返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
) v3 y$ h& ^: v4 S3 nPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
. a* f2 y% J9 [1 D9 Z& ]' J, K( b本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
% X  o2 N: P+ ]8 F: V
/ ~1 j# B& @  ]( j. U
, T; ]" ~9 z. t. X2 Y  D6 L问题
+ L5 S8 H* _, Z3 v7 ]/ P) N" r0 z5 Y* ]$ R6 ~2 z! P& [
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)% u; L& g6 w( `- J- n- y
' _- S# R( K4 X1 _4 [2 T7 {8 K6 a
SELECT * FROM MY_TABLE
7 [* t6 N* _- ?( ]4 ]6 N" a0 f) p- |% z! V! l7 G2 ^
A.如果可能,用把查询转换成存储例程# u- `4 t3 X* O# v9 B* ]2 w0 K0 a
B.如果程序允许,给查询指定返回记录的范围$ G" ~$ U- J$ _  d9 V' v: l* g
C.如果可能,添加where条件9 A/ A4 q9 e8 w: ^
D.如果DBMS允许,把查询转换成视图
; P9 g7 n# v" R2 g* z1 Y; fE.如果DBMS允许,使用事先准备好的语句! O. {& U  G, i' R0 t5 i2 d: K

* F; P, k3 V5 c8 m' h8 {) h
8 L3 m" }: ]8 Z/ Q0 |  n2.可以用添加______条件的方式对查询返回的数据集进行过滤?/ n4 i* U$ n0 z

% M% U; l4 F" o, b8 t/ O答案:____________
  A/ z. V7 d7 b' {( A% Z/ p& q0 [" H# ^/ }& c, P; C
: A" m: e7 j4 ~
3.内关联(inner join)是用来做什么的?; k/ j3 p. k9 q# z6 Z* y: \, @. i

: g! `. m5 N" C' yA.把两个表通过相同字段关联入一张持久的表中
: k% \  C0 b* ^3 jB.创建基于两个表中相同相同行的结果集# s- Q7 m9 t4 h* B) h
C.创建基于一个表中的记录的数据集* i; b' i1 j$ k: M% T
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
$ [; V5 P$ Y* ?! H2 J; PE.以上都不对
* H& J2 h* I: s3 D" H
2 U0 |3 r! x- v9 o# \  S" Z) f9 R& P
4.以下哪个DBMS没有PHP扩展库?
( q5 f9 {  S. I& \6 P, b( U# h
% [) @$ V2 \$ d9 y# L$ gA.MySQL
4 J2 M' o, R! F1 ?: h% K5 V/ t0 dB.IBM DB/2- j7 P: u% Z+ b' f4 y
C.PostgreSQL
8 h8 V6 F- N& p. h7 Y  zD.Microsoft SQL Server4 s* j/ b: q  Z% R& B- ]
E.以上都不对8 v% X( P9 p2 p! Q7 p: ]1 T* ]
4 I% O4 {2 D5 a8 l4 s( c
+ ?: w9 z8 Z+ s2 e2 `; \$ Q: I
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选), ]* t; ^0 l8 o2 ~3 D3 ~7 T
8 t. [" X# k: J+ m; e0 h
<?php& J1 C4 L0 J( d$ c- Q& a' n9 `
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
7 w6 t# n$ C7 k4 x) K8 p( E0 d?>( p: j6 Y5 O' Y

$ e& p: U6 B8 ^+ \& e8 Q/ Y$ P2 OA.MYTABLE表中的记录超过1条$ ~1 A+ N; ]+ Q. r
B.用户输入的数据需要经过适当的转义和过滤
" x- t+ y$ B2 zC.调用该函数将产生一个包含了其他记录条数的记录$ }; Z% u7 p: a% F" u; U2 @
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除( N/ G! ], z/ R+ o
E.查询语句中应该包含数据库名
6 f: I- u) [& ~, h- Z* ]! i& ~, d; ~& E5 T& A  L3 [  x$ }
+ W+ X1 ]% w9 _
6.______语句能用来向已存在的表中添加新的记录。1 j; G4 W# l( D+ l+ _5 f: O
, G6 `0 V; W4 z7 {4 a% k, Q0 K
答案:____________, L+ p: x& i4 P& w+ A& d" B

5 k: y+ O! a% p5 K% B* E4 x1 |: x4 D4 y% ], I' K: m+ l1 `
7.以下哪个说法正确?* `7 w# s, R/ q3 R' d% V6 y1 J

1 ?+ m* {( e  UA.使用索引能加快插入数据的速度0 G; `/ k9 e; R; V, |0 V( A1 Q
B.良好的索引策略有助于防止跨站攻击6 Z( j, p3 F5 }! n( J  B* e4 b7 f$ _
C.应当根据数据库的实际应用按理设计索引
2 `4 [! E/ g# ^3 j+ hD.删除一条记录将导致整个表的索引被破坏- |7 ^7 w4 i% c. A
E.只有数字记录行需要索引
* e: v# k' c' J. c) u. w# C
' Z9 T* Z0 |) T( W* W- r2 d
1 m# d# U; }, i( D. j* j1 D9 x! u8.join能否被嵌套?
. h) h# D- r& I& ?
' Y) H( p' ]7 r+ iA.能3 @1 w; f, m; B
B.不能4 x8 w! y2 O6 K( O4 R; k4 W) Y
% C5 t# Z$ y" t+ Q: d; J. n

$ k" s' u( g8 I% {/ G9.考虑如下数据表和查询。如何添加索引能提高查询速度?; u( O+ T2 q! q
, ]" \' }+ C) c8 g
CREATE TABLE MYTABLE (9 j. O4 o$ t  s! u5 P  i
ID INT,# o/ N) V9 b! m2 ^9 [. k& j
NAME VARCHAR (100),
$ @# ^; w' f$ I% T8 i  MADDRESS1 VARCHAR (100),5 [7 c" a1 v$ _
ADDRESS2 VARCHAR (100),
, |$ }* ^' C4 S  S" XZIPCODE VARCHAR (10),8 N+ F! |( B# t9 H7 N
CITY VARCHAR (50),1 u' o! }( @+ I% t) m# u
PROVINCE VARCHAR (2)
  v' k- Z, [$ k& p* `); F! d8 s7 ~) I+ B6 Y
SELECT ID, VARCHAR
' r) T( O) [" Q2 J, TFROM MYTABLE% |9 O  ^$ F. [& O8 q' I$ S
WHERE ID BETWEEN 0 AND 100
1 g. F6 C. S5 ]( b" k. J. f: Y6 eORDER BY NAME, ZIPCODE
6 h6 }' ~* L& r0 _% l+ t* S
" p0 r, ?% h. b' S) t# T- \3 UA.给ID添加索引
# I4 @! t4 d5 W3 I; YB.给NAME和ADDRESS1添加索引  T% v) ]0 l/ @. R: U! @  B
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
& j# J1 m& W  a0 {$ a3 iD.给ZIPCODE和NAME添加索引
5 K/ V# O  g1 J3 z+ bE.给ZIPCODE添加全文检索7 [/ V' u" i. Y* R1 Q, M9 N9 U

$ Z4 W2 Z" O# b' A/ B9 F; N% ?, w* ?
10.执行以下SQL语句后将发生什么?
0 N( G" |. M- J# P/ I) }+ _5 h
  d  p0 F6 o: M# @7 h/ t" U- uBEGIN TRANSACTION* I  c, L5 p  \/ [, R" X2 I
DELETE FROM MYTABLE WHERE ID=1
8 |7 J. g! r- B1 ]DELETE FROM OTHERTABLE
' g+ u; w% H* m; V  e# m# m, TROLLBACK TRANSACTION3 \! l- A* I" T) _* h
" X& g2 ~4 g, Q  _
A.OTHERTABLE中的内容将被删除
7 N1 W  @; O# f0 L* G# bB.OTHERTABLE和MYTABLE中的内容都会被删除: f( J* p7 o* ^) F% ]
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除# E! Z1 T! x8 @$ S4 V1 O. e! M
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
+ D, m6 X: Z  {! \$ n7 r# _E.数据库没用变化8 Z" s# d3 q' G% i, H) v
0 D0 s2 R) v2 R* X7 e1 o6 V
6 W$ l8 B9 g. [% P; x' f
11.DESC在这个查询中起什么作用?
) O( |# @" c  f
) R/ F: ?6 U9 V# F% HSELECT *
# y. M$ C8 c$ @8 d2 ~' {7 }FROM MY_TABLE& C+ X! z" B9 @' v
WHERE ID > 0  _! B2 I3 [5 G. V7 C$ S
ORDER BY ID, NAME DESC
  x, B$ y# Z% `8 {: f* C, x4 ^2 W
A.返回的数据集倒序排列
; r" J( |. z# k4 p- P' KB.ID相同的记录按NAME升序排列* v2 ^) v; a/ B0 |2 \: h
C.ID相同的记录按NAME倒序排列. v, S- R0 S- U- K
D.返回的记录先按NAME排序,再安ID排序
: T! p% P# Q% \( t9 ^+ TE.结果集中包含对NAME字段的描述
5 ^. m. h$ n8 J2 V
; u" ]: d4 `! X8 L  s( @! k
& X6 F) B8 l9 ^% ^% @, h/ r# K5 M12.以下哪个不是SQL函数?
- o1 K) J, `/ ]' L" W- b: q. f; Y( t3 w$ c) D
A.AVG
" o4 I* m1 `- UB.SUM
( e) y  `0 s0 QC.MIN( ~. Q" X: y2 u+ o7 h
D.MAX- A" P  J7 o( a! I5 k0 |
E.CURRENT_DATE()
( e' j" L* j( f. @
- }/ D- H0 b& d
& y8 J( W- o3 |8 O13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?/ w: P. V/ M" b3 _$ W

3 |2 @# {  C/ \. F$ F8 \4 `3 e  ZA.该字段必须有索引/ w- Y% z; e* g6 ~. Y# P4 R
B.该字段必须包括在GROUP BY条件中
3 N2 f3 Y6 b: IC.该字段必须包含一个累积值0 Y/ E/ \+ s: m: Z+ ?
D.该字段必须是主键% l0 ?  [3 f( m0 U
E.该字段必须不能包含NULL值. Z/ T9 D8 `; d1 [

( o, `$ z6 o: S& Z; \' F3 p
3 o9 C: N* g% `# n4 i" m14.以下查询输出什么?1 i' T& N1 j" p5 E" j' ]
6 w" i' A2 I7 S: V* b& S& k/ p
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
& }2 T( j/ a5 ~. s0 ?% n8 @ON TABLE1.ID <> TABLE2.ID
& x( X5 `4 B. }) @  A, s
# w8 E2 {1 F% A/ v1 C" E3 WA.TABLE1和TABLE2不相同的记录$ s! t7 I, Z8 c, b  W
B.两个表中相同的记录
4 r  q2 |* ]6 \- V4 O: ?2 hC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
; x. R9 ]6 d0 @9 c3 ^4 AD.两表中不同记录的条数3 j6 t, A; e1 U. o6 ~" o7 l: a% i
E.数字2- X$ u4 a( Q5 y

' k9 ~$ R$ Q9 m  o* H2 D  X0 P
15.______能保证一组SQL语句不受干扰的运行?# L( A4 @  A0 w! x
+ B7 n  o0 ?9 ^$ t
答案:____________
5 H+ E2 Z% P4 k
9 L2 J( n+ i8 ~0 O" R
7 P  v: \0 [$ w; j+ }& B5 H$ D5 G# V& q% p$ f+ b$ [) W$ M
答案速查% ?) c  [% ^! |2 I
1:BC* Z6 j( y* V$ K  E6 ]+ T3 M1 K
2:WHERE5 B' x( N3 z$ w3 ], t
3:B
! K' i" }" c& C4 e4:E& d* ~7 B0 x1 K
5:BD: y* [1 g. |+ ?0 @
6:INSERT9 E* o# S* C: ~1 v, H! a- z- Y1 B" G, E
7:C
: f  J- o* _* K8:A
, ]( R" K# d% V# I& Z% p$ q9:C/ f8 w: F  g  [. a  E' R
10:E$ M+ L" G) U- E3 c1 f' l! i0 F
11:C( J, R$ z. C+ g3 w& g
12:E  f; n" o. q; K' B& y4 m2 u6 K
13:BC4 x$ u7 n, i, `1 E' @/ j
14:C
: z3 D0 i% b+ T# K- w3 w15:事务
+ R5 ^- \% t; e  i. e. d- z" \' o4 x. @3 s

/ A( E! d, L9 W& ?8 |
) t; \7 o* E! u. U答案详解% Q4 X4 N& B3 u; G
/ W' A1 f2 o+ J3 z
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。6 o* ], ~' |/ [& T2 t/ [% N

- p" s/ H. S% S. {9 S+ ^3 O2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。8 y5 f. Y& k2 n1 c* X) Y0 p1 z. l
- _' ~; k1 v7 Y; p0 v3 U. v
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。( b* S- _: Q" ?6 l% b3 c  _% ?

+ r5 O* [: t0 b% n4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
& K2 {* a! J+ i4 E' t9 k% I: g* T" X) d$ u- S
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。. U# o' Z4 U$ r' B$ h
7 }: T9 D1 B, R6 N0 P8 r
6.答案显然是INSERT。
4 c- g# w; ]1 ?, x) \0 B: U& J. ^; a: `8 \, f* ~' u
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。7 \6 t" y3 k& s
: ~/ j: b7 r' I4 g0 E) S- D. \+ |
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
  H. w; v3 c5 }8 e  Q6 ^8 _5 V5 q( W) h
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。7 Y# _8 G& Z& v9 o

3 ^4 a% O. D: D/ C* E10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。1 o+ l) e+ `$ q
+ o2 @- z( W" j2 i& F. }
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
# q7 U. M7 b! i. l. c) `3 [, Q9 g7 C% _7 ^
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。  I% @) D( C  S' Q% @2 p$ }* N
: l5 o4 C5 S' D. T7 a) M4 ], L5 t
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
' @, T+ E* v* ]6 N4 b$ l
; O" C$ {% ^! b# g2 _/ x, W9 b14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
3 @# e1 [  e* t6 ^; D( c3 g% h8 C( y2 G
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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