|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。. i7 h5 ]9 Q' q
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。8 O$ ^, {0 u I$ W% I0 |. |% F
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。8 G5 q# G4 R7 W/ W; Q0 _3 ^
0 k% R1 I2 h$ V/ O! d* k
2 ~# [; d+ P5 R9 j问题
; [. T) ~9 v. T% y% Y; o% U" s7 G" w" m/ F
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选), z' e" j, W7 q) E
" Y& t5 ~& o/ C% ]( E7 gSELECT * FROM MY_TABLE
5 U: B$ @: L# y% m
& _6 ]- B1 X4 FA.如果可能,用把查询转换成存储例程2 D0 P- s2 w! x& Q9 @- _7 F
B.如果程序允许,给查询指定返回记录的范围( M7 |2 r0 o% |# ?. A; o0 q
C.如果可能,添加where条件. V1 L Z* k. r
D.如果DBMS允许,把查询转换成视图
& ]( `2 V* A2 jE.如果DBMS允许,使用事先准备好的语句# {; W. T' }! g5 E4 U4 u$ Y( e' X6 w
6 A/ R/ D) _! u, Q8 R$ |
/ U9 C% m! K1 ], k0 l2.可以用添加______条件的方式对查询返回的数据集进行过滤?- {8 A# A H; y7 K" m; y
+ Q4 Q7 L9 X l& F% U
答案:____________/ q, c* o8 k! L1 n; `
( J1 _. X3 v% {0 o/ g
+ g+ W+ t4 ^ h& n
3.内关联(inner join)是用来做什么的?' m9 w5 D" r3 M& Q' Y
! D* X) N- q0 y: `* J0 w
A.把两个表通过相同字段关联入一张持久的表中
9 M9 o, [' s& W- HB.创建基于两个表中相同相同行的结果集0 \0 e3 |% ^# R3 h7 ~
C.创建基于一个表中的记录的数据集. x, `2 F9 J4 v6 [9 K, ^, p
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集! k! G$ G! T- E; l0 {7 P
E.以上都不对
/ _5 x2 D* _6 l1 B
0 p7 I( g6 A* B1 t B& T, G) Y! ^) W+ b6 A1 E+ j
4.以下哪个DBMS没有PHP扩展库?8 \2 P; _; z" c: ?9 X* v( S/ |9 x! a6 F
' w, E" z0 x$ [A.MySQL
. t* f. e- @& L! a4 oB.IBM DB/2
" k. W# b; F9 eC.PostgreSQL
# C$ e( g; c. e! p aD.Microsoft SQL Server( F, k) X F; k& W) ~* w- X+ G
E.以上都不对/ G( \8 E2 h5 p1 G% w1 h( i3 P
& W1 |. k$ H; ~1 L- J% Q
6 m! Y# q0 L- g. v) Z) C2 ~5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)) i+ r. @4 K2 A
' q% p q; N$ M5 N) m9 j<?php+ X) b- y' Y0 m( U6 N6 l
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
8 K& a+ g& _' z# \0 |?>
+ u w6 |( C8 ?' V( E3 d
& b( m+ L& U/ j4 X: ?A.MYTABLE表中的记录超过1条
& g3 D$ D X* H1 ?: m9 _B.用户输入的数据需要经过适当的转义和过滤
- c5 P+ _7 O& X* h* C" I$ KC.调用该函数将产生一个包含了其他记录条数的记录7 l l0 Z" g% {1 Y: A
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
( E' z1 `& X4 j( JE.查询语句中应该包含数据库名
3 m. ?: P2 D! y% V& f
3 ~, N! S# w/ k% t' @, |2 \, G
6 U# X; r5 r/ e* \7 _! \6.______语句能用来向已存在的表中添加新的记录。9 d" v6 N9 r: n) x
, Z4 w: R' W( [答案:____________: t& Y/ ~6 t' ]& d( r6 F8 i3 }1 [
: {+ K0 n9 B; S0 u& U" Y7 c0 M G5 f" C! k- S
7.以下哪个说法正确?, [& J* j; T- Z8 ]" @# t2 i
' s, P8 Z, b' g: `+ A* ` IA.使用索引能加快插入数据的速度
" x, v! {, {% M9 R/ r* GB.良好的索引策略有助于防止跨站攻击
8 ` Z8 O9 N* X. Q# HC.应当根据数据库的实际应用按理设计索引
& k+ o/ g9 p0 J7 ~D.删除一条记录将导致整个表的索引被破坏6 e1 S' K, l9 q, h9 X9 a
E.只有数字记录行需要索引
1 d5 ?$ A m& }0 i J: T: z& y) R, l& {( e& b. m
+ B; E$ Y' y" T
8.join能否被嵌套? r, [' f! N( f" |
: N% `+ u1 D/ c9 C, l+ e4 m) B8 [
A.能2 H g0 c8 ^/ i
B.不能
$ P1 r/ _& b# b& b: M7 G6 B6 [6 d
7 ~ [( b z( f* k$ D
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
3 {& \* v. ~+ t5 [. Q4 F2 W/ r) K, T
( k* K7 P' V9 M+ K" n& t+ S# n5 R: ECREATE TABLE MYTABLE (- t/ Q6 H; f0 u7 M- I; X
ID INT,
+ i5 b. |7 h% Q7 c' ]% p4 hNAME VARCHAR (100),
3 Q( L4 L7 G SADDRESS1 VARCHAR (100),
; C9 Z$ y% t! O9 `& v4 _* }# gADDRESS2 VARCHAR (100),7 w* Q% z- ~- s7 d
ZIPCODE VARCHAR (10),& b" t! L4 e8 H! o! t
CITY VARCHAR (50),
/ m3 [8 g( Q8 [! C; q7 RPROVINCE VARCHAR (2)
: _% F9 j% d1 X)
4 F7 P* W3 V6 n! `& _1 m j8 B, `SELECT ID, VARCHAR: u5 W. g. e: R9 {" b Y9 e
FROM MYTABLE
- W; }% i. X7 L5 T4 pWHERE ID BETWEEN 0 AND 100
/ x' E( q% d! `( `' ^4 U; [$ FORDER BY NAME, ZIPCODE6 d) ]# E' q$ I
0 c4 p+ m" _0 f3 E' p) D; i1 J8 O
A.给ID添加索引% @+ A9 x; D; g3 [& B- v
B.给NAME和ADDRESS1添加索引" j* D x! I5 g" ?0 O1 D; [# H
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引& d7 T8 m. i7 X, Q% h, ^6 |4 h$ b/ H
D.给ZIPCODE和NAME添加索引
- ]% } ?& `* WE.给ZIPCODE添加全文检索
0 E7 a# j2 W8 s- R% r/ e+ v/ o/ F+ E5 \5 E; E
2 ~( _1 O; D9 J, a Z+ l
10.执行以下SQL语句后将发生什么?
, _0 a; y( W" J9 V# J
+ c' a' `! A* }* |: f; }; sBEGIN TRANSACTION
' Y. y+ y/ X. L; `2 `" M- n2 ?DELETE FROM MYTABLE WHERE ID=14 B, y! u! W7 N8 [) l0 }
DELETE FROM OTHERTABLE
& h$ L6 q% p7 \* D9 ^9 l1 aROLLBACK TRANSACTION
% E! Y, N+ V) W3 y
f4 m$ ]6 |) E# H, t! ?, EA.OTHERTABLE中的内容将被删除( o( g7 d6 q' c- {: s/ B6 ~
B.OTHERTABLE和MYTABLE中的内容都会被删除+ [3 f n2 x( t$ G3 J4 M! N4 h
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
6 P( x" O& o* z3 SD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
% r( U3 L: U$ I% v) ]; rE.数据库没用变化
# O" G" h. Y9 s8 J- R' G1 C; f4 G- E
1 k& g4 g$ t( R/ f" Q11.DESC在这个查询中起什么作用?
1 r7 l* i% Y. g/ w' j. i( b' X. S: _0 q
SELECT *
2 E/ a' t$ g4 c. a: c3 k0 h$ cFROM MY_TABLE
1 i. E+ C1 z, ~% o( [WHERE ID > 0
1 D6 U v1 d9 X" \; u, GORDER BY ID, NAME DESC
2 L9 P, J; F- O" n5 g9 @ [1 Z" ]6 e6 P& N% y' O
A.返回的数据集倒序排列
$ r6 Q, j& h1 W" M: A+ u! {. y4 `B.ID相同的记录按NAME升序排列5 S" G6 C# b8 K
C.ID相同的记录按NAME倒序排列
, S% K+ z( B& I8 O, Q: w6 L0 [D.返回的记录先按NAME排序,再安ID排序
& ]' G4 T, G# B+ sE.结果集中包含对NAME字段的描述. z$ [# X$ N9 G! c5 M" q
r M) d' U2 L/ u
0 T) O' j! ]( L% L12.以下哪个不是SQL函数?
# \0 z8 F" X# p! c6 Q% M& h! {( c" n3 M& F6 ~ c9 U, a
A.AVG0 j h* C8 A' e+ _, K
B.SUM
$ F; ^ p) Z. Q# R5 dC.MIN: Y; w# f* N2 c4 b4 I* t
D.MAX
2 W" Y$ S a" B( @E.CURRENT_DATE()" k9 ~! r _9 z: w0 i! Q4 p
. Y: ~8 N$ v/ p) K4 v
% y t% G% h. ^
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
6 O! ^, h O$ r
' W4 i! B5 ~7 `) q% x+ t aA.该字段必须有索引
8 G& l7 `) C- m# p- n: xB.该字段必须包括在GROUP BY条件中
$ I% z; ^+ o: cC.该字段必须包含一个累积值' @2 H2 w3 z' |9 [( w
D.该字段必须是主键
: B$ W1 X( x, G4 M% k+ s7 RE.该字段必须不能包含NULL值
- Y) m; k) ?3 P0 F1 n: e* s- ^6 }3 M& x; v1 `/ ~& n
5 w7 | W8 V7 E* |# c14.以下查询输出什么?
6 E. ^; b2 m$ a9 q
; M$ A1 K5 i$ n$ ~" G6 ?# C: hSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE23 @( W' \$ ~9 X
ON TABLE1.ID <> TABLE2.ID1 E5 q8 K: L/ J+ h0 n0 {" b9 N- \
' i& z- S& I- Z) D4 f/ \! e# w
A.TABLE1和TABLE2不相同的记录, e7 _ @! ]! R& m
B.两个表中相同的记录* @" c/ l2 c: e. @
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
) q4 i6 J2 N3 F! @6 q' TD.两表中不同记录的条数
- G8 Y% O! Z1 ~1 `% KE.数字23 f/ M, j, [( @# V) I- b7 \" q
* ]1 l- g0 {7 a7 O* p% W
, Z+ O. e9 q, \# d O. ` n! @15.______能保证一组SQL语句不受干扰的运行?
5 [: S3 p: u9 w
/ y3 m$ r' d7 O5 I. w答案:____________: K. B, S/ K5 f
( f& K- ~9 i% ^4 ^! r: T, p1 {
3 V& T7 U) | s5 f1 W9 L
( p7 N/ {( @* Q
答案速查* h) e4 e' l" {' G/ I) K9 y
1:BC* n& P/ ]5 `) t* n
2:WHERE
9 O+ z4 q+ f7 r' t; M( ~; I7 \3:B+ {( w! m5 l. l
4:E% o7 l6 a3 k0 R- q! ?- X0 x1 C- r
5:BD$ Z* |4 W" L2 T# p9 Y
6:INSERT8 a; W9 |" Z6 c/ u6 p& H
7:C
8 }1 |: X' z: C y- N; g: R8:A* g6 _. ^" ]* r( N4 [/ N% ~
9:C
$ p& s; c2 u. y( \10:E
" b& }# y6 w7 z7 t, @, _, e# L11:C" u& e" ~% T) ?0 t6 ^" y+ ], b
12:E/ X- B3 V6 e' e- _
13:BC
7 [8 S/ k# M' z: f& c3 h14:C. f4 B1 f6 H! e
15:事务
9 D% b9 I3 Y/ R1 I5 X! {' G( F# q% m: n) T
b; `9 B" d1 f$ Z. L
3 w" C' b& ~: F' E$ m4 v$ V% E- b# B
答案详解4 y. ~. ]' s& I9 y ?8 B
# Z- m- g$ P9 Q6 o! }' P' b* E& v
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
$ O4 s) w$ \* c( W+ T2 T4 p6 g: E; w# p
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。: @: n% P* m- i) K0 g4 X( I! j
& Z9 u5 s/ |" z- v* |* P, n( z9 r! Z3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。7 L1 u$ d* P9 A3 n% _" {+ p! Q' J
- M0 K0 \1 R( R9 @* A* H, _' e- Y4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
, u" I9 @; ^9 S+ c5 ^7 M3 d6 ^# n" v0 r- y8 U
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。6 R; m$ ]: \1 T* Q
5 d! E' d6 a! i1 w3 L1 Z+ B$ k6.答案显然是INSERT。
( c& N2 ^8 b; r8 W6 H* y2 o2 }
/ f* }& l( F- C9 o) l7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
3 E# k) E v# }8 {& t2 R8 l& o5 l& ~& d. o: m K
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
( }+ ]6 @1 d/ r3 a3 I
: y V* c, r% i& N6 V% \6 E9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。8 {! O5 l! p, P. n8 Z: B; a
2 h: L2 t# F( Y/ O0 [' t3 C, o: [, x10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
6 l% _! Q) w/ Y: K! D
) X- }- o: y) G1 ^11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
' W# x+ L8 R3 R% h1 [* w, E) C
" X- ]+ M5 i4 `3 k! @$ F8 b- g2 Q8 T12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 k/ W* @' a, }3 J
+ M2 _/ q, w, r; v8 V13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。/ T/ I! g9 w, U0 O. H
9 L5 i9 n1 \1 n* Q- L
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。9 _; g- k; W5 U# n0 U. D6 W* U0 f
' ?9 K1 r3 }: w" j- r" }7 u6 }
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|