|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14325
- 金币
- 2448
- 威望
- 1647
- 贡献
- 1396
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。' o9 k _6 Q& K- k3 I& R
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。& J# f4 M% l" j* g+ y
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
2 ~. H* a$ A8 |1 _: w1 `2 u9 j R
3 D' a9 `; _) c! V0 \ v1 E0 B } v+ |; p" w, P3 j
问题3 |" i2 @; _6 j) h w6 ^
! `3 Q& G8 L3 |& C3 r1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)& K2 b* @1 a3 @- `6 V9 u
- t0 ~" W' h; ^$ t' LSELECT * FROM MY_TABLE
9 }$ {: _) H' \) i
) b! w! ]" l4 N+ A9 i( wA.如果可能,用把查询转换成存储例程
1 N ^3 ~/ |% K: N: i; f1 `2 [B.如果程序允许,给查询指定返回记录的范围
1 [2 F: C- y" Z& Y" r+ VC.如果可能,添加where条件, x" _3 l9 |6 Q& D
D.如果DBMS允许,把查询转换成视图
1 B8 I' K' c+ P$ zE.如果DBMS允许,使用事先准备好的语句; H+ q1 K$ b7 L% r, G
- C2 K) u, |8 b
3 B9 k% V) N0 V- m) d6 V2.可以用添加______条件的方式对查询返回的数据集进行过滤?
5 y6 ?: ~* s' x* {* ^/ T% B1 R8 F5 r8 c% ]3 e4 q/ r
答案:____________
! N2 s* S1 S8 F/ b, _
& } W4 G6 U) A& {/ L9 Y! s% K
. x# Q- a+ t. O6 u) b3.内关联(inner join)是用来做什么的?
8 ~9 ?" g" `# N9 S3 o. g5 e4 ~$ B9 D
A.把两个表通过相同字段关联入一张持久的表中
5 Q, l! l1 d: V8 Q: x1 Q; hB.创建基于两个表中相同相同行的结果集# X! L2 N; c( E( g# J3 ^
C.创建基于一个表中的记录的数据集
3 g: y( L" h/ v+ Z yD.创建一个包含两个表中相同记录和一个表中全部记录的结果集1 t% B1 ^% j) c A+ m7 O2 ]
E.以上都不对
6 e5 ?, ~8 c( |4 k3 j% @ d6 I# _7 W. g; m; K
) ~! [% J" |( K7 o. @
4.以下哪个DBMS没有PHP扩展库?
1 S' V1 p( L& [5 \" {" u# B. Q6 N, R
2 j/ S1 e4 J- {% I3 P2 XA.MySQL
7 M9 E. W2 @* nB.IBM DB/2
3 e& h5 V: }! |# e1 i9 t EC.PostgreSQL' `( y% \9 S. S' G( m
D.Microsoft SQL Server
$ S$ D8 Z9 _1 S6 EE.以上都不对! t: \/ g% P: Y! L9 F4 s5 X
% v9 _) q# C% @
* t1 s# X' D' c1 `$ E5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)' r4 L# e# ?& @3 U& v5 D
3 b% p& f$ ~( g& z- y/ r( n<?php
5 X; @! W, b6 `$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
; y: O- Q) i4 M4 f?>0 C& { d$ A: C* ^
' A" o+ h* A0 r- SA.MYTABLE表中的记录超过1条
; [ p/ y- S0 j8 R7 CB.用户输入的数据需要经过适当的转义和过滤# ^, W6 B% u$ c# _1 A0 N( ^
C.调用该函数将产生一个包含了其他记录条数的记录2 Q, h7 J) |9 q* Z9 {0 s) l
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
0 ?+ G: p9 }# t4 c3 F' |* J: _9 JE.查询语句中应该包含数据库名8 }4 S/ v" F! A/ ^& S5 g
: C/ x3 g$ z% ^) S' O& ?+ h5 Z" m
3 |, @4 ~1 E. V5 r; a' M! C
6.______语句能用来向已存在的表中添加新的记录。5 y' }* }( Y1 u- n. d
6 e Q/ u/ |. Z9 n7 v A答案:____________
0 ?5 O. c, l+ |9 n+ M+ e( F1 Z( D
; G3 k; z6 p& Q* k. q3 z' K4 R+ E# e) |1 z$ o
7.以下哪个说法正确?
8 R ?; R6 I( n- n( P4 _9 A$ F4 M. l. v0 H; |8 Y C2 l
A.使用索引能加快插入数据的速度; h9 v! M: q, X6 m
B.良好的索引策略有助于防止跨站攻击
/ o) f! \2 u$ wC.应当根据数据库的实际应用按理设计索引! L8 J; e% A1 Q( c: x3 z
D.删除一条记录将导致整个表的索引被破坏
- P) A3 X% `6 GE.只有数字记录行需要索引
- H% e! g* M3 H2 J2 ~! \5 ^! v/ L
/ b5 Z+ s, I$ k; \; n# m3 ~! o/ b
8.join能否被嵌套?; b8 b' A$ p; I3 U3 _% E
& ?) Y- O4 i% s% oA.能: A7 s- N% h/ L& x
B.不能2 z! T% I6 I( D V7 r' R
3 J) u7 s; a. a# d! P( P. n7 F
' l( d' d7 C# F1 c0 @8 E& k9.考虑如下数据表和查询。如何添加索引能提高查询速度?1 |; ?' s2 |7 G
9 T, Z, m, r5 B; x* I) j k
CREATE TABLE MYTABLE (
@! }# h) m' Z, T* q0 pID INT,* |: K0 ?+ F- L/ o
NAME VARCHAR (100),
4 D4 E, j1 q. ^# p/ IADDRESS1 VARCHAR (100),
9 p5 E) H6 }5 O+ b3 O9 FADDRESS2 VARCHAR (100),* J- N! o3 {# _0 t
ZIPCODE VARCHAR (10),1 ~% f, l1 v- ^- w5 p; j- }0 Y; Y
CITY VARCHAR (50),, z# ]1 t* T; |$ z
PROVINCE VARCHAR (2)5 p6 j( J% j+ ]# T9 y% S2 u
)
% B$ R8 K1 l* [$ _' g. U qSELECT ID, VARCHAR3 {7 D& S% ^% S
FROM MYTABLE
) V' w7 h3 C3 J$ r6 gWHERE ID BETWEEN 0 AND 1000 E* x9 |$ e; X+ L2 {
ORDER BY NAME, ZIPCODE1 [! |8 I; e5 e+ i2 u
6 ~% C& p$ Q+ t) vA.给ID添加索引! Y/ F8 F5 e2 Z8 a: x7 p* q' [
B.给NAME和ADDRESS1添加索引
1 u2 N0 @& Q3 ?! H' \2 ^; dC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引9 l, V' O! B0 f! o1 z) ?
D.给ZIPCODE和NAME添加索引
2 ]% j7 Q6 i) C% y9 ~( tE.给ZIPCODE添加全文检索( }* F, T# B" O! z& P& q2 s" P, f
6 b# P. j5 S/ n# r% E+ G8 j9 ~3 u, \: U' s% {- V
10.执行以下SQL语句后将发生什么?
3 O; C2 M- h6 S# O- ^
8 s [7 h& ]" ]7 B* vBEGIN TRANSACTION
4 K" b6 W: d' d/ j% U; L( y) |" BDELETE FROM MYTABLE WHERE ID=1
, s7 b8 A. [, X! lDELETE FROM OTHERTABLE3 ~: ]4 I5 Y& p5 u$ C
ROLLBACK TRANSACTION$ W* u7 ~; }7 _/ x
: X/ C+ H( u Q# ~0 {1 _4 j |! z% bA.OTHERTABLE中的内容将被删除
* ^' t& u7 \: \& w' ?/ X* \) eB.OTHERTABLE和MYTABLE中的内容都会被删除
) G% o) X) F) s& F, mC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除% B4 C. N" V9 h
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化* ^# N$ c3 ]1 a" k. _7 i1 e! `
E.数据库没用变化
1 ]% b2 U& D4 z9 n
- H2 d6 g) v! x$ {8 S' D8 S7 Z
7 Q% w" r$ {; c N% G, G11.DESC在这个查询中起什么作用?: Z5 p F. q( @( {2 \
$ @" s7 R) C- [# f: [
SELECT *
2 V1 E% g+ k; TFROM MY_TABLE$ b. x& w% v# z: y
WHERE ID > 0
: U; K1 Y2 i9 ?ORDER BY ID, NAME DESC
8 Q5 U! i- J' S" a' i e! z, D+ D2 Q
; f, U+ ]# P8 q. [% n/ F8 ^A.返回的数据集倒序排列
0 u/ I8 F# a& X8 Q8 P: oB.ID相同的记录按NAME升序排列
4 m1 H4 m+ b4 r" { {, N# OC.ID相同的记录按NAME倒序排列
, \2 |0 Z, m9 g' t1 H2 HD.返回的记录先按NAME排序,再安ID排序+ B+ G6 }" p6 R. S
E.结果集中包含对NAME字段的描述" ~ a; ^) ~% i* K5 |
3 T8 S$ K+ x# u h& Y3 u
. F+ P9 @# X! n8 t0 a# M% N12.以下哪个不是SQL函数?' V& F- _9 o) l2 D4 Y7 U+ \4 n6 U# e3 @
* Q3 Q, X( d( iA.AVG
0 H% s" ` {* | h/ B* L D5 q% Q) s6 kB.SUM
& m+ U) K- w9 _, f$ {C.MIN" C, g& z5 L* c w
D.MAX5 U& P5 }' n& V6 e, U. ~' r: G8 U
E.CURRENT_DATE()7 E( J5 P* X) X/ r9 p
( l# g# }$ _0 B/ I# {; A( n2 u% Z* W& J/ f! U1 r
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
/ i2 U% y5 Y/ F, V5 m! Y h6 @8 r: a5 n2 S2 b' D5 p2 Z
A.该字段必须有索引/ S) a9 P9 d- p
B.该字段必须包括在GROUP BY条件中7 J3 c! d8 @( k$ H' H+ i9 @
C.该字段必须包含一个累积值9 m) N5 e* V. `' I @
D.该字段必须是主键
) C) ?, r$ U/ ]/ dE.该字段必须不能包含NULL值
5 }8 N+ d( F7 @! R; |7 a- }" [2 C' i
1 z0 a0 W2 ~" `2 I14.以下查询输出什么?
& N% ~, n0 w2 M/ ~8 f5 V! b; W- _* X7 o% ?9 T4 i* S
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
$ M$ P; A% v T+ e/ K! lON TABLE1.ID <> TABLE2.ID
+ q) J7 k2 j$ T3 _8 v1 Q9 n: r
! \ r! d9 m8 z. D4 m' @8 EA.TABLE1和TABLE2不相同的记录" o& M0 i' T+ \+ I% |$ q7 Y
B.两个表中相同的记录
8 N$ _, E/ X- n+ FC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
. p! X0 z- v- H, Y. KD.两表中不同记录的条数7 a3 G$ E' d- u1 \1 m# S% M2 _
E.数字28 }6 C; a1 P1 g8 M4 {+ d4 c
0 y) [/ r, h( t+ t# h; g1 A# }
# h4 x: Y% y8 J3 A" n15.______能保证一组SQL语句不受干扰的运行?. ?+ _" e/ B; X4 x
' s2 N0 Y5 Y2 v% [* z
答案:____________
* @3 _! u/ a5 W* S& E1 m
1 ~8 C* W8 D- ]# q1 H d1 y! L0 y; a3 c* o
/ y8 K( l" K6 H* ^* q/ H4 O5 T
答案速查
; G3 {$ M3 F. j( T5 J! R1:BC0 _* o# `2 E/ r( |; x
2:WHERE4 W: ~) f6 k: M7 z
3:B
8 b7 @5 H- C' p/ L* U: j6 Q4:E
6 J% Q8 V" }) G( ^4 B9 ^, w! v* W5:BD
9 G3 b1 A( G Q6:INSERT
G( R* m) M1 p6 d. p" V5 X, {: {7:C
# T$ {0 \0 N( s9 M; u( Q; y8:A
5 ^( u7 n- W H8 K" A$ z3 R& U! B9:C/ [& |2 G: a& j6 x" f" y
10:E
; ~+ `3 I8 ^8 ]( R11:C
; k, e1 x. K" W( j12:E
. J4 t8 T, M, h. M: w13:BC
! g4 h6 K1 ~3 P- w% J% O* ^# w14:C: K" k7 ]9 K0 y, S h
15:事务
* Q' Z; _0 f9 r2 O1 a2 \
. ]7 H: U3 d! d; Z
2 T* e# ?" l$ d& {4 [7 p" c; a# u8 b T7 i
答案详解, K1 e, P& e7 g2 [
: y {. q2 K% ~& q% C0 c. ?1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! ^3 x4 p; |8 F
) q6 v/ ] R* b9 Z' j7 v. \% v2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。% T0 S: \' `* G" |0 S
4 {& D" X2 X& _& ?, d3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。3 y+ g" W6 R4 L2 a$ u- E W
$ g( G4 g6 o9 e& V1 _2 r. s4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
1 v7 c9 |8 [" Y1 D2 d$ H! ^! y9 o9 ?- `5 i x
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。7 \2 _( d; `' v# a/ j
Z- x) U s _! }& a
6.答案显然是INSERT。
! S( U$ d5 d! ]" ]: V7 O0 O W1 u1 @
6 ] c4 i6 v( h- F; |: q! _; b, E7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。: Y! V* A4 |: n1 \
a% t5 [; ]/ z- }* x9 N* Y
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 w# _* H& M' R0 e& S4 u% c6 W
( @2 j0 ^6 |3 v1 ~9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。/ v4 j) W, ]2 q4 Y* p3 ~! F+ F6 V
! \, T# E! F% m' g! P0 J: Z) w
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。" h5 p0 F5 V! O( Q' t, P! P
! _# M) O) V, @& x7 E$ D4 L11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。# T7 T# x/ M/ h# {+ l8 t
: X# V# [2 L$ a- s/ s# C7 y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。# g. ^+ B" g i/ l5 t9 e
; k/ M& b2 s: l5 ]* ^13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
5 a0 F) j) }6 E) S9 r0 X+ o- z) k
0 v* |* U& l, m# k" \6 Q* |14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。8 |0 e1 G6 ]9 v t7 T
) ~; J% b& Q! j0 w. }
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|