返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" c3 `6 O  [0 H. sPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。7 A/ J9 T' G! q
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。1 d' q' P" t4 M1 E+ [, s
1 L( S9 y) A5 G" ]
  m6 {5 M$ b+ [3 Z8 f5 p
问题& B' u9 {( q% n$ \# L7 S
0 u9 s4 R; [; J  f3 c
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
5 u, G! \/ U1 e! S1 c2 `! C% f3 Y+ f( t) W- S- S& A; M( q
SELECT * FROM MY_TABLE
, o/ j# L% w2 k  e, n- ]# [' F  S8 c. C0 r# b* I2 `8 g
A.如果可能,用把查询转换成存储例程
. q- O9 Y; O1 b+ hB.如果程序允许,给查询指定返回记录的范围& }: Y6 O1 I" p8 D. L
C.如果可能,添加where条件0 s5 h, |0 o3 u# a. f
D.如果DBMS允许,把查询转换成视图' }5 O5 i, ?  U; ~: X$ I# q
E.如果DBMS允许,使用事先准备好的语句8 q* ?% W# f( ]2 e6 l6 A* c
2 ]7 {. f3 ?! f$ ]1 s/ I' ?! D

7 @, ]  x) @" b( j* W* O2.可以用添加______条件的方式对查询返回的数据集进行过滤?
& N* ?1 d+ R; K8 v* h
( L2 A- `9 m$ q* @答案:____________* R* }6 T' I+ u% m/ X
7 u  ~( @4 }$ N2 b% S3 o/ I) {

9 `; s. m. U$ w# O* A) b3.内关联(inner join)是用来做什么的?2 A9 D% Z# L( R+ i3 y
% Z, z0 P) i/ j" @, X
A.把两个表通过相同字段关联入一张持久的表中( u- s9 ^5 d1 a/ q
B.创建基于两个表中相同相同行的结果集, b1 L6 Y. D. R5 I  @1 U0 ]- [
C.创建基于一个表中的记录的数据集% W" o# E8 P4 u0 M2 o% r
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集* ^3 H# F  i9 d0 g) u5 @7 U
E.以上都不对( a# |1 b& @/ Q# k3 D% n
& M! l' D" t& g& M( Z$ \
+ c0 h( {* f; ]! u' I9 p: w, G
4.以下哪个DBMS没有PHP扩展库?$ B5 Y- D& h6 A; k

; \4 W* ^0 g- P* a* rA.MySQL5 X8 ?( W% s4 I; @
B.IBM DB/2% m" _. M/ |% _
C.PostgreSQL$ i7 c, q; J/ z' B
D.Microsoft SQL Server
# N+ x* f! a# |E.以上都不对
8 V7 j/ b! R+ N! R
; [" h, @; V2 q- t* S% T+ t: i# v- B# Y: X2 r1 \
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)$ A5 D1 o- G( _: v: @
( I8 u1 w, `. q; s
<?php3 Y7 G* K0 Y, I! q- ^
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
" J0 X) C, M. ^4 {?>
) W; l. A& e% v" g
/ m  N4 c  H% W+ b/ z2 vA.MYTABLE表中的记录超过1条
* [3 t5 ]1 @1 H/ |0 e, M. C# m0 L" NB.用户输入的数据需要经过适当的转义和过滤
) ~, i. c( p; p( Y; y1 l8 u- }* O6 cC.调用该函数将产生一个包含了其他记录条数的记录; g3 m) h! k0 E! c8 _3 P1 i
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除- x6 K1 D. Z6 \' ~# V% P
E.查询语句中应该包含数据库名8 p4 f2 [# ~) D) |7 t
( K5 ]0 @) x& L( y
9 A' y3 f, J, `
6.______语句能用来向已存在的表中添加新的记录。
- o- t% }/ h' D* _% T7 s3 H+ L$ f' ?8 V
答案:____________
- G7 _' |7 t5 T) V/ w
4 w. ~" z% z; o% e1 C. \: K$ b3 W  H, S6 |. ~
7.以下哪个说法正确?
# U' B# S. R9 w4 |) Q, y8 u2 S$ u) N# f
- ^, K9 w6 e, f/ s5 h/ ^4 YA.使用索引能加快插入数据的速度6 T$ `% ~8 X! K! ~; `1 g5 q
B.良好的索引策略有助于防止跨站攻击
3 ]! @9 ?2 a4 g' F5 i3 o4 TC.应当根据数据库的实际应用按理设计索引
3 T$ ~* {: B6 M3 K7 ?6 m7 }3 _D.删除一条记录将导致整个表的索引被破坏- t% r. h( R) \/ k
E.只有数字记录行需要索引
- {) F! B& g* _: l% G& G9 ?9 Y4 {1 I" X5 R
6 ?. c1 `6 n2 q+ m1 Q& s3 J
8.join能否被嵌套?
" i, R/ Y) X0 k8 @7 n* ^. `0 C( S% O* f8 L' I4 t  D9 Y5 |. Q
A.能
+ _, o2 p' ?( n9 k4 f2 T! x1 _# yB.不能" Y0 d2 o4 L; ?  W8 E7 r3 b. z0 Z
# G: R' ?8 M3 D7 ]. k. D( q2 o
3 l5 R9 _/ E0 H8 X8 ^, c, p
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
1 A$ j! D6 V8 {- w9 s' b5 v' x" z' p
CREATE TABLE MYTABLE (% `$ d, i, ]4 h; q8 E* j+ _
ID INT,2 E7 R: s$ G/ G# _
NAME VARCHAR (100),
1 |7 _1 J8 P( N: ^7 TADDRESS1 VARCHAR (100),( ^% F) m+ d" x6 F1 e
ADDRESS2 VARCHAR (100),0 [; D7 \9 z/ Q" C" c* i2 h# }! b1 K
ZIPCODE VARCHAR (10),, t% p* F9 n* V9 Y9 p( w2 O  W
CITY VARCHAR (50),  y8 ^2 @+ V% I. k
PROVINCE VARCHAR (2)7 ^' {/ k" |. n0 \! R* T
)
/ B; H/ B- y( a; V" f7 RSELECT ID, VARCHAR4 z8 l; q% @& ^
FROM MYTABLE
; B4 Y, Q9 \, X5 q7 t3 q) BWHERE ID BETWEEN 0 AND 1008 e$ C$ b, m$ K1 g! ?! k9 i5 p5 r
ORDER BY NAME, ZIPCODE
  H( f: i* z9 e& c% O4 m/ g( k1 \; ~: p: z+ c0 c0 {3 P, j6 p
A.给ID添加索引
6 d  _. B. Z4 X7 L$ I7 s2 W* AB.给NAME和ADDRESS1添加索引9 c6 x" }3 W9 p* y" o- Z& x
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引) ?3 T' G2 f) M% I7 n4 C' E
D.给ZIPCODE和NAME添加索引
* r% J. {: ]2 Z9 R( `0 SE.给ZIPCODE添加全文检索
" [. a: m7 a. P8 g3 Z9 u% |9 c% t6 I% \1 ^! M" ~1 I

( [: @9 @! V) ^4 Z, E10.执行以下SQL语句后将发生什么?3 L* ]5 t  s" G+ l8 O
/ d# Y" i1 x1 F' Y
BEGIN TRANSACTION  i/ f% r" Q. X! G; f! k# I2 k1 I
DELETE FROM MYTABLE WHERE ID=1$ \6 q! ~* A/ h
DELETE FROM OTHERTABLE
1 e+ L* [+ H. H: {# n3 U) O7 F9 D' CROLLBACK TRANSACTION
! \  }0 D8 }& o. K/ ^& d3 p. J$ M/ F; s, G
A.OTHERTABLE中的内容将被删除
8 {4 H; f- ~! b; |7 O- @B.OTHERTABLE和MYTABLE中的内容都会被删除+ W0 k$ W, u) h( K
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除0 j0 A6 {$ q7 V& e4 ]: T. p, g
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
: X+ J7 V! b) J5 G8 GE.数据库没用变化
# h* g# ^! S2 e1 C0 d7 x% l- m2 Q: D6 G: r1 B9 e- z5 S
% V7 L3 N3 X3 Q
11.DESC在这个查询中起什么作用?+ `4 r9 k* q1 Y/ v6 q/ z
5 h' C' t0 g( `4 D6 j
SELECT *
9 `- H" p" c5 u/ C( tFROM MY_TABLE2 t" T8 N, V1 [, K% n
WHERE ID > 0/ Q& _5 ]) a9 L# t  E
ORDER BY ID, NAME DESC
% @1 ?: v9 g3 h+ U' L- D
: S  ?% p6 z% ]: C2 ~5 K( WA.返回的数据集倒序排列7 r* H" k. w) U% u6 h
B.ID相同的记录按NAME升序排列' X3 j! M& R5 U  a
C.ID相同的记录按NAME倒序排列
" Q+ P, y  }& \D.返回的记录先按NAME排序,再安ID排序
/ ]' c$ X  [. ]' ^E.结果集中包含对NAME字段的描述4 R; m+ I- S; Y/ {  e! C: A

' K7 k! ?  b9 j! N7 y
8 A, w7 {' n, |% o5 g; a12.以下哪个不是SQL函数?
/ H. P) ?5 t5 G, @* j: A
3 U! A) Y5 P7 p) B# j& ~# |4 N( [* sA.AVG
' r1 r3 a5 r( r' ]) _B.SUM
% a. C: m/ H" F& s+ cC.MIN- M* ]' ^' T4 p% d1 ]" o! M4 E9 a
D.MAX& Z8 _6 o5 L( G# N
E.CURRENT_DATE()
3 E/ R$ b' _: Y0 m; L' {& c
8 b1 o/ b+ r1 O8 J5 `, t/ v* A8 K$ E& }: B4 C$ t' T* u
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?- k! I& ?% Z7 b3 U0 Z& m

9 K, E* N4 B2 s  ?A.该字段必须有索引2 P0 J" L1 J/ [6 e7 w) K$ N
B.该字段必须包括在GROUP BY条件中
1 z& N( A: `5 _0 wC.该字段必须包含一个累积值( l/ y  M; {& K( o0 a
D.该字段必须是主键
5 t+ Y2 @  \5 t1 ^E.该字段必须不能包含NULL值
$ @! M  Z& {* K0 B6 x: K2 `
* `, Q' M4 N- x
% c& E- O) \, b4 N14.以下查询输出什么?4 a9 M0 z3 g8 O+ ]
* i" s! \' @" Y! x4 Y
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2( n# S! B8 [3 Q5 e1 j$ \$ N
ON TABLE1.ID <> TABLE2.ID
/ u% ~1 u( P; b2 M. `/ r  w
1 I: r- z! }7 S$ m3 H! iA.TABLE1和TABLE2不相同的记录
) Z9 h, x% J7 B, z2 x2 s+ o+ s0 XB.两个表中相同的记录) L6 C6 a( B+ d  Q' S
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
4 c" [% L; v. Y" u' MD.两表中不同记录的条数
8 H, ~8 \' q/ RE.数字2; t+ C, q/ L" \1 p$ y/ n
! ?. D& p6 T3 d9 n. Q2 m

) X1 b3 y, A: l- o2 K/ {4 x15.______能保证一组SQL语句不受干扰的运行?
, B2 Y$ n; q! O0 |5 a  z6 p. U1 l$ N! `7 Q- U5 w: a; b* w9 d
答案:____________
  E- b* H# @2 j$ c
3 W2 r2 G  ^: P/ n: @3 G$ }& _5 G! U/ i$ W, x

# a& a. J+ O" \' B4 V) ~: P答案速查6 X" m3 E: p! f& }. X& P9 X
1:BC6 z9 L. ^' ^7 h; M3 O! s1 w0 N
2:WHERE
( Y9 ^5 [  e3 r7 p, U3:B) ?9 R# _2 Y/ I7 I# S2 a
4:E
- X: c4 t! H4 v/ A5:BD) Z/ H4 L# ~/ v0 B$ U
6:INSERT
% u$ G( J. D+ G7:C7 C* w) @4 O1 E: \
8:A
1 `# e6 P# F" ]6 ?9:C
, d# \; l8 L: k10:E
/ |/ R' u8 D, K6 R8 R1 J/ E( j11:C' L! ?0 A" b5 U# M
12:E- M5 w( a+ t8 x- D
13:BC5 l3 h7 \4 ^/ K1 `, m
14:C
% n/ I/ i  M4 B, B# L15:事务
  v: v; d# J# D0 L. r
& v4 p  V3 a& v9 w
& m* u  }# o/ n0 B; h4 ]' a4 }) _- N* B; |0 ]' x/ E  f
答案详解& L6 t$ B! `5 I8 F( l/ J$ p

/ T2 M$ U) e7 o- @2 C9 }1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。4 v8 D4 Z: w) j" B6 z! x

: _7 ~  S# P. H2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。+ W" w8 b/ Y- M: T" T

& ]9 x" T3 b  M3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 {: J  ^" ~; N% I4 e; C

. S) a( N& H5 g1 H3 s; o4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。8 C* q- D7 y9 h; N% p5 \) a2 Q) F

0 i/ v: p' q! g! I0 K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。! [' J9 v3 N1 @7 ]& q# g

1 K) |+ i$ I  R: `# \* b6.答案显然是INSERT。
) S' ]- y; k7 J6 ?5 y+ g" x" V0 T" j2 O7 }' k* N, l
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
9 T9 K: m. p: N1 r
  D5 v, B6 g" O; ?8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。( J5 [% G( M) X2 ?$ w
) `/ Z: H. T: n
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
% S2 A9 f) p3 N- c8 Z5 r9 ^6 S2 ?/ c( C9 o% {5 G* {
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& d: u* V4 O3 k( P; d8 J) {) H0 t' }0 Y- G) M. J1 F# D+ j
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。: @- Y$ c( J3 ^

8 B- D' P( M/ \0 ~$ S, |# m12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。  }' v# h4 @# X; A9 r( q' l' j! O2 G( ^

& q; |4 K( a9 h5 p! a* j13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' W( Z: J  ^7 X1 ?4 q/ ~. f

( _! w3 `. E; P5 `1 w14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
; ]. I2 c4 n  s7 t! n. |7 S8 x5 W8 D" G- D; D* t4 S
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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