获得本站免费赞助空间请点这里
返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ [' q* X; J1 x( dPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ p! \  U  }9 O  h本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( x0 e7 d* N) Q

: y1 O. q+ t' H: F- N/ w* z6 b' l
& C% w7 B/ @1 E6 y  ?+ t问题
$ y3 |/ z/ o# I, R* k2 B; _
4 E& R. D' E' X6 @) a9 L1 O; z1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)9 E# M+ |/ r' M' s
/ i6 t5 I1 _) }# K! P" ?
SELECT * FROM MY_TABLE
7 G8 B; q) X+ S; U) `/ G9 n& |- y9 D7 i# S4 }- u/ A
A.如果可能,用把查询转换成存储例程
# X) F0 H- {' _, v9 F) V( IB.如果程序允许,给查询指定返回记录的范围# l- o' I8 `. m9 U
C.如果可能,添加where条件2 [8 v/ r' r! \# e6 J8 Y" a- e
D.如果DBMS允许,把查询转换成视图( y; V9 A& i0 g/ n+ A( }. `7 X
E.如果DBMS允许,使用事先准备好的语句) u; ?5 q+ Z: A- |' \
( K( j" y, N; [# g8 w
  N# V& k( @1 V/ }0 {) F
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
- {8 a/ v- q; v2 R% l% ~5 ^6 p' g# B2 n0 `1 t+ F5 W
答案:____________0 _& n5 N+ x4 O# @& |8 n- A+ A7 d

/ |2 u2 X1 l' j5 A* C( D: z3 P- o7 \3 ?6 T4 C
3.内关联(inner join)是用来做什么的?
- i4 v2 s% x1 p% p+ w* t6 E7 w% I5 N' s4 ~4 _2 S
A.把两个表通过相同字段关联入一张持久的表中
7 ^; s9 y4 |! l7 kB.创建基于两个表中相同相同行的结果集
9 w1 [! B5 m* x. C+ v' r% s! L8 @  n: SC.创建基于一个表中的记录的数据集: i+ m  P1 o& f2 f1 ]
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集* }2 Z5 {: H: v% ~" ^$ V0 M
E.以上都不对3 H' F) n5 m7 h& M, M! o
# p2 H- T  h$ x" _8 z" Z9 F

9 i2 j2 U' N1 X, m7 s* ^4.以下哪个DBMS没有PHP扩展库?; J1 D9 ^0 k/ v& Z/ x2 H
. p% q' U: F; J* w
A.MySQL: Z% k2 U. t  A3 `
B.IBM DB/2
* J/ |8 x% x& T% r- Q0 F+ y" r* y5 sC.PostgreSQL, Y+ v, c6 M6 h3 w
D.Microsoft SQL Server  x0 o4 i7 [, j  X, S$ T
E.以上都不对7 |) d' K- X6 p. I& S$ y: G
" D8 B  i* A# a5 @. V
8 J: Z& x, J$ j- y4 x& t0 O
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)+ L( ]5 [# S5 x: ?. D+ U
& Z5 [! j7 w8 U, q6 Z: s
<?php* x6 ^* E) P' w* k
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
% ?6 O9 t$ L1 T, X?>) m2 z3 e4 _" Y2 a7 B. y

- m: `: g2 Q. U/ Z" KA.MYTABLE表中的记录超过1条6 U6 ?0 e* x% O! i: x
B.用户输入的数据需要经过适当的转义和过滤6 X) {; n* r0 ?' X- L% D% V
C.调用该函数将产生一个包含了其他记录条数的记录
7 C; m, f& {+ ~- HD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除$ N1 s4 \5 j: |$ a1 f
E.查询语句中应该包含数据库名
4 l! j# ^/ w9 W6 ?" S6 f8 S* u+ h! ~' h% R2 R! y8 _0 p- L
; x% m+ g- O  m3 t/ y
6.______语句能用来向已存在的表中添加新的记录。% ?8 x  s& m, Q

3 |+ l# C# Z( s4 }" A3 ?+ m答案:____________
: I  `. D/ i. a) z% m, b, Z  k0 ~% x  M& f0 P/ J! t- S+ k
6 F* S* Q/ s+ {8 D+ M2 w# O
7.以下哪个说法正确?
# r, M: a& m3 O* g& a4 C( v4 g; K( @" J  s. T
A.使用索引能加快插入数据的速度
# }5 t' E. q8 i! Z+ ZB.良好的索引策略有助于防止跨站攻击
0 i  j" A$ [2 a: Y$ Q. D  aC.应当根据数据库的实际应用按理设计索引0 y, H, Z9 X5 D, a4 u
D.删除一条记录将导致整个表的索引被破坏
! D" N  n5 Z+ x, A% H" jE.只有数字记录行需要索引
  S# D: W& w8 C. m! H  {7 n! S2 f  _5 M5 C& Z- I  G- K

9 g1 p9 C8 _: s2 M, k* f/ \8.join能否被嵌套?9 f; d) @) ^0 W% |- l

; b7 h/ m  P9 gA.能
& V, r: v: d% Z+ bB.不能5 G0 ?( \- E$ r# @+ T
: I7 o# e( I, c' E1 m

1 s. b+ N( H" w1 H( _* J6 U9.考虑如下数据表和查询。如何添加索引能提高查询速度?) ]- `+ \0 k6 S

$ {9 c" A& E7 P% V! aCREATE TABLE MYTABLE () i2 A' ?2 g0 ~. X0 O- {8 s( X
ID INT,
# c* ?! z- U" V2 z* K- R* s* gNAME VARCHAR (100),
( V( k* X) _2 ]* w- C, Z& J- x# kADDRESS1 VARCHAR (100),
0 D' F: T: B: V& c$ g  G' [% ?ADDRESS2 VARCHAR (100),' o* Q% M9 V* ~  D; Z8 K
ZIPCODE VARCHAR (10),
0 _7 k# S( D$ e8 iCITY VARCHAR (50),; B& t. @  H/ }) o$ Q: u
PROVINCE VARCHAR (2)9 k3 F3 M9 I, I" p4 ^4 U
)
! k: T7 \3 ]' r2 N- h: eSELECT ID, VARCHAR" y8 Y4 b8 c# F1 ~
FROM MYTABLE
( U1 E  e5 J: x' a7 eWHERE ID BETWEEN 0 AND 100
8 F- y! l7 `6 q0 d/ s; F% e8 `ORDER BY NAME, ZIPCODE
/ F3 h3 X- g+ X. d7 b3 ~7 O& j" Z$ r) `" W$ Z2 x
A.给ID添加索引/ U) q2 a  i6 T3 ?7 k5 L& o6 G' F
B.给NAME和ADDRESS1添加索引; p1 x  k9 d) L, y" W
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引5 V7 u! }+ G2 ~2 k
D.给ZIPCODE和NAME添加索引9 c. u2 K6 F9 P) }" m
E.给ZIPCODE添加全文检索
8 T. R; f$ X# W! ~
% @7 {2 Y5 d! n3 i. X' s9 x/ E: x0 y4 Y0 m# q
10.执行以下SQL语句后将发生什么?
" {+ ?- W  {# a
" [- k8 ^7 t: ?! jBEGIN TRANSACTION* A$ z3 J$ N  s# u% e" V! e
DELETE FROM MYTABLE WHERE ID=1
( f0 Y  H' _6 x$ ?DELETE FROM OTHERTABLE
, |" s1 f. L# ?ROLLBACK TRANSACTION& L" P; z' {8 }/ g1 X* y
7 p# b3 t+ M% f# ^; R5 h7 z- z
A.OTHERTABLE中的内容将被删除0 G- D* k9 @1 J, Z+ @1 \2 i+ |: B
B.OTHERTABLE和MYTABLE中的内容都会被删除# i, k7 x0 w% g
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除% n# \; E5 L+ G% B+ i
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化3 L) [- l9 L2 i# S; o' w+ [+ @
E.数据库没用变化9 H$ j( [9 T* B. P
: w) f% S  Y/ W( g- \

' J( O- r2 ^% Y( M" _( t2 _6 i11.DESC在这个查询中起什么作用?
& S6 f$ d3 C" E8 K8 K/ Y' w4 I* `! \$ \7 F
SELECT *
+ A3 Z! S+ Y" e% h0 yFROM MY_TABLE
5 V: k% A' O9 m5 L( }% ~2 S. AWHERE ID > 0
  P- F$ l6 R1 tORDER BY ID, NAME DESC6 i2 }6 k6 ^, ?% I! e/ t; k

3 v( S4 q' n# wA.返回的数据集倒序排列
0 j& D$ p- F7 KB.ID相同的记录按NAME升序排列
3 m$ T0 n: G; e+ ~/ J1 ^C.ID相同的记录按NAME倒序排列
) Z. I% T0 ?: w9 f3 z( ^- T" qD.返回的记录先按NAME排序,再安ID排序
' W8 a/ G( T! O0 J5 H' ME.结果集中包含对NAME字段的描述
# @! G- P) m, s. b! ~$ Z6 a. e5 g$ b9 G$ B
$ ^. W- |* G/ n- s. M
12.以下哪个不是SQL函数?" ]7 @: o0 ~! a
7 y  V' O3 M$ t8 N; ^* K4 c
A.AVG
# Q2 R3 _2 b# e5 z- E9 X8 ZB.SUM
( ~4 e# q9 p4 [% \1 Z% J6 }! fC.MIN. g' Y3 d% s. \
D.MAX1 H2 o  j# i. d! E+ O! S: Q
E.CURRENT_DATE()" k5 x6 [1 T( x, [$ j

% S5 A# M# S9 `$ p- z9 j. e% p: ?8 K6 n  V4 a- y4 o
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?- H- \/ v( P0 x! w0 T6 y

% v* W8 T3 q$ T& o3 I# SA.该字段必须有索引* r9 v  I' ^, N6 j- {, h1 k" B9 {2 _
B.该字段必须包括在GROUP BY条件中4 l: ^. p' h. b; ?4 R& w
C.该字段必须包含一个累积值
! [: T6 p. i- [. k% C/ Y* O, tD.该字段必须是主键1 v& f$ b, ~8 K8 p0 `3 M0 W
E.该字段必须不能包含NULL值
3 ^  @6 q/ ~: w0 e. W, i
' V8 q" D# v. c5 e; m: p8 T! ]+ \- T% e# m- d' I7 [  k: ?
14.以下查询输出什么?
' s. \; M/ b4 M2 `& f! ^3 K/ ?9 c
( T. g0 e8 m, mSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
/ p6 ^9 C1 J& U2 R' E# l1 E) t. kON TABLE1.ID <> TABLE2.ID
& C! a& O9 a* d3 Q, z4 \' u( {* i
& c: {8 q2 {/ ZA.TABLE1和TABLE2不相同的记录
- I. U8 e% Z3 Y: s$ W0 L9 `B.两个表中相同的记录; ]! Z# I  f) M' e9 k
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
+ ?: g+ z7 e7 ?/ k  o; kD.两表中不同记录的条数
5 k- F- g- t+ Y5 _E.数字2# c2 ^; b5 }6 a% G
" ]8 k  g* f, Q) t$ h

4 D  K0 t6 I. X3 f# f9 t! f1 U$ ^15.______能保证一组SQL语句不受干扰的运行?
+ f( |0 k4 C5 B+ ~8 j" r! b" o
: Z& k  D* t' ]/ P答案:____________
/ ?8 ?5 T$ i/ R, H
" O% l9 ?. f" j. m2 j6 u6 c0 M' f; |  @9 `
8 f& Y0 |8 Q+ f6 x
答案速查
. ^* D: v; Z  y/ H* a" ?' `5 S- [1:BC/ D. O, x  ?; }! `3 Z2 `
2:WHERE
( z% H. @; K# K( m! b/ Q3:B& Y; H# S0 q$ A  m$ s, Z' Y
4:E
& E1 _9 x( E+ b/ m" T5:BD- A/ V  S6 ]3 K* E9 y& e" I7 B4 Y+ T
6:INSERT2 E, o6 G4 G3 q0 @7 W) y
7:C$ t# Z3 _  }7 O2 M" s- X
8:A" V- l) b2 P. s- e& Q
9:C
: {1 J+ \8 k8 L3 \10:E
! ~2 @1 J9 E" x/ }5 G11:C
( V, q) y: |6 `) q12:E
) o3 ~& j1 O0 y! V6 Y: l13:BC# G! l6 [/ [' v
14:C
: Y9 e+ u; a9 s, H3 _15:事务
: m2 N- q2 s. g/ c3 P; [  s, c1 o* F  d$ ]

: J1 _* N/ W: F* C) x9 P0 g4 P, i& y4 S6 [6 B) `" w! S
答案详解. J! w+ ~& f' D) h' y* t, ]% H

1 `3 d% ~. H" f: H1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
  M% {$ P% `% W, @( q" s! e" t& n1 N- ]' A0 z( p
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。/ N3 k4 l) Z8 L" D8 Z' E& r

4 D0 z& i1 s2 t' h/ E3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
; E$ |* B+ w0 L9 v* N* l
+ K0 f6 u" U0 D( M1 G& }3 R4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
' k8 l0 G6 Y+ c
' k1 u& q: l9 D' q3 e5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
5 I( m* c- V3 d- t, R  r8 @4 W2 a4 j+ q& y
6.答案显然是INSERT。
5 C5 ^5 i4 m  Y! w+ J4 D( ^
& Y% `: c$ `+ \; _7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
$ m8 l4 G1 ^; B% [3 C" Y
- f: t8 L% l7 e3 @! v+ j8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 n. Z, n! F: i" N

/ ?3 |. Z' ]9 D% ~- j- r( W  l9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
9 Z/ @1 n* E1 Q, A- s9 c; i
6 q1 T6 N0 R: E5 R/ L7 G. f3 k' f10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
, M, X- k/ M& ]# x$ v8 z
# Y( g$ {- q1 r' O" V11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。! l9 j/ M# y+ \6 T: g
( b* }( [& K8 E7 q
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。* i- \; s2 h8 }6 s$ x3 w, G" Q

" I: ?) _$ z0 U13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
8 q8 x2 I  _5 U2 R$ p* e# a) v& D! g7 X7 b( w4 G4 d# n$ k/ v4 Q
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
0 }3 @0 Q) W* _3 s& Z
! c! n& T$ [" _15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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