  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" K ~* p2 Q& [$ z: i/ gPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。/ N% Z7 J4 a8 q+ l
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
; s: M' i9 |' r/ n/ r5 g
% T# O$ s6 x1 \5 B. Y7 }/ K3 |* @" c
问题; N) T" s+ V% ^) Z0 ?) A
* M+ y6 }, C' S' j' J, c( B1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选) b! D+ ]# c& w5 p2 A2 _
. _2 w& i! l5 a9 tSELECT * FROM MY_TABLE; X. v4 O" ^1 R( e0 P1 h1 y' o. ^
& b. l4 P0 O5 TA.如果可能,用把查询转换成存储例程: ^7 M; u. b: s4 ]' }
B.如果程序允许,给查询指定返回记录的范围
2 R0 c4 q6 c0 s5 E5 xC.如果可能,添加where条件# J; B! l$ v+ M, R; `
D.如果DBMS允许,把查询转换成视图
7 k$ j0 M" P% d! ]9 _- ME.如果DBMS允许,使用事先准备好的语句
+ h! w \, n# l
$ L T3 O! I2 v9 Y. r2 N' e3 e" w9 E) u! e( i
2.可以用添加______条件的方式对查询返回的数据集进行过滤?3 v5 F6 ?% T+ a
6 G D% i! a/ Z
答案:____________
" R9 u' e" k' `+ d! W4 X7 ~/ x: [8 X* v
9 B1 W. b- Y! v% N$ J" S: _3.内关联(inner join)是用来做什么的?( K$ j5 M" u1 [- ?7 m
+ K7 ^' M0 C$ WA.把两个表通过相同字段关联入一张持久的表中6 t$ v" F u& U; ^- U' O Q5 } t
B.创建基于两个表中相同相同行的结果集
* u" _ O/ x* N ]3 }, q8 ?C.创建基于一个表中的记录的数据集
, Q$ R5 i: T) V" B7 i0 R5 c `D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
! d( p3 f" Q+ ~4 ~. ~E.以上都不对! k) ^1 w& ?- t6 f1 ` d2 D
" Y0 L2 K& x2 A% Q, Y8 |% Q
, f5 d8 G' i5 `: p7 v9 f7 n4.以下哪个DBMS没有PHP扩展库?7 N, @) @! V0 {" o4 L
& k. {" O' u( W' u+ B$ @) e% NA.MySQL$ L) l7 `9 g" u- G8 H
B.IBM DB/2" p$ O" ~# G: ?4 x# ?# o1 h
C.PostgreSQL
* h; o1 B0 E8 ? J: D! lD.Microsoft SQL Server
5 n j. V6 x6 ]. I2 v( bE.以上都不对0 k$ Z. D8 E# [( A9 C" ?1 h
0 O0 D7 b7 H7 i, Y, W' M k
3 I+ c4 y5 {& z7 m* x& l2 K6 X4 E. t5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)! m% T5 i+ Z3 l& }/ T! P9 y
3 Q6 v( R/ s8 K: {/ c' c" J<?php; z$ G1 a4 R C
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);" R; m% E- `$ m
?>
' k' x7 j3 _( v ?! c% O0 x8 D' g* }0 [0 x7 j* l0 p7 f7 j
A.MYTABLE表中的记录超过1条9 M* s/ B2 [2 V6 q" l5 S' k1 B
B.用户输入的数据需要经过适当的转义和过滤
2 E! S8 }# R+ f9 {2 U1 FC.调用该函数将产生一个包含了其他记录条数的记录
. `# p) ? J/ M0 TD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
, S- Q: X! x9 q; }E.查询语句中应该包含数据库名* [- X1 J- G6 Z( A( W! R# ?
% n: [( w; s# D4 [8 k
" L8 s6 N7 }: I% _& c; M
6.______语句能用来向已存在的表中添加新的记录。
6 f: n* W: b) y/ v d- \: Z* V& z6 D; l5 C
答案:____________2 Z! F9 I3 H* O- @! p( y; V
6 m; x4 N; k5 X" \1 Y
$ E4 n4 K2 T: Z
7.以下哪个说法正确?' G* {" s4 {5 I0 B
2 `1 L* u @! M* h0 C
A.使用索引能加快插入数据的速度
5 z4 z* Y. T: @ D9 z3 a' B- VB.良好的索引策略有助于防止跨站攻击
/ \" @; F& W' GC.应当根据数据库的实际应用按理设计索引4 G) X6 p& {0 y# C/ P6 Y
D.删除一条记录将导致整个表的索引被破坏
3 S1 K' U5 V: W* c* Z- pE.只有数字记录行需要索引' X$ F& }& u s& \
4 m4 w I$ W, p! V, {" |% m+ h1 @# J& x, @/ S7 _
8.join能否被嵌套?1 H! y+ y. n: g5 p* _, w3 U# t' L
8 T2 h8 r6 J9 {
A.能
0 t8 X7 U; K" j- j7 sB.不能
( l/ u; V( K- U) Y: `5 l3 \4 \
* m8 R! L% S" `- Z. D
* [% W7 l- Y% n6 I1 J/ Y2 f9.考虑如下数据表和查询。如何添加索引能提高查询速度?0 l6 z1 x; S' i, k7 ~
- a' M: S4 @9 _0 C/ s0 ZCREATE TABLE MYTABLE (0 G* g$ O$ n. ~' B7 A# F* c J
ID INT,0 `& C3 Z9 x/ ]! X+ O! U: D
NAME VARCHAR (100),
1 n5 e. z+ T* I- N+ PADDRESS1 VARCHAR (100),
3 W' n2 h* K4 o; V" X: k& Q5 DADDRESS2 VARCHAR (100),7 |& Q$ U% ` |& ^% P, A
ZIPCODE VARCHAR (10),* R& k5 p' U' _& n
CITY VARCHAR (50), Q0 j8 T% e4 P* C1 [- X
PROVINCE VARCHAR (2)
% a0 ]# y. a* o- E ?1 k- I); W9 g7 r# ^2 e' A9 x( P, i
SELECT ID, VARCHAR
" a" c! S* V; C& V+ q/ a* ]FROM MYTABLE5 ~+ @; p4 U: a& M2 E
WHERE ID BETWEEN 0 AND 100
4 {) K- Z( y2 AORDER BY NAME, ZIPCODE
7 s3 ~8 R9 r0 J+ h, ^+ ^% h; A1 f& P. |/ o! J7 U
A.给ID添加索引$ }3 ~8 j0 }" _" B: ?5 `4 `
B.给NAME和ADDRESS1添加索引* m! L* I8 X) ?& [1 ^+ d" M9 D
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引: u) B. g' x% ^6 }
D.给ZIPCODE和NAME添加索引% z* R- S$ o7 F5 B- M: a# D
E.给ZIPCODE添加全文检索1 ^! P2 j G$ d2 V4 F
9 O k, U- v2 c7 a! }
% J% J0 V. A1 {, {
10.执行以下SQL语句后将发生什么?# H+ k9 ]; j% a7 y
5 @7 m2 B$ T W) H H) O8 K: qBEGIN TRANSACTION+ E; n% ^) |) t
DELETE FROM MYTABLE WHERE ID=1
; o/ @; G- D. j! R* n! @DELETE FROM OTHERTABLE8 u' s" y2 f/ b1 T
ROLLBACK TRANSACTION
|1 I' I, z+ B6 I
6 `: |! V/ P* n ?A.OTHERTABLE中的内容将被删除
" y& b+ ^% i3 d" X) z2 y0 bB.OTHERTABLE和MYTABLE中的内容都会被删除- k+ n5 a( E9 M
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除& @: \& Y8 m! z+ ~& S: n! }3 ?" `
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
$ }) S8 l2 w7 Y" OE.数据库没用变化
3 \% K+ |' R, l& D9 J* a* @
, T' u, f( C N( \
- r1 M% }* V) x- ?* Z11.DESC在这个查询中起什么作用?$ s) v6 v' u f$ j) h0 U
5 B+ u+ i3 o3 Z& s( D- v
SELECT *
$ g% e: t. y* R _4 }FROM MY_TABLE0 h; {: R0 s5 e) t
WHERE ID > 0
* w: U# C6 T1 f9 f) H0 v: p+ o( n2 Q5 bORDER BY ID, NAME DESC
# U! j; o; `, @; L7 ~" R9 j9 j W7 ?. v) J) U) a. S
A.返回的数据集倒序排列$ C. [+ A8 a8 W8 `. ~
B.ID相同的记录按NAME升序排列
$ e- U |/ i5 jC.ID相同的记录按NAME倒序排列) @& N3 {! l+ A; p' _: ^
D.返回的记录先按NAME排序,再安ID排序( j% }/ x! J7 |! U$ E8 i
E.结果集中包含对NAME字段的描述
( B C- t' b% Y/ ]2 l1 D+ ~7 X4 d) Q( e- z' d
; L, n- K# e) R( s J2 k
12.以下哪个不是SQL函数?
6 ~; ?1 P; {* d5 {3 Q1 v0 P, S
: P4 n% M& C; s* |' Y. WA.AVG" p/ \" @* M) x/ J. o
B.SUM8 P4 B% A9 Z3 n+ M* W- q8 d W
C.MIN( v0 f, g* Y# o+ Z7 d
D.MAX
- Y, A Y. H/ \- d% sE.CURRENT_DATE()
$ q4 u' W: f: G+ f4 ? T# L
4 z: K! ]) m0 `4 ?0 f. c, P+ c4 W3 A% n$ F6 ~* v; b, H
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& e: @0 h" K( F- h) D
5 ]: U( o. Q; g2 k) a' R" DA.该字段必须有索引
( P" f4 t0 d2 kB.该字段必须包括在GROUP BY条件中
1 l+ ?$ L& ~2 e0 G' H1 Z8 M2 K) x# iC.该字段必须包含一个累积值
) t5 K; Q( x+ K2 k( W/ gD.该字段必须是主键
. O3 \! y* p7 p+ TE.该字段必须不能包含NULL值9 P3 w; H Z9 ^" K5 z% j( F
& I* X4 v$ o( {8 N) W
, m0 J! f* J6 O0 o+ D$ U7 I( o14.以下查询输出什么?
* u j8 I9 E5 O+ j0 n
+ @; P5 ~4 P- [! X& K5 @5 @SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2- V w$ ?0 u# d' E1 i! R- Q
ON TABLE1.ID <> TABLE2.ID
3 j# i/ a: ~# t9 K1 B9 [
2 Q L" x0 l3 w) ?8 w7 g( T+ ?A.TABLE1和TABLE2不相同的记录
- B: q" _3 Q4 w+ IB.两个表中相同的记录
5 l, f1 W8 W% AC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数* N' O2 B2 o& [# t* `
D.两表中不同记录的条数) Y/ V1 Q) I( t( u5 }1 G. i7 F" i' _
E.数字2
9 c' j7 p) n6 U7 ~) c# J+ O7 e9 s( x
q& L, q2 v8 m( J P) u15.______能保证一组SQL语句不受干扰的运行?# K! x; c, [) w
; C9 v7 S7 K; i答案:____________
( y* t$ B0 s1 \4 M& F" _8 l$ }# W$ N3 w' L! E
" L) u- h; j- X, C+ N
& O3 m) n! X/ {0 o- O4 p1 y
答案速查& T6 }$ v) A. y4 j2 X, N4 g
1:BC. Y: o7 j- z" e
2:WHERE
. _3 q% O3 S; c$ ]( e& u, C3:B( G, A/ y- J' q3 `4 e i; ?
4:E( X2 c& Y0 J' a! j( a( Y0 O) y! k
5:BD
" T' u0 p' x* r4 K, u( T/ a& y# n6:INSERT
# R* _ k# l) ?# |6 f9 _! l9 w7:C% j* Q& p1 [# c6 Z Y* w7 l5 b0 U* e
8:A7 o& Q$ P+ W8 u
9:C6 P! p1 d5 v* O5 h, K# Z/ F+ g! b
10:E
5 X: R& X4 O$ X/ ?4 D2 D11:C
2 G0 z1 V a. W/ C( R) x12:E5 c/ Y6 ?: D. }8 V7 c+ ^
13:BC
8 d5 h! D) X( {) J4 E; R14:C0 N* P8 O& Z3 m7 s, T9 D E9 _
15:事务1 }5 Q+ b" r% B7 W' N& V2 E w
! u/ D7 d- R" a H- p# G
- z) K& R8 ?( U2 E E: L w7 J( }) i# F
答案详解; w5 x' V$ ~/ V+ k
: U+ a; P# Y$ z7 y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
$ Y; O, s: P: l0 ?. q/ l
0 i, l+ t- ?( E8 |; l- D2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
; V! x0 V6 }3 Z& P
( Q: _; _" s) u3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
& o3 ]7 O P+ @* m# P& |/ l7 y h- J, X' r2 u/ X
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
* g" j' x; {4 Y i# `+ X7 w z1 z1 y: Q
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。/ _. T5 j: k6 Y+ Y
( {% H; P$ J3 u# ^+ h2 E7 V, N6.答案显然是INSERT。2 R7 ^4 |/ O$ p7 I& Y/ L
3 ?& h7 q( [' {$ ? q2 J1 n3 A7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
3 x i; N1 P3 N1 N
/ Y) [3 e$ g/ t! P* _. j8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。1 X8 n/ j( U5 E8 [" b
) M9 U X( S! D9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
9 M _% A/ P8 k$ _1 a3 X7 `- |5 `* M- M& h4 j: Z1 W q9 A# o
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
8 X8 v+ |2 j" W+ K6 X. q: h; ]3 x- ?- @4 {6 M
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ ?" q5 m8 t( n) u8 }9 p" x+ ?. `) k+ @
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
p; l# t- S5 z! K& N: {8 a& H( Q9 M ?
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
l E& _( a+ d) U
) s& O0 _4 p L9 i; a14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
; [9 x* _( Z8 s {* Z3 y) v& \# Z7 `6 u: x+ a
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|