返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。5 Z# P* d  i6 T
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。+ L( ]; j# X! ?$ q5 j
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
. M, g% K: y$ H) c. z( `: D7 q6 y" j, j( ]: i* A* Y$ P8 L

! U& B/ T- P$ s问题
9 o* s6 ^3 F. k' Z. P. {: D" h  Z) ]8 h9 m# L5 x7 k5 W
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
' I  _* i# V- e( _8 x. t
4 u: H  r' x  j, D+ ESELECT * FROM MY_TABLE0 `0 S: _! e# H- M

$ C& s9 O- F- t, |' E/ h5 B& yA.如果可能,用把查询转换成存储例程
7 N' d9 ~# E. j) @" [4 k: Z0 oB.如果程序允许,给查询指定返回记录的范围
9 ]9 }& ?2 @" \, H8 t) |# x; wC.如果可能,添加where条件& q) x* J( a2 Y
D.如果DBMS允许,把查询转换成视图
% P2 o% P3 R: H# qE.如果DBMS允许,使用事先准备好的语句, n6 s9 u* V/ x% |
; ]/ P2 f! ]7 @$ x3 s
3 H* ?- L" m# [1 M
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
6 O: O. b3 d. E8 Z7 ]) g" }0 T
答案:____________
4 n6 K, Y9 F6 q' F& f- I) K) v3 p9 o% I4 o, B  b! q

3 B( j3 j5 k3 y3 R% L/ ^  s3.内关联(inner join)是用来做什么的?
- U0 K5 }$ X) n
: I, H& L" {+ x2 f3 w2 aA.把两个表通过相同字段关联入一张持久的表中: s) I1 I0 `* c) ?6 h9 O( T
B.创建基于两个表中相同相同行的结果集
- Q) X$ \# b& iC.创建基于一个表中的记录的数据集
# x) l4 Y" b, ~. vD.创建一个包含两个表中相同记录和一个表中全部记录的结果集4 k( \$ O8 M- m: q
E.以上都不对( |- Z; D' o' d/ @( i
0 O( Z! D9 k2 @( R  ]! Q

: g! B) j  s9 h* v& b' X5 u4.以下哪个DBMS没有PHP扩展库?
3 h+ u1 G+ p4 i; C0 c+ f8 N$ S2 i# V# A
A.MySQL( W9 `/ s5 P" C  D5 o( C4 i+ u
B.IBM DB/2
0 @9 J; i/ C4 X& U+ x$ r7 B0 FC.PostgreSQL" D9 z) E0 m' S1 h
D.Microsoft SQL Server
: v( h$ K$ b( d( h! h: D: nE.以上都不对; f/ f% l1 g( ?" I, z: j' a

$ Z4 Q9 f# r. k% E/ D8 P  T
7 Q+ T" L8 X* w! `7 v$ m! t/ ?5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
6 b1 Q+ \5 X0 N  q; |% U  x) }6 u6 S& F+ a* b# W' I, e$ N
<?php
. Z; J0 d( X: K  [. N2 ^% |$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);% s$ d" [6 G+ N$ Q. \) H
?>
0 d; z! z. z" m, Y5 m/ I' |- j4 m& s3 w1 r4 m9 ]
A.MYTABLE表中的记录超过1条; m3 G6 B' D$ t; ^  X
B.用户输入的数据需要经过适当的转义和过滤
$ ]) d  O. T6 p' W5 |) N" v* PC.调用该函数将产生一个包含了其他记录条数的记录5 W+ ^4 S2 m* g: f3 B- p6 b( I
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除2 c2 ^6 K& P% C9 ?, q
E.查询语句中应该包含数据库名
% y# Z0 {% n, u: ]2 O( @
: h$ g6 p; ^8 V, [/ V
; \3 O" o& v& b4 t% M6.______语句能用来向已存在的表中添加新的记录。1 d; `3 `6 ^9 Z: P/ q- H$ x
# g* t  Z7 A; g, Z5 B$ H3 X/ I3 i0 L/ _
答案:____________
  P' C5 r3 z6 Q% g/ H' Q- Z* U) R; ?5 Q3 |. c% ~7 Q  f
1 f9 G% s; c* b0 z6 E
7.以下哪个说法正确?
) g* c* z5 v$ T9 v/ b
: j  C2 @  U' N1 n9 |9 D! PA.使用索引能加快插入数据的速度$ R% ]/ e9 K3 b1 K2 A
B.良好的索引策略有助于防止跨站攻击
* G- Q2 w3 {' T3 qC.应当根据数据库的实际应用按理设计索引
! D' {% y! ^; A5 y2 XD.删除一条记录将导致整个表的索引被破坏
8 y/ q/ A5 o$ C& X+ u# yE.只有数字记录行需要索引
) S0 I& Z- ?$ _- k$ J' \1 a/ {6 E
! Z# V5 n: x& z6 f* D6 C6 B4 Z7 ~; }0 w/ ~8 F, k3 k8 K
8.join能否被嵌套?
7 s4 S6 M3 x! \. I! x
) k/ w5 M+ I' k! g8 P1 AA.能
. ?' r4 v0 T0 g* l: CB.不能
7 E' Q# y) u- _+ T% B% _
) C# J$ N( D3 C8 a
- [, {5 ^5 S% K2 t6 Q+ \  i, N% u% J9.考虑如下数据表和查询。如何添加索引能提高查询速度?0 Y6 c% _3 ?: T. `$ z- `

, Z6 \* P# m( m5 J* O. o2 LCREATE TABLE MYTABLE (8 S6 _" P$ Q$ l2 J
ID INT,+ E, F8 }7 t  @. u. _# w. U; @
NAME VARCHAR (100),
+ \" Z) [; N% |& ~1 M2 GADDRESS1 VARCHAR (100),
& e% ?  z: V' r) q7 m1 G: eADDRESS2 VARCHAR (100),
* \/ t6 X  x5 f# @5 t! e+ @ZIPCODE VARCHAR (10),4 Y% C% f6 `: q" O% {9 t' y
CITY VARCHAR (50),
& D& E" z& b  z, u$ \PROVINCE VARCHAR (2)
# _  x; N2 O5 \/ G9 d): m6 M' C& x& h9 i. V! t
SELECT ID, VARCHAR% T1 C3 p: P3 H) `+ K+ V% Y
FROM MYTABLE. q7 _% K% f, i- l
WHERE ID BETWEEN 0 AND 100
2 A. h% a* ^! ^8 x, Z) AORDER BY NAME, ZIPCODE0 L2 d- s) S/ H0 n, m
) {3 {" e% ~* D( z
A.给ID添加索引; h* R0 c- d) A, Q- K1 }1 A
B.给NAME和ADDRESS1添加索引
- |# i/ ]. X9 Z; `C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
( i% A) Y  l/ m) x" L5 H) CD.给ZIPCODE和NAME添加索引( T1 ^) _2 D# \% e$ H/ O
E.给ZIPCODE添加全文检索2 ^8 A9 ]. _) C# c! ?7 D: B  u

5 d+ m3 L5 O3 a1 A8 i+ e; u7 v( g8 h# A8 V" z9 {6 P5 U
10.执行以下SQL语句后将发生什么?1 X7 A: r5 X7 s  ~

  g1 v) x7 k. q: k- Y5 uBEGIN TRANSACTION
, Q1 W: Z' R  o% M( z5 _DELETE FROM MYTABLE WHERE ID=1
8 I* v0 c# T8 l' eDELETE FROM OTHERTABLE. T/ t% r3 O' b
ROLLBACK TRANSACTION- H. C0 t( C1 F$ T. T. I

# Z: ]* l6 F+ A3 U5 f; l* h/ _A.OTHERTABLE中的内容将被删除
  u! R& S. j. x& g$ sB.OTHERTABLE和MYTABLE中的内容都会被删除* p5 j: X& I( h! c; [
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除' S2 U6 S! I; R* D
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
% p/ A& t7 f0 I: m/ t2 UE.数据库没用变化$ |9 }; _9 [4 e

. c, k& G% @' d% Y- b+ d# f% C" ~$ T8 m- n7 E
11.DESC在这个查询中起什么作用?
+ M% U; \1 b- _8 U) Y$ B2 l6 i" V3 _4 H# n. x
SELECT */ D( q  U) L! y/ w) s; D* N
FROM MY_TABLE
2 v+ p1 D: b9 \' ~, eWHERE ID > 0: \% u. q& {8 t3 y
ORDER BY ID, NAME DESC' _& Z& q! T, V$ N3 H

0 Z$ D/ l5 @7 t$ EA.返回的数据集倒序排列
) G1 b3 N, v: g& T4 t3 LB.ID相同的记录按NAME升序排列
8 K) k& I. x5 X9 ^* fC.ID相同的记录按NAME倒序排列  i) Z! V7 \5 `  g1 z# d/ E$ }
D.返回的记录先按NAME排序,再安ID排序
. ]* `1 e0 ~  i2 e; lE.结果集中包含对NAME字段的描述
, \9 [1 I" q9 t- y
% Z" P+ b6 g, G& l+ d: P7 a: |
/ ?$ g; a0 q  \/ i, J: z12.以下哪个不是SQL函数?" k1 a8 b8 _9 ?

7 N+ C$ W2 o: g& ]8 ?3 RA.AVG6 y1 H& a/ e3 Y+ S" F
B.SUM
! D( x1 |' }1 _. SC.MIN) x2 j2 u4 [# m+ O! q2 p9 E, a
D.MAX  [* D, \, O6 d' c" G1 b5 z
E.CURRENT_DATE()
8 S* S. K0 \; i
: L- J' K7 Y- p! O! d) w. R0 _, s0 `( H2 l
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& y* d0 g4 C; o/ p7 I
' X, |2 n: j+ |2 g& B7 HA.该字段必须有索引5 |* i- d8 Q5 @; F" M/ M, N
B.该字段必须包括在GROUP BY条件中) }9 `; ?: d3 h
C.该字段必须包含一个累积值9 j% K+ G3 E5 L0 g2 ^
D.该字段必须是主键
2 U  E3 x! U* R( j2 ^3 V, p( v7 J$ rE.该字段必须不能包含NULL值
# p3 {  v7 u# C: C3 [9 }0 G1 g2 H* q: m) a: x' X% J
+ `- g8 M) n* J7 C# s( f
14.以下查询输出什么?1 R- R9 D. A% D% L( {

+ @+ w+ t* G; C- {& M3 pSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
  {* U. U8 k5 E9 }2 |ON TABLE1.ID <> TABLE2.ID
$ W9 ~- u' t* t. U" Q2 [) `  ?
- t+ F% ^' I5 ?/ nA.TABLE1和TABLE2不相同的记录2 u- `; v: f/ `; T! d7 D  s
B.两个表中相同的记录
/ C% W( q/ K' F! ^: H( O5 UC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
& }# {  r. U3 t1 e. TD.两表中不同记录的条数4 p4 A5 ^; S( c" t: G! F
E.数字2# P7 u3 V8 x/ e

* M! X  G2 F3 G# P; B4 S- w  d3 m: l4 Y  y
15.______能保证一组SQL语句不受干扰的运行?
7 q. f" h8 t3 s3 H4 @" i3 }0 h5 Y) V& f, {8 y0 w+ h  [
答案:____________7 [  T+ i- g; Y7 {8 H2 |

- y/ |' `2 ~: w& p
$ b5 s9 r/ ~  j1 S" q  ?0 l8 R1 O/ U* i; j' E2 @* D
答案速查
0 J! p1 A4 K0 G( L1:BC
$ H/ e) O/ [2 _' o+ @2 S4 Z8 u/ k5 ~2:WHERE
( t& Z* [7 b8 w4 v" Z5 Q3:B
6 G. u" |: D. [4:E
: t3 B0 x) Q3 L8 j. H/ c( _5:BD2 I6 W/ N+ g  z4 U( r
6:INSERT& E8 V  O3 _- @' ~2 m
7:C  J2 k# C7 [+ r, d- p8 |
8:A! k+ S& g, s+ P4 \
9:C7 }  @' h! }& h* j
10:E9 M) H, |$ h+ o( R9 v
11:C2 {% E) U3 ^1 p" U3 O$ q! q
12:E
: |0 L1 _4 Y$ J) @13:BC
, \0 E, f$ J7 B6 @# j0 i14:C
" p0 F: {' P" I% Z" G1 z2 j15:事务
9 f+ z" m& |% L! h+ J4 M2 L- |5 O* ^
* h) n( x/ w* W" T

! T7 s# e. v) V, X; e) j3 X答案详解
2 I# j: |/ O$ a. V# \) T  _  [$ @9 n! X; u6 _1 H: u9 W- g
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! X9 y: M  }- I$ [7 {! ^$ ?7 k' O# ^
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
* j/ ^: @9 A- n3 n1 g* e7 A9 ]! Y8 r1 W& x2 N) |+ F3 Y
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
% X% s% r0 v6 {5 m
4 a) j5 v: X) q4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
, e; V5 u* L6 M3 _6 d. ?1 h$ v& a- V
1 I0 Z- H  ], |. n5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。- T4 \! W) U% w" e9 I# X
4 |( R, Y( u9 q4 q
6.答案显然是INSERT。6 v6 G  s1 p  F: R5 I! }+ e: D

. z* Y4 x; N5 n2 J/ c& e7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
1 z% B9 Y. Z8 ~8 p) x$ _$ q$ w5 M. @" U; j
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。' A4 _( S# \$ f% y7 D
! a: o. T" u& q! s9 X
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。# M: J( z" x9 Y/ n

7 P( i$ V; g6 ]$ t2 M- {6 ]10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& c/ m* o$ s0 }8 Y) K4 J5 v$ @& Y4 F( J2 J+ m: @/ h& ~
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
7 X$ l  [- h1 r$ f- D6 n9 G$ ^, m3 w% c) S7 A% z. F
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
4 ^( f3 ^8 O5 ?5 `) a* e
9 j5 d' B$ a" o. z) y' G13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
; I" J6 H; b; s. Q& R: H' J% J+ W0 c  z  i1 U/ x6 W
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。# c0 d+ `4 U" y& b# B6 W( z
: Q, e) t  `* \
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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