  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。- l. K. C: y) S2 X: X3 ~- S* C
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。) u) y! [! c! b. j0 K! C2 p
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。3 U# w5 _6 T; x# R
, s, P9 K0 |9 x8 \
3 M; N4 k6 i1 a- T2 u
问题
: t% n: x$ b! ~* u# y+ k7 F2 c! |$ A8 s8 g) C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)( b9 H# Q: L( m3 [) G
^, U$ X3 L! ^* f) ~
SELECT * FROM MY_TABLE) s! J0 z" _/ y' Z
5 I# |8 W1 k% m, j4 k: ~A.如果可能,用把查询转换成存储例程
" J8 A) m# E) E6 zB.如果程序允许,给查询指定返回记录的范围
! {9 S2 @$ s( UC.如果可能,添加where条件- A5 @; V- H% |( K$ N
D.如果DBMS允许,把查询转换成视图 d" `5 L9 e8 `8 r9 `
E.如果DBMS允许,使用事先准备好的语句* W* P% h# c$ ~- w2 z8 [
1 D" n4 e# b/ [
# e1 R) n8 j/ k1 B0 d1 }2 j2.可以用添加______条件的方式对查询返回的数据集进行过滤?
- ^. Q$ [6 F, A, i
& d$ G" D2 Z0 u* H4 x8 ]' Q答案:____________, t& k/ n. d2 L' D$ Q. N# x
0 I3 c+ W4 @6 l5 h$ X% n( x: E
4 l- \- U! P. k7 n+ Q0 S# V3.内关联(inner join)是用来做什么的?
9 B+ A2 p. D+ k8 c6 v
% N, f/ [/ F! D7 Y6 gA.把两个表通过相同字段关联入一张持久的表中# i" h( Z2 @( W9 X
B.创建基于两个表中相同相同行的结果集! Y' B+ O4 k, J% W
C.创建基于一个表中的记录的数据集
/ }1 r0 q& h7 w% }D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
# @ \( n- D$ A" H4 K5 sE.以上都不对
6 _- F! s" X* L# p+ f4 [6 G, J$ Z2 g1 f% k
8 p( p. p- o( t/ g- F- X
4.以下哪个DBMS没有PHP扩展库?# }0 b0 Z7 ]" f
& N" }* T+ Q/ H2 a5 L; _A.MySQL! D( i# [7 y4 Y# J9 x5 |6 k- \# {
B.IBM DB/2
- v. x# s2 l% H6 Z cC.PostgreSQL
% D+ B5 |& i8 WD.Microsoft SQL Server9 @5 ^9 P; J7 R! [# K( n
E.以上都不对
& [/ w- P6 {- N0 v6 @7 t" R
9 c# H" F3 Z7 s. d0 J: K% \0 e8 h; B, d) @$ f
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
* ?1 w, f" V" |! {4 R' N( R+ m6 P$ s! g: K" a! p$ F
<?php: w6 [5 _4 K! a8 C
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
- F) l" p) {( S5 C?>
7 [, j6 ^5 N% b8 ]- h5 c8 X6 p5 D4 i5 s5 L# @( G
A.MYTABLE表中的记录超过1条
4 [+ j, `5 U4 t. bB.用户输入的数据需要经过适当的转义和过滤# J% u; O* w: z" E7 t2 O; ^
C.调用该函数将产生一个包含了其他记录条数的记录
g4 i, Y6 i: _" x2 I8 X( HD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除8 X1 `' N0 U, A4 q# v5 g
E.查询语句中应该包含数据库名. `4 O. h5 j8 r# D. S6 t& ?( F
, q0 u+ [9 Z1 u* ^( K
$ W- @+ h1 s0 b) } b3 V
6.______语句能用来向已存在的表中添加新的记录。9 A. j! L3 f8 f" T. ~7 g k
5 Y; E: V; d( E3 `8 ~答案:____________5 C2 j3 r8 f% ^/ A' e6 S5 C; n% O
4 X3 r; ]) T. A/ ]$ y9 v* p) L
7 W8 f* O1 W% t0 g* Q7.以下哪个说法正确?' \0 W2 _* h {# |/ o) `5 v% L
9 w% q' j( C4 a4 i5 L+ l, a
A.使用索引能加快插入数据的速度
8 d+ b) r8 D1 [. P1 Q2 T1 B( vB.良好的索引策略有助于防止跨站攻击
0 A$ D G# ` A: @# bC.应当根据数据库的实际应用按理设计索引
. ~9 t8 ], r4 p( O# XD.删除一条记录将导致整个表的索引被破坏
6 b2 W- L9 K' P$ WE.只有数字记录行需要索引
' R7 S" }- ]- Q: ?" I& N4 d& e: G% I
t( @% w+ b# y& N( T; C2 ]
% k9 S: B/ w1 ?5 k. J$ C8.join能否被嵌套?! [' M. v1 I# q0 G1 E+ |
8 s% U, ? O7 L" n% P, FA.能/ Z4 {; F+ q! x. z. t
B.不能. O+ u7 S; B2 k7 b x; ~
4 ~7 R# A4 c/ W" D/ `
, ?( P. x1 J' T9.考虑如下数据表和查询。如何添加索引能提高查询速度?+ [: ~& M* R) L( O5 T- d t' c9 Q$ B9 \
0 N! [) @8 h5 G. I7 {0 O6 gCREATE TABLE MYTABLE ( |4 i( d, a. X
ID INT,
5 T4 b& q: k0 X+ v- L- A+ DNAME VARCHAR (100),
" d1 p# A+ V8 W, FADDRESS1 VARCHAR (100),: E% p9 n1 o/ m# Q& x; }6 W
ADDRESS2 VARCHAR (100),! f5 z; E7 h7 ?3 H9 D, q
ZIPCODE VARCHAR (10),
4 _/ U" h4 L0 i$ \3 h5 o2 {5 eCITY VARCHAR (50),, y5 k& U9 c* n* X- H
PROVINCE VARCHAR (2)
' S9 S- P: E( s4 a( M7 f3 L& Y)8 P {; j+ F: y( ?4 j
SELECT ID, VARCHAR) {+ T: {& J" M. s4 y
FROM MYTABLE! k, I( ^: I7 h4 ^
WHERE ID BETWEEN 0 AND 100+ Y, a9 h! k, L" b: z) p* }
ORDER BY NAME, ZIPCODE
7 \5 O' v C0 k5 p. }' Z- F" j
$ K; T, D0 I% D: X3 V/ g# aA.给ID添加索引
2 G4 q& e! [6 @9 |) xB.给NAME和ADDRESS1添加索引
$ a' c6 [+ ?' B0 f3 e k8 lC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引/ o# f0 k9 n8 O' ^
D.给ZIPCODE和NAME添加索引9 k L; I( f) _' ^+ i+ n/ Y
E.给ZIPCODE添加全文检索
+ A9 h) N9 Z) b' Y" I; S9 O, T' [+ k5 r# y k( t
; l p* V |6 s1 w7 J9 f$ o% N10.执行以下SQL语句后将发生什么?* B4 G0 ^ y' ]6 U
* q5 ]2 A z2 s% c: @
BEGIN TRANSACTION
' r" s2 a" [0 L. G) DDELETE FROM MYTABLE WHERE ID=1( x0 s8 |* K E- T
DELETE FROM OTHERTABLE
1 \' {* u3 S7 X& nROLLBACK TRANSACTION
1 R/ s6 }& h6 t5 u# J$ y" Z( t$ L
: V0 q5 {, ~( s3 j) jA.OTHERTABLE中的内容将被删除) k# g$ a( o* f4 Y+ ]3 Y# ]
B.OTHERTABLE和MYTABLE中的内容都会被删除0 r; E3 E! z5 {* _& x2 }# f$ @
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除. |4 n4 f/ F- r/ h2 Q
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化8 l% Z5 i$ @" R
E.数据库没用变化
" }0 i. o+ V/ Y
' r: a! q' B6 @% @
+ p3 O8 P; ]2 Y& R9 \) g6 f11.DESC在这个查询中起什么作用?
% c9 g4 d9 x" v+ a8 l- k9 g) a w+ H! C+ \5 b& r
SELECT *; e# @5 \0 t( e
FROM MY_TABLE
. J: u: J- j% R5 ^( K* A( s7 n( fWHERE ID > 02 D8 i* D/ G& l R
ORDER BY ID, NAME DESC; x7 x6 X; @! t, b. V. K
0 _' `8 g5 H6 w aA.返回的数据集倒序排列
* G0 G/ n) P( p( h' Q9 p: i( CB.ID相同的记录按NAME升序排列
/ m8 e; } v% Z2 s1 B4 c% `C.ID相同的记录按NAME倒序排列
- i9 i- l' p9 T) d8 ID.返回的记录先按NAME排序,再安ID排序( o! y% Y8 _# |5 Y
E.结果集中包含对NAME字段的描述% W2 M2 P+ A5 A1 Y1 Z
0 f; u( Z# A/ f6 s+ `/ h* }3 J! v" P8 O) a% \4 }' b# e
12.以下哪个不是SQL函数?
, j* V z6 g c
" D# ?" U0 z' x8 `: o! {+ OA.AVG
7 B0 W4 T& b7 NB.SUM3 M1 v$ |4 }/ o* i- N% ~9 H+ @9 \
C.MIN# u' y; \! T2 g8 B; Z) g
D.MAX+ j. E# Z7 \* z
E.CURRENT_DATE()
! g7 ^9 n1 J1 m! F% ^' C/ a3 @0 X" A/ @
5 n; A0 W6 ^0 f; @1 U) F# x$ n5 A
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
; G9 |9 ^7 R: F3 s& @8 t+ F3 s$ \0 T5 f q7 O% A9 K4 W4 z5 p
A.该字段必须有索引
% m+ n9 L/ _) }B.该字段必须包括在GROUP BY条件中
* s3 z8 h0 D. ]: X" lC.该字段必须包含一个累积值
+ M8 q, S+ y u9 A" V$ xD.该字段必须是主键
8 u5 i/ _" U# e' s3 S3 _" TE.该字段必须不能包含NULL值
/ r5 t* I3 e. }8 @3 H% i6 _
, A$ z' @$ C9 s a/ z8 M; x' L2 _6 b, |9 l
14.以下查询输出什么?; c: ]* _) J8 D/ _
: w! |0 Q4 H; b I0 F: i9 A
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE29 i1 F: N( g: m7 C/ e/ B' P
ON TABLE1.ID <> TABLE2.ID% q* k& s* s# B. g2 S
& t7 A- x& v- N7 Q
A.TABLE1和TABLE2不相同的记录0 \9 t7 j: V! T9 C
B.两个表中相同的记录' l2 r6 t! I. W% \
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数( p! v1 m' {! ]0 U! W
D.两表中不同记录的条数
9 T$ J5 ^ M' J+ w& q5 JE.数字27 f* N9 q6 I+ G
3 w( ~6 z: U/ I
+ L; `0 T3 m; c6 W* i) B$ o2 B
15.______能保证一组SQL语句不受干扰的运行?1 X( H, g* {! C: O/ z4 p$ M' s
4 _6 F5 Q z2 ~1 S答案:____________' j: L1 ~2 {6 I; X# E ~
) I6 z$ @) D2 G) _8 e& e2 F# u
9 J9 B$ L% |8 L8 U8 s$ A
. x0 z' c+ i; u& v
答案速查
# I6 d' Z# r; Q# f1:BC
. f3 R. N# d- S; D4 x, j2:WHERE7 U; [/ E+ S" u/ C7 S* H( |
3:B
- K( D& y8 k7 a- L* L2 q$ t0 ?4:E0 K# j& [( v8 X, }5 N
5:BD
$ u* D, z1 ]3 u: E4 d1 C( T6:INSERT/ X1 d) `1 j0 a7 B0 R
7:C
( i0 c) _0 f) p( W+ M7 T. q1 ]" H& c8:A
$ Y8 j1 `! M9 U2 L9:C
3 G1 I- @6 C# H1 ?7 H+ T E& N# _; g10:E, T9 B( C9 P7 C
11:C
/ E- l5 k& d b1 q12:E
/ D1 g5 Y/ i( v* ^# j13:BC
# y3 {# e0 e: i, K+ ?9 [# f14:C
/ v$ l5 I; }" S3 i: k# ?& Q15:事务3 h$ Z9 j; r' z4 P/ z2 ]( v! k
8 j+ j; U' E7 r6 }/ n, S5 z9 ~* l1 i" H; ^" n# j
4 F# F3 `# B6 i( @$ W/ r
答案详解/ O a# k3 I2 ?" T) Z ?
7 k% d* ^6 I3 e9 u1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 I$ j2 t: [1 ]" d* ^, @ H' L! V3 \/ f1 @9 @% H) b
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ u% f/ M! I7 J4 V' g3 ?- L' O8 o3 H
/ o' ]2 t8 T5 ]( B6 p3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。. Y8 z9 q& @; O7 |, K3 x% V( a
% L' Q7 Q; a: Z) K, c, |
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
2 n2 H% L4 A. P' e% q, e
4 K% K9 b& i) t: L% |4 r5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。8 [$ l, B8 W3 s) s8 Q
4 }6 x' o* r& g, i" [$ U6.答案显然是INSERT。% Y, S- v* Q: R$ ?* ^8 l( l
5 g z9 h K, v1 h$ r6 l
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
4 J- Z: K- M2 \( |0 ]1 X* A
Q* y# G! f& c" g M! x8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
) u. D2 L; Y9 ] r/ K2 \6 f z5 r9 J Y- G- y' _6 v9 G
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。4 `9 n! D/ D3 ?& a/ |$ a
0 J! L$ n9 W, F, j( Q" T; [
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。/ w/ F% }5 s2 c" v4 f1 b
* \% N/ J" H9 v: ?11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。1 J/ C3 K. g6 d6 k9 B5 S* h3 J
: y) u: B: B) w7 O9 B12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
$ T, x% U3 H9 B" `) d2 ]
) `" T; O- K" Z$ ]* y8 M13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。# \* y1 H, {( s! v* v q
) H" `0 q$ J: Q( @6 Y2 y
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。; @) U' ], [" i# u: T% J) @4 L
: q' M& F8 }2 I2 h
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|