  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。8 `8 Y5 ^4 N% L7 A
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ W" O, H+ K2 p+ L( U z6 S# v本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( y7 v/ X+ U* W8 @ N
y' g; l/ D+ P4 J3 h) B0 Q% j, f2 l" O! e
问题
" G3 W1 ~/ c M. u) Z" k/ L% I8 M% H6 e D
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
0 J7 s! X7 G, v3 K7 _. M6 P% U( h8 m( f- v
SELECT * FROM MY_TABLE' q3 C7 ^2 y: L A$ P; \1 E
: d7 u/ B8 c4 L+ ~
A.如果可能,用把查询转换成存储例程& K$ O; |2 n, s/ H; i
B.如果程序允许,给查询指定返回记录的范围
, Y$ c$ c& |0 @, CC.如果可能,添加where条件
' }* h$ \/ `* n7 {D.如果DBMS允许,把查询转换成视图
! i; h5 G1 t5 X7 M7 m' W I( {E.如果DBMS允许,使用事先准备好的语句/ S+ k. @0 k: u( r2 W, ]
7 a% ], U9 h* G6 |. B2 ^; ]0 C8 A1 U( J
2 \ {7 v2 @. m( ^5 C' s2.可以用添加______条件的方式对查询返回的数据集进行过滤?
- U* g3 y1 [) H/ ?: g! e7 @2 p; M$ M, V! Z! i2 ~$ X4 H4 T
答案:____________
$ _* V, ?/ a, D# P$ u1 ?; a
; j+ l2 f) E" R* \+ B6 C) }; O; f/ L
3.内关联(inner join)是用来做什么的?- D! q5 B% A" ?2 D
! F: J$ {1 o: {! X, `
A.把两个表通过相同字段关联入一张持久的表中
; z3 f! m7 A5 H" v, @) g# ~B.创建基于两个表中相同相同行的结果集$ w3 E0 ^5 r( p" P( O o
C.创建基于一个表中的记录的数据集3 ~% Z* \) O J( A
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 ?0 O* Z2 G" e' ~* TE.以上都不对
' y0 e Y: r6 _- e' b) `, s5 E" @# d( X5 X
$ S* H, W" U# Y9 `- A: b4.以下哪个DBMS没有PHP扩展库?
- n# X l8 g/ x3 V/ I/ o8 l: g7 a' T. J2 O8 R/ E% a& F6 H
A.MySQL; q% d: g1 Y/ K, M
B.IBM DB/2
, h7 Z! T+ t" o- |; TC.PostgreSQL
! S% V1 U5 [; S' LD.Microsoft SQL Server& q% g' K$ S6 } I
E.以上都不对
# |6 }/ p) W% _" U- z5 @! o! I: R/ }. b5 Z$ r
2 G" P* p( M' ]% @2 B5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)7 k; G* M- o* I7 q
" E! H% J1 S. p- k6 o<?php. S f3 ^9 e" `# N- c& D4 ^6 q4 H
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);6 ^" M9 \" [# s& A0 Y# E
?>
" z9 h2 ]- ?% F, i7 ]( c" j8 l! W$ G. x
A.MYTABLE表中的记录超过1条
; @( G& K. e1 V( R- P5 k& i$ uB.用户输入的数据需要经过适当的转义和过滤
o, I1 {* n) F* oC.调用该函数将产生一个包含了其他记录条数的记录
' {. o4 r& L/ k! G3 C" V7 S5 iD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
( g1 u) k! f5 C$ K; o4 o BE.查询语句中应该包含数据库名, `4 Q7 n9 E8 f/ s' w
( Y1 K) k/ U3 t: r
! [5 ?. N: c# ^. ?# ~7 [% L1 Z6.______语句能用来向已存在的表中添加新的记录。% A3 s: C2 }$ L8 | b0 S) V
# N) x1 i# |% D; d' q# ]5 r0 h2 V( F
答案:____________: V3 c3 B9 T) y3 L% }4 t" }) d3 i
1 O/ l4 F9 H0 _+ H; i" k
" u4 b. |1 v+ u8 D/ G
7.以下哪个说法正确?
' [/ j9 ~( \" J' }
8 V* N7 y" ]! h k# {) q$ F6 GA.使用索引能加快插入数据的速度2 ~; U( s) A( @. q
B.良好的索引策略有助于防止跨站攻击8 S& J8 I& |) [8 l8 Z! j
C.应当根据数据库的实际应用按理设计索引2 A# Q! J+ ?, U5 L& j+ y6 {' A; s
D.删除一条记录将导致整个表的索引被破坏/ M" R& ^2 m4 _! |
E.只有数字记录行需要索引. j3 A) f0 ^3 D
8 \. d8 V/ \- J" t/ i2 M+ ]
! U8 d3 H& C- ?0 Z" G8.join能否被嵌套?3 f: B0 n& ?+ Q4 {; R
9 F" @6 u( p- _2 e3 ^; a3 i t3 t
A.能
/ [5 I; A' a' n0 H9 _ xB.不能; Q2 ~9 w9 f9 m2 G, k9 H6 G R
$ S4 Y1 j. V* S6 f; Y1 n. |6 E5 H7 _, i# K2 v
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
, ]; T" e7 t4 ^2 }* y& d
1 |! Q- G W% k8 }: }( @CREATE TABLE MYTABLE (+ w8 z1 Z; x1 p2 l1 @
ID INT, ?2 j9 ~/ z, q; N0 U3 j
NAME VARCHAR (100),
3 {* @+ Z$ ^3 N0 p- oADDRESS1 VARCHAR (100),
" I8 p X- [* @# p5 N( @& m5 HADDRESS2 VARCHAR (100),
- }+ t: G1 X# D0 SZIPCODE VARCHAR (10),
1 q- O+ B9 T8 s% Z* w( Q8 iCITY VARCHAR (50),
1 }0 U5 Q1 z) z7 S; W" K6 `7 L5 rPROVINCE VARCHAR (2)
& `" ?" H9 D* A# D+ N* C! c8 _6 l, F)! L1 ?& H' d/ W7 K- B% \
SELECT ID, VARCHAR% F }( A- |4 C1 d X; a
FROM MYTABLE
; v7 \9 s [9 u y$ pWHERE ID BETWEEN 0 AND 100: s( l8 L2 E0 ^2 P4 z
ORDER BY NAME, ZIPCODE9 q, [' I( G$ i( h" K
3 M3 h9 Y9 w* _5 h9 H5 F/ l, mA.给ID添加索引
+ C; \( t: T# J7 B: p+ l2 r5 X% V& ~B.给NAME和ADDRESS1添加索引% x+ E4 ^. h1 j1 A. `+ K
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引4 U# O8 n8 K8 C, L S
D.给ZIPCODE和NAME添加索引1 K+ z; k5 u3 {3 E, L6 f" w
E.给ZIPCODE添加全文检索- D3 {1 V8 o2 a8 b, e
3 d# w8 {4 u) E& g: p% [ j( A* I2 [! w$ C0 p+ G( q
10.执行以下SQL语句后将发生什么?1 H3 {2 i, b6 h
' ]4 ]! F, `! o' z2 y
BEGIN TRANSACTION/ U% \" U, | p) e
DELETE FROM MYTABLE WHERE ID=1
T3 l+ T: ^2 L: w8 k3 J+ UDELETE FROM OTHERTABLE. R" x9 C5 {2 N) |9 X" f) x0 r
ROLLBACK TRANSACTION; n# j' }% H% a/ D/ J
4 f4 v3 |$ y; L6 G
A.OTHERTABLE中的内容将被删除
- K9 z, L. g$ R9 V9 jB.OTHERTABLE和MYTABLE中的内容都会被删除
% c4 d0 v# Z! Y6 Z! w5 ?C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
! c5 G& r8 g$ G2 i" b, P7 ?D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化7 r: Z: O: F) q2 x# l/ @
E.数据库没用变化+ e. h, n# v+ x! @5 l' N1 W8 r* _
$ ~- [! W# P. r6 I" M/ w! u: G5 m3 i; ~9 u6 T# U2 e6 N+ D) e
11.DESC在这个查询中起什么作用?: d9 V/ O1 p9 O! P6 U9 i
7 \3 m/ A& _; j: WSELECT *. E- b5 g2 q& p% P
FROM MY_TABLE* B: g1 }- C. I
WHERE ID > 0
: p' l1 A: g9 R' uORDER BY ID, NAME DESC
$ n j" ?" t7 [! A1 b1 i( D+ o! }% e+ ^+ y# T7 j
A.返回的数据集倒序排列1 a/ S/ c& z3 U" U8 ~
B.ID相同的记录按NAME升序排列# \, c/ s4 {+ x2 I) m/ P. C. t3 e
C.ID相同的记录按NAME倒序排列
& u; s+ p$ d: O& vD.返回的记录先按NAME排序,再安ID排序
! I+ h/ Y/ t! C3 SE.结果集中包含对NAME字段的描述/ ] L0 {; A5 y' f5 ~5 _
( r+ a* i* w+ D: \* m% y1 I- a* v3 d# N& J& C- ?5 P4 W
12.以下哪个不是SQL函数?
" i( B7 C& G7 R8 `' O% O
. T; `9 z' k9 k8 x( ^6 y U: tA.AVG1 ^% {6 j5 U; F- J4 ^, W
B.SUM9 L9 @$ v( q$ R
C.MIN- i) j/ E+ e/ q9 c
D.MAX- x9 |6 ^( h8 `, q0 F
E.CURRENT_DATE()
0 s# v. a, O2 v3 r' E k: @- k
. W' [9 M1 t3 h; A" @# I% Y
: C' x) A: R. E) G) _13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
* _: [4 O9 D, u: J4 E8 p5 D& \/ b$ @7 H
A.该字段必须有索引
% D3 j5 R/ Q# {+ hB.该字段必须包括在GROUP BY条件中4 h3 {7 Q; i! `
C.该字段必须包含一个累积值
) g" Z) h2 b1 A% ~D.该字段必须是主键
8 U/ a, }2 f8 D: mE.该字段必须不能包含NULL值
, D& J f' E0 `% f8 j" j' Z- F A0 ]4 s5 o+ O2 [/ Z k
a5 w: B) _; @6 z14.以下查询输出什么?
' _- M3 j9 j6 x* C' P' E, c. m" ~( R) h& L; E' n$ X( S8 Z
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
2 g/ g0 b. ?. v; ?2 U& kON TABLE1.ID <> TABLE2.ID/ L( m' [+ r9 Y9 U- w) c1 {3 j: [0 x$ i
& u/ l& D) C# C& p1 O* FA.TABLE1和TABLE2不相同的记录6 W) U. s4 c% o* h% V
B.两个表中相同的记录) x g3 \8 ]! e4 c8 m' y
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数" ~7 Z7 I+ F4 Y/ R+ ^7 f* C
D.两表中不同记录的条数' j) F2 K9 _5 p) V) q! ~+ g
E.数字2& u: _+ P5 H0 P" p6 j4 z7 k
, @) i7 A* L) w& ~
. s7 h+ M2 S' W1 n15.______能保证一组SQL语句不受干扰的运行?0 C* E; l6 O# y
4 \. c/ y, e5 R% A2 T$ Y
答案:____________
( ^5 k, F+ C* o" L$ U1 Q$ M T% H5 l0 {
* o8 @* m& m8 h" |
+ \2 E1 y4 h$ L' u( R g; H/ x
答案速查( t. _7 ]4 r# @7 A. _$ F# T
1:BC
1 V; s1 y+ h# ?6 x6 T# ~2 I2:WHERE
) k* j: T2 t# F! e0 N( m& T3:B
4 ?# g [6 ?0 |3 J5 H' d7 ?/ E" m4:E! R5 l" D% w/ S/ y8 I" F* M% A
5:BD
% @. `, U; P- ?6:INSERT
) S/ x3 w. L+ f H7 ^6 W% w6 Y7:C
+ g$ J. D1 f$ f7 O$ }8:A
, n$ a; U% V0 [- \" r9:C6 j, w. m. ^; O: ]4 m6 u
10:E1 C2 h% E0 x) `3 E* Y
11:C
& ?! b( Y) {% t& c. M12:E+ g: B e' U! E, r( c
13:BC6 w# D0 ]7 W; s1 O
14:C" a$ p. T9 v9 t g" \
15:事务
: s0 p; N8 E4 d6 y0 n7 e4 U. S
: V5 o2 U6 d. m$ L5 p7 r3 Q8 \8 j7 ^# @ L( [6 e( R) F
$ `% G6 o' b+ H F! X! m答案详解 [. R0 C& u- \2 K1 b3 q
8 i" @! G; Y- O& D6 s. x1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
. c! @. \6 X$ a
, _! Y4 F9 s$ W2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ ~& |) I$ n% p2 a
3 ~ q8 N# y E& z( r. q$ `! |3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
$ d: x6 P# ?% G9 }% A0 y" a! d% u/ X* h/ U) J7 C! ~8 C9 k
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
" c- F; j+ z' F# A& \9 O" {( p- P0 V- d. O3 G& H5 L
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
, \; v+ {: w) h+ ~ l% {. P* W/ q$ @" y1 r
6.答案显然是INSERT。: T3 P8 ]) O. M, ]6 p: B% u, r
/ }! H% o7 D8 g( ~7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
6 @" \9 i u" h$ }* @) d/ Y" h, L; e8 \
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
! Z: b" b) E0 D# P3 C& |* G0 y& c$ F& X
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
% J: u4 U- ^$ @* k& g& D
7 n* f! D9 g) F+ Z- B10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
% z _' E# M1 h$ X' N. @
7 {, i) ~: o5 [. q11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。4 P* I, T+ b- d0 {" I
2 ^+ K* W8 ^; w" r; Z12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。% n) d- O y8 _0 |
, {5 H* D! C7 o- ~; b13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
; B: O. @- o' q" K
9 m6 {! q2 r6 ^2 x. X* O14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。% |) z( e; g6 A+ F8 n j
- v1 {6 m, h$ n; R* S. r4 j15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|