|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14325
- 金币
- 2448
- 威望
- 1647
- 贡献
- 1396
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
: o5 l0 B- v% i7 L0 a$ W! j9 ]/ RPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。8 M( \8 x) }; B4 X1 s, Y8 L5 ?. I# K
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。/ Y2 q5 Z, F! G8 N" Z K: _& @5 w
* [/ I- k1 ?; T# p6 x( I% Q* Q3 l$ M; C8 @4 K
问题; ]5 E2 m# z1 V/ `( {
. |7 w1 u+ j7 z% e* C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
" v4 G. K1 f- c+ F+ w; i' G2 V- @7 w+ |
SELECT * FROM MY_TABLE2 C& a. p! {* a" V, w' ^
2 D0 _) F) e4 |9 y! H, }
A.如果可能,用把查询转换成存储例程
! k/ p, R8 g& w7 T/ k7 B2 HB.如果程序允许,给查询指定返回记录的范围, {" M F- R/ j/ \0 E
C.如果可能,添加where条件
/ a- z! ~" X$ R$ r8 \ ~1 U4 SD.如果DBMS允许,把查询转换成视图
4 i+ F \- q3 dE.如果DBMS允许,使用事先准备好的语句
) H: h2 R9 u! U0 k+ H: n6 q' Q# E
3 x8 C* ^; x% e) O
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
* X( |7 I9 M& o* b/ n: d/ s9 V' ?
: L& O, `% l8 b答案:____________
, s* ]1 h) C% o" s1 ]3 k+ ?
" k7 J3 @) ^" R* \; ^# S5 M- d" G$ k8 R2 h2 ~
3.内关联(inner join)是用来做什么的?
5 I6 K8 k# V- M) S$ n% r8 S( D& a: K% K6 [0 g5 ~& z
A.把两个表通过相同字段关联入一张持久的表中
. n, Q5 U/ f. VB.创建基于两个表中相同相同行的结果集
" T' j% b: ^3 oC.创建基于一个表中的记录的数据集
: p4 j4 A8 N i9 ID.创建一个包含两个表中相同记录和一个表中全部记录的结果集
9 X$ B/ u0 S$ |& m: s# y" z+ LE.以上都不对# i- v, B" c4 G! G4 W3 N' {+ A
S) u3 O" F+ Y- K, X+ D/ R9 V& L* h! F! {' o
4.以下哪个DBMS没有PHP扩展库?4 ~* s: K! R+ `! M; S1 R' y
2 x! M: \ o" ~& z r
A.MySQL$ b; q! ^/ T- \1 j: D! r4 @4 @
B.IBM DB/24 o) ^. t3 L' ^7 G* G0 ]7 |
C.PostgreSQL/ W0 j. s( w/ h! C% n. I! f
D.Microsoft SQL Server! w! b- X. T r C
E.以上都不对. S1 o( k5 J4 p N9 X/ N
) p0 f- w2 d1 ?" h! ^! ]( N% \, I% I. v0 y, |+ v
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)6 `8 O5 `, \5 b: T R
$ X( X. i$ G, Y* U2 [1 e
<?php7 {# \4 f& T F% j0 X# S7 Z8 _7 a
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);. ~/ [6 w- T y! V/ g: d% f4 E( y
?>
2 b8 {6 w& r, | x& y* e8 z' z! ^/ R6 Q8 T. X" W4 f5 W& F9 ~9 ]
A.MYTABLE表中的记录超过1条
P3 L. G n. Y zB.用户输入的数据需要经过适当的转义和过滤
$ Z+ N; {4 Y( ~# ?% DC.调用该函数将产生一个包含了其他记录条数的记录
& A& l- n7 a/ [D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
' L% l, Z7 ?! \E.查询语句中应该包含数据库名
; x" j( L. v( m8 X6 I- D* U
3 @7 [6 \6 Q8 o! `& b* U z1 _7 `- d ~. w
6.______语句能用来向已存在的表中添加新的记录。: Q0 h+ g+ n4 z* g
$ H: ^* f- D) U( {6 W- N' c
答案:____________
6 o& l2 R5 C/ z
; k9 |4 Y7 P: w3 {8 c
]" U, E3 e$ r- Q5 C. K4 S4 X- b7.以下哪个说法正确?$ y0 c$ v. n" Y! M$ G/ f6 @
p/ H* }6 |, Q" g8 }& XA.使用索引能加快插入数据的速度
- Y3 \2 M) j. g" V2 @7 x$ }. x! Q& `B.良好的索引策略有助于防止跨站攻击/ e' {8 x! ^% i" E6 r* G' W
C.应当根据数据库的实际应用按理设计索引
( g! G A( o4 N7 ]! oD.删除一条记录将导致整个表的索引被破坏( R4 `" i' g; a" G- j
E.只有数字记录行需要索引6 x: k0 m* S$ u1 O7 k$ [
+ X2 l$ `6 \ Y; d( y
5 X& X) ^2 f* A& z4 M8 m( Q7 ^8.join能否被嵌套?
. M* y4 t+ w5 n4 S: f E- J7 Y( b; W/ v3 c: ^. |1 u
A.能
" y9 V Y. y3 t' V8 M4 m+ fB.不能+ b* F; a3 r: Q2 J* Z
+ H4 s- Z+ q- Y: f" t6 u3 c6 G C5 S7 N. D6 B k0 `
9.考虑如下数据表和查询。如何添加索引能提高查询速度? u( |5 _4 _9 n( N# L
% E3 t7 t2 c, Z" u: F+ p
CREATE TABLE MYTABLE (
N: E/ c5 C2 G/ OID INT,& Y% Z P7 `3 h* T1 d8 |
NAME VARCHAR (100),6 M% \9 p. a L9 H H9 q2 {% n
ADDRESS1 VARCHAR (100),3 s& F, w! V0 H4 |6 g" p
ADDRESS2 VARCHAR (100),9 U2 Q6 O, I2 w; L- \: f8 h$ b2 C
ZIPCODE VARCHAR (10),* K0 v, F& W( y2 E0 A
CITY VARCHAR (50),- D. X) w( s( N
PROVINCE VARCHAR (2)! h3 K+ H; h0 f* o* v \) R# Q7 S
)
Q0 v# p4 N" E$ O+ `SELECT ID, VARCHAR( Q% H) v5 Z" f5 X! X: B2 W
FROM MYTABLE2 L! Y% V/ s7 c9 j p
WHERE ID BETWEEN 0 AND 100# R4 P# S6 y. A5 `! I
ORDER BY NAME, ZIPCODE) o9 e m5 x9 z9 j, D9 I0 s: s
$ n7 u$ B" P c" mA.给ID添加索引
9 V- h/ z6 R+ q0 M! p$ JB.给NAME和ADDRESS1添加索引7 o& `/ Y$ ]+ v j; }
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引' ]+ C0 {$ Z6 S, m' s( }
D.给ZIPCODE和NAME添加索引
3 d! [) k# |" w5 N J+ YE.给ZIPCODE添加全文检索
3 L7 K5 q$ i5 ^. n; V5 d
/ ], A0 f. E; G' H: }; E) s
. r9 G2 U! c' t `$ `4 {+ ~! `10.执行以下SQL语句后将发生什么?
4 J- A6 \3 w- @+ I$ ?1 _) A' S) N, A& R
BEGIN TRANSACTION
0 W- x, J! [# v1 ^9 Z4 z: g3 nDELETE FROM MYTABLE WHERE ID=1
; n+ I9 b5 c% Z5 e( X+ NDELETE FROM OTHERTABLE
. m0 C: g# Y; L! [/ |" u$ H5 D! |; LROLLBACK TRANSACTION
0 r e L0 V# m$ G5 T" C/ B* N% Y& E& \5 c/ |! Z
A.OTHERTABLE中的内容将被删除
0 B, ~- x1 Y5 R: Q$ EB.OTHERTABLE和MYTABLE中的内容都会被删除
' y* ^. X5 j* m4 D/ }( R3 mC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
8 H; Z& l" s% L8 kD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
4 {! ? |; N. Y. q( b" hE.数据库没用变化1 A' u8 K7 y9 h& V* Y0 Z
0 w4 \# R. \, L/ U9 E8 r% z% U5 T' M" n7 ?4 R
11.DESC在这个查询中起什么作用?
: W+ Z5 v+ W0 T, G3 w i ^7 K0 G7 U7 S- M5 u5 q
SELECT *5 N+ {( {% a2 v0 `$ w4 E' |4 k8 Z
FROM MY_TABLE$ z# Y+ e, `7 |0 \6 \! B5 n
WHERE ID > 0
, W* I7 K9 b" ~7 L8 ~ORDER BY ID, NAME DESC# j7 R% g2 {9 n: N5 c( d3 d
% C2 a8 O3 x3 x* N
A.返回的数据集倒序排列
3 T. b; W! G/ @* _) v/ V% VB.ID相同的记录按NAME升序排列7 A2 f# B8 ^ R0 Q: D$ ~# S) J" z
C.ID相同的记录按NAME倒序排列- o! @* P( V0 q- e0 H* O% k
D.返回的记录先按NAME排序,再安ID排序% {1 v, S3 V3 V
E.结果集中包含对NAME字段的描述4 n3 i2 W" k; m/ [8 U% E
8 M; W2 x2 w& o8 B/ A. W
3 c% D& y+ c9 l$ {& q, y12.以下哪个不是SQL函数?
U- G' P0 X$ h9 i0 O6 y/ r: l G: T& \ ], d% L
A.AVG/ d# }+ x; z( E. m* m, o
B.SUM# o* d: O- ^3 o7 M0 ?8 Y: l. m. Y
C.MIN
) {" d/ E$ A- m) S$ K0 U6 Y1 BD.MAX' a! k7 ]+ S1 T" k! [. X
E.CURRENT_DATE()- t. [# Y1 U( F, a8 m' ?
1 ^2 L1 R1 ]/ V. _- l/ V. E; Q) c6 T4 R3 d! s
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?' J! j8 c; S. t- ~4 p
& F& L$ ?$ f4 j" v8 s% c$ a, t
A.该字段必须有索引
( A3 ~: C9 H1 K3 W& P+ AB.该字段必须包括在GROUP BY条件中
& y* @3 N2 u6 N, Y, i; D- YC.该字段必须包含一个累积值
* K+ F' b2 k* e3 l$ ?; ZD.该字段必须是主键. j9 z; ~$ }: K
E.该字段必须不能包含NULL值
8 n! [8 X. P8 T; W, r( _9 r! n% ~2 w$ _! T ]/ i1 u; c( J$ j
2 h7 y7 L4 E. @9 W$ ^
14.以下查询输出什么?
* x9 p! ?0 ?5 u
. c* t$ P: k9 S6 B9 O. J% V. kSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
; G0 L# [% F! N9 mON TABLE1.ID <> TABLE2.ID
2 V# f8 |- t$ h" p9 u k+ C% [- \) g
A.TABLE1和TABLE2不相同的记录
$ i$ I. ^! s# C0 l7 K* rB.两个表中相同的记录
X L+ V6 Z9 D) p" O( W- zC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数& s- ~5 ^* ]/ d* {: M- {
D.两表中不同记录的条数* K' r% r3 _9 \; d$ t5 d! P
E.数字2
% w+ e$ `; i: ~0 K! l0 t
6 Z1 r0 y; l0 @' N% D0 j7 a, P0 w' U& b$ L
15.______能保证一组SQL语句不受干扰的运行?
/ W0 X! y. D$ y' R) C1 z& j5 H4 L& d0 T7 p" K9 Q& {
答案:____________
% x9 f5 G% v: Y- ~) o
% X6 F0 m8 C. G+ s( X
5 M6 I2 w* h6 _% p
" i" M: N& p* Q% J6 A( p答案速查
- n+ @5 ]# y( O1:BC
9 L+ r: Z* L, ]$ a; `* M# m0 r: b2:WHERE
$ ~- ]6 M# X$ D6 D8 R2 `3:B
- `2 X5 \/ Y$ z& w1 T4:E
6 c, [: S6 W! v' h" Y/ D5:BD
4 W, G5 U* O! h* @; \. p$ A6:INSERT
! f' |; L3 a4 C7:C
# y5 U$ w. C# |. j: H! z' W8:A5 b/ d- A6 p4 S9 G! q: \: H& Z ?
9:C
$ _; ]8 T" v' L% k# A4 T10:E0 ?# L) h: ~; Y$ }" d
11:C; i. u4 s0 }9 l7 X; w
12:E
' n' {' N! a4 l8 [9 ^13:BC
3 j' X) x L& ~% u1 w( Q' M14:C ]$ V4 b: E; P9 @; R/ I; R) H1 \' [
15:事务
, \: c+ M x2 i6 | h4 x; D5 q. d! e1 t& N" Y# g. f
1 R& `( J' s; P& d3 n$ H2 O
, g& C1 L7 w/ H; Z) p
答案详解$ t( V7 Q: {8 ]* @7 L1 z# ?/ ]
$ l5 r* O5 `6 ^" L8 W9 h
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
, O9 K+ m" \7 K8 b& q' }) h+ e8 ?" B/ s" |" s& |$ l& V; w
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。6 z7 Q0 _, M% z
4 j- x2 f. z8 L- ], U1 j: L( d% I3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
2 H; C5 i E) ?8 {2 g# l$ k" d3 x9 a" S j
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。: Z& O- E& `! `5 J' a
6 x# t( L2 |& E& B5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
- o9 v f2 X1 s7 E! Z+ t- s' a) V9 N9 U' j: P* M8 f2 ?. a
6.答案显然是INSERT。8 n" e, T, l! e, w( E+ _+ k; b
1 q. l4 ]! K' a* g) v
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
, x( e; f# ^% W7 g8 e8 v
0 a( X* Z! M* U" U8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
4 _4 \$ S8 k) Q, m3 o; o
2 Y$ Q- p' b, k9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
$ n! L: w( t" M0 N' w! D
) i+ g2 j7 U' z10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
; E5 k7 H$ M$ ?# } P8 s9 i. p; u$ p
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
4 l. b5 x6 n2 H1 e0 Z& Q L. s
8 R( O/ u4 `6 t8 Q! J12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
) H9 {! z- z* y7 b! W0 B7 ~
8 ~- D9 d9 R" z. U6 c13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。# m m: g6 Y2 t+ n! \. w
* \3 p+ i9 Q, `4 i6 a14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。 T, {/ K2 }, L2 Z
2 t( Y4 B5 \2 \# [, W15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|