|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
. D1 g1 H$ a% ?3 {! c4 v0 QPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。/ g z5 [ ?' S. t# W" d* h. B
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。+ S" B0 N! @# x6 V$ @
x0 \2 C/ [+ R: N% k
: m) E! c% O) G问题
/ L& W9 {0 m6 @" r8 m8 o+ q: `7 H! _- y5 R; J
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
6 D: e/ [/ Z& G; O5 Y9 F9 X8 T. y2 R& U1 A7 k8 X6 [8 d
SELECT * FROM MY_TABLE
# P( w$ i& v' N6 U; W
! ~5 h8 y8 R$ h& i8 X7 J) q! ^4 U& FA.如果可能,用把查询转换成存储例程" J$ K; h& F0 ~4 r h
B.如果程序允许,给查询指定返回记录的范围
2 [& V9 M5 J; r G! H0 V! @C.如果可能,添加where条件
* P, @& _8 s( S% R! ^D.如果DBMS允许,把查询转换成视图
$ ~3 l9 m, A" T8 S. w" F5 g( D( R+ UE.如果DBMS允许,使用事先准备好的语句
! C, a- ~% d+ [7 Z6 M+ I6 d, H* T1 k' Q# z- D
{2 m2 h6 e) {8 q1 t. f! z( g* B
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
* h! ^9 T8 E* K$ M2 P5 u. u, s2 \ W+ X5 {
答案:____________0 R5 q2 K d/ F* x
' h+ G% w0 v- j( O3 C% @- C/ @ q
4 v) Z0 z" d- u4 C- Z8 x( ^3.内关联(inner join)是用来做什么的?
& r, w+ ?- N- `) a+ Y6 \4 i$ Z5 B7 o* c9 E7 F; M* g
A.把两个表通过相同字段关联入一张持久的表中8 F0 o( a' k1 O: M
B.创建基于两个表中相同相同行的结果集
9 P1 |1 n- K' CC.创建基于一个表中的记录的数据集. R) c+ e( G- s% l% C& G7 `8 Y1 `+ @
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
, N L* D# H3 B1 Y2 `1 V/ m; O" `E.以上都不对1 I; v! j; N% B# g6 k) g/ ~+ M
7 E/ ?8 y# L9 L' O, M3 i4 q: Z
3 ]+ I, ]* {" V- F& [% Q' b8 L/ }
4.以下哪个DBMS没有PHP扩展库?
9 ?% G6 s( A5 `9 |) K+ F+ `( {* a7 f& w: b+ w- \5 }
A.MySQL
& M; ~/ P C" ~( S: oB.IBM DB/24 M7 G1 V# t8 }6 [3 O" \4 E
C.PostgreSQL: e* C- Q* r0 G. p
D.Microsoft SQL Server, v$ L* M2 u) \# Q
E.以上都不对
% J+ i2 F! r+ f+ _$ s( y
* I* U; @! P( W3 j2 P
4 Y) f* d# ^0 f7 Q5 ]5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)# {6 y$ q/ H+ |& m3 \
" a' x5 w. p! o+ P
<?php! H& S" R# K/ M; ]0 f/ g' {7 h
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);+ I3 I0 r5 n7 F: t2 a
?>
: {: \! W) `) [" y4 b! L2 m1 ^2 s5 ~5 t% }! y
A.MYTABLE表中的记录超过1条$ \' w% |, P: A/ f1 J0 b& w
B.用户输入的数据需要经过适当的转义和过滤
+ i8 G6 E2 ?! Y( ?0 `C.调用该函数将产生一个包含了其他记录条数的记录
S. i/ N% j0 g, I; c2 U- R1 }D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
6 ]6 ]6 l( K2 dE.查询语句中应该包含数据库名
: v ^7 N1 |2 j+ I. v3 |# ~( J# F
, p& v3 y! {, o. l
/ C( m' R, k. Y6 X( P* b6.______语句能用来向已存在的表中添加新的记录。# ~/ t: P1 l9 I, d4 p! |, v0 K
- c: a/ j6 h4 j; }
答案:____________
% r5 l- i7 E5 k3 ]
/ D- M& T. Q4 z) m. H, c1 x: x, s) N w! @6 A
7.以下哪个说法正确?
6 W; v% f. K" k5 Y0 T* R% `' f; K
A.使用索引能加快插入数据的速度& o2 u; x% d& K
B.良好的索引策略有助于防止跨站攻击3 @" K5 h3 e h: }
C.应当根据数据库的实际应用按理设计索引
* z" C2 P, s- i O, ID.删除一条记录将导致整个表的索引被破坏
; Z6 \% R4 W# XE.只有数字记录行需要索引
5 {& W7 y; y- Z9 j D+ S% l' ~; l. k' [6 |) \, y' N& G* I
% \; q2 D8 y0 y8.join能否被嵌套?
[( s# i2 g, d3 O |- ^5 w- |2 ^; n" |
$ ^% c, D+ c6 ?( d" e! D5 j* iA.能
* `5 L8 y1 ?* r# }B.不能, Z$ Y' U5 P/ p. d( |' ]+ ?
. x* M* a& O* F& `; X' o4 d( G5 t9 k# p H
9.考虑如下数据表和查询。如何添加索引能提高查询速度?- ^" M! d$ Q# h |4 c: u, O; M
0 h$ p; G& _, g) ?( B! h& W2 |CREATE TABLE MYTABLE (
, M4 h6 z6 p% e3 t" t4 L; YID INT,# c4 s a/ F+ V2 k0 g1 D
NAME VARCHAR (100),1 |/ p! F ]2 r! ?
ADDRESS1 VARCHAR (100),/ w* g* p2 `7 ~9 Z* s2 K5 k8 b1 X" U& C
ADDRESS2 VARCHAR (100),
5 p$ E3 s' m+ c6 w% I" C5 G% c FZIPCODE VARCHAR (10),
! I1 y! k# ?, \5 _: _- |1 u/ k$ ^CITY VARCHAR (50),
, `8 }; c; I0 a( d$ ]3 n, q: MPROVINCE VARCHAR (2)5 l z7 B, V: i# H' ?
)
5 b9 w' E2 X$ F# B9 ~& NSELECT ID, VARCHAR
2 @/ H( L; G$ t! i( L% z! QFROM MYTABLE) F3 H, n" U: n- ]
WHERE ID BETWEEN 0 AND 100# s2 H+ a9 p1 V
ORDER BY NAME, ZIPCODE
: @+ w& X9 g; v( l$ ~: j; L9 y, H" c: z% o6 K6 \7 P
A.给ID添加索引
8 C9 r; C. \* Q8 ]B.给NAME和ADDRESS1添加索引* K6 o. }# W. o; U% l
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
" ]7 b8 u5 r$ ID.给ZIPCODE和NAME添加索引
7 u# E0 D2 w& lE.给ZIPCODE添加全文检索
( B H- a1 D& d9 c6 v' H7 U
E! L; p+ b) E3 l; O+ ]! _. w# T8 L7 r4 ~6 A
10.执行以下SQL语句后将发生什么?
9 q" ?4 U( J; g+ k5 b/ G% h0 }
1 W$ p& K% t2 S+ p0 iBEGIN TRANSACTION
, U+ F4 ]1 A6 z1 b% S' A0 X' g; ]DELETE FROM MYTABLE WHERE ID=1/ `2 B1 w A0 B; r3 E
DELETE FROM OTHERTABLE
& n- F: I1 v: w6 S# FROLLBACK TRANSACTION
- D! Y0 i7 \& F7 ]. h! v8 s# T- L# L
A.OTHERTABLE中的内容将被删除
0 I- `; f; T7 ^% @0 T! z7 v- E9 Q/ R# ?B.OTHERTABLE和MYTABLE中的内容都会被删除# I t Y2 H9 W, s4 k1 w
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除/ t. B6 W. ?7 N- Y( _0 D) Q0 G3 r
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
8 y9 J) q: G3 L, |7 ME.数据库没用变化; P, K* u/ ?8 v1 y2 F8 m& \
/ _* y' Q G1 h0 `0 n5 `8 n, d9 Z S/ f2 d' |4 @( ~
11.DESC在这个查询中起什么作用?+ a9 e" U! N+ i: S7 v! @1 ~3 n* W
7 J; Q$ X1 s; g8 j0 t1 J5 ?
SELECT *% F+ n: t: x% r X9 _+ ]
FROM MY_TABLE) f- W; d" D4 B6 ?5 n4 R5 ~! z, w
WHERE ID > 0
& P" g8 q! A& O- t; o2 r) NORDER BY ID, NAME DESC
) X7 k" e1 ?8 D* Y5 P3 s1 y
; j$ O" V! |+ E* ~# e3 J. M% DA.返回的数据集倒序排列$ V2 a3 x- B% ~1 G+ W
B.ID相同的记录按NAME升序排列
" v- |8 I4 Y5 P+ c* F' }C.ID相同的记录按NAME倒序排列, F" Z6 H% U$ ]7 G- G
D.返回的记录先按NAME排序,再安ID排序8 w/ Q4 x) V: I: ^4 k# M0 B
E.结果集中包含对NAME字段的描述
L) E4 f8 M- H0 B! \# p! ?! m; V z* {; e/ B; ]
: g" f6 N$ ]9 r, s
12.以下哪个不是SQL函数?
& y' g- T; Q3 ~- [9 }2 o! N% M* j* U
! e& O. [( R5 X' W, P0 @A.AVG3 q! p7 l& ] \0 w9 u4 Q
B.SUM
^8 O* s/ m3 n% R% n. J; V: T+ E/ V& SC.MIN
; k9 W8 H5 ?; t. `# {! q8 DD.MAX# @& C* M6 H7 Z+ o1 L
E.CURRENT_DATE()
$ N" U" [ i c+ ^2 I) b% w8 R" N z8 y7 [. B/ u; S) B
& P4 W3 M* y e( R7 J" Q2 V! b
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
( ~! I* k! r+ C! q9 o
; w4 m4 l E8 @A.该字段必须有索引
3 t/ o: }2 t) l% L7 wB.该字段必须包括在GROUP BY条件中
8 V$ r- }/ w2 a- U/ h; }/ PC.该字段必须包含一个累积值! _ n- o$ U! r4 u8 X
D.该字段必须是主键& ]! N9 O$ d2 G% v2 X6 N3 J! N) M
E.该字段必须不能包含NULL值
. {5 P3 y8 k; D& w6 c: l6 T
. @+ c. ?: _0 y& O9 N; S. i+ F2 G" }* w7 d7 X* |6 U( @
14.以下查询输出什么?3 e$ |$ c0 _4 Z# s# n. U( _
, P0 F! J7 }: |+ kSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
# l% F5 |* Y) E) }/ O* L e* `: lON TABLE1.ID <> TABLE2.ID `6 ^+ w( Z6 u. d
# F7 S7 _ M9 U5 M m# U O
A.TABLE1和TABLE2不相同的记录9 b3 F3 e6 i+ D
B.两个表中相同的记录
S2 L* x/ u# yC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数2 J/ k. z' p; K. U* \: J/ H. @& g
D.两表中不同记录的条数2 K) @3 @, }/ a7 d
E.数字2
' n* U; a& b8 f9 |1 Q" ^& g7 P4 a7 J6 F; D- x4 n8 j- ~3 U
2 K) ~6 L1 w# @% [$ _
15.______能保证一组SQL语句不受干扰的运行?5 M+ z& A5 p5 K3 R/ C1 X7 U3 L
! ]5 Q8 h8 c. x( T, T" o3 l
答案:____________
. D I( I$ ~$ t
/ ^! x+ H1 o4 R6 s2 F8 |/ _5 l! d q8 `
; r/ ?" G- U$ w0 Y6 l. r0 \答案速查) u% ~; K2 u( m
1:BC
6 Z( g6 D/ Q0 E# g2:WHERE# D0 i: |" h( B% _* c+ Y
3:B
' }3 i& C7 V% d, ~# K: n4:E
) H. u& [+ [8 t$ c2 k& {5:BD0 ? u2 U. U- Z7 W3 m |" ~
6:INSERT
0 m- P9 g) l% c9 E2 E( d% n7:C/ L8 O% `: t$ c7 [
8:A
2 C; \ q9 q/ I6 c+ k o9:C
/ i; A) D4 _: m. [; q5 v8 l; K. H10:E
4 J! I3 A. E2 n# P11:C
; y. k( V7 m3 I! p( J3 j12:E
) {" z+ v* t) P9 @' v13:BC: K5 M5 g. H. p* t2 D# l0 v
14:C
t/ R; ~1 o# r, F15:事务7 H9 T; l8 F8 |8 c! s$ M0 t- o$ M2 d/ M
2 Q4 u; ?0 E( R- I* s+ d! X/ R
/ q) \' B: D" J* I% y) r
9 Z' ?( _' P0 j$ S( z7 g I答案详解
# V' ^% R0 G* B* i
1 H' L3 T2 ^9 N# g d, I( i1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。9 v, e$ W0 k2 t$ l& E5 z
; ^9 S1 S" I3 b
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。4 {5 U' E. G6 Q* O+ ~9 }
0 B L6 @3 _7 O( G! s
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
" T4 x' z, }# h
/ b- J+ f4 V8 m% n% Y. }4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* R) f. r0 h) n+ m! _/ i; ]+ v
* U5 X! r; a8 P G
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。# Y9 R% F/ z, x2 x, L1 U1 F
' o0 }: @% \$ c5 [. }
6.答案显然是INSERT。
+ S9 S/ v2 W/ _+ X! C# r! x- ~: F$ q9 l3 j/ ^ h' U' M6 |+ v$ ~
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。. T# |; v' d! U' r; i+ S% t6 m
( j" ~, f3 r" T4 E J, f
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。8 Q3 A9 Z4 X7 H
( ]$ L7 H8 D+ P* z; u
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。6 Z% }8 b4 t# x" W2 g4 f& Y5 D% g
$ y4 }$ |2 z" R) B6 }10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。( q5 B d# \: Y
5 Z) ]# [* q! @0 z0 b& M Z6 Z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
9 {; O) J% t6 |4 i! B, ^' P' b" |
: d. _5 x4 T c/ w. [3 r W12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
$ |9 t) R& `( v8 j& p. p
2 E0 w, X2 p6 v& Z4 a13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。. C' ?3 I7 L) f# b7 y9 O0 L- V& {) h" I
, b- W4 |/ n& ~2 F7 v# b14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
2 V) e# p l: @( U+ G, M% f
* C" ]* o% Y$ B9 y& l4 c15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|