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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
, m' K/ O( k" {8 V; v# sPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
3 z8 A- v; a% k9 z本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。2 X0 j. O& t4 w: e& E8 m7 I

$ ]" G) k0 [! X
$ `4 W7 f& ]9 z% |问题
& I5 Z0 Z$ ]6 t
" C# u, F" v, T% C7 g; x1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 h3 R5 N+ R# i# \
* F) P7 w) A5 g( F- Z4 R# }
SELECT * FROM MY_TABLE
, z) c6 T3 n: W" g( M$ v( o# }1 ~5 h& S9 d1 F& ^! M
A.如果可能,用把查询转换成存储例程
( e2 ^- B* e7 }" O- j: [- S7 F( N5 FB.如果程序允许,给查询指定返回记录的范围
2 g1 @# Z. s5 B( XC.如果可能,添加where条件
+ ~4 g( V8 P# C; @5 |D.如果DBMS允许,把查询转换成视图
- `, x0 N% D% s9 jE.如果DBMS允许,使用事先准备好的语句8 k* L1 M5 F, ~! ~* }. H

8 X2 |& N: E% V  B7 r+ x; E% }! B) [# M# T: C, L% n
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
; s) l( n& _! V7 g% W9 y' ^9 L( X* ?; l' p- {' A% l
答案:____________
* p: O5 {! C1 {/ _& p
% G4 q/ S# ]6 f
3 ]5 Z2 L2 g" s$ B) G) s3.内关联(inner join)是用来做什么的?
. u+ ?# n' c( u2 ?* n% F+ o1 b. l  i
! N5 d. P1 o  {* }A.把两个表通过相同字段关联入一张持久的表中
; n# K. f' s0 t+ c6 WB.创建基于两个表中相同相同行的结果集
' K2 ]; U9 m3 q: G9 Z  zC.创建基于一个表中的记录的数据集' p5 R) _8 Q5 K* n; ]+ M
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集$ |7 o, G) {' C6 F! x' I
E.以上都不对
' z) w: T9 {. N$ @) K, |( G4 Z6 _- I  J% \- q- L! S
* u- o% _1 s: y. n' o2 P
4.以下哪个DBMS没有PHP扩展库?
% v+ |% {0 d5 A! V6 k+ T3 N
9 u# _* Q% b. j6 W8 Z: j$ d, HA.MySQL
) f# O. q9 z6 ^) v, O, Y( C( RB.IBM DB/2% A' C! P; \) ]: J
C.PostgreSQL
. G- I' O* D: w$ o! y. W+ SD.Microsoft SQL Server" ]* W0 @; @3 B8 ]5 @2 K
E.以上都不对
0 V& Z, z" B: N
" c' X6 W, c; D& A2 N, M
5 U6 `1 h- t3 s! [* M( ^5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)$ }/ f+ a$ S% Y  J
1 K8 W! Y. _  M7 w, p; ]
<?php; Q' A6 q9 M9 I3 ]3 T" F
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
' c( k  A  B- m' _?>
6 ]6 B, `0 \3 ^6 }
' a1 d$ ~% P# H1 PA.MYTABLE表中的记录超过1条4 k& V2 |( d! a7 i& P  n( v
B.用户输入的数据需要经过适当的转义和过滤
: E) ]' @0 g+ V( l, H2 H- M! ZC.调用该函数将产生一个包含了其他记录条数的记录
# T2 M# j( o% O  @. jD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除2 G, p" H3 M$ N/ C' q: @6 ]- l
E.查询语句中应该包含数据库名" J" f* _8 e% S& X5 g( b+ g/ p- Q7 a

9 i: U" \- u2 W7 b0 J4 v- a0 T& @4 [% r% E& d! I2 T. a5 f( R
6.______语句能用来向已存在的表中添加新的记录。
8 O9 d. M* e- v* Z# v. z* P9 k( H6 @2 [
答案:____________
/ E- t: _5 K6 o* r$ P1 e& G: ]6 k. x$ }* ~* u

' m8 S- n) e& X5 K4 K  Z7.以下哪个说法正确?
$ i0 v! }9 m( ?$ a" R
5 M+ Q3 R0 r5 U0 _1 YA.使用索引能加快插入数据的速度7 P6 w) s9 }; j2 n3 p0 \2 I5 n
B.良好的索引策略有助于防止跨站攻击
- c. n/ E, j! l0 a! C) F3 _C.应当根据数据库的实际应用按理设计索引$ r& {( m' N1 s& o5 J0 e% a
D.删除一条记录将导致整个表的索引被破坏
2 t4 v& N7 q7 z3 uE.只有数字记录行需要索引/ |* w: r) n6 p' D7 f' J5 a( T
' V7 _: @  g$ _  {# J

# s5 t8 b4 u' r9 [( ?! l8.join能否被嵌套?
& a7 J0 ]3 ]3 e2 B% U  V: K* @! s* z' b2 P1 [/ n
A.能7 e9 w3 J. q# @
B.不能2 N. [8 @  L% g9 J: R

5 v* k/ R' w/ W5 o* }1 m* v
! t6 _7 p+ q/ g% I2 n9.考虑如下数据表和查询。如何添加索引能提高查询速度?
& z9 b' f( j7 W( w: G( F
% Y; K* Q% P  B) O' sCREATE TABLE MYTABLE (3 I$ m) O3 P& P" o
ID INT,5 J% h* c+ ^( |% J' y
NAME VARCHAR (100),+ W  v4 i( C, }7 ?! A. a4 r
ADDRESS1 VARCHAR (100),
& ^7 U5 ^9 \3 [* N; yADDRESS2 VARCHAR (100),
7 n; p8 t/ I3 r' `; qZIPCODE VARCHAR (10),
/ O3 z  N7 b/ k/ TCITY VARCHAR (50),
: I! @: V3 A7 R. z1 JPROVINCE VARCHAR (2)6 U. {. P2 C: w* m/ n
)
* J7 ^( A" C% {2 v! P* hSELECT ID, VARCHAR& Z9 ~& X) x: S
FROM MYTABLE  h0 K' G2 `% G
WHERE ID BETWEEN 0 AND 100
9 u- K' y! y! a# RORDER BY NAME, ZIPCODE+ c, b1 l* g4 D, Y2 s$ k  J
  q( ^' g; [! g4 {7 n
A.给ID添加索引6 I1 k- d! t  c
B.给NAME和ADDRESS1添加索引1 ]/ g$ V, J! y. H, s
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
& ^8 k% t: E/ jD.给ZIPCODE和NAME添加索引3 I1 U3 [6 x3 `$ ^' S, W+ ^
E.给ZIPCODE添加全文检索
0 L/ S; g  ]  M$ h. }/ I' G) C
( J- Q3 l8 O* Q4 D% H: }) `. G8 @, ^- `% r% P1 ]" {9 @$ S
10.执行以下SQL语句后将发生什么?& s$ ~5 ?- t: z& X' {/ f5 C! o( x

: {" N2 x: T$ Q6 ABEGIN TRANSACTION
; i; E9 W2 G$ v" C1 C8 xDELETE FROM MYTABLE WHERE ID=14 O$ {$ Q1 Q1 h7 r# D& p  Z6 Z
DELETE FROM OTHERTABLE6 d0 f0 [1 K! M
ROLLBACK TRANSACTION
' Z* i7 h9 m2 E  ~0 i$ X+ {
, [  |, [2 [. R; T, K+ bA.OTHERTABLE中的内容将被删除
/ c! |' M8 i# _+ F/ b( ~* Q8 n2 a+ mB.OTHERTABLE和MYTABLE中的内容都会被删除
9 q' L! |. ^# l9 L1 ~- sC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除/ G/ x, I; h8 t% d/ J0 x
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化) j) `0 `0 p: {& s5 T! h% ^1 {
E.数据库没用变化
8 m# O7 S7 M6 f" X9 U& |2 ?" y* F7 ^* U; g

* Z9 i  B' G% h. B- F11.DESC在这个查询中起什么作用?
" D. g0 @2 g* j* K5 X  o! q2 ^: R1 Z8 i' C/ ^; c% d1 |: b2 z! K5 B
SELECT *
7 `5 v: l2 o0 |3 h, `7 NFROM MY_TABLE( a, E0 e0 q# X1 e) y4 t
WHERE ID > 0: U* m, p" G6 W- h$ H, V4 Q
ORDER BY ID, NAME DESC% P) R4 q: K- A, V7 t0 w8 E5 B

- J! [* t( p5 e4 r. yA.返回的数据集倒序排列- y. u/ \2 s# O  L; I0 c# |
B.ID相同的记录按NAME升序排列
9 {1 O! n' `* M# Z3 \C.ID相同的记录按NAME倒序排列
3 S- E+ P% ?4 ~4 M9 Y; s9 X- SD.返回的记录先按NAME排序,再安ID排序% a9 i) K- ]* J" l
E.结果集中包含对NAME字段的描述: \/ u4 s6 c1 }, ^9 O1 f% C, _
' E/ X2 J4 |1 i. \% i( O

! p3 z4 k! v% {# K. r12.以下哪个不是SQL函数?
  Z' h1 D% t) `, ~7 s  M
0 @& S3 n; i) E! [1 x0 K+ cA.AVG8 _2 V- i' Y  L7 S
B.SUM
7 |9 ^# W/ @/ WC.MIN* `! Y6 _: @9 ]% S6 p! _+ A# y& o
D.MAX
/ A8 o5 w& `- w, fE.CURRENT_DATE()
! _$ l: l# r- W9 L
  i# H( B% I/ r+ O! L/ j& p1 I3 a$ O1 N5 }$ e
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?% H0 ?- G5 M/ m  T$ i) m' y

' J1 q( p' E0 p2 Q2 LA.该字段必须有索引' l7 J; {0 h7 [8 y0 t# l4 |
B.该字段必须包括在GROUP BY条件中+ d) j) R! t- U5 B$ Y. `" J
C.该字段必须包含一个累积值
- c7 C- G- V( nD.该字段必须是主键) Z" o% a5 k8 s# y* n; P
E.该字段必须不能包含NULL值% H4 P# m# Q# A5 O2 v+ M7 d, o
' N* \: R8 Y- x) [$ A; z8 O
7 b$ \( _1 N) k! n5 E
14.以下查询输出什么?
. l3 k0 B7 m- G( y4 Z- E' C7 U$ J3 x" u1 p
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2  S- W6 M1 ^! U8 c  y
ON TABLE1.ID <> TABLE2.ID
- k' w( @4 ]8 k& b1 V' X' k" r* w
A.TABLE1和TABLE2不相同的记录
) U( }# h7 e2 T6 F0 {9 j7 v$ H# qB.两个表中相同的记录
& n! e6 _0 [! x+ |+ }- z0 E4 sC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
  l6 E; L  E" A( {. C8 o0 UD.两表中不同记录的条数
1 O( U% g' T! t7 o3 kE.数字21 i, M2 y4 H% x  g: ^3 C7 G4 e

( i2 y. E; \  B3 O3 M; [) G( q# _( ]1 {
15.______能保证一组SQL语句不受干扰的运行?
; x' R& _) r' {9 D( c: a+ F+ m" I# R; ^% s
答案:____________
0 Q/ K6 Q, G9 C7 [- I
4 Z3 Y- }. ~; w$ G1 K) {! ?4 ?0 v% O' i3 y  I; ]$ }* f

# q( S& O( Y1 K; |6 L答案速查
. Y) r3 S4 Z4 @+ h. z1:BC* s* H( n& I1 ~( G+ M# I/ ]
2:WHERE
* L* y; p" z) d, `3 N3:B
9 x, X+ r2 s! _8 X7 y5 y4:E0 }1 X$ F( k) ^$ g* d
5:BD
. @& b6 G2 \/ [% U6:INSERT7 I2 M, B# ]' q
7:C7 F* b0 P- C) F! r! T+ `
8:A4 r" P; @; I5 X& _( M# h8 F' r; k, _% B( A
9:C1 J. m. q, a; s
10:E
) _9 [0 [0 U. W4 I! Q( |11:C
' S. Z! H9 d* P5 ?12:E
) |9 w& `" C* g+ Q13:BC) j3 Q' i/ l5 |4 C
14:C0 P4 Y& v4 k& z7 `; J
15:事务
# d9 M  W$ N! q5 L# S0 f% o
. s2 S8 w8 g2 K1 w) G$ M
4 S% x# t- b. V) T2 j( T+ H' ~4 r+ D! d6 a
答案详解
+ z3 [. b% i; W1 M7 t  B# m" w7 x3 g. h* M/ {& a3 d
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。2 r9 k& M) p* D5 q0 \
+ P! u( q; ]# Q* S
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。- f% U. \7 g6 t& U& }+ ?  {+ X
! ]7 ^" ^  U0 k9 C! \" q
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
! V/ [+ b" O1 F9 F0 F# g9 n3 B3 v; P8 ?0 O+ u1 u" A0 y( I, Z
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。1 {$ h6 j' j- f+ r1 j$ d

$ o+ g( S9 S9 H# e5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
, Y0 K4 q! K( {9 C  a' Z
2 L: z2 I3 ~& J1 L6 j+ r" h' y3 P6.答案显然是INSERT。( ^% }0 ?% y/ ~6 t1 H0 \6 N+ J
4 j! e5 r: n  h4 `5 A% Q' C" B
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
5 [, W# @2 n6 T( a, |  F! C
% j. s  E$ k8 j  X/ u2 \* `% L8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 f$ F$ D2 J5 q. o
; K: t% l! J, ~: D
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
: \+ d  `0 Y, g$ H
! d) X# V, H8 `! _, g, R3 d10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
' L" O+ R6 P. _4 |- i* Y. C9 r, l) p; O8 B% W, R0 ?0 }
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。9 n( J& ]* v+ V/ W% _9 k( n/ o
- R8 ]  B0 c6 P4 x
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
! ?( G  U  P8 j- K6 L6 n
" J8 P( s( a4 {) j4 r0 y# x5 ~13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。  G9 V# n6 K) b. o

7 U& Y) }7 z% v1 ^/ W8 U5 @14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。0 Q9 L# z8 J7 v

# |( p3 [$ i3 i: `15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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