  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。. S1 a M4 O9 ]; n! e5 ?
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
2 i: B; ]6 { }9 Q6 h本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
* H2 D+ ~4 l! o8 q. @" J% ]" z( d6 P
* a' b8 n& ]: |: M0 w% x. c
" X, }2 ]1 M, f3 p问题
8 r6 ~, u3 M6 P) [) z$ {/ e# x' c) O) i0 [) D" f
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)! T/ y) A1 ?" p5 z
: B9 H/ ~6 L4 u1 R* p! z0 W- f' s
SELECT * FROM MY_TABLE& j% c C& j& }
0 i3 ]) `6 h, L5 {5 `, |A.如果可能,用把查询转换成存储例程- a/ y& Y6 m6 L. H1 z) s+ H9 \
B.如果程序允许,给查询指定返回记录的范围4 D- t% v/ z2 C4 k% Y" ?2 [2 s
C.如果可能,添加where条件
# }4 e2 d, M* ]6 w- |$ V7 bD.如果DBMS允许,把查询转换成视图
. L) q3 ^* Y3 _: |7 L- s$ D eE.如果DBMS允许,使用事先准备好的语句
4 \0 O) [! z8 {5 \0 ~3 i0 i( M
; b7 ]. h2 [ i! P6 G2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# E- t8 w- X3 i e! K: z/ Z5 d- x7 {' P i! i L$ N9 G
答案:____________0 o0 Z! J0 D/ d3 Q/ n4 R
7 S+ ~( N7 ]6 o3 J2 z6 d9 A I& X
( f) t; m+ X5 q
3.内关联(inner join)是用来做什么的?
; ~1 M( Q% ~, B* ?0 o2 c; ]; I6 y) y
A.把两个表通过相同字段关联入一张持久的表中
% b3 p* w1 ?% c4 ~B.创建基于两个表中相同相同行的结果集
, u4 i$ H9 A0 \' |& |C.创建基于一个表中的记录的数据集3 Z- K) x/ [. X3 u1 [ S
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集* o& H% E$ X$ V* c$ u
E.以上都不对
@6 w& R0 b' ?! J1 r) r/ c1 U! q
& v8 f5 [4 D) B5 Q1 R: ~! `' v& t. J9 F5 W0 X) V" i9 K3 v
4.以下哪个DBMS没有PHP扩展库?
7 i- w z {+ x& o& L' |0 L1 D( e$ e8 S7 V X; r9 P8 a
A.MySQL1 r. A; J) N6 m7 Y, }* \
B.IBM DB/2! U; f. C, r. p0 f
C.PostgreSQL: Z4 z6 x' z* ~4 v1 ]
D.Microsoft SQL Server
' z/ ^- S* ^& Q' D5 b, t9 |9 wE.以上都不对" S" g8 n7 t8 b- |
% H% Z& ?9 J ~/ z) g
" m" B3 w7 K W# z3 O! x' O7 u8 `5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选); F4 }- w% e6 k" F8 E b2 M& X2 ?/ E
2 Z D, |- [# w- t<?php* Q6 D9 F& V: ?; y0 u
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
' a4 g4 I; U& {* y9 z?>
" s* m; x' O" k9 ]+ l' B
- l% r/ }. @: e: B4 GA.MYTABLE表中的记录超过1条; N+ u7 s6 v, ^- P- X
B.用户输入的数据需要经过适当的转义和过滤" Z; @/ O! d* v6 m- {
C.调用该函数将产生一个包含了其他记录条数的记录
0 ~3 l5 Z/ z! E1 J/ ?D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除; g) x! Q4 Y) U" P {) p: \
E.查询语句中应该包含数据库名 t v! p# m7 y; I$ c# G
% r, |/ K7 m( e- Q8 V
8 y4 l3 e9 u5 e4 g, e7 A6.______语句能用来向已存在的表中添加新的记录。; D+ j; |% k$ `- {2 l5 i
2 D% Y1 R+ t$ y+ h- y4 n6 j# g2 p2 {
答案:____________2 e# T K2 h, x5 P1 Y' l
' e) N5 {" U4 g2 ?1 f. |
" _: E" e9 F2 ?/ Y1 @
7.以下哪个说法正确?5 m) f7 \: ?) U6 Z
) e* h' g0 H# \+ d) G" w, p3 c
A.使用索引能加快插入数据的速度" v# R, ]( P6 a' S* J6 H5 P& e: c# @* H
B.良好的索引策略有助于防止跨站攻击% V: j9 s6 Y+ s- J- T/ O# C
C.应当根据数据库的实际应用按理设计索引9 C& \( p! {! l7 d2 S
D.删除一条记录将导致整个表的索引被破坏
! L9 f6 ~: W2 Z+ C/ V6 NE.只有数字记录行需要索引3 d0 `+ F# X) g" D+ R4 [) i: G
; f6 j! m$ l* x, M
6 s2 F5 _ V% c. `* r$ M, m- u. W0 y8.join能否被嵌套?+ l) `# ]& z+ m; l
0 D3 q- M; ~) o/ o4 v; s" q) IA.能
. o$ ?8 R) P$ yB.不能
6 P' ^2 K6 _! D; ~4 a$ v1 w( m7 ?8 \8 b7 W0 k
4 G( b1 x" ?. s7 _5 v; \3 O
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
) x. x' A& q7 q. x9 @, L. ^; O# A2 ~, }( M
CREATE TABLE MYTABLE (' T- d: ]- c+ S8 ^" y$ P
ID INT,; a1 O: i; g: c, x* Y! Z+ H
NAME VARCHAR (100),9 Q) j8 [! @+ w$ S
ADDRESS1 VARCHAR (100),
7 G" n! I4 j6 x# yADDRESS2 VARCHAR (100),
8 e+ c; F# a2 r- G+ ~1 z# _ZIPCODE VARCHAR (10),3 G! s. a4 T0 [7 b
CITY VARCHAR (50),7 u- ^4 D: F# m8 i) `- ]
PROVINCE VARCHAR (2)+ w% k2 v5 j0 \( F
)( _5 {# }0 p9 c2 T
SELECT ID, VARCHAR2 ]& {, r* t* f$ r
FROM MYTABLE( f1 j9 r: |5 o0 d
WHERE ID BETWEEN 0 AND 1004 G' S3 L2 E& m# Y+ R1 |
ORDER BY NAME, ZIPCODE. V. }) j3 S2 P4 a
( r5 D r% c1 _3 z3 c2 O0 L
A.给ID添加索引
- p: o' M! W0 F7 L. D4 ZB.给NAME和ADDRESS1添加索引
; g" k2 F3 v6 @+ D; UC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引1 W% p2 w: G+ G# z
D.给ZIPCODE和NAME添加索引! U4 u- Z0 t# B/ t8 P. Y. b1 v7 u
E.给ZIPCODE添加全文检索
- ?$ v9 P# ~* b1 e9 I( Z
4 h+ x# [, p8 ~' ?1 Y# P7 }
/ N0 K: B3 i8 f0 B5 j3 {10.执行以下SQL语句后将发生什么?8 S W( v' L5 f$ X4 N
( I* ?- Q3 h& p4 b7 ZBEGIN TRANSACTION
; K4 S. e k' j8 zDELETE FROM MYTABLE WHERE ID=11 C$ P7 Q2 o3 s* c3 O' q
DELETE FROM OTHERTABLE$ i. o5 M0 O2 T3 c
ROLLBACK TRANSACTION1 y5 V6 O0 v4 B
; {' Z" L! d9 d3 m' ]/ F& W
A.OTHERTABLE中的内容将被删除" ?0 @( x( v( }
B.OTHERTABLE和MYTABLE中的内容都会被删除
. ~( T- F3 d2 A. m2 s1 q& TC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除- W3 \9 U. o7 R5 ~+ o# c K
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
( T6 g+ x ^% N# l% w1 V7 TE.数据库没用变化
/ \( H; C, l1 p* x+ ^" C* `8 T9 o4 S
/ N3 Z& t( E: q5 q
11.DESC在这个查询中起什么作用?
- s5 t/ w! n' i! S! G& C/ d, ^
+ d) q$ h% H$ Y/ \) l5 h9 d' o4 {2 XSELECT *
- i% A# Q8 R" Z3 I% EFROM MY_TABLE, n5 }% I" e; a" L6 h
WHERE ID > 0 {1 a2 z5 n" m% g6 E$ G
ORDER BY ID, NAME DESC# q n7 v# }8 p: Y: D$ M
& b K9 v% ?3 e; r" E, s0 n
A.返回的数据集倒序排列
/ H% I: E% z- C" S3 K+ l( y R# EB.ID相同的记录按NAME升序排列2 W- g# d7 ?, k
C.ID相同的记录按NAME倒序排列. x7 H9 U' K, `+ ]& A# X) v; L( I
D.返回的记录先按NAME排序,再安ID排序, d1 c9 h9 J0 A: C% y6 \- `
E.结果集中包含对NAME字段的描述
6 ]1 L! G! ?3 _+ E1 z7 H n. x% L$ x. k- ^7 i; ?! ?9 }
4 Z, w) ?. i( |) t# k& d* M$ U
12.以下哪个不是SQL函数?( X& }# R1 D' c8 O
+ W: B& j6 S! W- p! A
A.AVG4 `( F& _4 I* z+ [- n9 c
B.SUM, U; |$ s) G9 C) Y1 e& N1 ^1 p2 }" r
C.MIN
+ U$ p% n) g- g) [D.MAX
6 \! r+ j. ~. A# y" s1 M6 y r% D, fE.CURRENT_DATE(). B1 J3 }' W' `0 c3 B& T
, f2 e. J; Z* ^% g2 w
2 x; K2 R+ W& f/ e13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?" N _- Z$ d7 P5 o% F* j
2 L) f1 ^& U2 W8 xA.该字段必须有索引! l- n9 \5 B: \5 p0 g: g4 u
B.该字段必须包括在GROUP BY条件中
' Q4 h7 b4 h1 y! P& aC.该字段必须包含一个累积值' m7 T, `" D" Z+ n, @, W. ~
D.该字段必须是主键
3 R6 ?" R: P6 T- IE.该字段必须不能包含NULL值
$ w- p5 e6 Q; z# d' T! l" r! j% C, ^+ K) m
/ g* D% v% d/ p# O14.以下查询输出什么?; j, v: {; S+ }) O
6 z0 D+ X! W0 C# |$ R; J
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE22 u* Y ^. z* t5 \1 K* f( ~
ON TABLE1.ID <> TABLE2.ID- O# ?& I% X! E- w# p0 h
9 z3 @6 [) R" N% c
A.TABLE1和TABLE2不相同的记录
& {# I+ v. f/ L, J. K; A- F; _! ~$ ]B.两个表中相同的记录
7 S7 m8 g) M; b3 \' bC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数- I! v! F$ W) Q4 M+ o6 q
D.两表中不同记录的条数
+ T! v" c' J" A' v- t5 n$ `E.数字2
& B+ U7 a7 V ~6 v N- n7 @. E5 }& T, Y
# ?/ {. ^/ H3 ]/ C* e6 y0 g15.______能保证一组SQL语句不受干扰的运行?4 D! S: Y) o7 j/ _1 Z2 i
Y) F. {& e2 M. o1 n; C# }答案:____________$ V' X" A1 s( E$ ~* H6 S! K
. g7 o, s% S5 Q# f2 ~7 _5 M- q" r, N* Y: f( T: I# `) t: ~4 v! O/ i
' r# @( Y* m7 x9 \( n
答案速查) _2 E. @ b* q& x1 m% j0 B
1:BC
9 a8 E1 T. Z) s2 C2 Q2:WHERE; L# B) \4 |; ^* w% y: ?, u
3:B
N v* F5 o6 R4:E
, K' q1 M8 V4 Q& D7 [) z6 U2 q& ]5:BD
) p* T3 `. M& [; p9 h: Q6:INSERT
& l4 {* Q: H- ^* _1 v2 O7 G; P+ W7:C% v% h3 I$ T+ R% b/ K/ g1 K" u
8:A
8 @) ^: U% B: [. `/ c9:C
2 j1 ^: c. y) L1 I6 I10:E
' S3 d" S) c& X' }5 C& K4 W8 J11:C
+ s" W- M7 u' k/ g+ P3 E+ N12:E4 r# T3 }- u- Y" L" U
13:BC" f* D7 A3 p1 r g: W
14:C
! s9 g# ~0 S3 @7 v2 L) y15:事务
7 h0 p! D( A& O% _. L! b' p
0 I3 z6 d9 P" u8 x- a' V
- Q z9 X/ L2 y* S
. f) T) q+ S* B0 w' t( ^答案详解
+ ^! P" ?" [. j7 R! d- h7 X; P+ P) D( M. z" @
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。4 a, Z7 E. k O. H
0 }% U6 i- j- }; S3 V! A
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
! N8 h1 _% E5 B$ G* Y. }+ e9 M9 |: ^6 t$ w
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
2 D! q9 u3 ]% F# U8 t* }% x5 o+ n% S5 H( ~( N* J
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* j% }3 G4 H! G
3 f$ R1 L9 }, O4 h* Q
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。6 s5 B; j1 f; w: r# w
6 _! [& t9 w! v2 T
6.答案显然是INSERT。* y5 W: J/ d' z2 ?1 Q1 z
0 \) z4 N7 v. f+ Z! `3 V, ]
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。: k; @8 ^, c9 U
[# P( v1 N* l# u
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。. T9 R3 m7 c. ]% E+ E. m" ]. r/ u
1 P9 o/ V; A. D9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。1 N* x/ G" V% |) e- t5 }, n
: s, V4 |9 Y. z& O
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。; d r+ \( V4 V
% U* d2 B- ^7 E
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
9 a8 }( {) O( Z% W2 q7 j' l8 v3 R) G: w
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。4 n; h5 g* \( T# t% f
1 ?( K( n k$ G2 h& Y( I% u
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
0 e+ U2 Y; x5 ]! O/ x4 s8 J: |
+ t; Z9 u2 q3 U1 r- X14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
) i2 ^, x% r% ^1 r8 P( `, ]' D7 u9 Y2 b c3 y
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|