  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。9 K. u% J, ]; c. h; X9 i0 \
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
1 t" S. U% t+ y, ]$ @1 x本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ |; H: C, K9 E4 D5 E( y' m8 t, T N3 M" f" O4 d; b. w' H) v
1 O( I) G, }. s0 x( X
问题
5 b9 n" }- [- b4 I: \, l
3 n( x( E0 Y" q1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
1 ~% J' W/ X- d
, z5 j( y$ ~7 K$ e3 A; o& d& ~. NSELECT * FROM MY_TABLE
- v# ~$ H5 c. C7 ~2 I8 I2 T9 }0 R8 ]" e/ Z- N( C
A.如果可能,用把查询转换成存储例程2 b* M. W, \. V, Q2 [
B.如果程序允许,给查询指定返回记录的范围. @* W4 v3 a( p, e+ U. V
C.如果可能,添加where条件* m. f% F# D8 x5 d+ e& `) Z
D.如果DBMS允许,把查询转换成视图
# N# z G3 i% ]" zE.如果DBMS允许,使用事先准备好的语句4 I: F8 ]6 j4 C" `% q+ o
' x* P; i( _3 ~# g* C0 o% P
$ {3 k8 z) j* n, i3 V4 F2.可以用添加______条件的方式对查询返回的数据集进行过滤?4 G0 F% _- e. A: ?$ J
8 E Z- Y$ h: D1 }5 k
答案:____________8 `+ v' Z. f, z5 q6 [
6 o- ?$ l& ^3 h- d7 C1 B6 ]0 C9 j
3.内关联(inner join)是用来做什么的?
6 f0 k3 o6 v8 V1 G$ o) p/ C/ G' F8 j8 o# v
A.把两个表通过相同字段关联入一张持久的表中4 e- C; O7 H# E" k8 H/ \3 M2 i
B.创建基于两个表中相同相同行的结果集
) S6 n N8 u: C4 M( Q( @! ]0 Z* kC.创建基于一个表中的记录的数据集
. ]8 W5 N. _8 P1 j: cD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
' b" K% l: S% m; N- qE.以上都不对5 n4 z/ j1 N5 X3 W4 b$ B( k
7 y6 C# W6 U; f8 i' l8 M. z! C7 t8 w1 _- I* s9 s
4.以下哪个DBMS没有PHP扩展库?
. k1 i1 m& a: @' Z! c1 S
+ I& `$ _- k2 W5 kA.MySQL# y- A) x8 a8 S1 n/ ^) i
B.IBM DB/2; Q v2 e& l0 e
C.PostgreSQL3 V5 `+ e3 P! v# ^$ y- B
D.Microsoft SQL Server
{) ?% F! [# {' e" X! cE.以上都不对) H8 L3 W/ L) Y- K/ X4 C ]- k
6 F3 ?# g @' z+ Y0 B1 C4 m: l6 ?8 X7 b0 q1 n
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)# G' d5 Z7 P5 J2 ]4 p
2 M2 F. [3 G6 g8 t- M, l<?php) j9 C0 c' ~( ^, M8 h
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);0 H$ _0 w; v: |: t9 o d
?>8 f$ F. N+ K: L1 I
. P5 g6 j" c9 X8 UA.MYTABLE表中的记录超过1条
5 F, }+ h( @! s" }+ C. x5 B LB.用户输入的数据需要经过适当的转义和过滤, ?1 M& ~: f4 h9 k$ a
C.调用该函数将产生一个包含了其他记录条数的记录
7 N- v( \0 |4 [9 u. ?, Y1 ?' S8 ~D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除4 c7 Y) J% V8 e8 T1 q3 E
E.查询语句中应该包含数据库名( }* m7 w# t( I! f2 Z& b* `9 C4 c
" a$ _( @) c2 R; Z6 R# g$ W# Y: v
2 J& O- s% r( M l6.______语句能用来向已存在的表中添加新的记录。
% W6 W$ h, x: x! h& T: w8 k2 ?/ h1 z3 h$ x& r5 a+ l
答案:____________
: z) b, h( u1 w& {$ t& ?* Z7 a! z. K; |' t0 n+ L, b
0 b0 q3 w2 s/ t: v/ B- f
7.以下哪个说法正确?5 x. N- ]" D$ c$ b# n; A
% F3 r5 S5 n5 [A.使用索引能加快插入数据的速度7 o$ W+ C% t, L9 n
B.良好的索引策略有助于防止跨站攻击1 ]3 S. E# \; j) [4 }: j+ F- w9 u
C.应当根据数据库的实际应用按理设计索引 r; M e" b+ v
D.删除一条记录将导致整个表的索引被破坏9 D! L, u+ {( G7 d) v4 A/ c2 W1 ]
E.只有数字记录行需要索引0 z g3 x" \/ @* Y7 h
$ H8 Q* S" t/ D
: q. q# p" n; D; t
8.join能否被嵌套?# s- c$ l7 i3 y3 C q9 x$ S
$ ^7 U& S' q, o1 p/ I9 W
A.能8 S" C/ H) d0 g/ U' ]9 Q8 E
B.不能
' a9 C( y& b( Y4 t8 a; P+ ]( j2 T3 S- k: ~- V
: E+ G6 N0 B. N ^" _4 P; o9.考虑如下数据表和查询。如何添加索引能提高查询速度?) Z7 M" Y4 u }0 x
; x8 B6 y# b7 \7 l+ T) t! S: nCREATE TABLE MYTABLE (- b0 C9 ] i) K7 V- V
ID INT,* Z0 g C& l$ D4 U8 J2 Q$ Y
NAME VARCHAR (100),
% Y" N Y7 c" J' S cADDRESS1 VARCHAR (100),' D! j. g0 C' i7 H4 V% j- V
ADDRESS2 VARCHAR (100),
m; e% L# ?) IZIPCODE VARCHAR (10),
" M" S: t$ ?# b; I2 v' H" zCITY VARCHAR (50),
+ d. x8 h O2 zPROVINCE VARCHAR (2)
+ h1 P) ~* g& I- F9 a)
6 ?/ k+ Z; m# n6 K4 ISELECT ID, VARCHAR; V0 i+ f4 Z8 A+ X# ? B
FROM MYTABLE) t" G, h4 V) I$ l4 u- P
WHERE ID BETWEEN 0 AND 100" |' w6 U( K; `6 B
ORDER BY NAME, ZIPCODE5 a" j: e& T8 o( Z8 M
8 y2 I; _5 t6 `- M/ T$ d$ `! r0 i
A.给ID添加索引; r1 X2 l2 Q) z8 C$ R" _
B.给NAME和ADDRESS1添加索引( s }# b: c: n2 v, M
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
. a) Q: R/ k: Y" R" V* F dD.给ZIPCODE和NAME添加索引
; \! P8 A/ F' e3 y7 M' ? K. u9 bE.给ZIPCODE添加全文检索
3 X- v* n* e7 @9 F8 R& y9 |4 ^: R. J3 N! W6 r6 q2 x+ B7 v
9 H. p: ~! T9 m, v3 B6 t$ i
10.执行以下SQL语句后将发生什么?
% ~3 y% H8 F3 }
, _- i3 w# Y, B* x' TBEGIN TRANSACTION9 }0 E" v" B: \; c7 n
DELETE FROM MYTABLE WHERE ID=1, t3 I9 z9 x" f
DELETE FROM OTHERTABLE
) p5 u4 h, `9 U: ] y5 f+ |8 |ROLLBACK TRANSACTION2 B: e u* x. n; Y9 j
6 }9 D$ z$ e7 N1 K
A.OTHERTABLE中的内容将被删除
; v3 U( k/ x9 O* J1 \B.OTHERTABLE和MYTABLE中的内容都会被删除
: N( B' Y& h3 B5 UC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
8 V+ l% V! D9 `, xD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化! Z6 e/ Y% k" M' s
E.数据库没用变化
, E# X. r3 \$ R: G% j- t
/ Q1 C$ c* l/ O3 B- r" U, N- G1 y) r+ u" v) X
11.DESC在这个查询中起什么作用?
' p9 L, x% J" X; ^% l
; o/ ?2 H0 Z. d5 fSELECT *
0 s7 _! ?2 N% U. q; ~4 M0 u% p9 tFROM MY_TABLE/ k5 e$ B( {/ [$ r9 |' ?- r. I6 h
WHERE ID > 0
! m# U/ c3 T. K. U7 }) V' ^ l- BORDER BY ID, NAME DESC
7 N n8 J9 h( k' x
1 B. ^4 X/ j( x% KA.返回的数据集倒序排列, l1 l- D9 r1 b5 w. V
B.ID相同的记录按NAME升序排列0 E9 r3 K" V+ U' [6 J$ x2 ?
C.ID相同的记录按NAME倒序排列0 X" Y, n0 z, ?. s
D.返回的记录先按NAME排序,再安ID排序7 D0 t7 F3 r9 T9 _; ]' P3 Q
E.结果集中包含对NAME字段的描述
4 i! D6 z& t* d$ ~% A% K D1 j3 `5 d2 T! B
$ a( Q' k% e2 y* \, P8 c7 \
12.以下哪个不是SQL函数?# H) Q ~0 {8 o0 \
4 r/ \3 C, }, r; b3 H! n
A.AVG
- r* B* X$ R, gB.SUM6 M! y. N. [: ]; O# x3 }
C.MIN" w: h+ k6 H' Q% L
D.MAX
) V! q, N# d. A- L3 b; A/ M4 kE.CURRENT_DATE()
- e+ k7 ]+ w* _! l- S
) U. M, _0 \, i; o6 |. f
# K9 q ^; n' L% O1 m13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?9 \ B& ?; W) L+ N5 ^8 l
3 G$ o$ l" G5 N4 T
A.该字段必须有索引
5 @' `) {( L4 bB.该字段必须包括在GROUP BY条件中
; X6 D7 R; p K2 i/ kC.该字段必须包含一个累积值
, t* t, S0 x Q, y& aD.该字段必须是主键6 W1 O/ C* d! l6 ^/ W; p0 |
E.该字段必须不能包含NULL值
; ? ]1 [' B0 m- h
1 R. U* L, m. k- f9 L8 M T1 N/ v& X0 ?" v1 k+ S
14.以下查询输出什么?! I' U$ u7 I! O, Z, c) {/ Z' N
! f& |# N6 [- ~SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
& h$ }0 \& T9 T, rON TABLE1.ID <> TABLE2.ID
* ^. n! {4 j8 Y* w' ?
) o( F6 w$ A4 w& {' yA.TABLE1和TABLE2不相同的记录5 b8 G2 f' E3 _ g
B.两个表中相同的记录
1 u l+ h+ B( V" x4 H% G3 h* gC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
- X F4 \$ f* A& S9 |D.两表中不同记录的条数' M) k" I; Z# b5 `8 N U% t/ z- s2 L
E.数字2: r& @) y. \, j0 w+ F: z" Y1 h
9 S" S. L) b1 a' j) J$ o& k+ A2 Q( n% P ?8 X% g
15.______能保证一组SQL语句不受干扰的运行?3 k2 c; p' Z; c5 X
1 ^7 ~- J% V1 A% r答案:____________& j" P; g `0 Y7 k8 T$ N' ?$ F: Y
8 l9 C9 |$ v& l/ _
& n8 H' p( p" ^; q- z
9 _* C7 N6 m5 N( _答案速查$ d/ t$ y8 {/ _: @) c. o( I! @
1:BC
% p& m6 F0 u5 a( v2 B9 B9 i2:WHERE
' h" |3 G+ J) o3:B
) R( B! r. }/ S4 a8 K. J* g: x- z* q4:E$ D, r( u! Q/ T! U
5:BD( e& a* s# G4 }
6:INSERT
8 A3 M4 Z) a' G$ n; c2 c- ~4 r7:C
9 ]2 p) o9 e/ P, Q" B7 ?8:A/ v) J% C6 J2 x1 X$ i" s
9:C1 u$ a1 |1 @. z+ E$ c" ]
10:E8 J/ T9 q6 T; |% K$ U
11:C+ ~! i8 a' C: _$ _, k9 t1 I
12:E
4 R3 m( P4 z1 x1 p9 k9 l13:BC
3 S9 `) ?- L+ x$ I) B: W2 z! f& x14:C0 E$ T5 B) a- y7 y6 Z5 J3 x S
15:事务
. [ P2 J& ~# q7 b. x
; E( v; \# [# a n K# e0 Q
9 b1 z- ^/ ^# ~; @1 \
0 ^3 D* z' n9 W# b5 @. ^答案详解' e& p$ P- B8 e3 A4 z3 I' a- J. B
8 G# F7 J2 W) ^* Q: y1 R1 b
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。( v1 j& E, Y& ]+ Y" [$ d
" Q+ o% V4 M4 U. G/ w9 W. X2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
6 R: n+ ^; s8 |4 x2 v$ p/ [% Q8 s5 r3 |( F: I
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。, d/ K" A# X ~* f6 K' ?/ {' n
7 o6 @8 E3 X& G6 O, x: N0 k& b% o4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。9 m# B. ?$ J% `
! B7 l9 `' J o3 O6 y7 j& U' r @
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
% C/ ?1 G" P1 t9 q/ Z. Z" A0 K
6.答案显然是INSERT。
& o/ ]% m8 ?5 `/ c
5 [# b6 \7 @. ?, t1 E6 W7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
! q. ?( }6 ^: W, P3 `. W/ L* k# d
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。3 _" E& J0 `8 B0 c/ s4 A. o) o
. o0 l C) b1 o, W
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
# o1 d4 [4 `, A& q+ D; `& R. D" O* q! ]
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。( R! Q$ B3 g! \/ `! \
* P: }6 o6 K; Y11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
6 d' A$ T! K! f, F9 k* A0 |* ?6 L4 R6 M& j5 b
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。) u- l; Q. [/ L0 F
. U" w9 C! D1 j4 E7 l3 U13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
5 j- y) [; B% A9 \ |! V& w% s2 | \
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
. D$ r2 M! y1 H' R. A1 G4 d, t5 Y9 k' S3 A I9 `/ @* \
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|