|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ {8 F9 l* k9 {8 M" ePHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
, }& n+ Z. B+ b本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
* G7 r# p1 P( j7 [: g! O3 X# J. b
; X; F& N. T5 i: X9 L# o: M问题' b, M. a3 G, [1 R2 d
: Q. ?( K8 C1 J
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)' L/ {4 A( a" p7 A _- y; q
6 K. h2 ~) e! x. D
SELECT * FROM MY_TABLE$ f( s! S8 y) R& V
5 J7 v" \6 o \2 J
A.如果可能,用把查询转换成存储例程! a- W. Y* h1 l
B.如果程序允许,给查询指定返回记录的范围1 e. r4 S) k. ~5 C& R
C.如果可能,添加where条件, Z* K* J4 T* A# s2 s; ]6 d
D.如果DBMS允许,把查询转换成视图 j% _- y* \2 x& b+ H2 f
E.如果DBMS允许,使用事先准备好的语句
1 H+ W' D5 `& T; w- B1 O
4 d+ Q- G4 m1 C# X1 ^
/ b) z( e* A/ U6 O$ w* r" v: m2.可以用添加______条件的方式对查询返回的数据集进行过滤?
- }, O- K% t6 |( H z3 V
# t! R' }7 \8 I1 X1 p6 \% S/ h答案:____________
) y7 B' N) j5 ]: O) P9 H# Q$ J6 j3 [4 |) `5 P7 Z
( T/ V; H7 r$ B3.内关联(inner join)是用来做什么的?
9 Z& v4 h: e* D+ Q8 a4 H4 W W' r6 j% V1 P
A.把两个表通过相同字段关联入一张持久的表中$ y- B4 r& r+ Q6 A$ G6 c
B.创建基于两个表中相同相同行的结果集
7 U7 u0 s$ p! j( B1 HC.创建基于一个表中的记录的数据集, v: Y( Y& @% ]; ^5 Y- v
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集: R, t9 r" G6 S9 n; h
E.以上都不对( S5 ?/ G# v7 t; Q0 O) T' x
7 s" ~6 B, K0 B) }+ s# N$ c( f$ x: e0 g ` [1 G
4.以下哪个DBMS没有PHP扩展库?
) [: f# T- q0 R) K1 j o- x7 x! q$ x
A.MySQL
# H7 Q* n/ }3 `% X: K( x- V) c/ CB.IBM DB/2; w9 `+ U5 j( `- A/ E! b6 U
C.PostgreSQL( h# f' @0 O) Q$ T" p- w" ?
D.Microsoft SQL Server5 r! P$ e/ n2 O8 n( I' Y* L; ?
E.以上都不对
) E+ D/ s. P r" `0 E& u: _# V8 t2 q% B6 F9 B4 k
* y A3 {# } B5 Q7 K7 C" [+ T5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)+ Q) i) \. F# S
, q- K; y: b8 r) }) ^2 F. w" ^8 P$ T
<?php
( p3 G6 h8 i! }4 a3 t3 N' D$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
/ p: e: s2 S4 ]! m" C. i; P; p0 T?>, A# r: x# u6 |7 k% T4 @' Z, O
/ E% O9 ~8 M3 N( ?/ s$ u' [
A.MYTABLE表中的记录超过1条
2 j% \! \. u* t7 e; gB.用户输入的数据需要经过适当的转义和过滤
, y m- P) ~% U+ ^C.调用该函数将产生一个包含了其他记录条数的记录
+ k! {. F8 N' |8 j. q7 I; F5 T, m$ OD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除; J9 A# U- j. {- @, ~
E.查询语句中应该包含数据库名
/ t) f9 h. ?- f/ G
4 t8 ]( L, H, h7 Y' z7 ]9 x/ P/ Z; o
6.______语句能用来向已存在的表中添加新的记录。
' h5 F9 M8 S, J. o3 Y$ `9 `: {6 @3 _* @* L$ _
答案:____________
+ I, [2 h, F& J8 x+ T
d5 r/ D( N+ X9 o, g: H
8 g7 M8 r: {5 u" r4 w- I, d7.以下哪个说法正确?
. Y q7 t0 T" r# w1 I' g6 o- i5 T( A: l. u8 ]+ {$ g( U
A.使用索引能加快插入数据的速度
9 w, ]: A( W, [4 |* \$ j' p7 RB.良好的索引策略有助于防止跨站攻击. B, x0 P/ X5 t% I
C.应当根据数据库的实际应用按理设计索引
+ L" i* V1 k+ n8 i' PD.删除一条记录将导致整个表的索引被破坏6 P: ~( e# z, J( Z
E.只有数字记录行需要索引
* U D, L1 B' [4 p+ P( g) W9 h2 ]1 w' d* i) k4 a* F# R
; ^! ~) C8 ~6 D" S- q8.join能否被嵌套?
+ ], b0 e/ i5 y
+ a3 H1 t! B o# p( ~- u0 uA.能/ C {0 v" ]0 X1 O) f
B.不能
! ?9 i8 A: h0 k# i/ J5 i
& }3 m7 U( r7 \0 t& U1 a6 X; _8 y, X3 i2 n3 g4 }1 z5 e& q* Q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?# \# s! o& C) ?1 ^! J% P
7 y, G3 ]$ g9 q- z* A$ t1 GCREATE TABLE MYTABLE (
$ u2 U& y/ o! a& WID INT,5 l( O! c$ Z+ _# J" I
NAME VARCHAR (100),
9 f4 F5 ~( H) P, n" p8 \9 p1 yADDRESS1 VARCHAR (100),
- |) z- d! j9 SADDRESS2 VARCHAR (100),
* J% x$ u3 g x: Z! \6 x7 q; LZIPCODE VARCHAR (10),( v: d- j0 }! x8 u7 j/ n. L
CITY VARCHAR (50)," c# q1 g& }6 T
PROVINCE VARCHAR (2)
0 y: n) K% p" C( b% @" c9 g# u. e8 ^; })1 f/ t* d# I( @
SELECT ID, VARCHAR/ }* E$ N1 }" q) S2 V- Z
FROM MYTABLE
: W: K, u9 K/ |5 Q, W( EWHERE ID BETWEEN 0 AND 100
, W, s3 V/ \. B. IORDER BY NAME, ZIPCODE
- |6 _( V: p# Q& d! {" b9 y
: B0 M, ]/ C1 I& g& c1 eA.给ID添加索引3 v; {5 `6 ?. W/ e! O7 { u5 ?( h
B.给NAME和ADDRESS1添加索引
' I5 V. [+ J1 |8 O3 m+ lC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引! P: T: j2 E$ G
D.给ZIPCODE和NAME添加索引
+ B: z' }. F9 [: `8 F6 d8 kE.给ZIPCODE添加全文检索
) J2 [6 W. Q9 |3 N6 U' f e G* `; t9 v' J9 S
7 e+ e' T; A8 g( n n# _10.执行以下SQL语句后将发生什么?
" A! A6 P2 q" Y! F1 Z# h1 A9 u: l( n- i: v3 g% x1 q! E
BEGIN TRANSACTION
8 q) }& a. m8 G/ q: \- u J6 `DELETE FROM MYTABLE WHERE ID=1/ \& Q: Z4 C( ~/ V' S% X) D
DELETE FROM OTHERTABLE7 s+ D8 T: B" s2 t, V7 M8 ~: j- u
ROLLBACK TRANSACTION
+ s5 X, c6 |7 g4 ?/ w+ n* @/ X4 u% F3 d! @
A.OTHERTABLE中的内容将被删除" M. p g/ T' R! K% L
B.OTHERTABLE和MYTABLE中的内容都会被删除0 t/ J& E) }; K& s7 A4 Y6 ?% `
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除) {$ i+ J8 s! Z
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化) [; _0 j' V6 M" K1 N
E.数据库没用变化
* d K* I0 p. C U6 M& \1 e) I9 R+ |! a* ]& L- [" L p/ \
7 F" K) y+ E/ w1 w. j11.DESC在这个查询中起什么作用?: H! p6 y, i4 z3 I$ Z& g s! S0 f
) j9 ?# |' Z* V* p& V4 |8 m
SELECT *
1 g4 j& a a6 N+ n' X; OFROM MY_TABLE
: C( J8 S, @$ k2 yWHERE ID > 0
' B( u/ M: b( F# _1 cORDER BY ID, NAME DESC
0 z) _! d5 |) ~! T
) `; C7 u1 `0 I9 p1 D! H) o5 zA.返回的数据集倒序排列
# t& o, k K+ g3 U% `B.ID相同的记录按NAME升序排列9 R" x t# |# | _
C.ID相同的记录按NAME倒序排列' L) Z5 F6 z; G
D.返回的记录先按NAME排序,再安ID排序
3 k6 [; P! E1 vE.结果集中包含对NAME字段的描述
3 [% J' K8 T+ z$ G' B) v: }, X1 J p& _+ u
. U; ~8 I. ?1 Y$ Q: o. C& r12.以下哪个不是SQL函数?: O! X. w8 M! Y! E/ ^! o
d* b9 G) I. l- R1 C
A.AVG- [0 @6 p% c# K; k' s6 C
B.SUM) |( x+ T- M, `$ ?9 q2 G
C.MIN
4 i; B @+ t$ E. AD.MAX5 E1 W& @4 @0 j. K# D+ g
E.CURRENT_DATE()9 B( t$ z) E- b# @+ N+ z* L0 N
$ ^5 Q" t0 b/ S1 U
; e7 }. t7 e8 C! J13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& g. v3 b! r; M. i" q+ O- l0 i- R3 \* S
A.该字段必须有索引; v: b A8 _' V. o
B.该字段必须包括在GROUP BY条件中
) Y, Q( V# B- IC.该字段必须包含一个累积值
1 i1 `, c7 B) l) N3 x LD.该字段必须是主键" |, A& {6 L( C8 u
E.该字段必须不能包含NULL值
& V$ A0 E* N5 g6 V& Z3 d: n1 U9 @, k9 T. [: K/ o
* r0 S% B2 J; D( y4 Z; Y
14.以下查询输出什么?
J' j5 K9 I& v7 l% N# d* m- A$ h( {8 Y0 x. i) L3 z
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
6 ^) o# i% ^, ]4 tON TABLE1.ID <> TABLE2.ID
! j j2 Q3 T. U* X- F3 D5 ~6 q3 v8 S; U u) v
A.TABLE1和TABLE2不相同的记录+ J% v; G' r/ f( I" @9 x! s
B.两个表中相同的记录
) @" ?$ x# e$ g( u( fC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数& X3 m" w, k+ P! J7 ~
D.两表中不同记录的条数
; t; I3 k. s0 B8 B8 W! D% I1 JE.数字2 ^) z' b$ e- \& Z. e/ J* {4 V
, s( u* ~. _+ W L0 a
8 M2 Z6 o+ V% \
15.______能保证一组SQL语句不受干扰的运行?
~+ A5 B1 y7 n* ] p; F7 L0 o- a! ^6 {8 C, `$ Y1 ]2 d; F
答案:____________
/ _9 S7 _1 U+ a4 _
2 g7 Y6 d: Z8 V. J9 h# R/ o
7 `5 ]* x) ]$ ?, u9 C" K; A( V
. z" Z* V0 f q; Y答案速查/ V8 W; s+ T2 ]7 j6 b
1:BC9 A0 U" x9 {3 ~, t2 ?- T0 c. f, Y
2:WHERE
7 o2 ~; ~8 c5 s, J3 ?* V% | @3:B
& x$ V6 f( u* }1 ]/ S4:E
) x9 n; j: t' {& o4 M) ~5:BD
" ^; M( n* a8 h' h: Z; q3 P6:INSERT
4 V2 o3 K2 X2 p s# Y7:C7 X9 D5 D& t/ a( d
8:A9 C( C' u! h3 `* g8 h5 o
9:C
4 d6 k# `9 f u0 n10:E' U, M; `3 e- y5 Y9 x
11:C
3 N5 R0 c4 f0 O6 F0 f1 B# Y- G0 Z12:E! G% H6 ?+ W5 A/ `/ j
13:BC
( w8 M6 L1 x: r" N2 \: ^14:C" v, P/ C) b- }4 T3 U
15:事务
8 c/ I9 r6 G W+ m$ Z
* B, W) D* l9 F- H! V3 ^( n9 o! @, i ^7 a9 Z n7 S
& e) f) o8 X# `) ^3 T
答案详解; k* q& u4 A) o6 z6 q7 C! w
% y q0 Z2 x, P7 U
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。% J6 y# H$ s$ ]& F e* V
* s% p4 c7 g# Z2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。% H$ V6 O# g$ `" S( P1 m" K3 O7 x/ A
7 F9 j' {+ ?( L2 F O3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
. i4 i+ b" v$ _' V- t( e$ T! P& T1 @; j/ r' G! C
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
: H2 J- X; h3 a0 n, I: h
, V% N/ \6 u$ S/ w5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。3 ?9 w2 j8 i9 V5 b O4 S
% A, r# O- W7 } M9 F0 @
6.答案显然是INSERT。
4 x2 j$ G, N& }! p9 v, w" z
: {# @' o% o1 S4 J8 g7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。0 Y8 s5 K! ^) i1 X
# s5 X5 e6 a$ H+ @4 p" k8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 A/ Q0 \+ D9 J* Y
9 C# J; X" E5 U9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。 a, ^; Y# b( k3 ^% S$ J3 |, _* [: G
7 p% _+ ~3 I$ H7 m7 {
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
" n: J5 D& S/ d) {2 Y
/ K# v0 d) c X5 B! V3 N& s! `11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。( m' @5 T, k( Y0 Q/ ]
" w. i2 y+ u$ k! c12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。0 B' J# ]" V. v2 L2 ]
) ~( J8 Z8 a& r$ U9 }% @
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。( C$ H0 F6 X# l; U B6 x
. g, G- K6 p" f2 H) w0 k4 u
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。 h% p: Q' g' E. _, ]
% j% }* F" b6 h( m6 ^. `1 p15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|