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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。- v; e5 i" ]9 Z
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。; G4 E% z% z- }1 t* C" J
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
6 t+ t6 }; V! q5 L* g# L+ |! @- [; d. o! Q: z  @
) F) i, G1 A! T3 n$ ^: C# a
问题% j7 b( |3 \: b9 j+ |$ y3 z
' d3 K0 |) H3 y" `7 I  T( b
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
: Z4 {# R% u% {6 M( A4 n2 Y6 C$ J7 I6 e6 [: z8 M
SELECT * FROM MY_TABLE
; p5 {7 u9 e5 p5 g
, a4 e3 J6 @) L* _% yA.如果可能,用把查询转换成存储例程
1 v4 P% [) u1 N$ a1 gB.如果程序允许,给查询指定返回记录的范围
  h. K% y1 S2 MC.如果可能,添加where条件
8 [& N, S8 I9 b0 t( Q- AD.如果DBMS允许,把查询转换成视图* t, z- z9 d, G, k1 X: U! D
E.如果DBMS允许,使用事先准备好的语句' A" m5 k+ m9 ?' T( `0 D0 d/ O
' |$ a: d0 T2 B9 M/ A
" l( U" _' k; B3 W
2.可以用添加______条件的方式对查询返回的数据集进行过滤?2 p8 x3 y( W# @( n+ F

/ ^9 h- |  J9 E, T答案:____________
* ?1 c  j* X2 m" ?4 d
* A( o/ `) a$ b& N7 G  i# r  G' N3 j% x5 l8 a% |$ ]- O
3.内关联(inner join)是用来做什么的?
% j0 c. D8 k1 G/ O: m2 f
! r8 K) `/ N" A6 aA.把两个表通过相同字段关联入一张持久的表中  H6 Q+ V9 L* g# c0 N+ c  ]
B.创建基于两个表中相同相同行的结果集. _. G: a  B% f5 [" f5 v( m& }  B
C.创建基于一个表中的记录的数据集! G$ n, Z' w1 u9 h
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集" D+ g9 C. _0 i7 {& O. R2 C$ V
E.以上都不对
; M* J5 T; c5 Y
; Y, t3 ]3 H) i5 d- ?
; N; Q4 h7 K; |3 }$ ~& ~4.以下哪个DBMS没有PHP扩展库?
+ G# Y- L4 }* T" x2 o% V# h5 Q1 T  ]: ^$ a+ y
A.MySQL
; R  G2 s, g5 r2 vB.IBM DB/26 {/ x5 y0 s. J( I' l
C.PostgreSQL
$ B2 d8 E, ^4 Y0 w' ]) I4 `D.Microsoft SQL Server
$ m7 ]: u# y1 q6 I' \. L7 m: LE.以上都不对
  h, B4 i+ B- w) p# ]6 a# l, d4 l* l* a* D0 W
/ g) |& o" R+ M. Q; O3 m; ]
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)" ~- u$ C, O- @- b3 D+ j
: }4 _( J0 M- ?' L$ X; t- \* M: u
<?php
  G; W( D5 b* r, x$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);# _; b% A# B6 l; |8 u4 h
?>
2 Y- G% \+ m2 F' Q( O6 _% Z. [! s% p/ |( r
A.MYTABLE表中的记录超过1条
3 R  |2 i7 z5 b/ X0 @B.用户输入的数据需要经过适当的转义和过滤8 `4 d8 f* _, @6 S  w- R
C.调用该函数将产生一个包含了其他记录条数的记录& v, w/ y3 v' X8 `
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
4 m0 Y9 |$ o( H' u0 l, I: G. }  ?' AE.查询语句中应该包含数据库名& @$ f% _& z8 p  u( V1 k
. f' `' y7 g& T2 P5 f1 _

7 U9 D9 ?" H9 K) y- K* P; D6.______语句能用来向已存在的表中添加新的记录。. I+ J# }$ ]7 ]3 @5 B

7 z( j6 E% U3 \, |+ J  Y答案:____________: U9 l7 u4 a* o9 }& ^" ^$ D' m
1 @; r/ u; p2 l! d
: R1 l3 Y7 H3 f6 p8 b: Q, K
7.以下哪个说法正确?+ _) |1 I( t$ X) K( i
9 W  ^) L' S! ~$ v
A.使用索引能加快插入数据的速度4 Y  O% x& M' v8 x3 S  C- `
B.良好的索引策略有助于防止跨站攻击
) C0 F# n1 `2 P" d: DC.应当根据数据库的实际应用按理设计索引& u: v. U( ~7 n1 L
D.删除一条记录将导致整个表的索引被破坏0 u7 p* @. P+ L# G1 }, A# K' \  H
E.只有数字记录行需要索引
% v$ K0 P+ f3 E; N2 {( C. F. k& `. q5 {9 T2 J/ a
/ S: K7 b9 g1 t  b! e# x
8.join能否被嵌套?0 Q( S! p% D( W$ T4 j
) m2 O6 B# E, j5 o
A.能4 R7 A* r% o/ k0 T3 X
B.不能
( g+ m% [9 L8 ]. h8 C! l1 S
  `- M' U2 p1 j8 _4 e( I. p" C1 S) Q  h7 j# L0 L7 C
9.考虑如下数据表和查询。如何添加索引能提高查询速度?% L& P; E/ n! O- J0 g: ^
7 c, P! \( J( p9 P9 G
CREATE TABLE MYTABLE (
0 L7 S4 K" T0 R$ M8 lID INT,3 ?7 o' K( C0 w6 g
NAME VARCHAR (100),2 _- B: J8 @: [
ADDRESS1 VARCHAR (100),* C2 j% {) M: M1 I
ADDRESS2 VARCHAR (100),
/ b- Y  y2 z3 l# c& yZIPCODE VARCHAR (10),
& P( b) |& j8 {% tCITY VARCHAR (50),% z. H- X2 `5 |
PROVINCE VARCHAR (2)) a+ W5 o" m" S9 o: ~) U+ J8 g$ x& ]
)# R# ~! z$ x7 I* S4 |
SELECT ID, VARCHAR
6 n  `- d" V/ t: N7 B6 MFROM MYTABLE
4 p3 Q- }, D2 s7 M8 {WHERE ID BETWEEN 0 AND 100& f; O. ^9 y# n8 B5 M+ g
ORDER BY NAME, ZIPCODE
5 g$ z0 k$ e% ^6 [! L+ s/ [
( V- p% v* y7 m, C- UA.给ID添加索引
, X' h1 h2 e, F1 o$ C0 MB.给NAME和ADDRESS1添加索引; M1 x1 ]8 ^5 H3 V9 E' B, {
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
+ F" W- T6 v; A& y, FD.给ZIPCODE和NAME添加索引$ z9 o% y6 m5 q
E.给ZIPCODE添加全文检索! q4 t' v5 ?6 f) |1 s8 Z: i

; W9 u, ^  X0 s" s& I0 n
- F1 M) f4 f) |5 `! d# V3 ^( R: j) }10.执行以下SQL语句后将发生什么?
- F1 U! a& `  Q; g6 b7 N' Q
& q5 ~; d! Q6 K! d8 [BEGIN TRANSACTION
. R0 a* o5 A; k) bDELETE FROM MYTABLE WHERE ID=13 K% m4 W, l7 E8 [, Q; ?+ R) |* v
DELETE FROM OTHERTABLE- e5 w# m+ Z  Q* e
ROLLBACK TRANSACTION
3 y3 k3 P; z) m* }4 r- ^$ j, d: g- l$ B* {, s6 T
A.OTHERTABLE中的内容将被删除/ S' Z  \+ x8 Y9 Y$ ?" `
B.OTHERTABLE和MYTABLE中的内容都会被删除
) c. {, q* ?' d* ^# Y, ?C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
6 v4 j' N; [/ ?  S$ O6 G$ J2 _D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化7 v$ Q! F7 N7 R# q8 S2 O" D( a$ f1 S
E.数据库没用变化0 k# E' |% i2 @* W
2 R+ v" f' m. h% ~* K% K: J

( W9 z/ [4 n% l0 ^11.DESC在这个查询中起什么作用?
, M  _& L# p, {' D( I" Q% P9 E- n% v1 ^+ |
SELECT *: v5 ~4 _6 W7 C0 Z, R) P4 V
FROM MY_TABLE
1 [1 J, q, _: w& u( d& p: ^% ^WHERE ID > 0" |3 v3 j4 J, X' B
ORDER BY ID, NAME DESC
- g2 R6 B# d3 e  K/ C; p2 }' A3 o0 q. x  d# s# p+ ^. @4 w* c
A.返回的数据集倒序排列8 \0 u: n$ g/ z! O* U4 E
B.ID相同的记录按NAME升序排列
' X, ?4 m, S7 D: MC.ID相同的记录按NAME倒序排列/ j+ }3 d8 h" d9 Y5 S. Y3 C! Z# f
D.返回的记录先按NAME排序,再安ID排序
- \+ S# ?' c! w/ \E.结果集中包含对NAME字段的描述
+ T8 a" a. F9 Y8 Z) E8 L2 Q7 s
6 ?0 U3 E! u! k1 }7 K  I' `: ?+ [# C9 L' J; ~; y8 r& x
12.以下哪个不是SQL函数?
7 i6 c) z  f+ ]$ ]' _# N. k, V  d, g# z- b
A.AVG
0 E% k0 d  T6 c8 [3 KB.SUM4 w; G: ~4 o7 j& a: a. h( `* G, P5 B
C.MIN
- t( g* {  ~0 T& f+ K+ G& l/ z' uD.MAX
6 y) M$ Z8 {5 KE.CURRENT_DATE()0 D* q& r4 H6 N) M; u
- p7 y. K7 F7 ~7 [
/ h& s! m& g$ p/ i0 k9 a: r! A! p
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
, c0 M) c7 n5 V; q! _, o9 s
3 I: U6 Y' X) kA.该字段必须有索引- G$ c" |* C* ^8 Q9 Q+ _4 b
B.该字段必须包括在GROUP BY条件中; P! m. F1 m1 l9 x6 E! u% x0 W' c: }
C.该字段必须包含一个累积值
/ S) `+ z  C! s, j$ [% M: [D.该字段必须是主键
& n. F2 v: V8 V! SE.该字段必须不能包含NULL值
; S0 Z6 J" J9 j0 c  m
+ K1 W) A  l$ {- }5 [  u0 {! z+ m& x# m+ q8 @
14.以下查询输出什么?- z; P- g: K) C( L! ^  `2 l  x

% p( A+ j, s* rSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2# M) I8 [. ~- \6 A
ON TABLE1.ID <> TABLE2.ID
9 I& z  ?6 {  o  ?
% W- _( I, ~0 B' G: H7 w/ SA.TABLE1和TABLE2不相同的记录9 \" `! I1 B. a' t/ v6 G( I
B.两个表中相同的记录1 ~4 Q4 v8 C2 Y8 W
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数, f( @0 a* ?, W- ]
D.两表中不同记录的条数- m* x/ S- O7 h* ?* n
E.数字21 D$ |7 E2 T( d( _4 J
5 |5 V8 E7 S7 `3 R3 E; |

5 V$ Z* x9 t0 A$ L% n% T15.______能保证一组SQL语句不受干扰的运行?. ?4 \& l! F/ H( j* z% D

. J$ V1 A! p8 j- U) {答案:____________( u1 X, Z' ]0 o: c
% ~2 q: I6 r  A  }- C

" [2 Z, {0 Q! L; g' `3 d9 D0 b
7 n. o! T- i5 b( J7 p2 a答案速查
, \' F: u3 r; e1:BC# x: a" o7 `! Q5 @6 I4 y
2:WHERE
; w1 c- p( @6 {1 p. A" S3:B5 {- h- q6 S* `) N& e* O, Q6 j' w  O
4:E
! s6 e$ H$ P7 z! c8 F) B8 y5:BD0 w. f6 ^; _4 [4 Q# j
6:INSERT: b! F! [8 f; q8 E& C
7:C
- f) w" Z5 O. y+ e$ ]% c8:A& @( I6 l+ V5 T/ |( N3 T" c0 E  I
9:C
$ H: D" ^' h( |$ }. z" `+ }10:E- K/ _; c+ m% Z$ `' s3 a- F  H( Q
11:C
( e( I8 Q& Z: l; f: J. f12:E, O. X. R* |/ V7 G( i: ^; b( U
13:BC% v7 T. }9 g9 q7 [8 o: `; z
14:C/ t# ?) ]% F1 h9 k7 t% d
15:事务# h8 K3 k( i! D5 C
3 }0 _5 O, s9 h  o1 Y  p. T

, }& O0 [% o' o2 Q8 f
+ }1 Q' o* G4 I& @- z1 x2 ~答案详解
# f$ t  S$ I" S& R, w" C! F* T- j! A# `
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。' ]9 N% Z' A$ n) [# a" O: h4 \
& e" @; ]& g5 I" H. o
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
8 x6 W2 o/ V2 C  I8 d# n* ~" g# n1 a3 w* Z
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。/ a. Q* @8 O+ c- C, O9 L

# e2 ]- j/ u2 t: t# a8 y/ P* U5 ?4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。- F9 A; t3 x4 Q" W) ~

7 I8 J6 V* A! D: ~" W7 u( V& l6 I5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。3 Q0 {4 S* m- M1 R; m4 q( M; z1 C& g' K' V
+ J  c% B$ F) ~& k; A$ ~
6.答案显然是INSERT。
5 Q( g4 x$ u# H7 l: d0 u. u8 O2 h
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。( J& j' n& S. @2 Z4 t% n

/ R! `' d) d$ J" R. A* W8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
. b' {0 T) m7 i  x" l7 N
/ l0 }. a8 C' e- K9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。( \' \5 t$ z0 |
) F; t( d6 O! n8 Y& {
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
% A( t: ^. p, _& M- }/ L+ f, X% ]. X% H" n7 b: _  G4 {4 k& e) `8 F; m
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。6 u7 U  {* u+ v  e
4 L/ U8 U0 R8 _$ d
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
8 Z" h/ Q: Z. a8 t8 D# R/ t' `# ?
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
% U3 |6 n* d6 _- J) z* ?9 s( M
/ R) h8 j* a: J6 e14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
8 D' q7 C7 H6 E5 g% Z0 a6 t
6 ^' v( H3 j5 u# G15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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