|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。5 z+ d- O" R& g9 I3 T
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。; x3 X) y3 @. o: x9 X; u
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
* Q" D# z; D+ f8 A5 J7 W, D8 _, X& t; J/ m
; f! Y+ o! \$ a9 A, C# M1 h$ z( y" `问题
+ y7 D) n" W4 F4 r% g: h' ]1 J6 {) {. a* X) ?" t1 ~- Z- _
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
) |6 ]$ R$ f: i( F" s) W3 B. I7 _1 ?( q
SELECT * FROM MY_TABLE
. `* s9 T! F7 _7 g
' u6 o; z) I. \- KA.如果可能,用把查询转换成存储例程
% V& E% g) M4 ^. i% w/ I9 c- uB.如果程序允许,给查询指定返回记录的范围6 `% n3 H) h4 W+ v9 r6 ^; w; x, W& c
C.如果可能,添加where条件
: p, D' ?- [; ^; XD.如果DBMS允许,把查询转换成视图
7 ]1 U- @/ i8 Z' c- h( e( O: A. o7 ^E.如果DBMS允许,使用事先准备好的语句
" p5 J, A' R/ b- C9 U7 G( a& H m6 d- r/ Z% s! C i
6 H7 w* w4 V9 p+ s% k! j P
2.可以用添加______条件的方式对查询返回的数据集进行过滤?; j8 R8 g* ~2 D5 q% O; z
" o% d) W9 h/ a) n' a答案:____________
1 S6 j' W/ [' E) i1 E" M1 r. |( ~' I2 E/ J$ D9 @3 u
# ?$ G! j% V5 H5 r
3.内关联(inner join)是用来做什么的?2 ?5 B; f x. s' T! A$ X* q$ H* L
K; m& o. i2 O, d1 s5 ~! R1 W# ^
A.把两个表通过相同字段关联入一张持久的表中
6 N$ U T P6 r+ S' rB.创建基于两个表中相同相同行的结果集* N" H2 P5 I" g$ @3 o& ^
C.创建基于一个表中的记录的数据集/ ~, |7 M! Y# \' s
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
- s, c \: o z; O( @. c$ p) dE.以上都不对3 @2 {5 ~, Y( @
% v2 l3 s( R1 B3 S! J$ N! u& @
4.以下哪个DBMS没有PHP扩展库?
7 E1 s D: _- \2 R
, d" a% l& t& Y, A7 Y6 h! a3 m( lA.MySQL o5 b9 A7 P' F# [2 q
B.IBM DB/2' Y- A8 c# C8 S9 o! N
C.PostgreSQL5 ^" J. n/ f0 d+ N
D.Microsoft SQL Server# O/ h: d$ F% w4 f# T; _2 ]5 g4 i
E.以上都不对; X' A+ _ j$ i, ~# X3 o% W
' C) M) l5 f% x/ X! B1 n& N
7 s L3 o3 M- r5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
4 W6 G; F& g% [ O5 x" F( u3 \& ]
8 R; y5 q5 c+ |$ g<?php
/ c% H. [' g |$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
( r3 K) W/ e# |& n1 n8 g/ M6 [& o?>$ Z, [ c; r& O2 _
/ S3 W. O% y. s4 K
A.MYTABLE表中的记录超过1条/ j ]8 R; ~; z9 _1 O# X0 S
B.用户输入的数据需要经过适当的转义和过滤
/ {+ {/ A: A. }0 C, S- JC.调用该函数将产生一个包含了其他记录条数的记录
5 R/ S4 A6 s1 fD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
9 v) O4 k" D* a4 G$ b" gE.查询语句中应该包含数据库名: U( K! J; a/ R5 h
5 M/ c" O3 F9 W. g0 }) I
& j. `1 _2 U' X6.______语句能用来向已存在的表中添加新的记录。
* _+ c* m/ w% }" z, n5 b/ r$ v
/ S. G$ @# f8 s; t `6 i7 s9 e1 U) o1 l答案:____________% Z7 \1 g6 P: K; e3 {" R8 g2 ~
9 |' Q$ b) D, {8 e, |
, @0 |4 t9 b; d6 y! U
7.以下哪个说法正确?4 V# T% T1 v" h0 g, A# A) _( P( Z: ?
/ |, E6 u3 [# j" r" A# ZA.使用索引能加快插入数据的速度
& e( j; b0 f) q7 ~$ R5 o+ @2 I$ pB.良好的索引策略有助于防止跨站攻击
' b+ ]# [0 U! ?! QC.应当根据数据库的实际应用按理设计索引
7 h T0 D9 y% @) MD.删除一条记录将导致整个表的索引被破坏0 Z; a/ N8 I2 h3 K" I* P1 X# q, G
E.只有数字记录行需要索引( N1 W6 v, j! x$ I S
% ?3 q3 g8 ^7 B- ] y5 z U) l& r3 k8 D/ G* U+ L! ^0 p6 n2 m
8.join能否被嵌套?
8 `1 ^; [6 n3 c3 I% }. M9 P6 _$ \. K ~# }- C1 {) }" u: M
A.能* d. K9 P8 q, Z" _. z
B.不能6 j' [: T% m( |5 a! U9 U5 [
; ]- `+ R3 d: O. f
6 }+ O# H: [1 T; H3 b' w* C/ \9.考虑如下数据表和查询。如何添加索引能提高查询速度?
/ @$ `6 C: Y" B) m% Y- A) S- B8 f9 u& J5 g) o$ ]0 X
CREATE TABLE MYTABLE (/ Y# }. v3 Q0 l. v( r z4 s, `
ID INT,9 W7 J' Y6 ]9 ]& r; `* w' Z
NAME VARCHAR (100),: ]6 l9 U3 n0 P7 t' o! j
ADDRESS1 VARCHAR (100),
6 Z* p- W( W0 o d) [ADDRESS2 VARCHAR (100),
u* p( X2 M: a5 x; [) E! v9 FZIPCODE VARCHAR (10),4 h0 [2 l( V% Z R; z5 a
CITY VARCHAR (50),
! R% j. g6 L1 c" a) A/ tPROVINCE VARCHAR (2)3 n2 Y. \$ J [; }4 s/ a% G
), ~0 k0 E0 ?$ {5 r3 o
SELECT ID, VARCHAR
4 t* ?% R: t# T) ?5 TFROM MYTABLE
' ^2 |1 s+ ~5 [4 z! R' yWHERE ID BETWEEN 0 AND 100
3 R4 w5 R9 i) d4 FORDER BY NAME, ZIPCODE
& ~' `$ w8 c5 K. l
2 [$ D3 g3 @" e7 F h; U& ?' {A.给ID添加索引5 N6 M i) ^+ M+ A: j
B.给NAME和ADDRESS1添加索引- u6 N& `; l& D) A) u8 M3 b" b( F
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
; _' B1 O: b6 X, a/ B+ DD.给ZIPCODE和NAME添加索引+ a. O* L% G4 Z
E.给ZIPCODE添加全文检索
+ K5 r+ C, w; u* ?- }( R; @) z: O+ _1 n/ H8 b y6 L
/ _$ P2 ]. F# p8 M1 T# n$ c10.执行以下SQL语句后将发生什么?
* r) p% G% P T" g! j
7 W& o& g# {- ~: v( y( Y' y _BEGIN TRANSACTION0 U; Z3 z. Y. |( Q3 L
DELETE FROM MYTABLE WHERE ID=14 k' h' k5 p& Y/ ~/ A4 t. R7 {
DELETE FROM OTHERTABLE& p, I0 D* @, w5 b+ N% n
ROLLBACK TRANSACTION, z% p. E) k' B% n W9 \# n
) s4 ~; a+ O: E1 \) C- R! FA.OTHERTABLE中的内容将被删除
5 \' l: X( n3 }8 U1 x* h/ b9 KB.OTHERTABLE和MYTABLE中的内容都会被删除. y5 @+ ^& l3 G5 [! h+ F& { F
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
, }4 o7 d( R1 y( T9 R# W2 FD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
+ g2 o5 K) x/ V# LE.数据库没用变化 m2 k7 B6 I0 o% {7 m! ?
0 w3 X0 v8 R- ~) P
( ^& D- Y5 Y4 i: V0 a8 e11.DESC在这个查询中起什么作用?& `- [2 U( b% u, p
8 U, ?9 a& x, Q$ {" \
SELECT *4 Q8 @& C g1 u% I
FROM MY_TABLE7 e. ~3 ?; X# D' [. @: W3 p4 T
WHERE ID > 0' E. ~# Y% z( P/ m" B+ G1 Q& r$ K
ORDER BY ID, NAME DESC: P& L4 t3 x# z4 A; F6 y" w& C
% b0 {6 O* I" SA.返回的数据集倒序排列" `9 C+ K/ g8 n; f- h( C
B.ID相同的记录按NAME升序排列
% O, h+ @- r9 \C.ID相同的记录按NAME倒序排列
8 r' q! m0 m! }: Y: U( M- sD.返回的记录先按NAME排序,再安ID排序, ]# u M2 b, a3 X# V' P
E.结果集中包含对NAME字段的描述5 S! Y. ~( c5 V- l) z
2 N! c) ^5 Q- |3 }" @
$ ?, J, l( p! Q' i7 B* D12.以下哪个不是SQL函数?* s! y5 B- W, F% v3 d4 ^
) x+ d; J3 j' f @* X) g$ k
A.AVG
3 |* s3 p- R, h$ G! T7 QB.SUM
, P: g8 x. X6 A0 i" E% Z3 CC.MIN
: f$ X# K* D/ y; z" `2 FD.MAX
8 Z3 o$ U: n7 b5 [6 ?; n, s' IE.CURRENT_DATE()
+ ^) g3 h L$ m4 Q8 ~# u
& V4 e6 e- [6 X7 F% U) y- W: [- W+ l# y* q4 p( C
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
, X) G' D' m1 S/ Y! A/ l, L. O9 j/ Y5 ^
A.该字段必须有索引
/ b8 t& z& K- [# ^ kB.该字段必须包括在GROUP BY条件中1 b' Y5 g, x. p; [
C.该字段必须包含一个累积值
) W9 P; M' R3 u7 N5 UD.该字段必须是主键
+ n2 C# ~$ ^/ W, Y" i7 P; @E.该字段必须不能包含NULL值+ ]5 x: \: x; @$ s$ ^
, `% x7 V! \& M1 \) Q5 J
/ z2 }9 L' m5 o. Z A
14.以下查询输出什么?* B3 n7 d% Y7 E
6 I; C( G; w4 y& F0 a+ E6 {6 ?! k, nSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2* }3 c- G. A) |" p5 p2 n
ON TABLE1.ID <> TABLE2.ID- s% e- h, _+ e0 O
$ |& t/ a! i8 Z! L6 {A.TABLE1和TABLE2不相同的记录
4 T% b7 j2 Y( B% G% l& e/ \9 iB.两个表中相同的记录
+ } y6 ]# ?( H+ uC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
# n1 v* Z, R9 ?: V/ lD.两表中不同记录的条数! J. V2 N5 t, V ~; N
E.数字2
+ K$ T% s% P! P- W/ k! u& m
) B% `/ o& x3 A6 s. W$ X. K( M! }: Z2 @
15.______能保证一组SQL语句不受干扰的运行?9 Y. U4 c! D3 [( H. F' I
# C8 z- o; D z' h: l
答案:____________
, e* f1 @2 Q- \! E' k7 \4 }4 N7 c t1 ^3 W$ ? a
# t9 ]9 {$ n0 I- G) i8 C" {
' R% E, X2 S" G M+ A( c7 o2 T4 P答案速查
% Z2 w# J4 Q" `1:BC
) I8 K& D0 u0 g2:WHERE
- J8 S+ p( \3 D7 R4 ?3:B
' p/ R) m$ o$ V3 G6 U4:E
/ I( c# z$ @$ A* y. D6 E5:BD1 i( [: m; A/ V$ a7 X7 ]
6:INSERT, w) C: D$ T3 ~% C
7:C
& a! e- {5 D3 d3 e$ ^8:A
, F Z( P' ~% k @4 B" G9:C
- D8 V8 j6 r. C2 e# Y2 q* |! K: y10:E
" H d8 R0 T. s3 b! S; l; f; g11:C
}0 n' O' J9 y4 H" r2 s12:E
8 W$ I) q% `" u8 a. S; Z4 w13:BC
* f+ g% G0 m) D9 k, B: n14:C
3 b% l7 j$ q3 C15:事务
T# {/ d6 E" p) u' M) C) P7 ~
, W) V: f: ?' L% T7 k+ p1 H& K6 |7 X0 o5 v
( G2 y( J& N$ w
答案详解
: |. X; A( E1 R3 \8 M1 Z5 J% |9 B) B4 _: J2 C
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。+ w* r6 v, t! K7 I+ D; y* j- f# r
- R" u/ b1 h) D0 ]1 v4 M# l% R2 M
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
4 ~) a. ]; d! M* \" T: u2 P: \: c7 h7 E" n7 m6 [5 J
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。 J/ @7 h4 X* Z3 p# u# C! b
' d; h' B" w% T# g) j: j
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
2 y& G- x1 _4 t2 j ~0 _1 j2 |1 b9 v) o: L q8 V- O
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
/ w) E _ j$ }% c+ b9 D: K
5 H" }6 G0 R7 W) V% l6.答案显然是INSERT。
7 C$ w( Q7 q0 W7 w
a8 k& R* F' {. O9 D7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
$ t% I$ F: Y( |( {! c. s- y
; ~$ E' y F$ f4 X* r+ n( t$ a8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
0 b0 b8 F* R3 M
- {# p/ C% U8 Z/ n9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。& c- j; N/ s2 Z7 Q7 c
1 m9 S. R# M% o9 d
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。7 B% P& C' E5 { `# O
! c: `* I$ x' @$ L& D$ K
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。6 c0 C# w, H$ p, T1 D `8 v
& m) x2 r. p( ^# H! L2 g12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。! s+ _* q6 J* C4 Z
+ ~0 \4 p3 X3 j7 z) Q& m
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。* F5 [: q, A8 q U# y X4 ]6 }
/ @1 h, m' ?8 m+ V; j* O14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。) p, O! A7 ?9 \: t5 k b) C
; ]! |% G1 ?6 }% ?( D& @+ |5 `15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|