  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
8 U) h, j1 H) T9 B5 e' z0 oPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
4 \7 f0 l/ W7 b本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。1 f1 v% ^8 F5 T4 V6 h: z
* z0 k- b" ?& g! {
8 m: F* B5 U& s$ B4 Q7 }5 s, C问题8 H# @ u1 t; E
; l G! |) p3 O' B: Y# z* M1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)0 a5 B# _/ D( R: q: O( J
* ~4 A, g, f$ |4 C0 fSELECT * FROM MY_TABLE
0 v8 O4 }6 j8 d9 f4 f" t0 x# O7 E) v. @' X6 t' a6 o0 W" m P
A.如果可能,用把查询转换成存储例程
4 {! u) y H: ], e' bB.如果程序允许,给查询指定返回记录的范围
$ l9 f5 ?7 t( E4 h9 `" \' tC.如果可能,添加where条件# f( j: U% T& }! o g y W
D.如果DBMS允许,把查询转换成视图& ]( |* o8 W! c, h
E.如果DBMS允许,使用事先准备好的语句2 r: Y/ q0 _1 c7 j- H( T
% V- S8 p9 F+ @1 n8 S7 g& n w4 v* n0 B* X0 N% L9 z
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
7 K, b9 Z1 F$ |
, Y" e3 C" U) z3 M# X: O答案:____________
" K* G- L5 I' C2 H
- q5 a- z. k8 Z" M. v/ a- k
& C: h$ ?* r* Y- Q F! b( M# A! i* g3.内关联(inner join)是用来做什么的?6 Y5 |) y1 D$ P
$ J7 A8 ~& u& o) B4 L/ a! d! }A.把两个表通过相同字段关联入一张持久的表中
! S6 h; p) k! O2 r& c1 RB.创建基于两个表中相同相同行的结果集* s$ ~* e/ i9 ]/ D: W
C.创建基于一个表中的记录的数据集
5 k6 `3 I3 K% y, w% _- pD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
! k# g- q. S& O. `; mE.以上都不对% v7 j) ]2 c: ?3 z6 e
) s& j$ g! \4 q
5 w/ _9 [+ x: J5 K, Y' e: d' v0 S
4.以下哪个DBMS没有PHP扩展库?
4 F$ y7 P& @1 L0 Q
" S6 @4 V `# fA.MySQL
/ q) R- A/ e( N# ~4 m [8 o- @- ~B.IBM DB/2
/ A V9 \: T/ |$ i3 ZC.PostgreSQL( U5 L: p) Z% ^/ H
D.Microsoft SQL Server
: C' @( e8 n! ]' IE.以上都不对
2 L% U) d+ \. s- m1 S2 D9 Q$ o' P7 \$ r
0 A5 ~4 g- w3 }
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
$ [) b) \6 w$ l% J7 v! r
f! b0 D, n6 E, U2 i- f3 }<?php9 Z9 @- e0 n7 e; V' `4 I$ K
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
& l% Q( R d. y?>
/ K8 y/ {& H- |" l# B, H0 k/ m2 q9 W' U2 H
A.MYTABLE表中的记录超过1条
& E- M# L' k6 B2 h' `- Y; mB.用户输入的数据需要经过适当的转义和过滤
9 f% v9 y! V' H7 kC.调用该函数将产生一个包含了其他记录条数的记录2 c9 Y5 ^0 G& I' u+ ?
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除. ? p( I# R4 v0 r. J
E.查询语句中应该包含数据库名# e/ z1 b& i: \! A1 F0 q. ]
6 B+ l& ]. A5 S! X, v7 |+ c8 m7 q) P
) U; v G/ T1 ^, P, b6.______语句能用来向已存在的表中添加新的记录。
8 n/ d' |* Y8 |# G# d; o; F, e/ |% @5 L4 w. P5 j" u, i
答案:____________, c v4 U- j7 z- J" a
+ N7 N( _5 k. ]1 ?( @
8 J1 }! w4 y7 ?) M S7.以下哪个说法正确?- O1 x1 Z- J, f; u
. S! X4 I& |: R. M% {/ Y& |
A.使用索引能加快插入数据的速度4 W4 R, y8 J- I$ _9 d6 S
B.良好的索引策略有助于防止跨站攻击: u; |! ]" e+ ~+ Z& q9 g6 F2 l
C.应当根据数据库的实际应用按理设计索引# `" n8 x) r. f$ D+ ^, s- }
D.删除一条记录将导致整个表的索引被破坏; p+ O c$ C- a, O7 @: r
E.只有数字记录行需要索引, d2 y3 K7 o, K9 G, W7 e. C
' N! k z# Y1 u4 d7 I# p
! ^! Z- ~& ^9 g
8.join能否被嵌套?
8 y; l2 |& o: I b! V d9 x
5 w% }$ x: j: @4 F+ nA.能8 |$ M- j' I* J' z
B.不能) w' H: D# o& O7 N
$ ~% M: C/ |2 l2 `, h8 {# _( N
h ^! `! T, d6 {2 ?+ Y9.考虑如下数据表和查询。如何添加索引能提高查询速度?
9 s% y+ {* D+ Y, R, ~1 W& F! ]6 Z+ F: ?" f6 a8 ^" A
CREATE TABLE MYTABLE (# K S( A9 b7 \( Z- [+ A1 A
ID INT," _! r+ o5 Y0 e3 F$ g8 R9 H
NAME VARCHAR (100),
+ S7 V0 g) R3 c, D/ @% Y3 bADDRESS1 VARCHAR (100),
8 t: x4 o( m" M! J& ]& nADDRESS2 VARCHAR (100),
% t( p/ B! W0 _. K! m% e/ T# a8 O0 pZIPCODE VARCHAR (10),$ Y5 r/ r0 D( A: S6 K
CITY VARCHAR (50),
- d- [, h/ M, B/ B6 _6 \) s- MPROVINCE VARCHAR (2)
" ~+ U1 y* n# r8 x$ })
# f7 Q/ E6 ]7 DSELECT ID, VARCHAR
* _0 h5 u: k( S$ j, ^& pFROM MYTABLE
( d# G* U! h: {" R$ mWHERE ID BETWEEN 0 AND 100$ j( J' ~' [- s ?$ v5 w
ORDER BY NAME, ZIPCODE
1 @& _! T2 P9 a; t
* {/ Z/ A. B, D( a {! fA.给ID添加索引
% O- o+ V: M8 MB.给NAME和ADDRESS1添加索引
9 W5 s! E9 U( n1 B* o4 y% pC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引4 U; c; G1 P, ]1 O3 D; V
D.给ZIPCODE和NAME添加索引
3 o# q, j* h6 G" Z7 W" V: fE.给ZIPCODE添加全文检索
- M( W) I; M$ ]- j; `7 K. K& _# |
9 s* L% n+ [$ z" ^% a
* u8 m6 {# Y9 u" W/ \$ v1 B% ^ J) W10.执行以下SQL语句后将发生什么?& W( }! V1 H, i A
: x* I# {' X. U, vBEGIN TRANSACTION
$ j5 B8 X8 N) }DELETE FROM MYTABLE WHERE ID=1
$ H+ U# n+ S8 N2 K" q# @) b0 N8 gDELETE FROM OTHERTABLE
~7 Q# P' L1 S0 A, |' LROLLBACK TRANSACTION
# z0 \) _. v, A) ]7 Y9 h- ^* S4 L: D7 ?0 u
A.OTHERTABLE中的内容将被删除' Q& g* n% S' F
B.OTHERTABLE和MYTABLE中的内容都会被删除
( o% x3 h( f' v/ [8 g7 G; vC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
5 H) y) S( a( X4 t$ [D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化6 z$ w( B) r. Y3 Q
E.数据库没用变化5 k- a. t' `' {% a( ~
# J' q7 e$ |7 L9 s
) ?; e# ?$ [; \" z( L0 t2 v11.DESC在这个查询中起什么作用?! e0 e* M3 K2 A- {
8 s" G+ H3 j$ h. [5 y/ z) Z
SELECT *
4 x" V" b M' O' K- j" O; ]FROM MY_TABLE
5 A ?1 X, A: B3 JWHERE ID > 0 E% ^! V6 f/ D3 _, v/ y! q
ORDER BY ID, NAME DESC
5 } v9 K2 c# Q a7 U0 I( e% e' p. ~& {& E/ X9 [/ M
A.返回的数据集倒序排列 S" ~3 ^- W7 H) l1 d( v7 U/ v2 b
B.ID相同的记录按NAME升序排列
0 _$ B* g, e+ R! X: x! gC.ID相同的记录按NAME倒序排列
+ m. W1 M0 d' l& K. L/ |. hD.返回的记录先按NAME排序,再安ID排序
1 w9 t W6 O7 D' x1 d; y; W, FE.结果集中包含对NAME字段的描述
1 U9 i# ~$ K W0 B( T
: d S a" T: b$ [" e$ z9 c, q$ P8 W/ K
. _* V1 B! G8 U; ]. l& E12.以下哪个不是SQL函数?
- e! n0 e* k8 s; T8 ^7 v2 u m/ x% I, @2 f4 T# O) K
A.AVG) H3 f( d* W6 D0 N; b+ w
B.SUM
- D0 M: q( f% }8 k4 {C.MIN7 e( X: [/ S: X5 p
D.MAX
7 n, t4 X8 [/ Z* N* RE.CURRENT_DATE()
" g( M% Q+ D5 @' \! }$ v1 S
* O+ _' D& D$ ?; m3 j
6 b3 H# V0 p% h7 B" r& u13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
@( O8 l/ A% d/ r+ ~( Z
! q! g+ l6 p+ a1 BA.该字段必须有索引
+ |0 G0 X" k# B8 `& O0 T4 bB.该字段必须包括在GROUP BY条件中
7 q' [1 }% q& k2 {0 BC.该字段必须包含一个累积值
b+ d4 \9 h1 l$ uD.该字段必须是主键
! J9 c _; k6 B0 z, m. Q% ^# yE.该字段必须不能包含NULL值
2 l* ?: g+ i8 _# R( ~2 y& Q" L8 `9 J
3 ^1 b; F: T2 [ z! \0 w* X14.以下查询输出什么?
. }9 y% \) v. m2 F- C% w- K2 b4 M6 A7 }. H, W
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2: N3 w# ^1 r1 ~3 r# {( k! J) a
ON TABLE1.ID <> TABLE2.ID; B' z* x2 \$ H) }6 c+ D/ B
/ m) s9 W- \+ i8 x6 ?- z7 A2 D7 qA.TABLE1和TABLE2不相同的记录
6 E" I' }; y! ^7 A# z0 gB.两个表中相同的记录
% O$ C6 L0 ]& q; e0 wC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数9 i3 j! `( Y1 {" r" g' t
D.两表中不同记录的条数( B, _- ?' \& C; |
E.数字2% H: i9 i- a$ I
! k# s: ?4 k' z2 `" v, h8 E) t
+ P |) ~# _6 n& M L3 z7 R( K15.______能保证一组SQL语句不受干扰的运行?1 {( ^- {! r) q; w, V5 D
* }0 d5 [( J7 s3 r' u8 u& n8 o. `
答案:____________1 l. I1 J( f4 J4 `$ k
$ g5 a% I. {4 D$ o8 J$ |7 n
# X6 I7 Q" {; l8 c
; X7 v; O; s2 y8 F' w1 X' R! n答案速查0 e) w2 K# U7 |" U
1:BC
, h4 |! J' z3 b3 A, n$ G4 o/ N2:WHERE! E) _) ^4 |* c* ?& z
3:B- O" K* _$ A. y; p, U
4:E9 t8 ~2 `0 C" E* o8 w( O
5:BD( H# i' j5 h( C# E4 c" a# b" Y4 X
6:INSERT
1 ?0 ?9 K1 X( G. z% F' y1 P7:C6 U4 Q- I3 V+ Z, ]# c; O5 e
8:A
o. {* P. @( K6 b" n/ U2 p4 I" M q9:C3 r$ M p6 g+ J/ p8 J& D# o
10:E
+ w; C2 r2 e4 F) F' \1 c11:C
3 U6 N1 b1 N& l" T% o' q12:E
0 v0 G8 k! f: U6 f" y& K13:BC
( V# y7 Z. |7 a# L. r& T14:C
4 L! F7 N8 x$ G# p# r' ]) [15:事务
/ T" m9 r) j0 w5 u% I/ d: |9 K: _% S5 ^' Z) A8 l7 s' N/ ]
. |6 `! S; o( C/ \! y
; A% d1 W% {: b. |5 J答案详解
5 L: ~6 u' r) j, \" @ U! G9 f: ^0 ~' e( h) u9 J. a
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。6 J- P6 @4 ]' [0 {5 T
. c, H( ^! Z- k$ I0 E2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
* [9 d& p- I8 K0 g7 z* Q6 Y, K2 J: d1 o6 n2 D
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 L+ x, f; N* x! Z8 \
) b, `; P+ j, h& I3 ^
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。/ _, e1 r, X8 v; F
) \0 V. ^: i( H$ W* `' L5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。6 E' w( J$ J! z; _: w. H( [
- C* d8 p4 g' |. l* @6.答案显然是INSERT。9 R7 l9 ^$ ~" K% X
7 N9 w2 Q6 g, t8 Z- c0 t9 W1 r6 K
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。" m4 T% R- u* Y& X/ R& z# i9 j
- q/ ~0 J! B! N. R2 a$ v1 Y
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
9 D5 o/ x) l+ V( A' b
8 Q" ~3 {+ g1 e, @# Q9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。& f7 L% J3 D: I5 [7 }/ K0 ?8 l
! x' w/ ~9 o* }2 Q! G+ Q& g10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
- \) _! P! U. n5 y$ I
3 t/ Y1 V5 Z3 U) V M11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。& i8 l: @( G: ]+ d$ c7 ]8 M
C: S8 b: \9 G" `
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
7 ?! k6 b& [9 j; J- C. e5 N7 f) t- A
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。2 F( w) w& U( |4 Z% M! D I4 p
" K( w( p# V U2 ?- I
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。; }* b6 |' g$ V! g0 \* D& S
3 [! {, E1 {! ]8 _, j# U8 i+ i
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|