|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。: A9 j( ?* s& o. m
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。8 k" S+ a, {% L/ p' i
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
% w0 W( x$ X) o
& o$ O1 \/ z. I5 e2 z! q( ?% N) t
问题+ i: Y7 A" }* W/ O( s0 F. x! E+ n/ Q
7 X! I* c: }* }$ L& ]0 x6 @) h1 l: y1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)1 A$ g* _% Q6 ]% Z. `$ U ]
% |+ E) O1 j8 q- Y( R4 A PSELECT * FROM MY_TABLE
7 c4 i2 @0 s) p( R6 ]$ L/ @9 B! v* _0 r" ]) v2 c
A.如果可能,用把查询转换成存储例程
5 [$ }* f. L% L9 t1 {, SB.如果程序允许,给查询指定返回记录的范围- |1 H( @3 `& g) g, V1 A) s
C.如果可能,添加where条件
, C @3 h' O- E/ [( N! T2 U( PD.如果DBMS允许,把查询转换成视图
1 q7 J {) G uE.如果DBMS允许,使用事先准备好的语句# i( h! S+ T: `" a6 n
3 `/ B- \. T, N5 _6 H! Q+ {4 b3 r& f
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
5 X" {0 T9 @ o; f3 a& W7 Z1 g) ^: T t
答案:____________
" g, Z5 F0 @1 q# g: M( K; Y0 S# s4 M- K, b( @, o4 J8 i3 M0 J
( N# d& e! P" S- F: [
3.内关联(inner join)是用来做什么的?0 x0 H% j5 t) ?, U- }3 u8 u" g g: ^4 k1 M/ M
- o3 o3 f7 |* Z/ U; X+ q! X
A.把两个表通过相同字段关联入一张持久的表中
1 N6 i* }2 [1 t6 L* v: aB.创建基于两个表中相同相同行的结果集! v2 [5 C" p" h9 }9 I
C.创建基于一个表中的记录的数据集
7 P1 r" b' Q. A8 D8 z) rD.创建一个包含两个表中相同记录和一个表中全部记录的结果集# {: G; ~# P# m- C& A- Z" g2 M
E.以上都不对" J( {9 K7 j, E6 Y3 k0 u1 f1 F6 ?3 x
1 k' Y7 }' X. k
, {8 ~5 } ]3 k# ?4.以下哪个DBMS没有PHP扩展库?
1 U5 P8 n, X2 U g3 `
, H8 u( W4 E1 F- p! a; UA.MySQL) w# d. I4 Y Q! k* a3 G. {
B.IBM DB/2' A3 s7 h: Y m! F F
C.PostgreSQL
9 V% v1 ]$ T- Q5 @* u( P6 F! D' xD.Microsoft SQL Server2 b5 v( R3 K! e6 I* m
E.以上都不对
, ~4 V: z+ v3 |& |* n% u1 r. J; t- O' w, p: H
, Y! ^* R. i s k! j2 _) R5 W5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
) ] B0 i6 N+ y" s8 L7 |4 P0 b' F5 M" _
<?php5 L1 ]2 K2 Z$ ~) {/ h
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
Q8 r5 ?7 a V# \9 T1 \?>
8 I' I+ X, n5 j- P3 X3 f0 {# B3 j/ w* k! c6 c/ D8 y
A.MYTABLE表中的记录超过1条
" X: [" t7 d8 pB.用户输入的数据需要经过适当的转义和过滤
# J& U% v! ^( ^) D& p. PC.调用该函数将产生一个包含了其他记录条数的记录( d, e. E, h# Y: s, L; C/ Z7 B0 Y
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除# i! V& J& Z0 w) t
E.查询语句中应该包含数据库名
w0 X9 L* v: }6 Q& I+ x8 T, Z9 c2 b8 m6 J- b
! }1 l6 @5 w4 d6.______语句能用来向已存在的表中添加新的记录。% w9 q- t. h8 P( ]: d
' U I- }2 y' E" y! F答案:____________/ R% O5 k+ n# M8 O
) r6 X/ o5 m) t1 z1 }, Q+ \, e: k; F' Y9 V8 L7 D$ D: z
7.以下哪个说法正确?4 X e1 {0 J1 u& J% M4 z% }
) ?+ n0 t1 B$ ~2 v7 S
A.使用索引能加快插入数据的速度
; b; y3 w. K: f! aB.良好的索引策略有助于防止跨站攻击# p3 q8 }2 {" R+ p, q
C.应当根据数据库的实际应用按理设计索引
& T: y. X7 j+ l+ R# `1 AD.删除一条记录将导致整个表的索引被破坏
; o" R( r' O2 u" vE.只有数字记录行需要索引# F+ Y( Y, [# Y- _
- }: H! J6 E& q+ T! O& S2 U, R) G' T8 w. E
8.join能否被嵌套?
9 y1 v8 w& ?5 C* e" H
3 h# S% U/ D) e" T GA.能
- a; s9 k, t! Y6 SB.不能
! |+ p* S0 J. r/ q( G% @) ?9 p( s3 V0 @ N. H Z
( y4 n$ i# `- B2 Q6 H
9.考虑如下数据表和查询。如何添加索引能提高查询速度? K+ I w/ D0 E# _: w( S8 }) K1 q6 H
: H# ~- B8 W1 T4 {* ?% P) q" FCREATE TABLE MYTABLE (4 I7 H5 l5 t7 H6 V# c
ID INT,* u( ^* j" a1 S3 P- A
NAME VARCHAR (100),
3 j: X# T* [$ ~/ OADDRESS1 VARCHAR (100),
& } F& s- k4 ]" l1 T2 I$ E3 WADDRESS2 VARCHAR (100),/ E2 f; Q! V9 o/ C C
ZIPCODE VARCHAR (10),
. U3 |& t: p0 u: oCITY VARCHAR (50),
p2 u; b# b! k; rPROVINCE VARCHAR (2)) n# l4 l& Q, u' j- h- |. v9 Y: j8 Z
)/ e5 d% H2 j, e- ]2 w/ v/ u( Y
SELECT ID, VARCHAR
0 Q9 S. [+ r8 }3 t7 J2 S6 x G' HFROM MYTABLE
& p8 ] V) r+ P" k/ [WHERE ID BETWEEN 0 AND 100
( q6 ]$ w! O; K0 }! l4 {6 {. UORDER BY NAME, ZIPCODE) g% ?4 ^6 ~# g4 I u% ]
' L/ q6 p6 G/ Q. o/ d6 IA.给ID添加索引 c+ Y* }1 W, U
B.给NAME和ADDRESS1添加索引2 [: Q7 H+ O& w
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引3 X9 |5 L0 K6 N$ a
D.给ZIPCODE和NAME添加索引
. W6 Y# u- }. }/ \0 w0 mE.给ZIPCODE添加全文检索
- Z: [4 z. E- c. z
# G' C, k: Q8 B- H7 a
, g5 D! }& H9 U( m8 O' i% {8 \3 {10.执行以下SQL语句后将发生什么?
0 `* A" t, c. U" v/ F8 l! @" C6 `: K9 U$ J2 b
BEGIN TRANSACTION
4 o- g4 S; m: L& ^4 a7 GDELETE FROM MYTABLE WHERE ID=1
; ?. |. p8 F5 z5 S4 m2 s: rDELETE FROM OTHERTABLE f7 ^7 T5 d: ]2 }8 U
ROLLBACK TRANSACTION. b9 }9 @+ d9 S# D6 p
2 w* | _& v3 B( ?+ ~: f
A.OTHERTABLE中的内容将被删除
) \8 m' e& ~, [ ?5 R. i$ kB.OTHERTABLE和MYTABLE中的内容都会被删除! u$ o4 t3 ? S# K- w! n, j) J
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除) |8 N f: k' a* ?$ L
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化: c3 z$ D; _; U9 p4 b- Q& q" F
E.数据库没用变化, L2 U; t/ M( _6 v$ g
4 ?$ c+ D, J# _8 \/ C
$ c" S! P- z, l ]6 g* H
11.DESC在这个查询中起什么作用?# e, I+ ^% A) _$ r( b; H
- n* z) r% e0 B, |. F0 z( q
SELECT *
; }$ Y+ G: f2 m6 D# B4 ~8 T( ~FROM MY_TABLE. y( M+ u) i- S0 F8 x7 a
WHERE ID > 0
& h- V2 f+ w: I$ c1 U- Z. dORDER BY ID, NAME DESC5 {9 o$ Y4 q3 y! E+ f
. F8 n: H0 }1 W" J# @$ k, a& Y+ y1 G& x
A.返回的数据集倒序排列
- B% v) w' a5 g1 k. MB.ID相同的记录按NAME升序排列' Z9 d4 P4 R+ e
C.ID相同的记录按NAME倒序排列
2 c" n* c1 \2 \( {D.返回的记录先按NAME排序,再安ID排序% z3 T: u$ o+ q
E.结果集中包含对NAME字段的描述' M- A6 U4 U, U R
0 s. l6 o( a/ a' S0 n, A( n
5 F$ A- [8 Z4 z7 i5 O& g12.以下哪个不是SQL函数?( L, k( _7 b2 n B4 M. |
( Z2 {; v; S$ X& {5 L
A.AVG* v' g3 P |: o% i; I, L
B.SUM- [) G H. ?% |5 m" R
C.MIN
6 s& [- g, R4 z4 R# w" ^- wD.MAX
k0 K3 R. _8 M! R' ZE.CURRENT_DATE()
7 M% x f# ~* B3 b# k7 i3 @1 F. P0 c0 v6 N' k
6 U$ I3 x! _$ U: p3 `# J+ V: h13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?1 V* L9 A& [! V7 U3 W
8 A, I$ @# X2 ]0 a; ~
A.该字段必须有索引
$ [+ U9 q M3 S3 t8 p/ EB.该字段必须包括在GROUP BY条件中9 ~# |9 z1 e/ T9 ?) F
C.该字段必须包含一个累积值0 ?- G2 o$ n6 _) G2 w) n/ r7 e; E, f
D.该字段必须是主键& m# @8 o. q! q" Y7 M. A
E.该字段必须不能包含NULL值
; c4 G3 _6 R: B* j8 K& E
5 h- }: ]( a7 \( ?: a$ m0 D2 z9 P* r# y: ~
14.以下查询输出什么?: `) B; W$ q/ _# W
* A! J3 U* T1 Q- r
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2' Y0 W- {9 y) G6 C: n7 d
ON TABLE1.ID <> TABLE2.ID
* s- Q/ r- h2 Y3 c5 P7 K6 y, F* ^( K/ O8 L! k$ @! A5 ]9 x
A.TABLE1和TABLE2不相同的记录$ m$ V8 G; l% S$ E( x- E
B.两个表中相同的记录
. M- k7 v1 r |/ M |& rC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
9 M7 y/ H3 g. A6 ?" QD.两表中不同记录的条数
9 l, [% b9 B8 H* T( mE.数字2' h1 l' q; M2 M; f; p+ H
" |- O4 V- k0 C& w9 a+ z5 G" A8 n$ `4 p. H: i# k! e. o/ f; B
15.______能保证一组SQL语句不受干扰的运行?! r7 W% i7 E# k: x+ \* }
, ~$ n7 O& f5 Z% l% }6 u& x
答案:____________
2 S$ s' y; F2 c$ I* d) y7 R: f* Q
q: l" P+ D% d9 F1 r& W4 `( {6 F: a; F; a6 O; b
1 q2 H- p. \5 L答案速查7 |# u% g1 L2 p
1:BC
- C/ D# Z. B6 ]) T2:WHERE
' \1 T2 W' C. v3:B
: q! N/ y" u) g! z. n i g4:E
" k& a% e$ V- q- b/ f' b5:BD
8 t% Y8 R' x8 U6:INSERT( s0 `- A! q9 d6 I0 w- i, ^
7:C
* v2 I& u% P. Z \* T/ q4 t# k4 |8:A
5 f2 N: |4 f, Q1 {9:C
6 d$ x% s3 g" p, P% w10:E
0 g+ l" w3 L t- t11:C
4 A$ c, z/ A0 K3 Z12:E
u1 C+ w+ z+ U9 }( I" _/ i8 l13:BC
" a: g) h+ L' ~; h14:C
) f, u& O- l5 r4 m15:事务( |/ g2 d p2 J0 C( h
. t! e) a# I- O1 C5 T- e( o2 h# h8 ^4 }7 j) D. _' I
& S+ o( W9 l# K Z# ~4 b1 `
答案详解
+ c I( `( }% O
0 X3 ^0 ~6 Z; M+ _1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。4 H+ A M. p0 ]
0 H8 v. \" D r; o0 h6 g
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ f0 `; J% a2 H% _8 b, s/ j; _" h+ b2 w0 }8 f/ R
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 I) N* o- M, r( A o& u
+ m* f' \& A. j( n- N1 G
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。+ P# t4 [) ^( h. i+ l' s$ k; Z# P
! o0 n) j1 L& M( }. }! m- m! a1 |
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。4 Y+ N% w5 x6 @3 H% @7 D
* r: h% s. z) _! G w6.答案显然是INSERT。
5 @& E, m/ H0 O. N- q% i
- i3 t% x! G2 D t e9 j |7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
/ s" d4 T. ]& E
1 b1 U$ ?3 C! j' w. \$ p8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。2 |( P1 p; {2 R5 Q! r' A
1 Z3 d+ @8 P0 z, R# @9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。! F8 z0 o: [. o i
C% m) \& |: ~' N7 ?2 P
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。- k5 X5 y D/ X! [% z
+ ^9 `+ d: S6 j2 M11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。9 R1 S; I8 g. a- w/ Z8 W
5 i& _, c2 I; h12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
0 p4 H8 S4 C2 Z, p" b2 z9 Z3 w: L5 s+ a1 n1 p" o/ H. [2 O
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
& s0 w9 L# u2 n5 W8 G
/ g" r& o' o# `& P d14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
2 h/ Y0 p3 _1 H; [$ @5 ?
9 `+ G+ S8 Z A4 p, O. Q15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|