  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。& ]% D) B- m2 l4 c% a9 l! J
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。/ V/ x* I1 b; f
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。; l& l T% D! `0 R
7 n/ J2 Z- X& X- H- ~# P
) |1 A- o7 B6 Z- ]1 s) X
问题, U ~7 S* A; g/ l4 P1 k5 R
0 l9 T' n' d Q
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
6 r- W' n# n/ q. r3 ~7 T( g3 V' G& \: r0 `4 P$ u" i5 h
SELECT * FROM MY_TABLE3 O& X, x' @0 Z. \7 n+ d9 D
; o* j( d8 Y/ f/ q7 B0 R" [9 K
A.如果可能,用把查询转换成存储例程
8 n) x& Z3 v/ h# lB.如果程序允许,给查询指定返回记录的范围
" ]0 u8 _; Q% oC.如果可能,添加where条件8 N+ ^8 r% D# H) A$ U+ [
D.如果DBMS允许,把查询转换成视图# X" y! ~) L: Q% _) ]- @% t
E.如果DBMS允许,使用事先准备好的语句
! L6 f H- _" |- C
: s) ~' ~7 _9 i% W1 M% {- B$ f: g$ F k. j
2.可以用添加______条件的方式对查询返回的数据集进行过滤?$ S4 ?7 r/ {$ [- _% g0 p
. K: Z$ ]; I5 z; t6 D" D" e9 _
答案:____________; J3 m# {& F6 O
3 M2 a/ \$ ~/ ]5 M2 l! p; F$ F7 |3 ~9 f6 c, s+ T
3.内关联(inner join)是用来做什么的?; v+ B! E3 U1 w( f {" G: Z
8 r0 S8 i' I6 f; R0 f
A.把两个表通过相同字段关联入一张持久的表中
3 z7 `3 H6 p; M/ V/ AB.创建基于两个表中相同相同行的结果集! y- O8 _6 ]" O) i
C.创建基于一个表中的记录的数据集
8 t3 K6 A5 {7 v; b! ZD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
$ O9 @% Z) K5 Z: H4 v$ T! }, ?3 ~; |E.以上都不对
c% W/ r2 ^4 ?: t/ V, Z& L! ]8 [0 g* q' } t( J
I2 H0 W, m4 w1 O* V2 {- s2 D
4.以下哪个DBMS没有PHP扩展库?4 P, D4 {; T3 ~9 Q, x
8 I& z$ b( ^! C& h4 G7 C
A.MySQL
! @5 D7 K- F0 }2 R* |B.IBM DB/2
; k; @. C/ X+ a' @; \4 TC.PostgreSQL4 \& Y5 r& ?. @2 W
D.Microsoft SQL Server2 h3 m; N" g; X/ B/ j" z$ d
E.以上都不对3 I6 C M7 r; |! v+ m/ D
; z3 b" n! q5 F3 D
/ |' t7 z* s/ X3 b! e5 e
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
* H. O2 c( a; F' ]" m
: X C* G! l d2 D) U<?php2 {. n1 `& G9 o6 ?1 r
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);: H! d7 O) r: M$ X
?>! s- h8 A1 V+ x' Z5 d+ Q& P
: K" S Y n# u! J- P
A.MYTABLE表中的记录超过1条. l! q9 A: d, K6 o5 h+ u ?5 q4 Q
B.用户输入的数据需要经过适当的转义和过滤7 w$ {7 ~) v: W2 N# h9 A0 y% Z
C.调用该函数将产生一个包含了其他记录条数的记录
3 G7 \' E+ \, \- L$ w* Y8 I4 H8 pD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
: Y# g& R8 R- J9 ^6 sE.查询语句中应该包含数据库名! g7 {9 W- i7 ~2 K( r! a' x) Q
/ S! I& O1 E. ^& A! R9 s* r$ U
/ G' D* t0 ?6 p' T. Y; O- y
6.______语句能用来向已存在的表中添加新的记录。
: K- I1 N& Q/ f
8 l5 B; H& g7 G- i0 O* P4 Q( h9 U答案:____________1 C+ v& X: L% n. q; }: B
' a1 n: C. T7 Z4 G
! F: `- J7 D" ~& O' D( c$ z" K2 L
7.以下哪个说法正确?
* v$ M, `) M |, Z' L {+ m" A) `3 A/ l' R9 V0 [/ m
A.使用索引能加快插入数据的速度
) U* Z; {1 `9 M' ]) t* B) lB.良好的索引策略有助于防止跨站攻击" E. H8 s& F& a2 q
C.应当根据数据库的实际应用按理设计索引
! A0 h2 Q, B0 m; d6 x9 u$ l" UD.删除一条记录将导致整个表的索引被破坏
$ t3 h. c/ M$ _5 U4 F9 ^0 w: yE.只有数字记录行需要索引
0 l0 x; [9 c7 o8 T5 u9 n! E7 B: I6 @. L& v0 q4 Y) p
" \! I/ T) ^% m$ A: X1 c, X8.join能否被嵌套?; l( p4 ]7 D% U+ @2 ^
9 d0 z$ p# _) XA.能
2 J- B8 A2 U2 t+ s' ~; i! pB.不能
! ^8 _/ B' ?# S; s8 M0 `7 E) Q2 K4 ^& f) N& E
; V; N) j/ m1 | U+ W" `( H6 d
9.考虑如下数据表和查询。如何添加索引能提高查询速度?1 b. D) b [/ }
2 A+ [- |+ P" \5 U6 z% w" dCREATE TABLE MYTABLE (
* N& f0 O- D, D& bID INT,
" n! z. \9 V# O1 W4 V* o7 p2 Z. M7 c* yNAME VARCHAR (100),$ t. ?7 I4 _9 l/ I( x! q* M
ADDRESS1 VARCHAR (100),
0 n* B9 [8 b( I$ \# kADDRESS2 VARCHAR (100),4 z X' ^. F s8 V9 D$ G
ZIPCODE VARCHAR (10),- G# x' _, |) A6 w% ~/ [$ E: n7 a E
CITY VARCHAR (50),4 x7 U u5 ]4 ]! c- E: f( V0 \
PROVINCE VARCHAR (2)0 N8 D! W! U9 O8 i$ g2 @, l
)0 d d0 |9 K' }6 R6 j
SELECT ID, VARCHAR: l2 A9 o3 a9 F& V+ Z/ B" G8 ?' Q8 G
FROM MYTABLE' I! J0 }2 k( X6 I m
WHERE ID BETWEEN 0 AND 100
P0 M/ l6 [* {& yORDER BY NAME, ZIPCODE
0 r2 V) a( c- ~. e8 L3 ^5 ]9 P; x: l2 h2 @7 V
A.给ID添加索引
; i( o# b) w/ U h/ gB.给NAME和ADDRESS1添加索引5 C8 n/ H0 J4 }, u+ c( E' V
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引, {' `8 N# @. f ]) I8 u. U
D.给ZIPCODE和NAME添加索引; N. Y$ A' m, W \$ j& g, m
E.给ZIPCODE添加全文检索9 ^2 F) U* t9 l9 E# o
& F" g6 M9 K0 w0 z
: t- N: t# r2 e+ P. F. _10.执行以下SQL语句后将发生什么?& m& i4 a3 P) y4 f# y+ \( @' [6 ]% z
: F" [: ?7 G m/ \$ V2 jBEGIN TRANSACTION J* P8 _: u8 k. h# N
DELETE FROM MYTABLE WHERE ID=1
; @) p# y% E* }+ u4 NDELETE FROM OTHERTABLE/ o% C/ J7 r! J0 b! g! f0 y8 j
ROLLBACK TRANSACTION
* L: B* ?, Q, }
0 j" q! ^& v+ u0 pA.OTHERTABLE中的内容将被删除& q5 j5 x* Z; ?: x0 i
B.OTHERTABLE和MYTABLE中的内容都会被删除7 m# Y% f) e& @7 e) \3 p
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
& G$ B2 e% G" i6 L9 dD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化. ~8 i/ t. N! d. R7 q
E.数据库没用变化
g# P/ x8 D/ j' |" I) l- q' M
# c9 R0 ?/ }/ k5 T% V+ ~0 T2 b& c* b( s" S& i+ K. U8 m: ]6 a
11.DESC在这个查询中起什么作用?. v/ g/ c# C- r1 b% w
9 k, ^# p8 [8 \+ y, z$ Q9 k- \SELECT *
M5 O" P9 L. o$ GFROM MY_TABLE$ M6 J7 B. F) D. F' ^
WHERE ID > 0
# g; _6 }! w1 ^$ |' T+ B+ EORDER BY ID, NAME DESC/ G3 w( b2 x" n7 v" ?. k
- r1 `+ `; x$ i f
A.返回的数据集倒序排列1 G' c& F9 l6 f1 |* `
B.ID相同的记录按NAME升序排列" ?* s3 x* x. D9 A; M, ?
C.ID相同的记录按NAME倒序排列' p" ~4 ~7 A8 r, ? ~, t; A
D.返回的记录先按NAME排序,再安ID排序" l, a7 H) ~/ ^0 L2 ~0 K& B
E.结果集中包含对NAME字段的描述
: x. S' V$ `1 Y7 ]5 M5 }2 p
/ R0 R( v2 r( E: S
* T! q: D/ E9 ?$ t12.以下哪个不是SQL函数?
/ ]6 ?) g9 W2 j9 x4 M* h1 F' s. }6 }8 d1 J% o! Z2 p2 @
A.AVG8 m4 U+ d6 J1 n) q
B.SUM" E8 w$ c6 I9 W3 f# u5 I
C.MIN+ p& @! }$ h5 Q" I
D.MAX* @% ]% t* F, s
E.CURRENT_DATE()0 C) ^$ v/ x/ v" I6 Q
- ], h- |1 D& j- x# F: b/ D
2 n$ ^& w' C I. e& O7 E# ^13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
1 h; B1 L1 T$ y _. E% o
8 q% \- c, l9 {+ }3 XA.该字段必须有索引7 W, V3 q8 e: H6 ^
B.该字段必须包括在GROUP BY条件中
4 q4 d# F7 f" }9 sC.该字段必须包含一个累积值/ ?- m% Y ^: D# l
D.该字段必须是主键
9 J& W# }# H- @7 S$ W( x0 a+ uE.该字段必须不能包含NULL值2 z% g. I, j/ b3 ^% E$ f0 P8 H
! V: g: O2 J7 ?
, h8 B" R% P: ^: N/ Y14.以下查询输出什么?
- ?1 h) b3 Z$ Z1 W/ z
1 A0 W$ T% H+ E8 H/ X R W9 RSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2% f/ y. Q1 F, b. O) N. S
ON TABLE1.ID <> TABLE2.ID
% {9 D' T9 Y5 ?, w8 ~$ Y( f- R7 p+ f! L7 E
A.TABLE1和TABLE2不相同的记录
/ L1 V& q% M& v" f5 D2 oB.两个表中相同的记录
6 j; {9 S) I- v; v& I+ m9 FC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数6 \- u7 \- o: ~$ G7 U9 p0 p6 A- s
D.两表中不同记录的条数6 U0 t' r2 a7 m; x
E.数字2
& O6 H# K. f4 ?+ K$ R: X; Z( Y; [( P
3 r7 V, g, x! u15.______能保证一组SQL语句不受干扰的运行?" n0 g; u' I) d; z! Q* J
0 f. Q6 G7 |# p4 ^# @' h7 P答案:____________9 P' H) I& G/ v, N% d* f
* J3 b% E) X [7 i$ c3 m
3 [4 T0 x; }: ~) b2 X3 ^5 n' r7 I* O! k- {. n! X6 L
答案速查) a- B* l. }' X7 d* C( Y* C" e
1:BC
- `% Z( Y9 J' n* ]) H$ d; |2:WHERE
8 ^$ U+ X, x% E* \( a3:B
9 \. t! v# r+ P0 _4:E: }+ g4 ` g% L0 d4 p; t/ m
5:BD
9 L6 A X! I3 d* Y. z8 v/ p6:INSERT6 k; P5 Y' X9 _* i( l4 u
7:C
% K' o0 g' x6 \7 w, x! r; m8:A
$ G B& L4 q/ K$ f% y2 J3 D$ j9:C9 B" c) H# D, e1 c+ Q, p% h, P
10:E
4 F8 U! p6 S: k; \6 J9 K# k11:C
j; D- I8 A/ x- Y. D12:E
5 p1 K. v. o3 n13:BC' ], I6 e, B- h* ^
14:C& v6 R* I7 c5 Y0 q5 ~' ?/ l7 C
15:事务. ^7 `) T" z9 I9 r! ]
7 H# O( O/ F3 t
) h4 B+ E v+ B' Y5 y
) d) t; q( o0 u3 U+ d答案详解% y% J7 e* ~5 ?- b" W% a
& |% T! Y) G! k1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
. e+ [7 |2 s+ X7 p
L; u2 z8 E7 U- h( T% p2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。5 q& n. k% ~$ R# \. P1 W
) Q7 _( k- u6 s3 B
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
3 f5 S2 G9 J2 ]4 ~! {" _0 D: E3 | G2 Z6 I$ p+ u
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
) f2 o$ I% X' G/ D% E- @3 t% ?2 l4 E4 Q! a o
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。/ q# _0 b2 j. A& G& s5 m
7 I1 G' [$ }/ F% |4 v7 s1 @8 B
6.答案显然是INSERT。
U+ b0 m6 R: q8 L% d/ x4 m
( Q: n1 c% Z7 V7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
/ o( M- I) R6 p, k) `6 l; g% U' B6 k9 R4 b
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
/ a3 D& [& M% `
+ C/ t: _' w, D+ `9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
# O% n) V7 S% A' [2 k2 M" s9 q& K6 K7 k8 t* e
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
4 X. v; `! ~9 r3 e& Y3 E. m% x
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
5 @! v1 S/ S8 C L2 q' \6 l) x) t3 c3 f, r5 j
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。4 A/ H% n; g2 [. F' @6 E
6 e5 a. S) W/ A6 i9 x9 o13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' k" c9 i! f+ U+ m: r) ^
6 Z( U4 @" b+ E, O2 m; x
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
: R. ?* {) i" N7 Q- s; N
+ [7 Q7 B' n" y: G+ d# M3 p/ H/ k15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|