|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
8 F+ s; k& C1 Y$ _7 j- xPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
; D. ^ V$ [1 M本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( k" R0 ]& C) z. u2 b" b9 J
! t7 i* @/ v; U# R( W. l' |, p
_/ ~6 c5 Z1 P
问题
; Z+ Q. @6 v* X3 x
* v0 S0 {$ Y9 q1 P- T5 m* ?1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)4 f0 L, l& {. K) ~) L
$ l0 H; D6 L( G9 N3 Q
SELECT * FROM MY_TABLE
2 y0 ?6 ~* _7 I, g; V
4 e$ R$ w/ I/ ]; F9 t9 pA.如果可能,用把查询转换成存储例程
! R: g7 G2 N7 M: E* P; WB.如果程序允许,给查询指定返回记录的范围
/ R& t: a' T! W) L/ J3 |7 o/ nC.如果可能,添加where条件 j" @5 Q' G3 x, }. ?% J
D.如果DBMS允许,把查询转换成视图1 d- ~, k6 }6 ^# f. p+ X
E.如果DBMS允许,使用事先准备好的语句6 [! I% B) Y3 V: F
! f# X. y0 o# a7 K
% @# _, X) q5 }6 B' A3 ~
2.可以用添加______条件的方式对查询返回的数据集进行过滤?& @! r, s" X# m% P+ a
' \. F: ]/ M: f g
答案:____________
; {& K! h8 y2 _ P+ m9 a1 e$ v) W: f- D4 `9 B( }# W! U/ m; e' R
4 z) h# T2 G6 {0 z$ W, G6 C& d3.内关联(inner join)是用来做什么的?( F6 W w6 S+ x' e( z4 z
$ p# E2 `2 m! }0 X. hA.把两个表通过相同字段关联入一张持久的表中
$ R6 b6 ^. g* }' C3 C: I; EB.创建基于两个表中相同相同行的结果集
! h+ G- W6 l" Y9 d Y% uC.创建基于一个表中的记录的数据集
) m! t2 D5 W8 d* F( ]+ }D.创建一个包含两个表中相同记录和一个表中全部记录的结果集4 w" U3 u0 A/ _7 R( v
E.以上都不对
/ C2 p, _9 \) i- B; M9 I* Y+ [/ k" m5 ?. X) ?* y2 h; ]6 f
6 h& R0 L' I( E7 a' C
4.以下哪个DBMS没有PHP扩展库?
' T+ t# {: h3 k+ z% }/ A& M) Q+ \6 e& S3 }- N, G6 X/ y
A.MySQL
4 h* m& t) s( QB.IBM DB/2
; e# s: K- K8 T" X3 L5 jC.PostgreSQL7 j+ f- P' ^/ j# J t" \
D.Microsoft SQL Server
. ^- |( T e* G* [3 D& dE.以上都不对 s# ^+ ~3 R# d* K
0 |7 {; j+ O' E: y- D) |
# U p7 x I0 R) { g8 T- W5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)5 m* c' ?$ Y ?4 x* s8 G& S
; \8 v" q- c! K
<?php
/ x+ N4 I4 s2 E( Y0 q$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);) b7 F7 N2 k7 q6 b! ]
?>$ Q# R y& w# Y6 Y
+ N d: U* y0 d% A3 Y8 Y
A.MYTABLE表中的记录超过1条
9 z. G. i' l% ?* r+ W: b+ T8 D) U1 gB.用户输入的数据需要经过适当的转义和过滤/ q0 e; z( Y/ h7 }$ Z& j% o4 W
C.调用该函数将产生一个包含了其他记录条数的记录
: @; l; t$ m+ y R$ L# t2 S: GD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除+ D; P) l3 k+ ^0 Q" }
E.查询语句中应该包含数据库名; G% `8 e5 B2 m: g* r
! n7 z) S7 t, y0 M. E$ I) D' n6 M6 H( M$ U9 r
6.______语句能用来向已存在的表中添加新的记录。9 e% z+ j8 | p( `0 y
+ h2 {/ D8 w" x; {$ \' H/ T5 u6 @
答案:____________
2 m% G+ B: S0 u' s. }% z( s
' N) \8 H2 m# ]" a
- m9 ?1 D% P4 {! D4 W" G7.以下哪个说法正确?
' \- a8 x0 Q/ L, y" O3 L: @
5 s3 Z5 J& v j& F8 y& w* JA.使用索引能加快插入数据的速度
' Y/ p! W- J% J4 C' @4 m/ |! H# q5 ^B.良好的索引策略有助于防止跨站攻击( I- @1 e7 N8 a+ e6 e! W
C.应当根据数据库的实际应用按理设计索引5 } n+ D* R! o6 K
D.删除一条记录将导致整个表的索引被破坏' l# |* z/ q) q. [3 `( y
E.只有数字记录行需要索引6 y' \* {9 y M$ M7 z( z0 ?
3 w0 s1 E. h/ r- V! E/ ]6 G
6 b( B5 W& J2 t4 E( Y$ x
8.join能否被嵌套?
! l/ x# J: o9 C/ n: y6 B' E( Q( C
7 b8 W( A4 @6 `" k0 s; `A.能# G w' d1 ~8 y
B.不能: {4 b6 G0 T: l) i4 l
9 X! S9 c% j7 j4 n0 w# `6 o
2 q& W$ c5 W7 B$ y" D9.考虑如下数据表和查询。如何添加索引能提高查询速度?# Q( U: @# W+ `2 h( h$ h
# c* _ ~" t# k5 J6 v; dCREATE TABLE MYTABLE (3 g% O/ P1 Y( S1 d, s1 Z
ID INT,
+ ^& u& t$ B- V- w. n3 @+ O8 @NAME VARCHAR (100),( ~9 h# @2 r: r) ?4 v7 s) B9 K( ?
ADDRESS1 VARCHAR (100),5 m& ~# `7 e$ E+ P' U e4 C
ADDRESS2 VARCHAR (100),0 F3 y/ F/ I) a" H h* U
ZIPCODE VARCHAR (10),$ V* j+ U, U+ o+ a* _" C N: L: K9 E- e
CITY VARCHAR (50),
8 e2 J) P/ G" |$ W7 r1 p7 }PROVINCE VARCHAR (2)4 M# N/ W7 n& z, `
)( A/ b6 u5 t8 o5 r- l( z/ T
SELECT ID, VARCHAR% K8 i9 i3 J- t
FROM MYTABLE
4 C9 Z& Y3 B& Y. LWHERE ID BETWEEN 0 AND 100
) i3 J6 g- J8 ?4 k. B; m$ }; y# pORDER BY NAME, ZIPCODE) t, T8 _: H1 B$ Y& T
$ h7 U, V$ h; }+ j* T0 A" YA.给ID添加索引. m& ~0 F$ F. n. o. N2 `
B.给NAME和ADDRESS1添加索引7 f2 U: e0 `% y6 w: `! m
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
6 i6 J. @; q" ?9 e. a2 B( e7 |D.给ZIPCODE和NAME添加索引
& R1 _; h% U8 M6 W& O- |E.给ZIPCODE添加全文检索8 {3 G2 |* G0 u3 [! n5 ?8 r7 z
+ s' S2 B* o7 I" u: E5 G
' e6 r p" N2 |5 p q
10.执行以下SQL语句后将发生什么?
1 Q4 I# q6 {7 D, T& Z: \
- Y _. D1 g/ a& Y" Z/ p6 jBEGIN TRANSACTION
M' |" J2 R$ l6 t' e) \; j. cDELETE FROM MYTABLE WHERE ID=1
6 y+ m2 d3 {' x4 t) ODELETE FROM OTHERTABLE7 X, u/ ]( s2 ?; z6 C
ROLLBACK TRANSACTION; c( l$ I5 o8 b: p
% R+ O6 P' U. ?: t
A.OTHERTABLE中的内容将被删除
1 C$ D4 ]2 T2 [* [) V3 U: | xB.OTHERTABLE和MYTABLE中的内容都会被删除
- l2 c* W z: H& `6 [5 N9 vC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除' a; c# Q6 s: e! U
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化7 G& y. C* i) ?
E.数据库没用变化
6 [/ m5 x- H4 y% f$ c
( U- a- ?4 D; ~* T% d4 A5 |
- x: Y' ]" a: P! m! G5 H5 g11.DESC在这个查询中起什么作用?
9 {' F( y5 V# Z, k7 |8 y0 g+ A4 `: J. F1 i
SELECT *
. D( ?8 w. \$ F9 q3 N" M. h& nFROM MY_TABLE% z0 v% l. L1 ]' ]- o8 @" K
WHERE ID > 0# R$ `/ }/ I* N: [% e: \
ORDER BY ID, NAME DESC( J) \4 ~2 ]9 E; b5 V( w# y! Z/ C8 B
! g: H2 W0 A7 x4 n
A.返回的数据集倒序排列) K1 T6 O0 }. T# G( O' a
B.ID相同的记录按NAME升序排列
j( e8 P& }1 U j1 u1 m" c. ]5 bC.ID相同的记录按NAME倒序排列% d. s; _3 l( C& h
D.返回的记录先按NAME排序,再安ID排序
% l; o0 j5 |! j+ H' uE.结果集中包含对NAME字段的描述; a; d$ \5 c5 H
4 U# x# J- A) ?/ {% G7 f s1 i
8 R) S0 r1 w& n( z
12.以下哪个不是SQL函数?; V. ^* j7 Z% Y# m; G4 J8 ~
* x4 d, c- M n" D! E& K2 g& T3 wA.AVG
6 R2 I+ Y; z+ V. EB.SUM' v# A) `7 t+ J9 a) q
C.MIN
/ R) e5 f: }' ]( q7 S7 W) WD.MAX2 ~/ n' l6 _' L
E.CURRENT_DATE()- V+ d1 m/ r( b5 B
( ?" v" |# G) k
; L w( w3 f% o+ a$ o! S
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?" `4 L3 z) S1 h
' l9 }2 h" T. l$ R2 N# Z. m' qA.该字段必须有索引 K1 [6 Y0 [6 M/ f7 S3 Q
B.该字段必须包括在GROUP BY条件中/ j5 D1 z% ~! ]* O, B% A
C.该字段必须包含一个累积值3 z# f% h- R$ H; A$ L$ J4 L6 y
D.该字段必须是主键
2 I2 O4 o0 z/ O% _. BE.该字段必须不能包含NULL值) Q& c1 d* \$ N1 v( d" c
& `# n" g5 V, n1 D7 b8 J5 b% V" \9 y# ~: H
14.以下查询输出什么?
4 n! O0 |7 ^5 ~3 Y/ d- e5 p2 b& C) O# m: \
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE24 U; u! w4 P4 Y# m1 C, J
ON TABLE1.ID <> TABLE2.ID, Q' `: g* I% A! J u) P
: g2 B1 ~. j$ J# O9 f9 ?4 xA.TABLE1和TABLE2不相同的记录% A* G/ B2 H" `+ ?- e
B.两个表中相同的记录5 y" ?: E+ \6 i/ \1 i3 \
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数3 c2 b( G3 p2 r
D.两表中不同记录的条数3 M, _ R6 j0 U
E.数字2
$ E# F5 Q6 N3 B. Z, p% l" E% `. ~$ L Y# Y2 \) o5 r
, w" p- ^6 o2 z9 C
15.______能保证一组SQL语句不受干扰的运行?
) O& {! h2 e! T4 X! f. k" m# N! s% y: h' S
答案:____________
1 ]2 D4 l* N7 G2 @8 a y8 Q
) [) _: Y- p$ {$ e
4 S( g/ I# G8 m+ Z% P$ E6 |& m3 u9 J a
答案速查
$ _. P0 R3 t/ `( H) l& \/ r1:BC4 d! p. t* d9 I
2:WHERE
8 B1 r+ P$ `* u& j3:B( L$ P4 d4 h2 N3 O, D! Y0 _; n
4:E0 V! a+ X* i9 J4 ~9 G7 o
5:BD5 A1 u/ Q$ O o/ O* ]8 F
6:INSERT3 k$ r% L) q [: y
7:C
' s) Z8 S1 A# Y4 P) a& R8:A
2 ]8 u3 q5 Z, K( E0 a9:C
& g0 l5 G6 P6 t& z10:E
1 U8 U& l. z% u( J" n. p11:C
) `3 m* R) ^4 q- ]; j" t1 z12:E
! q; Z1 a, q7 X: }13:BC* b9 l! _; M' ^/ x; Y T" J
14:C7 [- q3 n) Z5 T- }4 u
15:事务
& V/ _, d' S& J$ {& k7 ]
- D0 N, c' K* U- { P) [; e. h/ H* T( Z i- ]7 D: {- i
`+ j, W, q. V! u0 D% S% Z, B& L答案详解% h1 Z8 x8 G3 b: U+ _* M4 ?
) B0 z! i# c1 ]8 ~' w# p3 o% I* T. K
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
. u4 A9 A: a; B1 [% u7 g' g0 N/ r) _& m. O7 u: X( D% _- J4 y! t6 {3 |7 j
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
" n* P- u" W: ^+ d T
6 |( S4 q# s% x% D j: o3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
) ]6 y2 b. F O% w5 m5 a# V
& E% j) Y7 t( W/ R) U4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
) Q9 {8 Y2 |% ?- ~; \0 B. |, _* i9 V* g5 g
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
) u8 c# k7 j1 q; |
( A( V: l9 q# Y( d: T/ X7 m$ D% ]6.答案显然是INSERT。5 D# F b: c) o+ S' U% [6 ~
. b) c+ T- Y2 z; E; T& z) ^ T9 k
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。! ~5 x0 g! a4 k: T7 a1 \
1 E' ?) F; C4 \3 }8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。( @ n- _/ n: F
/ t: L* T q; c9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。5 ^" e& i- M9 g$ J- k+ \
( l$ b- B- l" ~4 x& b- O6 o10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。2 d8 E" t3 K3 b, z1 W
: O" o4 c9 @& S# ^11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
8 h4 M. p! ~( a) L$ h4 B: Y- l$ S. o
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。 d5 c. g W: ^9 k4 k1 c( V0 N
$ y5 @) e# N: U% K13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
$ d- J5 N' c, Z7 B) ~$ ^; y2 @7 m9 L- `
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
, M1 t! Z$ w9 Z2 f* B4 d S9 j
" Z5 Y+ o8 y) d) `0 v N15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|