  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。6 L: p; w- m0 h! t
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。; G$ S- S+ z; `' e& V
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
% M! L. x( c% Q' b4 O1 d, ~ t1 O
" M" [4 E% [* v$ U. z9 L! i: c
, W% _4 |7 e/ X% S4 E0 K; R1 f0 T8 J问题* x4 w" h9 K' O/ {
4 X4 b6 r) g. p) E% F, q2 S1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)2 E* Y" g4 k' v/ E, U
1 p, G% p. u C" mSELECT * FROM MY_TABLE* {$ n1 o' Z) u4 t5 N- \( X
6 b/ R' E8 `* K6 E V2 ~ Q
A.如果可能,用把查询转换成存储例程
4 Q; ?" g; l8 a& j$ o: @B.如果程序允许,给查询指定返回记录的范围8 G# l. N- R0 V5 [8 Q' M: k! x
C.如果可能,添加where条件6 V8 l2 a8 @" |4 C/ [
D.如果DBMS允许,把查询转换成视图
* l) z* j) a6 gE.如果DBMS允许,使用事先准备好的语句, j0 e) e7 Q, a- y; n) q( ]
0 t( i; K. s" M* v; _
4 i* Y% y" B3 {: F% Z2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# Y' u, q0 N1 Z# N1 E) L3 c' J, x/ q: C3 _& q
答案:____________' w/ h% ] I5 ]! w' ^/ v
y% P; J) F9 F& n" A) R' I: V! H* Y+ f6 Y
3.内关联(inner join)是用来做什么的?
4 d: ?/ ~( d' H/ q" R* @& |2 }: S# s1 s& s
A.把两个表通过相同字段关联入一张持久的表中7 S9 g% a2 ^' B# {. ~" ?
B.创建基于两个表中相同相同行的结果集- B" Y) G; N6 s
C.创建基于一个表中的记录的数据集
# g5 Z6 q7 d9 p- y- XD.创建一个包含两个表中相同记录和一个表中全部记录的结果集4 K" s) s. U5 q4 O" {
E.以上都不对! s; r3 q* P8 x
W# P9 |- C! N( ]
& H. o' @+ C/ a" F8 ]. @
4.以下哪个DBMS没有PHP扩展库?
9 O4 o& z ]3 F6 o3 S, U, K0 K
2 X+ e+ b$ ?4 eA.MySQL' {' `, k' }# b8 `! P* z4 A
B.IBM DB/2 l' D$ ]& T4 s
C.PostgreSQL
; O, F" V/ f! X% G Z: p" N1 b0 @D.Microsoft SQL Server
/ |6 J5 k* d3 i2 F/ A1 W! WE.以上都不对
" g. i( V6 {$ E: \
- v/ } ?: Z! _: g* i, M
3 S: k! f2 [/ t2 b. L% ]5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)% U7 _% I8 D" H* C: u# C0 B
8 i9 ?; I( w6 s
<?php1 s' z7 E3 j# o4 M# g4 C
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
- B- a" t& T! B* _1 K9 `/ v% [?>$ u" z' L" `- C% n/ |
* a D& ]8 ] w$ ?+ |
A.MYTABLE表中的记录超过1条
) [9 H n4 _9 v) ?B.用户输入的数据需要经过适当的转义和过滤2 q7 X. h8 G: A. a- V9 C
C.调用该函数将产生一个包含了其他记录条数的记录, k; O0 q: V9 X0 o% M3 t( p' a
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除& u* u, s8 x. c% Q
E.查询语句中应该包含数据库名5 j5 W: M5 w6 u# G& y0 A/ t5 V
' Q/ i* [$ v0 w) U" Q" _. R) q7 g6 B4 f B. ]9 Q
6.______语句能用来向已存在的表中添加新的记录。' ]# k: ?9 P; [! g
8 N# |1 Q" x5 V1 C4 _7 U答案:____________+ }/ I5 ^$ v0 w0 N. |+ P4 P6 C+ o
" }' k# j$ i0 r$ D% S
5 e( F9 c: {: a- N7 G* N
7.以下哪个说法正确?( O5 r. l/ ?6 J/ e' `. ^
) x ~! _0 B2 wA.使用索引能加快插入数据的速度" r5 k+ }( m- K% r# P0 D
B.良好的索引策略有助于防止跨站攻击; F1 }! d& Q2 O3 i" x
C.应当根据数据库的实际应用按理设计索引
1 L f5 b# q FD.删除一条记录将导致整个表的索引被破坏
/ Y: u9 z, `2 f1 P: EE.只有数字记录行需要索引
/ c8 ~! b0 [: s4 ?+ X0 N
* I/ {) z5 q$ o; ^$ w+ e) Q$ V; N' E1 v7 \3 Y
8.join能否被嵌套?
& y- H! K: k$ p* n: \: a: o [, j0 F8 f0 ^# }
A.能0 Q' \, Q# v: b; U g
B.不能
7 W9 T$ l" U) V( r& q: v8 A9 `7 I7 U- B: X. J6 ^
. g, [1 W9 z0 H+ `2 [! p4 Z9.考虑如下数据表和查询。如何添加索引能提高查询速度?! G: Q9 s$ s2 ~$ ^0 a7 r) I$ w" H3 s
8 o# g% G. S" BCREATE TABLE MYTABLE (
% h, S9 f) H. h' s0 uID INT,, `3 c; Y! ]# o7 K# `
NAME VARCHAR (100),
, h; H' Q1 D9 n$ ^5 C8 j: b% fADDRESS1 VARCHAR (100),$ B/ C _4 [! E0 l% {0 A
ADDRESS2 VARCHAR (100),
+ z: e$ [3 {, V1 R" xZIPCODE VARCHAR (10),4 D$ D: T: F# j3 m) H/ ~
CITY VARCHAR (50),
: i8 ^/ ^# Y7 J4 ?/ m: OPROVINCE VARCHAR (2)' [& V$ q1 R& u% v6 z: \3 X
)# ~6 r1 t( U. Q7 u$ c7 T4 R$ }
SELECT ID, VARCHAR. ?0 I3 [; R3 ?$ Q! s' p, [
FROM MYTABLE+ a# G( k/ Q0 d
WHERE ID BETWEEN 0 AND 1000 e$ b+ C! X# E9 N8 t# q
ORDER BY NAME, ZIPCODE9 Y* |7 D5 v+ B! x" M
r9 Q9 L [3 }' x9 w2 Z4 p u5 F/ ]' mA.给ID添加索引
% S5 P( r+ c) A" i6 RB.给NAME和ADDRESS1添加索引, D1 H# K2 _/ L3 C
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
. m5 y% v4 k% y. l- jD.给ZIPCODE和NAME添加索引! X0 ], R6 q. ^5 \! t6 h
E.给ZIPCODE添加全文检索' B8 {) c1 _+ W$ j9 F3 h0 e
, d( n3 x5 C+ r# U: T
, I5 @5 p' U- D/ K" `10.执行以下SQL语句后将发生什么?. u5 x& u1 a4 X! \/ P9 r
6 W C- ]# i7 k! i! g% V$ p/ E
BEGIN TRANSACTION4 ]! {9 Z; _7 F
DELETE FROM MYTABLE WHERE ID=1
5 k: A( y+ H" m2 ~' gDELETE FROM OTHERTABLE& E! d" V1 s. u2 A& d0 D
ROLLBACK TRANSACTION
& ^2 P5 C) X& [' G+ R" S4 H3 S/ m5 H9 N- F$ m# m: h; U& s; K
A.OTHERTABLE中的内容将被删除
! |$ b2 j. V' Z- k' E5 V# j2 SB.OTHERTABLE和MYTABLE中的内容都会被删除4 U+ \6 a V2 F0 }* M2 o/ B
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除) n$ E X8 \+ m' H+ h! {2 y) m7 o
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化) q$ x( s6 H" x( ?, ~
E.数据库没用变化% _$ @& q3 _4 r. O7 T
1 r) m9 ?* Y3 o" v B2 p, n5 K9 ?8 J
1 m4 |5 _; r# ~- s% q. h+ c
11.DESC在这个查询中起什么作用?/ p% y- f& o M7 g6 T9 p+ q
$ m2 j( u# r" m
SELECT *8 ], n6 _( Z. [% P, a6 g
FROM MY_TABLE( z+ t% ]/ F) Z+ K6 _
WHERE ID > 07 X o; m+ N. i% E
ORDER BY ID, NAME DESC$ E# A9 t$ {& @" k2 o" ^
" v; o# A+ @7 K9 M# u' D5 X8 V
A.返回的数据集倒序排列
1 I' Y3 m9 b& @* h, \' O: LB.ID相同的记录按NAME升序排列" `, ?, K! ]' e+ x* ^
C.ID相同的记录按NAME倒序排列
G8 N( P3 l# ^0 TD.返回的记录先按NAME排序,再安ID排序: D. r1 ]6 B1 J: g
E.结果集中包含对NAME字段的描述8 z4 v( b9 b" O/ c0 U6 Z( T
+ x# R/ o- S4 N% ^! V
1 _- X2 g% J6 C; e12.以下哪个不是SQL函数?: x# B5 W7 o# y- ~7 {. R/ ^/ E9 D, ]( T
/ o1 @& [5 J- f9 w8 c" dA.AVG
' @. {9 {: M7 SB.SUM
$ d. o3 R2 Z, y+ Q" q2 HC.MIN& {( ?3 T* s4 F( S. q
D.MAX
: }/ q; V) |0 P) vE.CURRENT_DATE()
# i: O: B! E: r& @3 Q8 v' b5 l" r' u8 |
+ X, k& S7 j" I4 O
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
1 Z# v+ ~8 \8 @+ i' P8 U1 Y; ~; }) h4 ]6 ] E
A.该字段必须有索引" P( F. \. a4 {3 z: e+ q
B.该字段必须包括在GROUP BY条件中5 ^8 V0 A- ?( O& U1 a" t' A" u
C.该字段必须包含一个累积值
+ }5 o( Q3 w" E; S$ KD.该字段必须是主键
0 P6 A L$ W/ e \( U WE.该字段必须不能包含NULL值$ h; z7 k9 F+ v" i
# a, U0 O2 a1 E* [: \3 X: c
; S# m& X/ a& \* g
14.以下查询输出什么?
1 F% a# V) C1 L5 G' V- H% m9 y2 T1 e+ s3 j" k
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
: T& u7 Y0 ^. R8 v `" N5 J( Q/ xON TABLE1.ID <> TABLE2.ID
c* B( K0 q4 }) W* {- S/ p. O2 I0 F- o5 G# i% i# l0 C
A.TABLE1和TABLE2不相同的记录
4 H4 j$ Y# j+ }% _: ^9 l5 yB.两个表中相同的记录
- p. K, m9 A' rC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数6 _- O6 U3 a% R6 y
D.两表中不同记录的条数 M, z4 c( N( ^% W# t
E.数字2) W6 h/ y( n* }: z" S/ v& w7 B, p
: O2 M. f% K* T, n1 x
6 D' X! D a5 s7 l
15.______能保证一组SQL语句不受干扰的运行?+ k: T# _; y3 Z/ o1 t
0 H3 v: M9 }- `; ^答案:____________
5 Q( `& J! D/ X) g6 b2 T g- \6 |6 c. r7 Y* X# V2 u( _# i9 f" o
( T% w% n( [( N% `; D3 x
- }6 D6 R, p h T$ i* p( Q) ^答案速查
2 M# @6 J4 r, V% o- n; G3 k1:BC
* u" l s' C. q ^) r; v' `2:WHERE# e' h: O9 c; x: b% Q3 O
3:B% j& j( t5 K; ?$ }8 g, F2 _
4:E
! c- ^& ]4 Q! n& P2 x2 L5:BD
. M( [- ^" K& Z i6:INSERT
- H4 @, H4 d* h7:C+ s9 g' F" R8 d" R; W
8:A
5 y* g* S! M( q+ g3 b4 ?2 ^. I6 N9:C
% _; I7 y# S. c# c10:E
- O( G4 ~- X- y$ L* F: g9 t5 Q11:C' e4 [2 z, C1 B7 Z0 q2 O
12:E
) {, a8 j, v2 `- j5 Z5 M13:BC
: s' I# @# p$ g# U# D, u14:C8 Y2 o! n9 R, B* P
15:事务
7 X7 q& [- L& j1 J; t, p# D6 g' H6 D) w
9 H; |' U% m3 r( Y$ @2 v0 O" U$ ^' W( {5 A* L% y" i) P" V
答案详解
: {$ S9 f8 P; G- }& B
. d5 b9 D: ~& o: J1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。- J; ?( H& p- |! P! D
& C2 q, n9 w1 i2 u2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
* y R t# T6 X
0 I. o: m5 `+ P3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
* Z. s* V9 c) d( U+ ^' Z; b% v0 p6 F7 y7 H3 v) ~, K
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。" n5 j. @, b b+ l% P1 k) m
: y; x5 E$ Q6 P1 s
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。- U$ [* ?9 f/ a% b
; ]/ Z ^5 s& p/ |6.答案显然是INSERT。3 G+ Z9 _% L: u- W) a7 A$ D
F. e1 e/ v, {/ W, i
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 Y& c: r7 w# }
0 N: V# j |: @1 b, t2 k! ]8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
+ ?- T0 b' w5 S1 |2 t7 i, c% x. v2 v6 R: @5 n5 s
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
. |5 Q4 @+ g; Q1 r. \
8 n4 m+ H6 o. t- ^" u10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& {( V" U, \' R+ y2 Z+ }( ?1 s) U2 r/ R( b' K$ s
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
# z: K# Y1 u4 @
o# \9 H1 ?. @% e M; ?12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。% `8 P2 S2 U# J* r1 L/ F" m
, E* o9 \4 |2 r, G$ w2 j13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。+ R! w( f. t+ [$ e- E- t9 y2 j
, @9 g: n! Z& t0 j! s% \! @
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
4 Y0 R- L6 I% a0 J8 b
* {) S5 u u1 V! S+ @2 {: @15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|