  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
, Z1 d5 M& t7 S3 JPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。& ]8 o: K2 ?* l1 ?% J
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。: ]" R; e# M$ t( Q2 j
4 @1 Q& [3 A9 ~4 R" u% {: \0 Y4 d
问题6 a* J: l) D2 r. Z4 n9 ~4 O5 [
. [4 A; t8 i* a6 A% a2 f6 R5 C1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)6 S; {# }* A6 w* Y2 T( u
* Z) j$ Y* P( h+ k% J. k& |SELECT * FROM MY_TABLE1 s" i: l. j- p6 K
- J+ d& \$ \( i W
A.如果可能,用把查询转换成存储例程
9 D9 D9 ^" D5 b, F# S5 bB.如果程序允许,给查询指定返回记录的范围; ]7 A6 q8 W4 t: l0 K1 g
C.如果可能,添加where条件
1 e8 [9 p1 J" P- fD.如果DBMS允许,把查询转换成视图
6 N) F/ l2 C E% V5 J# ?% BE.如果DBMS允许,使用事先准备好的语句5 l) B2 H% }6 Y& v6 q
* b3 {% P p c% k6 h* z
6 j( Z7 a& N3 X+ d
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
6 z4 Z5 ~7 L/ @+ B
`7 N% M5 H9 I, ?& J4 J3 C3 R答案:____________
; p8 w! T2 ^* @0 c, Z! `, O7 N: W: M
5 i# i. k5 d: U3 y3.内关联(inner join)是用来做什么的?9 y2 M E0 F7 K4 J. b
2 ~: t/ Q$ s, Q q2 I
A.把两个表通过相同字段关联入一张持久的表中
; _- I' @! A* [# k! z# m NB.创建基于两个表中相同相同行的结果集
$ P' J6 p6 V w- H, `) Z+ u7 FC.创建基于一个表中的记录的数据集% A% O9 g. d) {# h& V. H) ?8 W: q
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集 [5 f* i4 v; L6 C
E.以上都不对" R; g' l$ q! F: [* _
0 G) k S1 T# _3 i! t9 e% Z3 Z
8 i& i* A3 ]. W4 p! H$ j4.以下哪个DBMS没有PHP扩展库?) r3 A! h0 a) U8 u9 r
! U8 n! g6 j# \3 L( s
A.MySQL, L1 z4 |; i; u N, h" X, x
B.IBM DB/2
) X# U: }. I+ x; S' o# T( u) BC.PostgreSQL% { y- G+ \9 r3 r& S- l
D.Microsoft SQL Server% ?3 T: C* d% _8 _# ^/ i
E.以上都不对- E. c/ e! j$ N5 j( k
& \9 C2 j9 G/ w2 V) d5 q' w0 ^5 {7 Q/ F( X: q* \$ V
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
- s3 m6 _4 b" U2 Q8 V: @& B+ }6 n4 C( f
<?php
+ H; d4 P- ~9 T( k6 y0 J0 C$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);8 p/ m1 i( X, K: U# d8 K1 F" U2 e. M
?>1 ^- \& w) ^8 B J
0 T6 U8 \9 h7 b2 A" D2 LA.MYTABLE表中的记录超过1条+ C: }$ i) h' W
B.用户输入的数据需要经过适当的转义和过滤2 P9 w, l2 T6 x# W
C.调用该函数将产生一个包含了其他记录条数的记录( o% z, ^9 |3 B+ A
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
# f9 Q4 F& C+ K/ e1 _+ ^: h, hE.查询语句中应该包含数据库名, L0 w2 k: @9 u5 p& K, @; o$ q
9 z! J+ d- x: d4 ^* H1 O2 o
+ Q: ?7 x; Q% _; @* k0 U$ D6.______语句能用来向已存在的表中添加新的记录。 B8 d5 l. Y3 s7 t2 L
8 n" L7 Q y! |* Q答案:____________( {7 _) T" r2 T) t, A6 ]
) y$ ~6 Y2 v; i% b
" y( ?- n9 P- N/ j3 o7.以下哪个说法正确?+ F' C) N& _2 G( R2 n. f. R' ^
2 M6 `# _6 u- P0 k. {A.使用索引能加快插入数据的速度
) C; W% ]7 Q% f( M: {$ zB.良好的索引策略有助于防止跨站攻击
1 [8 g, k6 |" S& QC.应当根据数据库的实际应用按理设计索引2 |7 V6 O* O( U) l0 }
D.删除一条记录将导致整个表的索引被破坏, V) l$ Q" d" |: U \
E.只有数字记录行需要索引
' ~0 I# F2 ^0 K! d
! P3 K- F- f5 e' h
6 q2 i' t# @; \7 H0 }8.join能否被嵌套?
X; l7 }; G# _3 ^& O% o0 B. h4 Q( |
A.能
" o" F$ e1 D+ X8 }" cB.不能$ p: }+ v O9 L/ B% @
Q6 p/ E# |7 R0 O0 d! R* J5 ?% i- u" j e/ F! ]
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
) L% g" A2 H' O/ e; _6 O2 Q8 `0 i; B/ H! J2 i" o
CREATE TABLE MYTABLE (; A% q6 C# X: b$ X' l
ID INT,
' l; _, G5 U' m' I8 KNAME VARCHAR (100),
~" V( q* i( c7 |8 e( ?$ B7 Q+ cADDRESS1 VARCHAR (100),: X6 r0 X( E7 Y+ n
ADDRESS2 VARCHAR (100),
5 V& r9 c7 g3 uZIPCODE VARCHAR (10),
' c$ \7 p& O& LCITY VARCHAR (50),
& n2 ?( s C N* u2 \PROVINCE VARCHAR (2)# T0 H" t# s4 k- y3 Y$ D9 N
)
" r# r' L- Z6 Z3 N3 I% @2 iSELECT ID, VARCHAR
$ |' W# z7 ~/ y; J$ v) ZFROM MYTABLE
1 L5 q4 m/ f- B$ QWHERE ID BETWEEN 0 AND 100
! r P2 B* D" g" d0 }0 i/ yORDER BY NAME, ZIPCODE4 ]+ Y0 o9 v* H! ^& b- m
! o# N2 |/ b# } }! [* AA.给ID添加索引 J$ N' u' e5 ?" k% f6 [& I
B.给NAME和ADDRESS1添加索引
+ e* W# U5 Y* [) a+ V; UC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
* e6 M" ]9 T7 S: e2 e- \1 Y& wD.给ZIPCODE和NAME添加索引3 ]) I- x: A0 Q7 {7 t q4 X: S5 G9 S
E.给ZIPCODE添加全文检索
1 ?: t0 m2 d+ ]- l* K7 J& V2 E/ a2 R1 q9 ?9 u
- o# B6 ~7 U$ o; h G8 f10.执行以下SQL语句后将发生什么?$ M, ^ d j o5 S! R) f
1 t. `0 h) P, \+ [! }' `
BEGIN TRANSACTION: t _( L5 [5 H# y/ T4 ]
DELETE FROM MYTABLE WHERE ID=1; u+ Z7 N7 z! V, k& ^
DELETE FROM OTHERTABLE
& L, L+ C6 p6 v2 k- z; JROLLBACK TRANSACTION
, t1 P# ^: G8 w% e' n1 Z0 L
& c9 M3 e, ]5 x g: bA.OTHERTABLE中的内容将被删除# p' \) ~1 U% a/ T, s, j- u
B.OTHERTABLE和MYTABLE中的内容都会被删除
9 e1 X3 n! \/ g3 Z: X+ w1 l! l9 kC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除1 x$ }) e( Q! @" z5 u
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化. E7 o5 {9 s0 S! O, `
E.数据库没用变化4 M0 t/ v! {" d
% P2 ]) a4 E( z" H2 t6 z+ t/ H3 c+ i, o4 `4 m5 y2 H; ~) l
11.DESC在这个查询中起什么作用?
' `2 f K0 \. Q( x7 @4 _& y
: ^7 @# _1 v+ g: A' m! gSELECT *
0 y; s9 f( B J7 S3 G1 `* FFROM MY_TABLE
9 m% f& v' [! p4 cWHERE ID > 0
( a1 U: s% Y) `7 S7 ? T+ H0 O2 G- H/ x2 pORDER BY ID, NAME DESC
" T# Y. u. A6 a: Z4 J. @2 v G1 t/ a3 i5 N: ^" Z* F, S6 l3 a
A.返回的数据集倒序排列+ }' R2 z7 C% p4 H
B.ID相同的记录按NAME升序排列
1 ~ T0 _# q8 e! N% C- oC.ID相同的记录按NAME倒序排列
0 k. ]' n4 {- D9 e% ?4 ^/ |& [D.返回的记录先按NAME排序,再安ID排序
5 \0 ~6 t* B* N" j: xE.结果集中包含对NAME字段的描述# t2 a8 i' p) ? ~2 C
; ]7 i( B; Q$ m; _7 A
; R$ z/ V( c1 P! ]; z
12.以下哪个不是SQL函数?+ Z/ ]0 ^2 ?) G% c, t
1 M* i Q5 |& ^: w
A.AVG s# c, S0 z S5 W4 c: p
B.SUM; s, ^3 g+ C% z) I" h! m4 w! i; }
C.MIN) H. ~2 a% I( G) t" V
D.MAX3 x/ W% O: J+ M, {9 H) M
E.CURRENT_DATE()4 O; p! _, _( }. S7 }
0 T* P- f; M! c8 s
6 v' `9 g+ F; K% }/ v) q7 g13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?# B. k; X' B& _ k+ m2 Y! b
6 ^6 m8 P }2 a& B' r: b; i
A.该字段必须有索引5 H7 K' p. b7 i/ N8 h3 c( }4 G
B.该字段必须包括在GROUP BY条件中
" W7 o: f1 v, m% h, ]C.该字段必须包含一个累积值6 [4 b0 x5 D/ o
D.该字段必须是主键
1 Q- h" X. Y9 Q o w( x9 Z6 qE.该字段必须不能包含NULL值7 b; c# k$ g9 e, p N
8 L/ X# `2 @) T3 T9 c
" n, [' {; [; Z2 b+ U14.以下查询输出什么?
' I( P% l" K! W, u z7 g7 l7 C$ x: t8 k8 G/ n/ b$ d- {
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
, Z( z' f, a$ @- O2 }ON TABLE1.ID <> TABLE2.ID
! g8 F2 m/ Q( M' `& m( j- [
8 s4 l% {0 D' u9 A4 o; iA.TABLE1和TABLE2不相同的记录, _4 |" b! z' p7 t( v: v' x7 j& P
B.两个表中相同的记录8 K p ]9 ]8 S8 [" O9 b6 |& J
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
8 o+ ^8 s* v5 z) h' yD.两表中不同记录的条数
* \, i* x& v, m# K0 l" K/ v4 ~E.数字2
) B, C1 z/ ]% P/ }) D. J. e0 x
- c9 {6 @" l0 o ?# c9 Z! ]; ?1 S( w( H3 B$ E
15.______能保证一组SQL语句不受干扰的运行?- n9 d+ H3 ?- j' {0 A
0 h2 p$ ?; i% t; }4 j4 d# g答案:____________( j3 b& k0 b! P' n3 x
: {* @+ M$ w0 z5 g1 Q
( N, R- s$ I3 M) ?- j$ E
6 _1 `, @3 q; S; b/ b, H5 K
答案速查
9 Y$ p2 R' ?( X( A" P, n( l/ b1:BC6 T/ h K4 L8 X6 u
2:WHERE8 g4 K2 [6 e) h9 ~
3:B. z9 p3 ~# `+ k6 [* Z2 Z- F, o
4:E
$ h6 H7 P$ d* X' H5:BD- @5 {2 d& l! `; @ N
6:INSERT
, Z& z8 Y+ \3 }) z( m7:C u, v+ G& h5 D2 y @5 ^4 \
8:A
- `5 Y9 D( W; n9 Y3 j9:C
' H& z( y9 G& w10:E- ]0 Y# T$ K9 {! H
11:C
) D4 f/ J4 d5 a: h- n- K; Q12:E
1 B5 o, y; O( Q7 \9 r13:BC1 n; f6 T! t a" j6 N# q
14:C
7 s4 R& z) i( N9 j# |15:事务% p. m$ ^: S; P# Y% p9 m
$ V4 i: G D# X6 g
5 v i- @1 |, p2 @9 S; e: ]6 {% y7 I: r
答案详解) l9 O( Y, ?) H2 ^- C
0 {' Z4 A; | Z& ]8 [1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
# z0 n; w+ Z7 c7 P4 n/ W) E, V( ]' p# y" M. `. j4 z
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
5 `& m7 X2 i- G. ^+ G2 }8 o2 m8 s6 {$ V
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
" S- C. S8 Z% a" V0 N# N
$ B. ^, E; o5 F. Z2 N: \4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
5 e* a0 t+ S' ~# }
4 Y8 P+ c1 ?/ Z+ |) Z5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。. Q8 b$ H% ]9 @2 X, N: M* Y
. t0 N! b4 D: u( T7 X, Y: w* s6.答案显然是INSERT。- B: U7 c( {* h+ A6 f# \, x
1 s, }) i' D' D8 H/ Z D" U4 R2 o7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。$ y* Q5 A2 p0 b w+ u! B: k! p
6 [: c9 M6 b8 ]% ]1 Y0 ~' z8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
, ^+ Q$ X9 M6 X7 q# e
9 s) y% W6 C! g/ d9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
1 l ` u4 ]* Z s1 ~5 M3 g( q5 R+ h/ R& ?; |, b1 K4 m1 L
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。/ c/ k; t) N' e3 V2 b. S3 `# m! l
+ t3 B0 U7 N' n8 |$ ?( H. [! h+ [11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。: }' \/ h. q* h1 V% [
6 E1 W6 w4 P2 G7 B9 D; K. S# P
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
+ m0 D) {$ r+ Q8 o3 h! F$ J1 v+ T% F$ n) Q
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。9 z& R6 o# M* L
; U1 P! u5 X: e6 Y% m0 `14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。! U3 t# g' k6 Q" h( e
- ]- {" M6 G* I) g
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|