返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
( a1 _$ V+ L$ @, i6 CPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。  K% A( Q6 c  v9 x
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
* J9 m0 ^3 L) i: u0 [3 a5 M7 \2 g! B. ~) C/ p

9 z9 G; Q7 E$ t, n0 N3 C, e问题
9 n9 v: D' @, g9 g$ D& H  Y0 P3 P2 e# D4 V5 c
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
. j+ s8 p" M; Y& j% k* D6 d( w& g/ R! c' J
SELECT * FROM MY_TABLE
  w9 V$ X4 ~* x3 ?* ?
0 ^- Q' z/ ]# J( _% Q0 YA.如果可能,用把查询转换成存储例程
% U7 l* B/ ]+ }; K1 Y" KB.如果程序允许,给查询指定返回记录的范围$ x# b1 u2 v% S) e' P4 Z
C.如果可能,添加where条件8 \+ W* a+ B/ f% ~: ^9 v9 ~3 [
D.如果DBMS允许,把查询转换成视图' v; E9 ~/ g  C+ l- T5 ?
E.如果DBMS允许,使用事先准备好的语句
6 B5 b6 E; w- e1 w, j% t% ?  D' Z0 e) H* X

! o  m  B+ }7 C: _& b. E: Y3 k2.可以用添加______条件的方式对查询返回的数据集进行过滤?
% ?" {" Z! }$ `/ e. n; v/ Y3 F" e7 y7 W3 p
答案:____________% Y/ {9 a% g; q* v

6 k, V' W' F, v1 G* h6 ^! B6 J
/ e& H" _9 r$ k8 B- {! w3.内关联(inner join)是用来做什么的?
- }) `! Z8 N0 i" V
! ?" h; }1 B+ K. v% h, q' g0 BA.把两个表通过相同字段关联入一张持久的表中
# }9 {/ I6 t. L0 m7 Y, LB.创建基于两个表中相同相同行的结果集
, Y9 M6 }) j* w, h7 r7 _- oC.创建基于一个表中的记录的数据集
1 h" U; }5 \' }: w) V7 ^' N+ ?D.创建一个包含两个表中相同记录和一个表中全部记录的结果集; G. m- W' x$ j& Y$ ^
E.以上都不对
. b% A4 J, V1 R2 w9 ~- H  j- H/ D- ^
6 k% F+ ?' T# X. @* l9 e3 g! u6 ^! S- h
4.以下哪个DBMS没有PHP扩展库?$ r  o- N8 @1 Y6 v
9 S* O) _5 A% A: O5 W  s
A.MySQL1 J3 l( [+ Y8 j$ n
B.IBM DB/2( \- h$ Q8 s7 J- f: y7 d9 C
C.PostgreSQL  j5 T9 y( m, d7 Q/ p% b
D.Microsoft SQL Server9 M- Q+ B) Q: m* N
E.以上都不对* a# [0 d, f; _0 Y# r
& ^' Y" _, |6 H$ Y. H
2 z' g; y# W; ]+ n1 F
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
  D5 S9 h0 ?) ^$ ?
3 b- ?2 `. c+ u; B<?php
+ x* s7 l* S9 o/ y$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
6 c: }: ~  i. }: q: }4 l. E" k- g?>
# M3 K& y2 a" @( a3 ]/ p3 k$ P3 r. J" P# o1 Q0 W
A.MYTABLE表中的记录超过1条
9 j1 H, r9 P  q. _+ }, V' VB.用户输入的数据需要经过适当的转义和过滤
4 A% z3 m/ B( s: k% l( N" r+ [C.调用该函数将产生一个包含了其他记录条数的记录
# T" l+ f3 P9 l: {) _9 fD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除" M7 ]- c, j: }) K
E.查询语句中应该包含数据库名& w( v( u+ m3 d- a0 q8 z
. |3 e! h6 f5 Q5 Y' g

) a% ?" c; \8 d0 R4 s6.______语句能用来向已存在的表中添加新的记录。
5 f9 j  j  r7 W) C  ?
4 V& D  X3 W' B; l- b8 R答案:____________2 O2 ?( O9 y' s
' u% }$ ]! y! \, m* n0 j3 T

0 @1 W  v+ t8 w  M; ^# G- B7.以下哪个说法正确?' B8 X9 n% N/ [" X6 R* s
7 ]$ {$ i/ r$ L5 I
A.使用索引能加快插入数据的速度! D$ Z  o/ f6 ]
B.良好的索引策略有助于防止跨站攻击
* p  h( j: `; }$ EC.应当根据数据库的实际应用按理设计索引  K+ C( k) b9 w* U
D.删除一条记录将导致整个表的索引被破坏
2 g& F" P: F4 xE.只有数字记录行需要索引( E5 P: z, H0 T$ J: {
% @9 Y5 Y- v" }0 G" j

' ]' r+ p1 O: f/ k8.join能否被嵌套?3 }4 s/ |) B/ \" |8 a2 o+ A
+ r( q+ T" g# H0 r7 z6 f1 u. S
A.能
6 E$ G1 N$ q0 T0 c! dB.不能
5 r. E; z# g9 O7 D
7 k$ D8 `/ a) i4 V# V$ u- O, ~; P, R. ^' d6 F6 z
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
* l# r8 `% O% m  g0 u9 b* s
+ r; g8 V% t( T% oCREATE TABLE MYTABLE (( @0 D# Z6 G4 ?: w# Y
ID INT,
# e) P. d. ^" K9 {2 W4 rNAME VARCHAR (100),
( S" O0 O# z; d6 vADDRESS1 VARCHAR (100),
0 s8 c: N4 \* h8 R! `1 ^ADDRESS2 VARCHAR (100),
/ K* Y$ o, U9 n+ w: XZIPCODE VARCHAR (10),  A3 v; L7 @; i0 q- i- e; J& A9 x
CITY VARCHAR (50),) i( G  k" y0 U; p1 {* m1 a
PROVINCE VARCHAR (2). U. Y7 n: R' P* w! V
)
  v' A0 m! }1 XSELECT ID, VARCHAR
( w0 `( s) Q# j2 I/ l6 ?6 MFROM MYTABLE
- @& m- u! v. P' |4 u. C  T3 b6 D/ c6 TWHERE ID BETWEEN 0 AND 100
/ J* }# X% k- I2 w6 @: G% IORDER BY NAME, ZIPCODE, B; \  X0 G4 e  [
  c, v9 `. A- n5 U3 r  q* M4 e
A.给ID添加索引
* C# z- j' i2 M* z5 ~B.给NAME和ADDRESS1添加索引" ~4 @& n: n  z9 G) m. G) g: D
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
; G4 B  ~4 X  y7 WD.给ZIPCODE和NAME添加索引
/ |0 S: ~8 Z6 n$ ^( l- C) ~E.给ZIPCODE添加全文检索
% w  N: @# X8 A/ G* Z2 U1 \+ c* l  ?- Z$ D6 C7 _+ n1 t: |, Q5 _7 Q
0 c- P0 ]7 T2 K4 E2 L6 Y
10.执行以下SQL语句后将发生什么?
6 n) R! `# X8 J8 D3 B
2 k, Y3 s; A. L, YBEGIN TRANSACTION5 K' W4 M- S/ u8 D: R( d
DELETE FROM MYTABLE WHERE ID=1
3 L: Y& }% j, z" F6 e% f8 xDELETE FROM OTHERTABLE
' z  z* [( z/ H" T2 s  @ROLLBACK TRANSACTION
( `6 J8 d7 f3 u" e/ i3 T, [4 C1 i# i& S  W, J
A.OTHERTABLE中的内容将被删除
( G: t) @' d& v( H4 l! v* LB.OTHERTABLE和MYTABLE中的内容都会被删除
/ X7 l5 x2 _1 tC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除, H( J1 _) l; D) Z; {  s9 m8 F' I
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化9 G0 X* A/ [' O, D. k: C( p* i; I
E.数据库没用变化' a: }' K+ _. w; a( m0 ~5 |" `

" o6 y" v( N/ H7 s! A- a4 S( W% p4 X  d! ^
11.DESC在这个查询中起什么作用?+ {/ k2 R' d& X. ~0 E3 k9 p

/ a+ G6 r4 g3 f9 }SELECT *
' R# N$ G- z% K$ l- {, @9 kFROM MY_TABLE
6 l) j+ w1 d+ d) Z0 z9 nWHERE ID > 03 i7 J! K* ~% m6 Q: C  n0 v) [; ~) ~6 Y
ORDER BY ID, NAME DESC. S" `9 B; ]$ E
& B4 p4 w) U( _" J  P
A.返回的数据集倒序排列
: y- G" ^" L: P3 g1 ~2 MB.ID相同的记录按NAME升序排列
7 j9 \. J" w( I. J. O9 x) lC.ID相同的记录按NAME倒序排列
# B/ V$ N5 l2 k; M! R9 A7 JD.返回的记录先按NAME排序,再安ID排序
/ l  t4 t, F& P) t* v3 ~E.结果集中包含对NAME字段的描述
: B/ @+ v% x3 I  s) `5 t
7 w! m, s& D7 U
: X- f) P0 B3 n5 f$ K: y12.以下哪个不是SQL函数?$ D8 ~7 a( h6 G$ J+ R* `& @  e; Z

1 g! J+ U4 q8 _4 `- D0 KA.AVG
7 I' y6 a! ?* M% V7 F& x. ZB.SUM9 d* Y  ^" o# ~. b; S
C.MIN+ z6 f; e1 T5 ?
D.MAX4 H& X1 B" S# n0 C
E.CURRENT_DATE()2 p& k4 m$ n8 F

% |2 k1 N1 u! u8 N% b0 T5 a( i# [0 Z$ M  o% g* B$ A
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
2 _( G( V1 v! j) P+ b( h) ~
7 _& N: l, w$ ?& u/ `, }6 uA.该字段必须有索引
7 E+ F5 Y0 {0 {0 r) s, o1 {# WB.该字段必须包括在GROUP BY条件中
8 x  T0 K3 H  ]) R* r+ T$ GC.该字段必须包含一个累积值
' m( v  Q- K* V2 }- r8 fD.该字段必须是主键
% p/ M) W; O, J0 YE.该字段必须不能包含NULL值+ S1 P( p. D, I' C2 x  l9 v2 c: ^4 z
! U0 l* h3 {& C1 _8 Q

4 I  u6 S/ v$ |' W* K14.以下查询输出什么?
8 ]( Z5 Q& S! v; e
/ @  l. m3 \7 S% w# D& uSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
; P' e0 V0 ?/ O  AON TABLE1.ID <> TABLE2.ID) ]: o- D+ O2 f. v: Q

% O4 X$ ]7 M! X7 A2 }A.TABLE1和TABLE2不相同的记录
5 i- d" A- i7 _( e( lB.两个表中相同的记录
8 e% Y" Q( o6 l5 G) ~C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
, b; ?+ n% B/ l- ?/ `; U1 H- b# {D.两表中不同记录的条数
' V$ \4 J3 g% S% [" `9 Z0 oE.数字23 A. \" `" f- ^" P' e: Z" V7 |  ?
0 Y6 f) Y  G4 Y& J1 s

3 Y# A9 T1 B5 y9 ~2 S& _3 u0 h1 A15.______能保证一组SQL语句不受干扰的运行?5 l7 I. A. w/ i/ F3 C$ O
; b8 N% k. M2 [9 i5 i' ?
答案:____________
% A! Y  _. M9 G8 i' Z: m8 ^9 @0 r, G, f, N1 b# u
8 L: v" G; z0 v7 Y
9 x( r2 y, \: x) }3 k! B8 @
答案速查! n; w* O/ L& j) A4 u
1:BC
# f' R% }  g$ D8 |2:WHERE2 U% O! C$ m6 K% J1 r" k7 p: ~
3:B
# E* `7 k$ {& x1 O: ^- D9 R! ^3 K+ A+ Z4:E* y! }1 N. m/ T- k. O/ F
5:BD- T  q  C, b9 f2 O2 C& S
6:INSERT2 f+ ^9 d/ B2 ?9 o' k: L$ _1 i
7:C; E8 l7 H' ^' _$ M0 t- C
8:A
8 {4 _3 _; `1 L4 [1 u( |/ f" a9:C: _- O# I# [. x- e) v
10:E" [, G5 U) q" f+ Y4 r# z6 p
11:C
1 m1 J/ S7 \2 n7 p: X12:E8 N' r/ ~' M0 }# d% N' P
13:BC
5 U# p5 c/ N& B9 n9 a14:C$ r- c( k  `- a% U! w& @: l
15:事务
+ ?3 R& |  D5 _0 l' `0 h, q. _& {5 n! F6 w9 M9 v5 b( {+ f% M

, {" N# I$ x& S8 ?# V7 ?8 K/ Y4 ^/ P' u8 e0 V' m: R6 O
答案详解
# Q: f! p1 M' I) I3 D
- {4 u; V( {6 W6 O5 H1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
) h4 ?2 l, h& x) g$ I( m2 s
( y1 H4 }' M2 }% F2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
4 u2 `# o, O- Z/ w2 Y* G$ H
, \3 [' K% `" i( Z% n/ y3 x+ V3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。4 @! q+ f! H% ]3 J4 g7 {
) X5 P8 J+ E0 E, a  m$ y
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。1 M% @1 G0 [. d7 s+ b/ Q# I

" [2 Q+ y) h: z1 ?8 ^5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
6 L% }# p3 W1 _& S$ @- p: b: I7 x) I8 ~
6.答案显然是INSERT。
" |& W4 k% h! c, W
. e3 O' Z* v7 q  ~4 r- \9 P4 ]7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 A/ I" ~0 c9 M6 v& ]: c2 Y
" e7 ~( y8 ~% Q8 M2 N" s; a8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。7 D4 B; y- S, K5 D* y4 X- u

+ `8 q  Z% f* m+ d/ Z, c2 I& d9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。: l7 R$ S* ]! b, |4 G

' m7 }( s5 M5 A2 ^; T10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。" L  m. \& ^$ M/ L" ?8 O' X2 D! ?

  F5 H$ A) a' ?! |1 y+ @" D) u' T4 s11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
1 J  |8 l* K6 S5 j
! {! E2 g7 R* g  G& B12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。6 ]+ z4 V1 k* H8 f% U

/ W( O, }2 P- H* y13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* c( M+ r5 l+ B& J, A" y% R
2 Y- ?# F! |$ ^1 j: g; G14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。0 {& m' Y" h0 e' `
1 G( z! |- M/ z) ^* U& u1 @
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

返回列表
【捌玖网络】已经运行: