  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14189
- 金币
- 2385
- 威望
- 1647
- 贡献
- 1333
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
6 M' V+ `: x4 u2 lPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
5 @ l8 V! p: w9 w本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( h8 k& S7 X- h6 ?
5 Z# i- `- B3 u9 e- ~
' u# v) z4 n$ b( r& z) G$ Z问题
# `3 P8 P% d! H! d: U; K9 X* |7 A+ p; F
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
/ G& i) h% U3 q; d4 u$ D6 L: _# k8 O3 a; y$ ~
SELECT * FROM MY_TABLE
0 ~& Q$ M2 {- Y3 O3 M: r7 |9 ^) |2 G1 j
A.如果可能,用把查询转换成存储例程/ k2 O# z7 D6 N7 Q1 y/ v
B.如果程序允许,给查询指定返回记录的范围
; d! N3 ^; S; b q' m* @C.如果可能,添加where条件; P; g# Z: N7 ?" Z) O; [
D.如果DBMS允许,把查询转换成视图
: k Y6 n, w% q5 }& g4 K7 F1 A7 wE.如果DBMS允许,使用事先准备好的语句0 u7 J( R$ W: M' L$ h2 ? s5 N/ H* o
5 g# [5 M2 c- i- `' z
7 s3 A& D) C# y2 d
2.可以用添加______条件的方式对查询返回的数据集进行过滤?" W# L f( @0 a& M+ G
1 R+ E3 Z; V- ]# z# C! t答案:____________
2 ^$ s- Y9 P) |" ]! n7 O6 L3 H& C( z+ h4 H! \1 O
1 @6 v, u2 u4 `( m+ N) E3.内关联(inner join)是用来做什么的?
0 B6 e$ z; p* P" {/ N, N
1 R( @! I3 o6 G$ I' n- Q7 BA.把两个表通过相同字段关联入一张持久的表中
! w, n; |! `$ \B.创建基于两个表中相同相同行的结果集
5 q' N8 }( w' n( D$ ^& z: K: tC.创建基于一个表中的记录的数据集
8 |6 `& J1 G& W% ED.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 A! q) U1 S VE.以上都不对6 m2 `' a5 \. _/ ~, j& v
2 p# F, o% L1 k9 |3 c3 o4 {
" l+ [6 ?! p9 ] m) Q! t+ G4.以下哪个DBMS没有PHP扩展库?* ?6 N2 l5 w6 C. O+ [9 D( ?
; i9 @- z* x. ^5 K$ c- D
A.MySQL7 M+ c3 |$ \3 g
B.IBM DB/2
6 c3 b7 ]' V* s O& ?7 PC.PostgreSQL- G: Y4 D# _5 l& y) P* B$ Q
D.Microsoft SQL Server
- n/ Z) \2 E+ s4 {E.以上都不对
5 D, ]9 \' D0 e: k4 N9 B: @: h5 H9 w. x3 \ V" C8 v) Z3 b
, r5 b/ c' c0 q# l& G: r
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
/ e% O1 O0 l4 f' E6 D0 Z6 v) Z2 S h* F/ X* V* U9 B m6 I
<?php- b6 \* g( y; Z' J) b3 N
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
' W# e% U" p$ b: P5 b+ y" h X?>7 _7 V: c i8 j2 C: X) p" _9 V, x
- p! B9 w* R) ?! A x% z& W$ w' V6 z( lA.MYTABLE表中的记录超过1条
! {7 i6 U5 T# b! j9 }& H: u3 p2 CB.用户输入的数据需要经过适当的转义和过滤, K) [$ T' F) I
C.调用该函数将产生一个包含了其他记录条数的记录
/ X6 N" D/ O$ S6 f+ OD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- Q, A% l/ A; Z6 A& W: Y" HE.查询语句中应该包含数据库名8 Q- C1 J2 k7 q2 ?. G
2 E- e7 B9 |' N: A1 J
& l5 S' M/ d" j w( }. @/ i7 L8 n
6.______语句能用来向已存在的表中添加新的记录。
+ Q3 y& t# f. }
7 g0 r X% z! c; |8 o: R答案:____________3 _+ u; u e# ^: {/ c$ [9 }5 k2 \
8 t* ]/ b, q" v8 g7 o1 k% l9 `$ r! x% w1 q8 `
7.以下哪个说法正确?
) Q) ^4 p% h6 I2 Q* G+ C2 M2 v
( ]' f% \% U) I3 a4 I9 EA.使用索引能加快插入数据的速度
0 f9 c7 e) e4 u; _# c9 VB.良好的索引策略有助于防止跨站攻击
1 s0 X7 d+ S4 ~8 MC.应当根据数据库的实际应用按理设计索引
- p# X9 y" y" C5 ?" h' jD.删除一条记录将导致整个表的索引被破坏- \' m8 U' m0 u; A+ X. r
E.只有数字记录行需要索引4 R2 b D0 {/ i* \: z7 R" L
) z, O" K- z. s- [& }! u& r
$ t$ E6 V M1 b) ]0 V. R' |3 ^8.join能否被嵌套?8 I! _; m. p/ ~6 e0 }" a
9 @+ ^: q1 }) qA.能( U2 r# e) y) }: z. w, ?5 T" J
B.不能
1 b; t6 n# ?1 F) c! ~: g
! R* ]6 @1 u } X
- `. _1 r- ]5 m8 J9.考虑如下数据表和查询。如何添加索引能提高查询速度?- ~6 d& ~+ ~0 c) l: @. m
9 a& U; {# ~; WCREATE TABLE MYTABLE (7 D# q6 h( c: q ^. C6 H( o) t
ID INT,5 R; e, m! t) F+ f
NAME VARCHAR (100),: ~: t1 X8 i v# a" z9 Q$ s5 N& C
ADDRESS1 VARCHAR (100),5 c3 {. V4 r. ^ D% w
ADDRESS2 VARCHAR (100),: p, G' m/ P6 ^ b4 W: M5 \
ZIPCODE VARCHAR (10),
2 r! q* A+ g: |. F1 O. k) \CITY VARCHAR (50),5 Q$ }5 f. U& C# |- o
PROVINCE VARCHAR (2)
5 I# |2 ~) C& ~! j)
$ a" Q- E& r2 f6 K) o# I' HSELECT ID, VARCHAR: t2 f# E, z. a: \' W: U- Z$ z6 _
FROM MYTABLE
: L! x- P# [0 NWHERE ID BETWEEN 0 AND 100
7 w( n' q9 c/ K' s* l# FORDER BY NAME, ZIPCODE
" i% r1 L# }8 O. f, ^2 u6 d
' B+ V. D+ A9 L9 C5 N- GA.给ID添加索引* j3 s, R1 c- A/ _' \- B
B.给NAME和ADDRESS1添加索引& Z* z7 a$ g3 y
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
3 Z) Y# _. {9 j- xD.给ZIPCODE和NAME添加索引
1 L$ L; ^. S/ x# e- ^E.给ZIPCODE添加全文检索
5 e3 @% N2 E' b6 y8 D" L
( I- i9 c& U2 v# J, A1 u1 M, p6 K& C; e* c' P+ g
10.执行以下SQL语句后将发生什么?) f. U) q$ z7 m$ K
9 o7 z6 v% }0 c% jBEGIN TRANSACTION6 K7 v- n% s% ? A! S' y {
DELETE FROM MYTABLE WHERE ID=1
+ K0 Y/ h( z; [4 xDELETE FROM OTHERTABLE
0 a& @( p. F H! YROLLBACK TRANSACTION
5 d j6 B$ Y5 w/ H N2 E
! h7 P: B( |$ E. V6 eA.OTHERTABLE中的内容将被删除6 Z! @" o& I5 F7 u3 M S
B.OTHERTABLE和MYTABLE中的内容都会被删除: m& r) `6 r0 j* v0 L- a
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除( _) N9 k3 g+ z! r/ Y( Y
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化/ v# a# c: L9 F. J% t6 o
E.数据库没用变化
% u3 N% r: {/ ~& `$ V$ E" n6 }+ o! N+ d1 ~/ d2 x/ Q$ r( k# p2 v
3 E7 b) ^: J7 _
11.DESC在这个查询中起什么作用?
& }4 E2 C+ K' M/ Z
' \; L5 A( a* c6 a* X, B7 MSELECT *3 g0 y7 N3 x+ E3 u% S# T1 Z. p
FROM MY_TABLE L" E2 u; _5 e; T, r! m6 m/ T
WHERE ID > 0
" r' ~9 p; L( O4 ?ORDER BY ID, NAME DESC
g1 N7 p2 L# I1 E& g' J* N0 g a7 Q, A! y
A.返回的数据集倒序排列
$ n+ K m$ I% Z! \B.ID相同的记录按NAME升序排列/ O, ]# o& A7 p2 i- Y* v
C.ID相同的记录按NAME倒序排列
3 y/ ]9 A7 X" j* TD.返回的记录先按NAME排序,再安ID排序. n3 n: e1 R# ~$ b6 s& E2 Y
E.结果集中包含对NAME字段的描述' E# Y0 w* b9 S. Y
# n# O% |7 G3 b: _1 M
4 Y) @6 g6 X/ C3 L9 _( r# P12.以下哪个不是SQL函数?! x% s+ ^4 Q; o' C* a3 L l2 V
7 d; d: g& y. k2 b1 xA.AVG
! {; ^+ ] z) O( d5 q& JB.SUM, i6 E, q+ ]& ]: w/ m$ u
C.MIN
' {, |8 N* G; g2 D/ S1 z+ @& OD.MAX! f- U a3 Z3 _9 q+ j
E.CURRENT_DATE()
$ g! B. v. f( I* F6 p6 S; C) B, [$ Q8 n! s4 }6 @) @7 Q
7 n1 {' l+ N* `; z, q
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?, Y! D" u3 |6 b
. W5 B I; m; N2 \; y
A.该字段必须有索引; d5 D; K/ _0 x3 c3 b( o. H
B.该字段必须包括在GROUP BY条件中
+ K C) i" x+ l' W5 j0 G3 c4 |C.该字段必须包含一个累积值' Y' Z" D8 [4 x i- W
D.该字段必须是主键7 y7 }* A* K- w% r6 [# L: L
E.该字段必须不能包含NULL值
1 b7 C, ?) A" _' W4 R& P0 S) j" a4 g d8 r$ Z/ s
) k" Z( S. b; f: x5 v
14.以下查询输出什么?4 |; z: ?" P$ a9 v! L/ a& d
- f7 s7 k- i# J5 }5 J3 ]- V7 {& S3 n
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
; Z B# \* \* C ]2 H6 |1 ^' zON TABLE1.ID <> TABLE2.ID4 X( _ E/ v o& N3 z
: N4 w! o4 a" R1 j# a" G
A.TABLE1和TABLE2不相同的记录
4 J7 e: F# {- Z- C4 X- F. ZB.两个表中相同的记录
" b) c5 J" D! ?' V5 OC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数5 e( B/ u; V3 k) u
D.两表中不同记录的条数
7 \' Y4 F5 h1 t; Y0 Z. \0 ]E.数字2+ E6 N: y g3 T
! c- n ]" x: K
, l( D# f7 v' o0 z1 ^4 y6 K1 O- c6 P2 N15.______能保证一组SQL语句不受干扰的运行?
1 k8 t3 [/ K4 x' Z# k7 w& x; I7 ?0 _/ p& m$ Q
答案:____________
D, K( v/ m4 r2 J, t5 @" ^9 M2 y
1 ?; V6 _4 e+ F3 i& K5 k3 X
5 ^& z" ^; z2 K5 w/ N" m7 v0 u答案速查
2 C0 N8 {3 m3 u' [7 q6 V1:BC5 e/ C* C7 i4 D- Z
2:WHERE
& M; S- p& O$ D+ ~) y6 `0 i$ {3:B7 t) W+ l& Z! P1 d' E+ a
4:E% l5 w' O2 l# L1 i
5:BD
/ j7 ?0 d% D e+ }8 e6:INSERT9 O- O( }0 P( J; Q! ]! g; O6 Y% `
7:C
7 r7 D0 L; _8 l% ~8 f/ Q8:A2 `; l9 z Y; N( _3 M
9:C
/ C( ^3 l# m4 m! T* Z8 a10:E
7 q& r( k4 P* S) b11:C
5 X7 A( W- C) T& Y, `, C k12:E; B! Q& H1 K# N; p* Q3 l6 k' O
13:BC
9 I5 g- M0 h) k S! e" ~14:C, Q5 o! ~" d4 _' d
15:事务
+ s o) s$ O/ n3 z; g+ w0 T5 F5 K6 m
& d9 Y- p" j7 J2 c# q
" a- @2 r( }) Y: K& ~8 U# d" Y答案详解
& e1 q [" { @; u8 m' m4 m. j) ~/ `* @1 B2 l
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。2 D$ o& o' r5 R
% }3 h. m2 c, s) |0 T( G2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。 R* C' L* @4 E7 \6 p( p6 T
4 _! \9 P- ]: |! u2 v3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
; O/ J# S1 h+ @7 B) \' V# e& G3 J+ d/ L; V& _5 h
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
: z) x& a3 T2 [4 O: }$ j2 p( J; a- J+ e4 @4 \
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。, e* V$ O6 P1 ~# ^+ y
# ?* ~& Z& F6 Y. i. x% u4 x
6.答案显然是INSERT。
" e' {/ V( u+ A( b9 o) m! [" v' V1 M$ A; _: w
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
8 `6 Q0 r& t/ J2 r" I0 H8 u: d) B% O( C0 m- H
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
5 ? M9 D' x* v, l. P1 g0 E# b. S
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。) U5 O( g" `8 I: ?8 z5 k
# [: Y8 Q+ ]' H10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
1 U" K% w3 Z/ ^, B- q9 g% N4 p+ [5 A$ X* N
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
. \/ n; B6 i! O" [+ i8 s/ `! W( {- ~- m8 b3 Z @
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。8 I# Z% `/ k# H5 X5 q) d
- b l! @% g+ F7 e( j) V: ]
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
. P" J5 B4 h8 X7 q- O g: B" d7 E/ v7 |# l
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
. A. P- G. p/ ]2 ]( Z4 H
) Y; ^* j4 d$ H. ~" D6 y15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|