  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14153
- 金币
- 2367
- 威望
- 1647
- 贡献
- 1315
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
6 }4 l( O& Y: P/ u- D2 GPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: y* v' B3 e5 J1 H5 t本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。* V% p4 P' k; g1 N
8 z2 s7 q4 b# o* a
2 U7 Q9 P8 V+ I4 `0 u
问题
: h" Z$ o& C' n, R8 @7 d
. o6 e2 \ U1 s! u% X4 z2 I1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
/ U4 ^1 H( V) Y! [; W' ~3 s7 X) g- D. n: f, x/ h& g
SELECT * FROM MY_TABLE
5 t7 z( a, m3 n6 i; ~) s0 R6 N" F* Y6 f+ s/ N: d
A.如果可能,用把查询转换成存储例程2 Q% N( k% k' V
B.如果程序允许,给查询指定返回记录的范围
& Y& X4 \7 q" ?C.如果可能,添加where条件
& S1 B: Y8 E, zD.如果DBMS允许,把查询转换成视图) L) n* a3 |' M9 [9 a5 {2 [ e4 t
E.如果DBMS允许,使用事先准备好的语句: }( l. H1 a0 l* p. ]4 B" c
- b& J5 S' {% g
* l3 J+ o; v5 Z2 t" f3 b9 o8 d, ~2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# N9 n8 r: X3 z5 L& m+ O
& i6 U4 N8 V5 a答案:____________- ?7 A* h, D, B
" \( G# j% k x; z
; z8 @0 C5 @! w$ K$ ?4 B6 n) q
3.内关联(inner join)是用来做什么的?: c( E# a* F. T M+ {; _# \$ P" {
6 ]* Y# f& K: Y; B Y
A.把两个表通过相同字段关联入一张持久的表中
/ @6 Z- m1 ?& t% T1 s) Q& @0 N8 H& UB.创建基于两个表中相同相同行的结果集
: B, F- b- @# f# [3 v# gC.创建基于一个表中的记录的数据集
8 {. Z5 L2 n) b- D: q) [5 ?D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
- ^" n+ i- [! r2 O' U! NE.以上都不对
% W5 S. \, B g: r
8 \3 ^( |( I- M8 B, ^: x3 `8 p; x7 M$ Y$ B0 t& b3 i
4.以下哪个DBMS没有PHP扩展库?8 G, g# N9 t, q }3 ?
) s+ \+ N, ]7 Z9 _3 ZA.MySQL
: z4 Y; N$ ]' ~! m& lB.IBM DB/2
) g8 C! L O L0 K+ t: X+ JC.PostgreSQL% P$ U& Y+ s$ r; O6 {9 Y# e
D.Microsoft SQL Server1 T7 j* A* W* P6 Z) v/ F, O
E.以上都不对" w2 E# V$ @% R: m: ]! `
. U! E) {3 X: |) N
4 y% @5 i* c/ P7 W$ K5 s2 {5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)# I$ `2 K2 b3 y+ w7 Z5 S( M
7 I, \3 Y1 e% W$ M
<?php# U0 G& U! V% l; ^9 @1 @7 l
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);% f' T6 R2 w5 n4 R" _
?>
3 \' s2 d' T9 S) g9 |6 h8 f! r0 @/ g+ j, [
A.MYTABLE表中的记录超过1条% D7 V2 g# w7 E+ Q7 K
B.用户输入的数据需要经过适当的转义和过滤
! V# \. v& P7 TC.调用该函数将产生一个包含了其他记录条数的记录
4 L' w7 B! K4 `/ @D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
8 b+ ]2 D% a# w( bE.查询语句中应该包含数据库名1 y+ |8 X( X7 g& z9 h1 @7 Q
3 Z# H1 C) u' P% {3 y( x
" M, A I, }9 a. }5 \$ _6.______语句能用来向已存在的表中添加新的记录。7 k3 `$ i" k: |; h1 {! f
- `& H: N8 d9 L6 R" Z答案:____________ Z' Y' u' L! K% i
- Y" @0 Y- n" p9 K/ X0 }1 I3 w/ T, A7 _% f: y
7.以下哪个说法正确?
3 z$ J* S% A5 o/ u7 F8 t
6 O; l- u: v8 c6 [8 F; D6 ~9 h0 gA.使用索引能加快插入数据的速度
7 A+ K0 _$ }( F" zB.良好的索引策略有助于防止跨站攻击
# d: x5 J) q+ F9 NC.应当根据数据库的实际应用按理设计索引
% a8 }; y$ A/ {; k! k9 Q2 RD.删除一条记录将导致整个表的索引被破坏3 e4 O0 R' D3 L6 r+ V/ M7 Z& w
E.只有数字记录行需要索引
6 i' S0 v8 j7 v+ o- C# _
1 x/ Q% J; X2 A4 f& T9 {. h, ], @( N- M4 `' p! c' p
8.join能否被嵌套?
! P! ~- I' i% x
, f$ R5 i2 v ^A.能! C$ Z1 Y1 ?# ~
B.不能+ g- x0 t( C7 ]0 s% A) r
z$ p+ e. z# B# e- u/ G9 ~+ i* k) @$ O3 j3 O, o$ k& p7 i$ `
9.考虑如下数据表和查询。如何添加索引能提高查询速度?( [) ]" Z$ h% m
, _- I1 V \# k q& U* b# K: p* N
CREATE TABLE MYTABLE (
. h; d2 d! _5 F& e) I& d5 bID INT,1 ^! O9 M A: Y9 R! k# h
NAME VARCHAR (100),
. I9 m8 Q* e+ bADDRESS1 VARCHAR (100),
& J3 v d; l0 s3 D1 D: IADDRESS2 VARCHAR (100),( q4 G) W! X: I* E6 M$ Q
ZIPCODE VARCHAR (10),
7 K4 f1 |2 m+ \' }3 X2 f+ @0 ZCITY VARCHAR (50),
! F' Z: B5 T' ]/ Y6 o sPROVINCE VARCHAR (2)
8 p6 Y; W+ e W4 ]8 x9 Q4 u)9 p+ V) e$ z5 R* r! {3 i1 {7 ]
SELECT ID, VARCHAR4 n1 t! v; Y% a4 t, K/ ?/ Y
FROM MYTABLE
, v9 _0 O1 R# U* ?WHERE ID BETWEEN 0 AND 100
2 |" Y& i+ O/ vORDER BY NAME, ZIPCODE3 v* F9 M) b! N$ A# W% z3 X
1 h! L7 T; L* z% T% }) B
A.给ID添加索引1 J( y+ M% f( @* q- W; b! D" ?
B.给NAME和ADDRESS1添加索引2 h; E4 N- D8 t4 m& I C# d
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引7 [) { } p. G! a
D.给ZIPCODE和NAME添加索引
E2 z6 z# ~; M* ?1 s$ A* j/ SE.给ZIPCODE添加全文检索
# L1 I* N4 w. M" T/ k* T- d3 P7 h; [1 h w+ ~3 X: g) j
" E3 E# Z" Q* K$ j4 d
10.执行以下SQL语句后将发生什么?
% y! O' h$ ~; Z; ], o; ~' p2 S7 X5 w+ X
BEGIN TRANSACTION6 q% _) {6 W8 k p) S
DELETE FROM MYTABLE WHERE ID=19 q( x3 R/ Y& { r1 f
DELETE FROM OTHERTABLE3 |8 ^, C8 g4 h5 ~
ROLLBACK TRANSACTION
7 O4 Q' z. a8 p
( [- y) G: l. p4 `8 z, iA.OTHERTABLE中的内容将被删除
- T) c' y) U) f$ M6 y) A2 E" p. M- KB.OTHERTABLE和MYTABLE中的内容都会被删除
+ O; V! F, [0 j# M1 q9 ?1 FC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
# Z: Q" K. m( |6 hD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化& R/ E' C- f2 g. j$ z. Z
E.数据库没用变化1 j& V! o" h% e% o
2 }& ^( w! ]8 i" P7 q0 `0 M! M- Y: L
11.DESC在这个查询中起什么作用?, ]/ A( y6 X& X; T$ W
$ U$ ]# q0 x7 @" N. c2 b8 FSELECT *
. k, A7 s$ c h. NFROM MY_TABLE
: I( z% b9 L5 }* eWHERE ID > 0
8 B! d- R" z; N* {. |- ]ORDER BY ID, NAME DESC4 T8 T; U6 |& ?5 d, o
' ~# X6 U3 A6 a6 R8 _8 DA.返回的数据集倒序排列. [& Y; F7 m+ g: b
B.ID相同的记录按NAME升序排列% j, i& H2 T/ T5 E
C.ID相同的记录按NAME倒序排列+ S y- ~: u( ]) y ~
D.返回的记录先按NAME排序,再安ID排序" }" j) n6 W3 ~, b* a! K5 M! r
E.结果集中包含对NAME字段的描述* G' p* z% `7 q4 B2 x9 q5 y( L3 }
, L$ w$ B8 o: }: C
6 G+ d7 _ ]9 b5 D U" z5 t12.以下哪个不是SQL函数?9 b* J/ c9 v# G7 H
) O/ E( j+ f/ V! v- q5 T" P# IA.AVG
4 G1 Z" w) I6 i5 @0 d: iB.SUM
0 m8 d! Y& Y" t9 k nC.MIN2 d6 d5 x0 A, q' h7 U
D.MAX* D6 x) m1 p* p) |
E.CURRENT_DATE()2 ]6 Q4 T9 I# }- }' G9 D4 W, ^
/ g3 J# y. R% H8 m& ~9 R1 r. q3 `! p. `4 T% M& _& k
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
5 @ ?, m4 E2 s. F- W. @4 ^: {* k- t2 d
A.该字段必须有索引
) W' y, x+ S6 t/ Q! M5 ~0 N: k1 tB.该字段必须包括在GROUP BY条件中; l! B& r, l$ f0 ]( ?
C.该字段必须包含一个累积值$ d) F2 t5 z& Y' N1 v, ^: f6 w
D.该字段必须是主键
( z0 w0 K3 r; V# _5 Z9 j1 rE.该字段必须不能包含NULL值
( e- d; H2 ]. _! @$ n/ V0 Z |& R/ {' f% p5 M+ @
9 S" b( }. Y& N% y9 {
14.以下查询输出什么?
) K* B* z* C3 c- y+ ]- E& _* C1 B7 T6 r- _2 K0 x e% C. W! H
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
1 o! W0 x, O3 U2 j. [, V: K( EON TABLE1.ID <> TABLE2.ID
6 `# T/ p0 l. E4 m N0 K* u; v
6 _9 L* A% e. eA.TABLE1和TABLE2不相同的记录/ S, x; A" D) D1 ]6 _0 J
B.两个表中相同的记录0 F2 j# n; M; c& D" l; _
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数) ], n, _/ y, A! f: c" z
D.两表中不同记录的条数" m6 ^! M+ i$ h6 m2 w5 v$ b
E.数字2
7 t# H7 ~& v3 T- h( p! q
7 E, x9 e) d" G- {
; V; U8 }/ g. m N" T& U15.______能保证一组SQL语句不受干扰的运行?) p# @+ n' f- c9 s' p
3 ]+ a# j" N. f5 G3 t8 v答案:____________
& t# n: E* H' w# j' _( _+ [
+ \8 n" E9 L9 z Q
0 k& K9 D: @! i v1 z5 X
& I$ A: V9 A# I- M e% ^$ `( L l答案速查+ n/ ^& O I: |( `, [: Z
1:BC
4 w8 a) @2 k% ~" S4 F2:WHERE
5 F, ?$ E, B: f. S6 m3:B
" K. i- ^, |0 V2 j4:E! T& \# }, K7 x, `- Q
5:BD# M3 C% b$ B2 g, b2 Q
6:INSERT, S0 w: \5 Y* x' K/ V* {
7:C7 x- h0 P7 G: S' e8 V! ~. A' ?' B4 T
8:A; ~+ ?0 ~1 I2 _3 l8 l! x
9:C% N& C7 Y3 k$ U- m5 T
10:E) m5 @* v' }4 b
11:C* C* n: q* b7 u" N
12:E4 ^/ I4 i4 C5 ^% S c- {9 d8 W( X
13:BC
9 ~2 G1 m+ X( k7 L2 Z14:C( u7 `) |* C1 Y5 W. z7 B
15:事务
' k3 c% _) P; J/ I$ n# N( s" F% O
& r5 N* [3 ^, V* S: A9 c& C3 _* u4 b" o4 B$ h
/ B7 d7 `8 h0 O; z0 }7 G5 W, ~% n答案详解$ Q7 w1 J7 R& l) T: f% o, v
$ W, {) a% o- b1 ?0 L
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! L8 x E9 Z; B! I
: A' r; p8 c$ k. z6 V2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。1 K/ t% n- V3 d+ \" A; l- a5 B
- F; C% Z+ l" j7 Y9 V3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
# V$ f8 r( j: Q. v$ A; \! a, S* E X( E' G. O" U
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
- C( f, i5 A3 s! m* r0 E$ L& V) a% p% N! X. n. f w5 R
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
( F$ R7 q+ _! }; w" w! `9 j
/ ~: W2 L6 b6 A, w, b6.答案显然是INSERT。
. I4 c! P0 C; s* s
& U( p4 q. R# b7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 P+ O: Z) o" N9 P
: A" c% |, _# L8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。9 D* q% N' K$ c+ \* @) t K; D
0 I8 O* w2 z* |- J9 H
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。" a8 Y: ~. W( T4 ]* d9 g: V
5 m* v! ?; f e
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。4 k+ V X1 Y" R3 c& X, Z
* N( ~# Y" X% S# a& i5 `. Z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
6 N8 f' W; g5 |& Z! x3 z' V! ~$ c$ F8 ?. P! {
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。$ n1 |# h O( U/ r! O2 T1 T
, Z, k; C) j1 |! U I+ j13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。0 L& W9 B, ^7 W
( k4 f: ], ~* u; O6 P5 `" I+ \
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。) K, |: B; j: o' Z% o
! Y! w! V& ], c2 @$ ?. q: G" M8 m; |15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|