|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
: R: j( s3 k- a* h( A8 e- q' sPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。0 t1 b$ D0 h- Z! E8 w" ]# i
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。9 w, m) W9 j: L8 f* o
. B6 V+ p5 P" A
6 [- D' m# ^" M8 ]. g问题
. w8 p" Z& ?( G; ~$ Z& G' k' d. b4 e* U$ e" j* @5 e
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)! @* O( t b* d# s
* P5 l/ t4 W- t" g
SELECT * FROM MY_TABLE
1 Y# c+ w% y* u' L. k; T0 R' R! T" O% t- [
A.如果可能,用把查询转换成存储例程# T0 L. d2 ?" E. y7 K5 G! d
B.如果程序允许,给查询指定返回记录的范围
; S1 A+ @; m4 k' {/ y( E' KC.如果可能,添加where条件. h& _/ [# O6 h. C0 ?. g
D.如果DBMS允许,把查询转换成视图* Y# o+ I1 ^/ ?9 J8 d' P" A
E.如果DBMS允许,使用事先准备好的语句: H5 L9 s4 a! c
0 A2 a3 ]1 P; _0 d
+ `# i6 v$ [+ W1 a2.可以用添加______条件的方式对查询返回的数据集进行过滤?# |: m; e1 j) r6 g- m0 v
- ~" y3 e; P0 \! w
答案:____________8 E3 k; v: ^% ~0 g$ r
$ C' O% i+ Y0 a/ m
4 |9 r" ^* O1 d5 D# D3.内关联(inner join)是用来做什么的?
# {1 g6 X6 K: s2 B4 G* m+ {) r" u* }5 ?
A.把两个表通过相同字段关联入一张持久的表中( c+ T' z g: f6 A, X' G) `8 r
B.创建基于两个表中相同相同行的结果集5 x# ?; l$ r1 o1 }& c1 B( g/ `# g
C.创建基于一个表中的记录的数据集
: a& `$ q, a# y" \ q" AD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
o7 e/ }1 W/ q G% [8 w; |E.以上都不对
: r% ]' R1 s' F4 b1 D. `6 @4 F6 o1 r5 z1 o; C6 `7 @0 k
6 R3 L7 m a* p2 t, g- r4.以下哪个DBMS没有PHP扩展库?
* ]0 U" N# \" Y/ W# {. y% w$ M+ K z2 h2 N. Y5 T6 n
A.MySQL0 H. V' N; e. L# D2 x
B.IBM DB/2+ n7 m" h0 R! L) W! G
C.PostgreSQL3 R7 R* k' f" G6 t3 O* N9 ~
D.Microsoft SQL Server
: j4 `% K- S1 G/ n0 gE.以上都不对
" C% v8 R" s0 a" j$ P3 s$ R# ~6 a) v. P; ?
$ J7 Q5 c. r/ c% H1 J0 t- x
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选) S5 ? m! j& ]0 ?
& L* ?; z3 O9 i1 O
<?php
/ h# r; }& d; b$ `0 U _$ j$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
! [' o2 Y7 \# z* n: x# S; a0 {% {?>
5 `9 _+ L2 |' B# \- C3 p6 J h
; Z5 ]7 ^6 e6 Q t" C% e3 qA.MYTABLE表中的记录超过1条
4 A% p6 W( g' p) A2 aB.用户输入的数据需要经过适当的转义和过滤
# u7 P5 B5 h Y6 M' z" oC.调用该函数将产生一个包含了其他记录条数的记录
6 n/ y6 @& d5 x4 t0 S: ID.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除+ H0 j3 c* \/ h) t. @7 w
E.查询语句中应该包含数据库名
$ j j, @1 W6 ` z4 u+ p7 S
! y4 c2 G* ]. ~* r0 y) U2 F
2 X5 i9 x5 d1 a- U6.______语句能用来向已存在的表中添加新的记录。' Y4 c7 p6 E- z; H- x' V% V
6 ?+ n7 _' G( i: `, M+ o答案:____________4 p2 c- l( G5 o; C
. |) G' Z% @/ e2 k Q7 s0 ~
# `! d6 s2 k8 f6 s: |9 t7.以下哪个说法正确?
, M( d1 [0 X' d0 W1 Q4 Y
$ W/ V5 W" O! a9 o" lA.使用索引能加快插入数据的速度
$ L" b/ M9 y; ~3 n0 w. GB.良好的索引策略有助于防止跨站攻击
. {! u7 ~2 |8 _* qC.应当根据数据库的实际应用按理设计索引
) E7 D* X/ y8 C4 @$ ?D.删除一条记录将导致整个表的索引被破坏3 C* Z V E$ }" m: u3 _* _, ]
E.只有数字记录行需要索引
7 N2 u( ~9 P5 l8 i' \9 r: |+ T* M* p& `) D @
' w1 N0 C# b& c7 d; g8.join能否被嵌套?
5 Y3 Z& \8 E3 _0 \
: {6 r- S4 y! {% W, XA.能+ e0 d4 ]( X V, ~) f2 m: N! h
B.不能+ ]/ Z" c7 V9 z' R# m: u" B6 `
( o' c+ Y8 ^& s4 a$ _
6 T- v6 N, @/ M, W9.考虑如下数据表和查询。如何添加索引能提高查询速度?
q1 F, t8 K8 ]6 A
7 b/ `% g1 B) v% }: i) RCREATE TABLE MYTABLE (, z! ?* C8 t- H l+ [2 t. J
ID INT,
1 n$ F' A0 L, U$ Q, _2 M" `NAME VARCHAR (100),7 c0 A. \$ o7 ~( s$ w
ADDRESS1 VARCHAR (100),
& ?' q% \' ^2 ~ADDRESS2 VARCHAR (100),5 {( c: M- a3 V+ J, m
ZIPCODE VARCHAR (10),
8 n; [# k3 a3 [3 a* u4 e6 \CITY VARCHAR (50),
1 U% [" j8 X0 bPROVINCE VARCHAR (2)
* C" @% b3 R7 f0 w, m, a d)
|) ]$ {4 }$ g* l. iSELECT ID, VARCHAR- B; e Y% T6 I3 {2 e
FROM MYTABLE9 V Q9 J, X7 e. Y+ ?" t0 G
WHERE ID BETWEEN 0 AND 100
4 ]! r! s1 h$ T m7 jORDER BY NAME, ZIPCODE3 ^8 k/ \) S- T1 R0 J7 O' E t
- f) B' h( i3 |1 e3 H
A.给ID添加索引$ _5 X& ]% {. e2 ?$ i$ C3 d
B.给NAME和ADDRESS1添加索引
& w3 y9 M* _, ^+ S8 zC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引! D. k6 t) d1 X6 o" e/ e
D.给ZIPCODE和NAME添加索引
* b1 l8 c% j, E5 K: l- WE.给ZIPCODE添加全文检索
* M- E1 g3 A! F: N, [ w! [6 \( [2 W. q1 s6 {
2 g# m9 @7 I1 o' x% R" j
10.执行以下SQL语句后将发生什么?! Q2 b* o* t6 [) [) u
% m) v( h( h" t
BEGIN TRANSACTION
, l+ D! ?1 w8 V5 z. iDELETE FROM MYTABLE WHERE ID=1 \% |/ ?* r" g5 k" D
DELETE FROM OTHERTABLE8 w4 c8 M0 `7 h! M: ?" ^: Q
ROLLBACK TRANSACTION; A5 F2 @" e& V! e
% {: r3 o- L/ @# O9 `
A.OTHERTABLE中的内容将被删除
" I4 Y, |9 Q; y) R. [: d% tB.OTHERTABLE和MYTABLE中的内容都会被删除
' Q* W6 ?/ b$ K/ d0 u; X2 SC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
+ e! g) D, X- b! Z8 s4 zD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化6 `1 E P2 [5 i8 S2 B2 W$ X! z
E.数据库没用变化
7 u+ K! D+ Z$ w$ U! p$ p8 b9 l$ u
" }$ W6 |$ z; n- m; l
11.DESC在这个查询中起什么作用?
' @; j, k9 O& S9 \7 A9 N$ } G
8 V& z9 A& L& _0 B) @SELECT *
- W# }# D# v( s2 j9 O# o0 KFROM MY_TABLE: m. y6 r- E; L- I S
WHERE ID > 02 ^4 `0 G' Y! x8 m$ {4 {& f" Q" n
ORDER BY ID, NAME DESC8 Z4 |! [) I6 ~- L, v" O5 g3 d
% S7 t# W7 F; W& u( w% N9 _$ {9 `) xA.返回的数据集倒序排列- q0 ?: k( ^$ Z
B.ID相同的记录按NAME升序排列
; ~" k* ?: b1 e: X0 g0 k B% YC.ID相同的记录按NAME倒序排列6 ]6 n$ @& d9 ^. Y0 ?9 k
D.返回的记录先按NAME排序,再安ID排序
5 L* Y; i2 ~$ E% T% vE.结果集中包含对NAME字段的描述
. ]) q/ X$ Y6 E; i. G* I' z) @9 _$ j6 T8 J3 U- a
9 t, B- I# p7 V6 {2 w* Y* X# S12.以下哪个不是SQL函数?
- E" Z4 v: E5 N# o5 H
: B: ^! p" J2 Z/ x+ G! hA.AVG
/ i: y7 ~9 u( v% ]B.SUM
7 O+ ~0 |* p1 g5 yC.MIN, ^; ?$ z; q: m+ H" k6 A( O
D.MAX
E# `, z0 ]1 z: O. |, h) nE.CURRENT_DATE()
& [5 [9 Z1 N5 j' C7 Z
! W& T4 S+ P$ `0 k. ~
( |4 R% _4 {, A d13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
4 a# O x# H; O% v8 X5 N9 F* ^' t" Z8 j
A.该字段必须有索引
' c( a: o" Z) u: }% {. FB.该字段必须包括在GROUP BY条件中9 E( K/ S8 R2 K
C.该字段必须包含一个累积值
/ ^& d! K% ?" a7 lD.该字段必须是主键
) y% s' p* E& RE.该字段必须不能包含NULL值% U7 F7 R) _& v0 }
9 b/ e1 O0 l) W: O% S& Q5 _+ D# M8 J" a' ]
3 d$ G7 p8 p/ p, t! f14.以下查询输出什么?2 |2 R( R$ G. n
# |- \& w, E+ x* y- U. F+ u( MSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
5 Z. H a5 @7 [. e _ON TABLE1.ID <> TABLE2.ID
4 x1 T" {2 Z; W7 w6 Z3 G
4 y2 q& Z5 C, [0 s. zA.TABLE1和TABLE2不相同的记录3 r! {7 ?/ s9 r, q2 U
B.两个表中相同的记录
) a, U4 \& X+ D4 ]: ~C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数+ b! x" n+ s+ T6 U8 P4 s+ m" |
D.两表中不同记录的条数8 q. z! J' u+ |4 r- }
E.数字2
4 a7 C9 K. O! a2 N t4 L
4 O. r$ ` x- e* @: p% l4 |8 F8 f0 |3 C
15.______能保证一组SQL语句不受干扰的运行?
6 j6 k* ^- p' |5 J* L( w2 j; S# c3 n) }
答案:____________
' A# j! O9 q7 k/ |/ u
: U1 E0 \2 ~2 d6 h
: ]2 g% a9 y) a+ |, V7 L. ^, \$ A
& j7 F j/ \, l0 w' X. @; a答案速查
! I- o& E" j( ]4 a7 T8 g1:BC! Z( F6 E. p$ n9 U J) X
2:WHERE$ Y( _5 q2 r9 x( T
3:B, M. \5 I: Y0 t& g
4:E( X2 t0 ^- M! l' y' F9 `4 Z) f7 p' C
5:BD
& T% l3 l) F0 t6:INSERT4 u8 \* ^/ Z* u8 y9 h. U
7:C/ [' D5 F$ y1 n- W7 p/ w! R
8:A
0 f0 R& N H5 R# d) K% [& O+ v. N9:C
: M0 f( [! u, i0 n% |10:E0 H9 y% j& _: {+ V
11:C1 R5 W0 h4 m9 i! C H I( }. x
12:E
" C; V; O' \! g: J13:BC* T8 I# k. }- v( q
14:C
% J8 M9 R9 D0 w1 _3 V! A15:事务
, M) J' v. g$ t0 e4 K
) [2 f6 ^4 v- ~8 e4 `* N4 w3 b( g8 [/ f7 m% V, H3 b: i4 d
) l/ c4 |( L/ Y1 m/ t% m1 `答案详解
" g9 y c$ m- g$ M
4 f) M) l9 i! x7 Z9 s5 y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。! ]" m% V% g) C# E
( f0 G7 f2 ?5 ?* h4 B
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
, B% N2 L) i/ C: ?7 `1 E; k2 @9 s/ `2 M7 Q. P
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
, H' r7 t9 O. f) l# v
$ q/ Y5 H/ M0 z* E4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。2 v" y% J' \/ R2 A& ?
9 X1 I# ]# n2 V. ?. W) [
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
% l4 M" Y+ z$ K7 U4 v7 d+ O2 s* b& m v1 s+ O! L) `$ I
6.答案显然是INSERT。
0 c+ v X' }# |' {9 u( [1 c
: D- t/ M7 ^, H2 l) F7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
, T! f) q4 m" E' ~' h% {5 w/ l2 G' X! C7 l( ] r* P
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。8 |( J# [/ |3 i7 u' o
/ J2 B8 g7 B+ a, J0 x4 c. h+ I; Q
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
1 \* G" w5 ^" x. K1 ~, J: u; V- B$ `! P" Y% U3 h
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。+ M( }$ M" B% o
( l! x1 f. b' i11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。1 R5 W" j* P- I1 N4 I3 \6 q
+ s, X+ ~6 h" l7 J( ^6 r. k12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
3 ?# G4 I0 N& J2 y8 E. Y" `; e3 x. @0 ~1 G% q
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。3 |7 {' I2 r1 ^, {; ]: |. Z
$ F- u9 J0 ?" s3 R3 |* F) P1 A
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
, Z" ]3 m+ u$ D2 f- P3 _ r! {0 J: _0 m+ G" K+ q0 A
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|