  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" x/ F( R. y a- {) t' _, c+ APHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。, f! B- Y( z6 S7 t
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。$ E5 P$ v, K" d o: m1 p
+ _: t1 w, \+ A# e2 d3 k! [0 p3 F( d. x; e
问题, V+ {8 W- z3 c- `# \' _! i4 S. p
/ G( L: Z6 w# J8 k7 h O" Z
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
9 h2 p# s. W+ O# A/ ^6 Z8 N+ m; U* x
SELECT * FROM MY_TABLE) J, | T5 R6 N; x, g4 m1 P9 b
6 S/ \& ^ K3 C8 @8 i+ B0 k
A.如果可能,用把查询转换成存储例程, ]- m+ y6 V& v% E- y: q
B.如果程序允许,给查询指定返回记录的范围2 G* b0 W9 Z2 ^' m: K" P, d0 o& N3 [# g
C.如果可能,添加where条件) Y6 ]0 e) f9 I4 S/ Q! G
D.如果DBMS允许,把查询转换成视图: R5 a& _2 Y; x/ o% `6 Z6 R; ? Y
E.如果DBMS允许,使用事先准备好的语句
+ C0 Y: R t/ S% q* w9 [; M( ^5 {, P! b9 j3 V+ U1 O/ k& A) b6 T
3 @( F) b! M- S! ^. W/ u; s: ^ t
2.可以用添加______条件的方式对查询返回的数据集进行过滤?. q# C) q# ?# h2 U" k2 P4 w
7 z4 b J% B* ~# U8 Y$ T4 C
答案:____________
3 ^5 B8 I1 H2 |! K3 q* h0 w/ {) {+ R3 o& \, ?4 R
5 w7 P( I) y% [! H+ }* Q
3.内关联(inner join)是用来做什么的?4 i( ?1 S+ _. ?6 z
* _; T4 {: U! E: {4 |3 e
A.把两个表通过相同字段关联入一张持久的表中4 T) ^3 W" b5 ]5 x
B.创建基于两个表中相同相同行的结果集+ H2 G" @+ C, [2 ?! X7 o: i0 u- Z7 T3 e
C.创建基于一个表中的记录的数据集7 n+ `2 Q. b% X. [6 L" ?' e
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
& n* ^$ w, |) i; x, R$ I0 x* cE.以上都不对) y5 x) E. W& V5 G. m9 ?
6 B2 J$ `* H5 z
, p5 x7 g! F5 |$ p! I9 `4.以下哪个DBMS没有PHP扩展库?
, Q1 o0 `! H+ G* J j! ], S2 o, i% r/ M
A.MySQL/ @& H2 h# H# G3 [8 H8 t
B.IBM DB/2
. w5 @: d# [; BC.PostgreSQL( V. b- T3 G7 ^: H; S
D.Microsoft SQL Server2 { k6 H( L7 ] {' T* t" w
E.以上都不对
% ^1 N; Z7 m% C$ H' Q: g
. l! ^ W: C0 M, P; t8 F* ^. X3 E4 P2 D" c5 X) |' y
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)9 n# U5 ^. b( k& Q
( @ X& o) x1 O: z- U- t<?php
! N& |, V Q' K3 ~1 Z" \8 L$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
+ y5 y" [, T o& j3 S% E4 U?>7 b; g5 a/ e6 o+ y- h& Q( w+ F. J
" v9 f+ w! Q4 H) {- {2 N/ |A.MYTABLE表中的记录超过1条. |; j& Q7 V# L
B.用户输入的数据需要经过适当的转义和过滤3 N. g4 K# o6 @' b2 I
C.调用该函数将产生一个包含了其他记录条数的记录
5 v! w$ v M1 ]+ yD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
s: S# C1 {) [, O, O3 O4 v$ UE.查询语句中应该包含数据库名
) f' m) y' r! N' f5 [5 E& G1 n" E5 l3 S* O) l N- i8 ?+ r* U
: x+ h$ n) O7 ?! C* {6.______语句能用来向已存在的表中添加新的记录。
( X W; }& n+ @ E9 k- y
; k% V) m' I+ o" v/ A& K答案:____________
( j7 ^4 [' u5 m4 R; ]2 o2 Q# W/ u4 N7 T/ H$ L3 S' N- Q1 s
: ^7 f+ t1 G% y2 I4 p: j# M
7.以下哪个说法正确?+ g0 k% j. Y2 y, @: `
( T( a* w. ~" MA.使用索引能加快插入数据的速度
2 w9 t7 {% b8 K5 `B.良好的索引策略有助于防止跨站攻击+ U4 r, C& Y$ K( q7 a' _, \
C.应当根据数据库的实际应用按理设计索引, v- `4 e3 k1 n2 Q8 [( ?
D.删除一条记录将导致整个表的索引被破坏
4 C& a$ C5 H' dE.只有数字记录行需要索引
% Y) V2 Q2 j+ X9 h1 g4 o" c: W9 R! ~, `7 m
: k1 v. z0 V/ Q3 W m$ q4 @
8.join能否被嵌套?
# g0 m( ~3 y* Z- k
/ ~$ }3 S: O8 u% }A.能
; l/ B" A/ ^; p3 Q; j$ j' f/ IB.不能
7 j; R4 j6 u$ B
' q$ X; s; J" E& ~# {$ I: B4 [6 K* U, M6 w, P0 `. R
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
/ k3 D3 l6 g; X5 Y
z. x+ ~" e" J5 NCREATE TABLE MYTABLE (3 Y1 X# r9 D. }1 v; {5 r2 F
ID INT,0 d- t/ m! f( c$ O1 ?7 I8 F+ n" {' h! L
NAME VARCHAR (100),
4 A. Z& v! @2 C4 G5 U m5 eADDRESS1 VARCHAR (100),
2 x, v; h) {( P7 v8 dADDRESS2 VARCHAR (100),) @. Z4 T& t! p' `: X
ZIPCODE VARCHAR (10),
4 q& `5 C/ O9 d$ ^: FCITY VARCHAR (50),2 L( ?) E) B+ K. _3 {
PROVINCE VARCHAR (2)% U; S- W, w+ l4 @( t" z+ x
)
( X y! q; H1 y# x4 o/ vSELECT ID, VARCHAR6 b" z/ r( U0 V7 i2 i7 K
FROM MYTABLE
# l7 ?: Q( J0 N# N- hWHERE ID BETWEEN 0 AND 100
4 t; Z% T1 y( ]- cORDER BY NAME, ZIPCODE
9 `9 _% b" {; R9 B
1 ]- c0 i+ @! Y/ w9 }2 N2 oA.给ID添加索引+ H- w6 X" Q% A8 x. d
B.给NAME和ADDRESS1添加索引7 l9 Y; n, B7 ^! j8 n+ V9 a! q
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引! d/ ?1 f" o4 \9 t+ x7 n
D.给ZIPCODE和NAME添加索引
4 {# f2 K7 R( d$ C# uE.给ZIPCODE添加全文检索
3 H5 \. o* S* l5 w0 C% k9 B4 i8 W( G' b8 v$ Y% B
1 P# t; Z5 U A. w5 B
10.执行以下SQL语句后将发生什么?+ A; C' b% ]+ Z5 _
) r4 s) _& W& }0 g3 L9 X4 F; F: D
BEGIN TRANSACTION1 N: F* O) ?% D& c3 E
DELETE FROM MYTABLE WHERE ID=13 I* I0 O& s* z* d) [
DELETE FROM OTHERTABLE
* g* L: Q# c6 w6 u, TROLLBACK TRANSACTION
# s' g6 W$ T2 g+ m: ]- ~" e; V% z
A.OTHERTABLE中的内容将被删除
7 {5 k& a6 _( X# `: p- AB.OTHERTABLE和MYTABLE中的内容都会被删除& X# i/ [+ m! M& e9 x. P
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除( @5 A' B! t2 g. I" ?+ t
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化4 z7 p% e: b- x8 g6 h8 f9 L
E.数据库没用变化
" D7 | p7 H) A
' U0 L. p% @* e2 t/ b9 r# `7 j- S7 q6 X/ f ?- a2 ~5 q/ M5 S8 J/ x
11.DESC在这个查询中起什么作用?
7 c- C% X+ i& M) O+ R7 @" ^/ |) L; w5 }4 `2 t9 U5 D
SELECT */ d- o# ^2 K2 {; O$ b! n0 L, L
FROM MY_TABLE u8 t2 t/ U0 f& ?5 ~
WHERE ID > 0! N! r! W v! {9 O6 F
ORDER BY ID, NAME DESC# A- r) q7 A+ ~7 x( ]. i
9 t/ l( {8 D y
A.返回的数据集倒序排列( J8 e# x; p) m6 m1 D7 A
B.ID相同的记录按NAME升序排列! Z% V7 D1 _6 l/ l0 m# d
C.ID相同的记录按NAME倒序排列
2 c& R# H$ l# x X1 yD.返回的记录先按NAME排序,再安ID排序
! y' [3 B) l; ~7 u) Y( \ nE.结果集中包含对NAME字段的描述; j8 I3 q, X" ?6 m# K
0 \" e1 T: l3 c* ^5 k% u
% Z$ K. W$ ?4 w! i$ y! @ k12.以下哪个不是SQL函数?! h4 v V! D4 F3 k8 f6 S: Q
: L: Q" h# g6 R3 s) UA.AVG
" t/ P8 W i Q! j, t) XB.SUM
; n# s, X4 X7 ]; R6 C) H& O7 A$ {C.MIN! _, f$ t1 w0 V0 Y
D.MAX
7 c1 w' `4 g, i- AE.CURRENT_DATE()
# ]) A2 t% K' D* U7 O8 u% j
`& n$ x& F. _" N2 \6 x: A& B
! @) C, p- y% u/ D7 m& V13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
4 G/ w- Z' ^. D. e) T7 V& }) z0 c) ^* q. y2 N
A.该字段必须有索引8 J) R5 L! Z0 V, E/ D6 Z
B.该字段必须包括在GROUP BY条件中
+ m& U0 F5 x2 e: W2 eC.该字段必须包含一个累积值" m2 Y# Z9 n7 v( p( _# `7 e
D.该字段必须是主键
3 c" O, ^4 W4 i: RE.该字段必须不能包含NULL值- w$ n" L- E6 k+ _! k3 U
9 g- G0 t. o% s! n6 z7 M
+ N- I0 B* p2 }14.以下查询输出什么?
* q b" H8 L9 c* i2 z5 V. L+ q+ c- {3 Z' p3 C0 m6 S% e- [6 r
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2( P/ H0 |# Y; b9 p' a5 y; s; k
ON TABLE1.ID <> TABLE2.ID
# m) o) N0 v% ?
2 e8 Z, X* z) XA.TABLE1和TABLE2不相同的记录2 y _1 Z) Q* C: O3 i: r
B.两个表中相同的记录- x! a: g4 ^! i& R, s+ y
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
0 C) Z' V5 H" c& F# @D.两表中不同记录的条数: d$ w3 Y" f$ ?# G: j# O$ j, Q* b9 m
E.数字2# i+ J* w: z- q" {' G; q
E$ O$ N; u- v( R2 l; u% A& i, A K
15.______能保证一组SQL语句不受干扰的运行?& M; N3 ]" F5 K! j
$ ~* `% ?6 J7 o/ k3 l, ], V
答案:____________: Z, m' _6 b& p
3 m5 ~2 Q- d y; ]+ E( p% o" ? v4 w3 U
# l: s' u( |: U' S# @) J
答案速查
9 U) I# l" o' M1:BC; g8 d) c6 d" P. v4 ` Y$ G& l
2:WHERE3 V) ]( `. D4 N6 n5 T" G7 h
3:B
$ Z: V/ k: x* x6 h, C4:E( A& J" _. _5 o* {7 N1 [3 Z
5:BD9 `- I L8 K" V0 O
6:INSERT
- a4 g9 b+ C5 f, f4 z* ]7:C) B$ C( D- Z' m
8:A* f7 q$ E- _) ~* v8 H) N% l
9:C
H3 t3 S: c6 ~6 s% F' r10:E
" X# i5 z5 X- y4 ?11:C- B7 z+ K' m3 K) U, s. D3 L$ f
12:E# L! d) t# U3 { M: p9 c
13:BC: G& t- Q% }% N* F# I, h
14:C
% A1 i! K) v) i( m. m1 c H15:事务
( q" f4 H$ H- y, f6 X! [8 |* ]
4 }# O' X6 G1 v4 z8 |! ~; ^8 y" Z% T2 }6 ]% L
# x! r3 |' U2 Y- U- V+ b) v8 n/ U答案详解6 r# Y0 R. V: O% Y- s, _' T
6 q# m8 V/ ?# @' Y1 Z' U
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
1 N7 V! q7 ~& P0 B" g! Q/ M% y6 A2 {$ ~0 Y/ ]# U
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! o2 `; {9 ]! l5 Y# {% W; u, B
+ I0 ]3 K% `( j- P2 q/ Z3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
9 o, K; N# w# u7 e- |
: \# e; H( c# B' w7 B4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
1 a, m6 Z; I% o6 Z
1 e3 v& \, s. T1 y: k% K/ e5 m% v5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。" d- y5 \! n4 u, a) `9 N
1 b0 p' S& u) h. V6.答案显然是INSERT。
- P" d" k7 ]6 A9 g# |/ E$ v
# q% I9 P/ F7 @, B7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。* l, n+ y3 Y& N0 u0 w! R! r
- R: l6 ?4 u% E6 w8 C6 H( X9 E# q
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。2 ^1 v- |2 z$ C$ B. U
; @/ [* v- l1 f. l' P
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。7 W- X. Y1 b6 }; a8 v
3 M. Y1 Q. I! r# w3 h10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。) |: C" Q+ E& N, l
( l+ j, Q% D( V( P* E* \$ E
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
5 Q% c; N) C0 o) p; k7 w; y' z3 o0 c. j! J" \6 z
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。7 v& M+ H# y' T/ u
% w4 @3 w" r" e; r9 g* W$ Z6 y4 Z# \6 H
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
1 U8 R! U- c" w( t) m2 V2 p2 l$ C2 X
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。! E$ r8 X" ~- e
7 [$ C0 D- S* X' L2 S
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|