发新话题
打印

[Zend权威认证试题讲解]第九章 - PHP与数据库



[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" b2 G; `/ y+ I! @' A$ M/ H& aPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ I( m# f2 A' E) _& N本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
" j! w) `6 u; K( F" I: q- N) V2 u1 V+ m" p6 R1 s! E& W) I
: y' |3 H0 F  ~2 B6 I
问题9 H* g8 f( R  R& E4 u

9 D3 y9 Z) ~5 c% m3 O+ O8 @  Z1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
  e6 ^" ~6 C% s! p" b$ [# D, A/ N$ S6 O7 y6 I- x  h, Q5 f+ l% u
SELECT * FROM MY_TABLE9 s& z$ `& p) u  K" V

4 Q- ?6 S7 J# b* x! DA.如果可能,用把查询转换成存储例程
5 }) v4 B/ \  hB.如果程序允许,给查询指定返回记录的范围
: r3 H  x& R& y; ]C.如果可能,添加where条件9 w5 c% P& J' a( l" {2 R  |$ l
D.如果DBMS允许,把查询转换成视图
1 |  b8 a! k# ~$ u6 I# R+ }* aE.如果DBMS允许,使用事先准备好的语句
1 I& \9 J/ P' m& I' h9 b$ F. N% O, h; z

* m+ @& g& H% `2 k- W* J+ x3 J* P2.可以用添加______条件的方式对查询返回的数据集进行过滤?
7 R* C+ m9 G; W4 J/ T; P' j( F$ J# S7 v" u
答案:____________2 n9 R, n' x7 z7 c' F

( d: A. J# B8 F2 m
  [0 Z: \9 m3 b+ h: L& M6 z3.内关联(inner join)是用来做什么的?4 f0 D5 F2 x$ y" W, R* P5 @
0 f4 N6 n' c- [6 t! [+ v
A.把两个表通过相同字段关联入一张持久的表中( V" S2 c: P$ ^+ l# |4 ?
B.创建基于两个表中相同相同行的结果集
! ]  E) }. |" X- f, V4 vC.创建基于一个表中的记录的数据集6 p; u! T% ^2 X
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集$ E: S0 O4 J( c) N: |0 q* V6 i7 g
E.以上都不对" ~. x( u) S; ^& e, y

) O* {% B2 s( x1 h; Y$ C$ C
3 h( K6 G, l/ N! n: j4.以下哪个DBMS没有PHP扩展库?, B: k. l. C/ p
. ~' z/ }8 z7 X4 `
A.MySQL
: }1 X/ C* |3 F5 T; f, zB.IBM DB/28 [, F, G4 o+ J) M: E
C.PostgreSQL+ I" Q' ~7 J) S. |6 b' F
D.Microsoft SQL Server
! e  R# [- w- G% S* wE.以上都不对
/ @1 `! Y- w! v/ d& T
4 n- S7 n' A  Q4 Z; A5 ^
) S' }6 e! ^3 h5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
9 G; W' ]: g* D* l. C5 p5 O* R* w$ W2 Q( ?1 Z
<?php$ Y$ W! M% y- V/ ?6 h- I
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);! F- ~, r1 T! w& i) g3 d" f
?>" N) w$ R# B/ P* P% `0 ?$ f
; A5 ?7 N" e4 T' A, Z( M
A.MYTABLE表中的记录超过1条+ M$ J* x& Z, J- s6 l' a# R/ @: O9 D
B.用户输入的数据需要经过适当的转义和过滤
( B: c6 \9 p7 h+ I9 ZC.调用该函数将产生一个包含了其他记录条数的记录8 T* V5 H  G- D4 H5 R( E+ @
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除3 P. G# M4 C$ I1 S- g) r1 R3 @
E.查询语句中应该包含数据库名$ q- ]/ C' ~5 Y% K" Y
7 D1 n& P8 d9 P5 W9 G- |
" O7 N9 R9 U) \( G! i+ h- Z
6.______语句能用来向已存在的表中添加新的记录。
6 w* K) Q9 G5 k: F# w$ Z
" a1 i* n3 O2 A( L& ^答案:____________( N0 c  }' P5 u1 u- J
8 u; u9 S+ L7 g" H8 _

2 v' R6 z  n8 G+ m1 j7.以下哪个说法正确?
- H# o- M% x- G5 A4 e: _
( S* Z; m& e# m- h/ JA.使用索引能加快插入数据的速度# J' f2 |0 n( G) @" l: Z/ B- m
B.良好的索引策略有助于防止跨站攻击
2 R7 d% I1 G! z8 n, [2 BC.应当根据数据库的实际应用按理设计索引
" O% j$ Q0 R% p( y2 u* D3 ?  KD.删除一条记录将导致整个表的索引被破坏$ I  e8 q/ H" }+ `$ `
E.只有数字记录行需要索引3 P4 l2 S% {! f
2 w9 n' `4 o3 d) V7 e

6 g6 X% a+ o+ z! c8.join能否被嵌套?$ R4 ]* O# ^: R: G- L9 z

+ f5 t! U. a) ], k# R/ [3 H! GA.能+ P6 Y$ ~- `* t
B.不能
% v, l  E7 i! _3 n
8 l* k( {# v* N) W+ j# u. G) ^
  }# }; v4 ]" Y" p# k8 T9.考虑如下数据表和查询。如何添加索引能提高查询速度?% z: _/ q) d" O7 A4 q, B5 i: i
& R* y( Z' g2 T1 i( U
CREATE TABLE MYTABLE (
2 D( O" E$ @9 ^ID INT,0 w: q3 B! V( }, c& y
NAME VARCHAR (100),
9 N( `* m3 F5 v% l$ Z2 r5 {ADDRESS1 VARCHAR (100),: m9 s5 D6 s% @5 t4 @
ADDRESS2 VARCHAR (100)," \9 ^& U5 k7 A7 {6 m
ZIPCODE VARCHAR (10),
' u* X" X$ M9 T! e6 Z; ICITY VARCHAR (50),& J. C9 z9 X8 Y3 g9 n2 P3 v
PROVINCE VARCHAR (2)/ C( h* I( w4 z& J- i
)
* p% S- u5 I5 c' v; i3 N1 ]' TSELECT ID, VARCHAR
% a& H( ?- p$ S$ V. k/ XFROM MYTABLE
( |9 G8 I  f" a  t1 n, SWHERE ID BETWEEN 0 AND 100
6 G" P/ J. c: @* u( eORDER BY NAME, ZIPCODE) T; I, }7 F1 `+ }5 K3 Q- W

9 `7 @/ o! {- d' p' c$ t) CA.给ID添加索引4 P1 ~8 P' q2 o6 [# e6 G
B.给NAME和ADDRESS1添加索引
- d- l# d' i$ Y: T7 e% sC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
/ j. E: E; |7 |$ u. e( x7 gD.给ZIPCODE和NAME添加索引
6 d$ P% A5 ^8 R! W$ ^; WE.给ZIPCODE添加全文检索; v; ^+ w1 H* f) V2 R8 e
- ?7 e: E  o; @4 [8 m# r, B' |" h  J

" l0 D% ]5 y2 u$ ]' p10.执行以下SQL语句后将发生什么?
5 {8 {9 u3 c8 v' x6 D# ~- F+ U% A, S: a: H' l; n8 N9 q
BEGIN TRANSACTION
! `  F' m! Y9 L; ^3 H6 G6 @* {DELETE FROM MYTABLE WHERE ID=1" k# i6 \: n; B. t: g+ e) p9 A% ^8 U
DELETE FROM OTHERTABLE; M/ y* _' d  A
ROLLBACK TRANSACTION
% y7 A/ Q! n! k2 s
+ J3 ^! @0 Q" k2 n9 rA.OTHERTABLE中的内容将被删除
8 z3 c/ V3 I0 J) g: O" C* fB.OTHERTABLE和MYTABLE中的内容都会被删除
- q. r1 G, E+ `& P1 E$ R+ QC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
+ w0 z- P' Z5 AD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
0 G' M/ E: K7 Y/ m: UE.数据库没用变化
5 C% p: t7 f, e0 r) Z
8 z8 V+ Z" h$ q# X  Z! {* b3 k5 [4 I8 G: V$ d, W
11.DESC在这个查询中起什么作用?
6 t  r7 P* F5 n# F2 Y7 K0 x3 P, b) b, g! K* ?" u$ g  p1 a+ n7 o) i
SELECT *
* ?5 m: p7 H  Z" Z9 U% kFROM MY_TABLE: f. o! \( S6 W" t, Z  v
WHERE ID > 0
$ z0 j; W* t1 J  f8 VORDER BY ID, NAME DESC, ]) e3 r1 m5 ~4 J8 y* _- o6 y
1 r' y5 n9 W) f6 i/ u
A.返回的数据集倒序排列( r$ Z1 O8 Y/ t% `: A8 u3 w6 K/ A
B.ID相同的记录按NAME升序排列
  p* F5 M) |1 r# {) v1 }  W8 rC.ID相同的记录按NAME倒序排列
' O( \6 `" e/ C: l+ f$ uD.返回的记录先按NAME排序,再安ID排序5 _# D3 P0 e1 r! r
E.结果集中包含对NAME字段的描述
/ i8 X3 G* C3 x4 ]! p# \6 Y, `2 T' I8 Y7 s+ P7 ]6 m

! b0 j* a5 l# g5 S! P8 \12.以下哪个不是SQL函数?/ u6 P5 y9 X- Z4 |4 f7 P0 H: H8 I
: W& I! n! P1 o1 M, V
A.AVG1 A% N1 ~! d+ Y& Z( J/ D
B.SUM+ H) M9 H: e8 `! V* h) W$ {4 r
C.MIN' y5 ?( u% E: ]8 `& x: E( ^
D.MAX
5 g9 u( b/ m# ?E.CURRENT_DATE()
( ^: z! ?' \( D, a2 X9 R, A/ q6 I6 w. W7 f$ v+ ]% K  n/ L
5 _5 G/ f; [% N- f% F  b
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?, W+ R8 t) e5 a4 x# [7 U1 o) m
& C9 q3 x& B! I& [" {0 Y
A.该字段必须有索引2 v2 i4 a: h4 \4 T
B.该字段必须包括在GROUP BY条件中% M. K( g5 \! n3 K' q
C.该字段必须包含一个累积值
0 [- s) S( s* Q) S' P( HD.该字段必须是主键
" C0 U/ X) d) S5 X( S" |5 x5 bE.该字段必须不能包含NULL值" N" U' p) b) g* ?. W' B

) p# S- d$ ?# ?3 y# Y
+ a0 ~: F  Z8 [$ g8 ?+ r+ {14.以下查询输出什么?
8 r* L# v' {( z, [; s* Z+ x, }- z: J8 d1 s. z8 A+ u" X: i+ J# x8 D+ P: x
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2- |4 y8 ]1 i1 L5 _1 a9 d: m6 o
ON TABLE1.ID <> TABLE2.ID
/ m& x" P1 @3 v+ [$ k
5 @, u; [2 \9 e" H- O$ UA.TABLE1和TABLE2不相同的记录2 w$ J7 G' E* Q4 c. t$ ]& o! F2 ?0 R
B.两个表中相同的记录. w7 a! A: Y  R5 f% O' y
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
+ f, S: C; a6 x; CD.两表中不同记录的条数& i) b7 Z' i- s% r% \
E.数字2
; `& q( T6 p3 C4 L% R' z7 G& C% ?, i
' K+ S% y, V  J) z% W
$ U" k% ~8 p/ }3 ~# I+ G# F1 I15.______能保证一组SQL语句不受干扰的运行?# o+ E1 S3 S: ]# [
1 A1 f- a6 I9 [& H- D
答案:____________9 o0 c+ |! G4 R

& ]* O. J* O* Z+ [( O2 w: p+ f
, x' h5 ?: B$ o. g0 _1 V% [. a
$ m* N4 ?1 `) H& P8 C答案速查
9 \' s6 s4 i( T& n" ^  v1:BC$ w/ o+ C, Z2 m
2:WHERE  Z" `+ c1 K( a7 j/ P0 ?4 D. l% g
3:B/ V- [/ A3 ?% a1 z
4:E
! E4 S( r3 h) X" `) k) `6 n5:BD
0 y/ ~1 n5 u) c* Y) Z1 G; |. ]6:INSERT. P1 O5 A) b3 W8 [! L, Q2 f
7:C
3 y9 u% ]: ~3 O: D! p0 `3 W& W8:A3 F4 n3 f' ~6 J) j" K- e
9:C8 A9 I0 M/ e6 x2 e3 {6 j4 ]
10:E- A% Q2 A% j" X' t. [, \
11:C8 [" G; _6 I- A5 d+ M% i: Z3 y
12:E8 ?& l! I$ K  ]! e  z
13:BC
# |  r7 y3 L/ p& n9 i14:C) T$ x+ ~2 V2 D" m4 a- U: I
15:事务+ Q; H0 g% m% F
0 z8 a1 @! i$ r3 E# ~7 N" A

" ?/ o+ F+ @$ o! c1 B" W8 O0 I% [9 G- b6 T4 v, M
答案详解
! \( b4 A2 S: f4 z) ?+ A
0 J9 m, h8 P+ n, f* U$ s1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。) K8 I7 D; N8 w8 Q; x1 M

# t" U2 C  T) N2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。/ L7 {8 g# b- i$ H! g+ t

$ l. ?( @  _! ]1 `: @# {. L) l4 n7 \3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。+ X9 g( Z- }1 l. }6 W6 M! `( @

2 g5 |+ u2 U, r/ l5 ?7 ~; w5 e4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。1 J( P# c$ z! s8 i- v: P

  ?# z! \2 t  z- D1 y' r2 ?% L5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
1 l, T0 J, T# b5 f
$ U& r* j* g# h6 D1 ]/ g3 E; X6.答案显然是INSERT。: m9 b& h2 Y% o7 a9 `3 X2 W/ Q6 u# m
0 I1 O& J" p6 ?$ X5 i: Y
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
9 ~6 ?1 _# u" `/ Q7 N! T: S- |0 j% A/ `# P% _/ E5 }- S
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。) X* Z! f3 o  C
, E2 _. ^: g! \
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。2 ~. W4 P- ~, s7 G, B
/ S" O; c8 c7 m( ^( p' O: |, r
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
( W3 g9 X7 N) h  G" r# g; u( ~3 B$ A2 s/ j
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。! G2 W! T8 J2 T

& Z: x6 ]) d. E. L: N) t12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。1 @! h* h) b. \) q$ z# \$ c5 X  q

' n- D1 k0 U  O2 e6 A( R13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。, R$ ]% Q' P, t
- d0 z! r7 x6 M! Y) C& R$ R; r
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。& S' ^/ W" D+ Z3 z$ x0 j3 Z3 V

5 W2 }; {5 z6 b& I15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

TOP

发新话题