  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14153
- 金币
- 2367
- 威望
- 1647
- 贡献
- 1315
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。4 D% U6 r& w: s6 o" u) R. c9 I/ U( p
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。- |$ k6 e: P+ x) J
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。0 [; L6 k" [+ `# n
" ^/ @" ~+ i! g! A& P+ l0 Z# t5 i- A: z4 q* m1 n# q: V9 O
问题; G u9 A$ x6 v& s# Z) r+ k r+ j
& U! K2 i% e' L9 l3 }6 I% ]% K
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)% n7 U, C; u" @$ e
2 x+ X8 _* w: x* y
SELECT * FROM MY_TABLE. O4 V6 N! y1 @% S/ s& S
9 w) f- Y& l" [0 Q3 o) z! s. C
A.如果可能,用把查询转换成存储例程1 Q! C7 ~* t+ V ~: t/ q+ r
B.如果程序允许,给查询指定返回记录的范围
5 X0 U6 v' }& T+ [/ B& T" SC.如果可能,添加where条件
7 C5 M7 v1 K5 y% O/ B0 b1 B8 x+ ?D.如果DBMS允许,把查询转换成视图- k# t- ~! U9 Z: |' x3 F
E.如果DBMS允许,使用事先准备好的语句' o/ l7 S5 V; x: C$ g+ ?
* x+ c" ]! h$ P- ]
* W1 ?. R4 H* }' t
2.可以用添加______条件的方式对查询返回的数据集进行过滤?. S) W+ g% o& J' [% ?& ^, q; v
5 }+ Z( O/ T- G, x$ N+ z# s' {答案:____________
- [* e7 A2 l# `1 m; ^9 U8 J$ a2 u% L
7 j- U4 w( a8 T8 t7 o3.内关联(inner join)是用来做什么的?0 l. Y2 o8 k {& Y3 b' F& L
7 f' R- O- @! G' p' x) v# R \, R
A.把两个表通过相同字段关联入一张持久的表中
1 q+ M8 Y6 t: F2 B( i# MB.创建基于两个表中相同相同行的结果集
! R( }' H6 J4 R& m3 e( L8 l4 [* MC.创建基于一个表中的记录的数据集* w4 o0 J8 q. v' ?& k/ _' L
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集- U) k( d4 E) T% H; j$ x$ ~ i0 ]
E.以上都不对
: v& M; E8 I' S8 K/ |. a" ]' D+ w" r# p0 h, r3 a
' p8 N# j7 m& ^. @# N1 j. m4.以下哪个DBMS没有PHP扩展库?
$ Q- k- S, y( n, t6 b1 V$ P2 I5 J6 W! D8 \
A.MySQL
# Z% h4 T( D2 P1 q1 I% N, aB.IBM DB/2
0 l+ r- C$ Y/ d+ X$ s/ GC.PostgreSQL+ j6 m" k$ z1 M2 [3 m2 G8 i
D.Microsoft SQL Server
1 p; N! A5 t* {) J0 l) ^* e7 {E.以上都不对
+ D. u9 h% c( \" [" q
6 L2 h5 { p& h3 U. w( F) [$ {+ [3 t1 F5 I4 ~$ L
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
) g! n0 y0 C& J5 Z! E* i# Y7 w) h8 k: F1 Y# F. @
<?php- N2 v; [2 M) I6 W5 ]7 j
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
3 E" F6 E/ d: v0 N0 r1 u?>
( J J) g4 a" D2 e0 C9 |
3 c9 N/ K* i% ?2 W; QA.MYTABLE表中的记录超过1条1 U) g$ P9 T. r: B" _
B.用户输入的数据需要经过适当的转义和过滤5 {$ W& n7 h/ b+ h; y" k7 m
C.调用该函数将产生一个包含了其他记录条数的记录
; f6 u) g5 Z) X1 i% _* I" s% dD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除7 j& F/ p, X1 z) B5 o. n: l
E.查询语句中应该包含数据库名% K! x% R0 s3 Z
$ K/ T" q' P/ Y4 \% P
% S& R% N) c# S2 Q2 {5 L8 S
6.______语句能用来向已存在的表中添加新的记录。; i }7 c" \ o
! X! g0 z) d& v' E* |7 J# j
答案:____________
) Q- s+ k& U: N4 T- X
; O/ s+ q: V5 H+ N+ A
9 T1 ~% i) x$ c" U7.以下哪个说法正确?
s/ |% ~% N6 n% t1 t
" c6 o) m! s& |! o; S HA.使用索引能加快插入数据的速度; T! q) L# `' D$ s2 l( R: z
B.良好的索引策略有助于防止跨站攻击
5 M) g/ D2 l) U; o/ b" `. b: AC.应当根据数据库的实际应用按理设计索引' u+ ]8 R) v# N7 D* P# ]
D.删除一条记录将导致整个表的索引被破坏
, h# e+ ^+ I/ z4 S: R4 kE.只有数字记录行需要索引
: K$ t# O% ^- e0 L$ b- n( |7 P K' N# J/ ~0 s' `- K
3 C8 V# n4 B6 `
8.join能否被嵌套?
7 @1 n4 U7 g" O7 |$ i. |- B/ C" r6 Y2 v' ]1 H0 g9 Y4 `6 U( \
A.能
$ I6 h- U4 w2 T1 ~B.不能
0 [+ \, K3 g: Y: g) m$ g8 E7 W+ ^! o+ Z) U: @# Z
! X; @& J# J* U2 |+ }9.考虑如下数据表和查询。如何添加索引能提高查询速度?
, y: Q1 s( n9 B# i; i& E4 {
+ n* F. R' {4 @# q/ S7 ]! ` ?CREATE TABLE MYTABLE (" ?+ u. z& s$ d3 K9 s' C% ?
ID INT,0 `' ~. M0 \( O
NAME VARCHAR (100),
3 |: ?+ _/ |1 c' _ ~1 RADDRESS1 VARCHAR (100),
& }* ^ H- x# {( L t2 b' LADDRESS2 VARCHAR (100),# ]( H \8 T; t$ n; x) l1 I. x5 E9 i
ZIPCODE VARCHAR (10), k+ ?; H# s/ N# r; I o# N
CITY VARCHAR (50),
# `+ m6 m! `0 F# a7 EPROVINCE VARCHAR (2)4 b& G" g3 \! x
)
& y& y. y; F% O! X1 d. b0 lSELECT ID, VARCHAR( y* {% ?1 O- v7 [; V
FROM MYTABLE/ h1 r" q( t7 e( V/ |0 a5 H) A- F' n
WHERE ID BETWEEN 0 AND 100
' G* C+ [# Y, f! h7 y( |ORDER BY NAME, ZIPCODE$ i& S8 g9 v# z' P
: i* Z$ p2 A ]( b3 i# ?
A.给ID添加索引
- r$ W1 r* n0 BB.给NAME和ADDRESS1添加索引
# _ f+ O* P+ v) nC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引5 e7 D/ H# Q6 L b& h' F) o
D.给ZIPCODE和NAME添加索引
$ x3 v/ N& E9 wE.给ZIPCODE添加全文检索' @+ b9 p9 d2 X, b
( l' T9 ` P: r$ I# w4 M+ z
* W8 y7 e1 @% O0 |
10.执行以下SQL语句后将发生什么?
" s$ n7 P8 {6 B6 _$ j# m
6 w* s2 ~0 b X1 |. m/ @5 ]$ c- xBEGIN TRANSACTION' @9 M/ K: ~, ?4 @* P* I
DELETE FROM MYTABLE WHERE ID=1
! u1 s" @) K3 A, [DELETE FROM OTHERTABLE
6 _2 U; H9 \* l) \5 T+ R4 t8 o& VROLLBACK TRANSACTION0 {' _" `& r5 V
) f1 w5 i) f3 |$ C: P$ |2 a2 ^; A' R% LA.OTHERTABLE中的内容将被删除
+ N7 s6 W, y, U! @& eB.OTHERTABLE和MYTABLE中的内容都会被删除
! K7 T/ j+ {# B. ?6 t1 A: i, mC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
+ q! b9 J( a' f( @! TD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
8 C% w5 X7 j, }+ n% U$ UE.数据库没用变化
4 y1 |; d- U3 P" j; ?" u1 ]( Q
9 ^1 I8 ?8 }+ t( i
4 R/ |% d0 Z/ D& ~2 R0 Y# s3 c8 M11.DESC在这个查询中起什么作用?
% H- t/ {: F2 [ i) Q0 e. [0 x& R5 |3 ?9 o3 w
SELECT *
; M$ \2 Z+ K2 vFROM MY_TABLE5 e9 _* ?$ B6 T Z
WHERE ID > 0" p6 r0 K9 A8 H( a8 c; q( j3 o$ {
ORDER BY ID, NAME DESC4 P: M2 F$ F) f$ e% B% \
4 I* o$ E# R, G9 [# P wA.返回的数据集倒序排列
) f3 K( _0 ?% X. ~ @2 ^B.ID相同的记录按NAME升序排列
4 c/ _- Q; f: |9 {C.ID相同的记录按NAME倒序排列- B# |. U7 N. a7 T: i
D.返回的记录先按NAME排序,再安ID排序2 U- o& ~6 t0 @* z7 E* C
E.结果集中包含对NAME字段的描述
; c/ l" ~% @( k+ m
4 p8 g3 f5 K1 A" I8 H7 O/ a/ V5 ~0 Y$ B6 T. ^
12.以下哪个不是SQL函数?
g& P& E* s5 H% b2 Y7 B! e5 X; b& b' w4 w6 Q- X% o- |$ J" z- a
A.AVG
8 L% d9 k+ c# }& _! |! dB.SUM
2 i, c$ d' W2 v) w9 YC.MIN/ p; o+ u! Q7 z6 v9 [* `1 e
D.MAX
/ l# @! n2 R- a* K$ y# [E.CURRENT_DATE()7 ^: }" K1 M, Y1 W
' [( h3 ]2 g' w
7 G' Q+ [7 g+ _ c6 h0 [' @13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
3 X0 g, k# J1 o$ g8 h9 }! D7 N4 d" S8 `% ^5 g, Q
A.该字段必须有索引( O4 E! ?7 f5 P, U! s0 B
B.该字段必须包括在GROUP BY条件中
7 p% u+ X/ X7 JC.该字段必须包含一个累积值
' E9 f5 F' g: S2 WD.该字段必须是主键
7 c g3 h, i/ w: FE.该字段必须不能包含NULL值! ^: O9 Z5 E2 a- p, j* c: ?3 `
5 w0 I0 h. r% U& a" W
2 q1 p( f$ Z+ P1 ^# E$ e* }
14.以下查询输出什么?1 ~0 m8 H8 t9 `3 D+ [9 Y
8 J! b+ l; c0 K$ E YSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2 ~9 N k# | T* x' S0 Z: w
ON TABLE1.ID <> TABLE2.ID; @5 i# G" U2 ^7 u
- t6 k8 _1 H+ i' e# `( ~% HA.TABLE1和TABLE2不相同的记录7 K7 Q! m9 I6 m$ ?
B.两个表中相同的记录) N. J. w1 e' S; h
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数6 g2 K$ M# B7 u3 S: X, h
D.两表中不同记录的条数
0 M: a, z" j6 g$ QE.数字2
- g e$ Z, l* l. k8 ~
! B$ D3 ?( m, C1 n$ k4 S- O: ^8 d/ E' c3 K' d% s. R. T
15.______能保证一组SQL语句不受干扰的运行?
. [+ t5 d% P1 H% S
0 E" |2 _- Z: w6 p9 H8 Z) v9 K答案:____________6 \8 w1 q& {+ J0 w, q5 g
- C3 N4 _" V4 m/ C% c) C
3 j( p5 E1 ]3 m7 l, k) v' f% }9 k5 q2 i
答案速查
- _2 Q9 i, Y6 n2 _0 T4 E1:BC$ O# U4 |9 n9 z# P2 Q) @* q
2:WHERE9 Y3 B; P" x1 H$ I
3:B
7 ~& ~& B0 ?& F7 K7 A4:E
1 a4 p, a' u! ^0 h9 F) n5 j' N8 u5:BD
1 k" w0 M7 E: I; k6:INSERT
1 i8 O% e/ N* T9 U) t7:C" u" ^" U& k4 F
8:A; A" w( H# [/ @. ]0 f4 n) q
9:C. F2 P4 o# X( J1 Z
10:E
% |0 z( C' _- t# \, b0 l1 m11:C- t3 v! Z6 M$ a* S. ~" \: P
12:E
6 I4 @& i" k$ ?2 d" m0 ?13:BC' w/ R# i+ W# E) }: P- ]
14:C
6 D4 l4 n. B. M/ A; b+ A9 L/ |4 @15:事务
( Y0 X* o5 _5 ^$ a" h: ~
4 ~1 E" F2 l% K) G( |9 b/ G @! b+ o. n2 ~7 l" v6 L5 u$ e, @8 r
7 L5 v5 |5 C" y* D! L$ |答案详解! @$ P4 s0 ~ a. ~) j
8 S) u; p' ` e9 Y4 G+ ]) d
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。6 Z4 G5 k4 ^, f; K9 W& J: N% }
' M; I$ T, ]3 H
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。" z4 e2 \9 }# Z; n8 @
; W; J: C3 h; D3 b4 P u' j4 i
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。+ ?9 ^ @0 I, N! A/ D! }
3 `. E/ z8 a* Y D% U
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
8 y' D6 E: e6 d3 @6 U7 @* a& A1 K5 P
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
7 n# E* b- f4 r2 Y1 t! A( H# T; `, A* j, J
6.答案显然是INSERT。
. n ?, I" ^3 I
! U6 b% A# B8 ]+ q% ~3 y7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 f) e1 x! r1 Y! s0 i+ p2 H; E3 }1 @( _! N
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 w# H) M2 F/ u
$ P- g N* l* R. F/ z" ]# P/ u3 a" }9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
2 U% I+ c ~7 M9 b9 l0 P- g, ], q
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
. R L6 j) {/ t( w% e3 e' Q
$ F" z4 W* q' C% N5 g d; x: b" e3 B11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。/ q+ i7 r5 l/ c' V+ s8 y
# @0 y b% f& k. H) T
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。1 ?* ^% v3 X7 k! \- Y h: K
& k$ U' y' W0 O: Q( S5 x
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。0 `( ]+ o4 }# F+ E* S2 _) N) r
% H8 p: o- p5 ?$ J: C
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
6 }% B- a. g! i: J% K2 o
9 x5 r) K# L! Z5 J15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|