  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
& b# P+ I/ l# Z6 m! T2 ^( u% {; mPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ [) ]% q6 l7 n+ y2 W本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
" l! D+ \& z( a1 `3 S/ [$ ?: c" m2 ], r3 `
1 N6 |1 V) U6 ?. s8 C问题
& i: r" x5 d9 Q$ s- H( ]! d
; J2 Z% j" U- m9 Q4 g5 p1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)6 w% C' B# y9 A' Q/ i
! Y( M' C! U% l" d) G0 NSELECT * FROM MY_TABLE* P& J. T: h) W4 Q" u+ [
1 v$ F9 R% I( u, @* z1 `) g
A.如果可能,用把查询转换成存储例程) H: [- M, m% }0 ^- `0 |0 x; {
B.如果程序允许,给查询指定返回记录的范围8 p4 v0 z! c! R- P$ q( J
C.如果可能,添加where条件( e9 T3 }, N5 \$ U/ r% j( _5 T1 G
D.如果DBMS允许,把查询转换成视图! i" } h8 j0 g" R
E.如果DBMS允许,使用事先准备好的语句4 c. \: a; L* j2 w+ ~
0 u5 K/ V0 [0 `4 |$ U r- {8 X4 @, ~0 G) x
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
7 O/ w4 f) M% q, l5 ]! d1 x& }' a: _ S b! Y( n
答案:____________; }& I7 Q, B% `: z
% K, L: V; k- j l* q& \+ P( e
$ N% u4 b$ O* n$ W7 A! ^! @8 K2 x3.内关联(inner join)是用来做什么的?
' y( W. i9 v( O9 S3 \. d
! _/ R. Z' ^9 N9 T# j) C. k4 ^! WA.把两个表通过相同字段关联入一张持久的表中5 d2 Q5 |/ o4 }2 q! e
B.创建基于两个表中相同相同行的结果集
5 A; j: F( k6 `: O" R' `5 S; wC.创建基于一个表中的记录的数据集/ e5 L7 n: K) X9 O- S! ]& H
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
" z+ k. ^8 N1 M% E0 `8 IE.以上都不对
6 v( e6 u5 }( \: v
2 P; e; ]3 m6 B
: o6 _& }& k& }# B6 s! E4.以下哪个DBMS没有PHP扩展库?
3 ?. i4 _; O0 B. u& H1 @9 V3 }% U
A.MySQL
' S6 q1 d0 D# h1 NB.IBM DB/2+ v2 X, l" I4 _3 B
C.PostgreSQL3 C$ S! y$ ?5 q: _ G
D.Microsoft SQL Server4 ~8 p6 `" Z5 G( {: d4 W
E.以上都不对
# h6 J/ [( T) S4 e1 Q: E* y' \7 A& o4 D$ h( b% a
& g4 C4 |! U. G7 K) y: |" p5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
0 |8 r7 N- a3 t$ ^" `
! Z& {! ], Y" q" U( G _# F5 ]<?php( U# H! b; X) [! d# |
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
7 W& J! c* t* j3 D# v, r- ?8 T?>
2 Q" a: ]. n2 T" ~8 p: {' {
" M0 G) {& g F" @$ _A.MYTABLE表中的记录超过1条1 `' f' O6 B! q$ v0 s
B.用户输入的数据需要经过适当的转义和过滤
! y2 x) e/ @; M! A% ~/ JC.调用该函数将产生一个包含了其他记录条数的记录
0 p: n( W0 M+ i- c& C K3 U5 i% b9 wD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除4 B( }: K' [ h, e" D
E.查询语句中应该包含数据库名9 u1 @# }9 R; m/ P+ T
+ J7 i. ~% B; k- H' I
& e% u) q" C% S, R7 b5 X8 H1 M4 \
6.______语句能用来向已存在的表中添加新的记录。
7 O1 Z/ V5 t# d* \% ?8 C0 b% Q( F
答案:____________
$ f( U- s: M1 z: _8 a- Q: l& c$ R7 k8 l% K3 _0 w5 l9 S
* }: w6 A6 L' J4 D3 J$ U0 `8 s; ]
7.以下哪个说法正确?0 u: ^* Y/ f# O' r% W
" b4 Y- P9 r5 F( y x/ N
A.使用索引能加快插入数据的速度
3 x5 b5 e9 q$ d6 dB.良好的索引策略有助于防止跨站攻击
6 w' b) q9 z0 o; c/ oC.应当根据数据库的实际应用按理设计索引
/ H! u+ n6 j8 H; N# e. vD.删除一条记录将导致整个表的索引被破坏
' ?$ X% B1 h5 R4 R) Y' N+ R, B( j+ h+ hE.只有数字记录行需要索引
3 c/ _* ^ J0 e) S: C( c. V, ?, N/ n" ?8 R ?+ G$ A8 w3 @3 X
8 ?/ X: B) I" d: j7 W6 ?2 w8.join能否被嵌套?
, ]4 c1 a% }7 V- d O5 u0 c
- M6 T% b. V# A7 |2 a( PA.能; P+ y% }+ s# O1 l) C; E
B.不能0 s }! F% l: J6 v5 ~* P" w) z
% x( p; ]+ w( `2 T, K3 F+ E. C6 p7 Z5 M8 b. i3 F
9.考虑如下数据表和查询。如何添加索引能提高查询速度?' c; y5 q, E- S8 U, j: F+ Q
: l* |! w1 r, a$ e7 l
CREATE TABLE MYTABLE (! i- l7 r8 N" X
ID INT,1 y# n% v' z- w) \8 O2 |: _
NAME VARCHAR (100),
' n, n1 W6 J7 T/ d7 b1 A/ o/ n) g; m! {, uADDRESS1 VARCHAR (100),
" `1 z, ?8 r9 u' dADDRESS2 VARCHAR (100),
& o& R3 s+ I7 L3 B0 ]! CZIPCODE VARCHAR (10),! O) f8 z" ^8 C0 b x5 M
CITY VARCHAR (50),
8 i% I6 e; J3 o) b. p. m- WPROVINCE VARCHAR (2)
/ ^) F; N' B0 u4 [# ])
. y; N( W; u; \* E* y6 }$ _SELECT ID, VARCHAR x# n( X' {# y/ T
FROM MYTABLE
@& C: \4 X* l- d% w* ^WHERE ID BETWEEN 0 AND 100
6 a# c7 m0 ?2 w7 W3 qORDER BY NAME, ZIPCODE
6 i; `! }: E) ^) Q
1 K- w8 s+ u" Y* N2 R" s# f O4 SA.给ID添加索引
8 i E0 t a- }3 Q- nB.给NAME和ADDRESS1添加索引
$ |6 ^4 T5 O' z6 f3 p0 \C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
5 u2 J# B2 U t/ I/ lD.给ZIPCODE和NAME添加索引
, ?* U/ x' x' o) \" {$ m* i' I' ]E.给ZIPCODE添加全文检索$ L" U* q& y5 l# g$ X# J C
* ^- q- a W0 r2 q+ C& v/ X/ V7 p7 P6 @
10.执行以下SQL语句后将发生什么?5 c+ Q# G: l: _8 D
% }" T2 [* {4 h# C( iBEGIN TRANSACTION
( r- J# e) q/ P* A* V0 O! RDELETE FROM MYTABLE WHERE ID=1
" y: p" X+ e/ {3 u, |% rDELETE FROM OTHERTABLE
3 V% W0 M% g. \& C1 SROLLBACK TRANSACTION
$ k# M) m# P n6 \1 Q. D
/ ]+ L V! @' G* ~0 w) AA.OTHERTABLE中的内容将被删除# j4 j* \( e, j- o+ m" k4 k: Z
B.OTHERTABLE和MYTABLE中的内容都会被删除' \$ ^% o8 X P- ]6 _+ ^
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除) G0 C/ s! S& S, q
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
, D! r7 ~: x+ g4 dE.数据库没用变化+ z/ ]' Q+ z, y+ E1 B) y3 l
# [/ k: N( O* C& R1 o+ |
9 K7 R9 ?: @6 a4 a# e11.DESC在这个查询中起什么作用?
, ]2 b1 y! S- }1 a4 F0 \* E# R. [7 e, V8 y( A" d6 y, b
SELECT *7 w1 y K% P6 T$ f1 T1 f! ~6 H) ]
FROM MY_TABLE
% U6 G4 v3 Z2 h1 P& y3 P, qWHERE ID > 00 k! Q+ J5 D Z d8 [; U2 Z
ORDER BY ID, NAME DESC
0 |- I5 U( d) [, G' E2 Y, \) X8 Z: `
A.返回的数据集倒序排列; n" B0 f* C7 c5 Q$ |+ o- D
B.ID相同的记录按NAME升序排列
/ ?. p: e' B9 v5 Z% P) @2 DC.ID相同的记录按NAME倒序排列
: f% A& A, E- ^" d6 H# x8 I$ _D.返回的记录先按NAME排序,再安ID排序 f$ H0 L- n, C
E.结果集中包含对NAME字段的描述# c t5 s9 N5 A5 [, T7 f4 ~; T6 U" a
$ b; m! W' p5 u' T; E y, w6 y1 R2 l
; ?+ r9 O" O( M! A9 g; x4 R12.以下哪个不是SQL函数?0 l9 ?$ o0 }( ^& Q) q
1 ]9 p, S' J0 b: ^$ p! `
A.AVG: V. p" Z8 [8 e+ x* f* f$ l
B.SUM
) V. F z+ P5 d0 JC.MIN, J0 i. t6 D3 m% j/ \, Q% y# S* y- B
D.MAX0 y# w( U! o2 w- {- J" ^% j1 l
E.CURRENT_DATE()
; u; z8 v5 W! Z% ?
/ s1 H9 \* X w6 F" j" K1 G' F A/ ~: R% `! S0 P% ^
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确? ]) Z+ G! ~8 U" K
* u: L5 o2 L- k( @A.该字段必须有索引
% Y- W% Z; _# ?* K- t# cB.该字段必须包括在GROUP BY条件中9 m# c; F8 \# e3 |' v1 P; O% y
C.该字段必须包含一个累积值4 q5 \* b. ~! }& {
D.该字段必须是主键) K6 O8 d% u6 }
E.该字段必须不能包含NULL值# }! Q! S2 `6 n- j. r) x
( X* p, g: q* {
# p- w, i$ H" y9 P14.以下查询输出什么?; v* a, R! Y1 G" U! ~
& n7 P/ ~. |6 A- ~# p# k
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2: w, L8 h* ^8 n, W5 Q
ON TABLE1.ID <> TABLE2.ID
2 o P4 E/ V k2 f
$ U' [9 ~* x# y2 s) q: oA.TABLE1和TABLE2不相同的记录# V3 n. Y7 W7 @2 a# B
B.两个表中相同的记录0 z2 ?/ ^+ v/ C. R2 |' [( l
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数2 m f. ~ E* w2 E* g1 Q4 V# @
D.两表中不同记录的条数
& a; p$ y& i7 jE.数字2$ h# @1 y N/ k ~3 N. S8 h
0 f2 f% `- k" Y2 s
( `9 x5 x- `: k+ W H6 J1 o- A4 |15.______能保证一组SQL语句不受干扰的运行?4 [$ x ~5 ^- b& t5 H- o! m
9 G9 I4 ?, ], `+ @1 @- n
答案:____________: s; g1 K9 K9 u z! A
4 X9 R `5 m, }6 X3 z: m# Z- c
7 N9 w7 B0 b8 A' r
' P# l( G0 `! E; t% c答案速查
4 W' e' M4 x+ S1 p: N- w/ ^: q0 n1:BC
& y; n* x, {- Y2:WHERE4 C B V$ L6 x( M0 w# a( n
3:B
8 ]8 x4 ?4 s+ x" l4:E
8 D- l- | c; H/ Q$ m5:BD
. l. T5 A% b3 x6:INSERT
! c) f0 J: S8 L1 n' q7 F/ o7:C1 l D6 U/ ^6 c/ Y" u9 L& I
8:A
8 E9 V" J: c( l9:C( V/ w [6 [8 _8 J+ Q' E5 ~
10:E
1 y3 O) U) W, p" m. [/ M5 N3 |7 x: @11:C/ `6 \4 |- {: c2 @/ ~
12:E
( v: x5 m# i1 U( U3 g7 G13:BC
* U* Q. W ?1 ^$ v! w. x* w5 A14:C+ A( w5 Q% N( y3 M1 Y. M
15:事务
# B5 ~/ J4 t1 l( d6 T% A. ? P% [# e( Y5 a' G/ ]
2 h, O9 ]& u% b# W, E+ l
4 H, |" |- l1 l- {* q) z答案详解# z' e$ |2 C3 O o M
. U( f7 y% J8 a
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
o6 P. Y3 p+ f; L) D
$ o% P L N, [& Y7 C2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
8 r7 B0 g: F3 l/ l" ], V* v; T+ F) |4 Z9 j( k) ^2 u2 P9 C/ o
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。; T% o- J( G% ?3 I6 } g4 d
3 }$ ~0 k: R/ _* p* ~
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。! d4 H V2 {1 r/ H
9 ^( Q9 ?; R/ `8 r6 a5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。6 Y9 \1 _+ d; [0 E0 C
* C$ M3 C# a7 T4 ?! s% v5 \6.答案显然是INSERT。* E/ e1 I5 J' s% f) s! L8 L) p
" T3 @! T* a2 a A" D
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。$ p! _( K$ @3 i
3 R! u% Q& m$ q8 L* z( S/ U8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。3 D& ]4 Y$ u) N. A: ?1 T+ L
0 {/ \. M" S/ T- F
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
& y2 ?. Z4 S' Y* m8 M; x
! ?: f( P( ^ ~# B7 s4 i10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。# Q4 r( P) s. j a5 k% V. f
- T( E$ [$ d7 f; D1 `, G11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
5 i2 ]' p& g; [: I$ ~, S8 f$ E* l3 x6 `
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
, ~/ s0 y* n! n2 K
9 w3 B4 }4 P/ P$ S' `13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
8 `/ g5 e5 @4 K2 M$ p I. a' P/ `# x
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。* m0 C) P2 ?9 u1 g: v
1 c% H' b# l& k9 o" g- B) @, F
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|