  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。3 c0 C- K2 F/ D# Y5 a: ?
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
% g, G2 g& O2 g2 m本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
. t5 Z& p1 V% E3 |8 F( C2 ~2 Y" W2 f
- U. }1 V$ A. U8 Q: ~5 f0 [8 }4 l. V+ S' y
问题
$ E) A0 x' E! ^ l& v" b5 x( |3 n' e7 m4 x8 u
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
4 w0 B1 ^) k5 z6 z& S& X' o `. r7 P2 W3 ?" l5 d( }) _0 S2 s
SELECT * FROM MY_TABLE3 N- B. ~. U8 J/ G, }( ]
* |- J) B; q0 m- |& v
A.如果可能,用把查询转换成存储例程/ m' ]0 Y6 U5 @
B.如果程序允许,给查询指定返回记录的范围. O0 ]% X+ O. Y: O$ e
C.如果可能,添加where条件
5 d& e/ @' \# r8 M! FD.如果DBMS允许,把查询转换成视图
3 b, o7 Y* ~' [ J& a1 ?E.如果DBMS允许,使用事先准备好的语句
; ?0 c" n& G$ n
2 F! d# {0 @6 X: X9 W; z, `( J1 X0 o) N E
2.可以用添加______条件的方式对查询返回的数据集进行过滤?! U- }: S9 X$ M4 m: n$ }+ K+ Q
, D6 |4 R# d9 `
答案:____________
1 ]* j9 \1 q' O8 V4 \7 Z5 a V/ ^) T6 `, y- ?
0 j* ]0 Z! q+ A6 x$ Q) ?3.内关联(inner join)是用来做什么的?
y& a# n: Z* L
1 u2 j" h8 ?9 F$ Q: k+ t1 }9 WA.把两个表通过相同字段关联入一张持久的表中
6 \, F+ u" }% {8 TB.创建基于两个表中相同相同行的结果集2 a4 _6 n. B/ F2 A( E0 E$ g
C.创建基于一个表中的记录的数据集
( |- R+ }& `' p$ ^) aD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 w7 W# J' H8 a/ ME.以上都不对" {4 J; @- l- a V! Y5 ` y& M
1 Q2 `# ?, {7 ~( t
& C, ]0 M# N9 L `- t0 \ C. {4.以下哪个DBMS没有PHP扩展库?
1 {, b$ t: a( x& M9 F; R. r
% _* N; D7 ~! H1 OA.MySQL
, |% M) _! q6 M" T2 wB.IBM DB/2
% D8 k: U* h0 f# e5 j/ T# BC.PostgreSQL& L: r% n! o X6 S' d% V! A& Y1 q) A
D.Microsoft SQL Server
2 d$ G2 z, D: u7 ~+ ~5 rE.以上都不对/ Y# d0 ]: V* P- b8 D8 K
& @$ E; a2 G8 m r' `6 K6 z% s1 A1 p8 R$ I0 \ p, R
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选). i! J l5 g/ Q$ V' q' p
( s' k9 d( i6 l) @" A; t4 c<?php. A6 s$ _* W# U, ^# ~% Z% \
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
* C% U |2 x# C* K. k?>
! F6 ^1 B) R4 j: g0 m
, O. U7 S+ x- X8 ^$ ~A.MYTABLE表中的记录超过1条) B* j3 E: i Z& _* M! d# X
B.用户输入的数据需要经过适当的转义和过滤* ]9 E1 }5 Q8 J/ N( E( i; {+ t
C.调用该函数将产生一个包含了其他记录条数的记录
2 B L! I( s8 m: k3 `' _2 s3 wD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除( l* @2 |- M' @& ]" J
E.查询语句中应该包含数据库名: m2 t6 a1 y0 c! n" M
6 M! m- |! g" E% Q5 V' l: c4 L& U
4 A% N* k1 K( b- i: D
6.______语句能用来向已存在的表中添加新的记录。; P' U2 F8 ?+ t1 b |5 T- @) _" H
7 ^1 j, i4 ~) f
答案:____________3 o( z! z3 s8 l$ L
: }8 ^& ~0 j- u) v
8 S7 }" l2 u$ r& M4 w5 ]$ j
7.以下哪个说法正确?% g* }7 U/ c4 x8 V. _6 G, h
" V' z7 q$ f* j) Q- F3 S* ]8 }
A.使用索引能加快插入数据的速度) t. K6 a; S# x; N
B.良好的索引策略有助于防止跨站攻击# |5 H+ _, n1 x- G3 f
C.应当根据数据库的实际应用按理设计索引
( c9 T# n: n! J4 q0 s6 b/ E) z9 L; PD.删除一条记录将导致整个表的索引被破坏0 D# s; e& p9 A. a9 j
E.只有数字记录行需要索引
/ ?2 |. t2 G" C" Z; l# R+ D; e$ s( F3 |' w- p0 P1 n
# n. P; I( u5 `- u% a) j, j# k8.join能否被嵌套?
- X: U; ^/ \5 ?9 G) E' T5 p) _5 Z# E
6 j+ ]( f' x, D0 a4 LA.能3 V% v6 h; p+ [
B.不能& i! p2 {6 z" h9 j$ O
3 F+ j3 X* r6 B+ }& e+ L
/ I) N. u4 U6 R& G' D$ m; Q- r% x9.考虑如下数据表和查询。如何添加索引能提高查询速度?
( v* D C: `- n! D
* D5 h% d+ i4 Z( sCREATE TABLE MYTABLE (
/ l2 T" x+ g0 {& g* tID INT,+ M$ J! c/ a3 I+ W9 B2 h1 u: l
NAME VARCHAR (100),! s) M1 T' l" f2 A6 ?0 s0 W. \
ADDRESS1 VARCHAR (100),
- ]. I8 y2 T. w& P) [: hADDRESS2 VARCHAR (100),
9 `" ], b w8 v# U) |1 q, I4 K _ZIPCODE VARCHAR (10),
5 G+ e5 T* k: ?6 m$ ~# kCITY VARCHAR (50),
# R7 H% z) ~6 z$ jPROVINCE VARCHAR (2)$ H5 x, P; E* ]
)
4 v9 C+ E! R7 p1 x# }SELECT ID, VARCHAR, x2 ]% m8 a% ~$ ~4 l) p4 n
FROM MYTABLE
3 T" d6 U t" H5 b) xWHERE ID BETWEEN 0 AND 100
4 x! Z& q5 x H! y" G7 W$ EORDER BY NAME, ZIPCODE
) x9 j G+ Q" H1 j: z: t2 {* K
: f' v$ E& J- G& k/ U" [A.给ID添加索引7 O' B4 B5 p( G0 l
B.给NAME和ADDRESS1添加索引* _1 e' w4 e7 p# F1 _, Y
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引( r% ]: ^9 O4 R
D.给ZIPCODE和NAME添加索引& c( f8 k1 r$ H% T3 A/ N
E.给ZIPCODE添加全文检索2 c5 d' Y' g# U4 `7 A9 h) X. i
: n2 q7 \4 b- i; N, \
v( }0 X" Q4 }8 ]1 Y. w# n10.执行以下SQL语句后将发生什么?4 s, ~$ Q2 S3 |8 {1 d, e! W
* h& k/ A: g, m5 N
BEGIN TRANSACTION, T/ k9 b+ K4 S- {9 j9 V1 V: h
DELETE FROM MYTABLE WHERE ID=1
* E, g& [0 a& G* _) C" W. Q CDELETE FROM OTHERTABLE- `$ v1 b+ s0 C( ]! L) e+ P6 S5 ?
ROLLBACK TRANSACTION0 o! y) L+ O/ c! {6 @6 e
4 |1 Q0 w( k N5 IA.OTHERTABLE中的内容将被删除
' D T7 K9 g' PB.OTHERTABLE和MYTABLE中的内容都会被删除( n1 H* k- j. U7 `% O
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除3 M6 B: n/ p4 g& P; B0 I
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
4 E9 |- D! N9 XE.数据库没用变化
0 O1 k! v5 T) P, Y) i5 |1 {, ^% L
8 v u# A6 l: g% q- a! g ^
11.DESC在这个查询中起什么作用?2 b' B% i4 r2 }, Q
+ l8 b: F8 a- I5 l ?1 YSELECT *. i. b. p! K$ e5 S) P
FROM MY_TABLE
1 s" D, Y% U: {& O2 D2 r. XWHERE ID > 0; E* H7 Q8 {3 B2 ]
ORDER BY ID, NAME DESC
) ?5 [+ a5 R- C6 R3 y+ Q% k+ U' s) O" [
A.返回的数据集倒序排列9 C9 ]& Z- e( }" }! t# u
B.ID相同的记录按NAME升序排列$ Q' v- {7 _# w1 _" [: z
C.ID相同的记录按NAME倒序排列8 @/ b6 @ M2 G
D.返回的记录先按NAME排序,再安ID排序6 J& l" } f. ]$ \
E.结果集中包含对NAME字段的描述; X8 }+ f* P, T; p. O! d: ~
9 c+ r3 t, p* J d I4 {8 b9 c) |3 o
12.以下哪个不是SQL函数?5 ~0 B* ?/ m/ H" U# n9 z M9 z
" L* z& _% n @ d, X: w
A.AVG
$ Q4 f7 j4 Y! S3 K# `5 o% v q$ `B.SUM
( H {& M5 Q `: @! D* lC.MIN
3 h% }9 D$ A& |$ H6 o0 ID.MAX" O; b* I+ ~& J/ R" O
E.CURRENT_DATE()* P+ T; h9 o2 g) G) e2 r
6 l! R" N6 |# s/ U+ ~/ }8 L6 t& c; J) D9 W! u1 u: L
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: H' U( F7 o) }; B: b, z. ~; t8 H6 g+ ]; w( `
A.该字段必须有索引
N/ V& X9 }, {; L( |B.该字段必须包括在GROUP BY条件中; ~0 e$ p9 C' r: S3 @, x
C.该字段必须包含一个累积值
# n4 ^; o1 }" W9 B) i9 hD.该字段必须是主键8 [+ w- T$ l& o, l4 w/ O
E.该字段必须不能包含NULL值! d* p( o; k. J7 ]; e+ d
7 r8 V. @. ~. a
( b) g; C# ]1 w4 ~, \" |$ P
14.以下查询输出什么?
% S2 }5 m3 ]; X
, T7 F& B. i" U0 f/ O# ?( ]SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2. S" x- C& J$ s I" U5 f6 M
ON TABLE1.ID <> TABLE2.ID
; \+ z; Q c6 Y$ u& H% x
& e' ~& o5 h& x- X ~A.TABLE1和TABLE2不相同的记录
$ b, X* F3 i* ?* {B.两个表中相同的记录6 ^' j9 m1 s. B: S: G8 C
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
% |* ?* h7 b1 N, p; f2 J2 {# D& V) ED.两表中不同记录的条数
$ q, `- x& n% T* wE.数字2
3 E) z; m3 D% k: J' h5 k0 m. V- b8 F
8 q1 A0 U5 t l& w15.______能保证一组SQL语句不受干扰的运行?$ n5 ~1 h4 X7 F& p
0 z4 V% e% M1 Q* l- _
答案:____________
" f7 {/ c' H) I9 ]# G W
5 \9 {4 z7 c9 P* Z8 w, O7 x. L$ `. i6 D- s- S J
( ~/ ~: `8 X3 W! _( A# R! U
答案速查
1 u, G5 Z2 u/ l1:BC6 n5 ^7 {; [) {6 ^9 D4 K
2:WHERE; h2 ~0 u. F0 R) \/ P2 ]
3:B' J4 i( A0 L, L( P. R. r; K% v
4:E7 W" W8 h! D$ t
5:BD( {" H- C7 ~) M- ~. C
6:INSERT1 Q( Y9 @7 v. t6 L4 p) a
7:C
- M; U6 |$ I7 z6 A3 c* X) U) g8:A
% V. E. y; q2 W+ U, }9:C. p/ v$ `- p; z" t# _# G
10:E4 ~& R/ N+ K% e- w! m' Z! |/ \ _
11:C
+ T" J* p1 S$ @! V. v! j12:E0 w. ^# u9 @* v2 N4 @* i$ n
13:BC
2 w0 Z0 z1 ?5 p14:C' {- t' Z* t$ t0 {
15:事务; U& y3 t4 m# |; Z
) p% U0 X$ \- h3 x$ n: c; V7 \# b2 p
- [ p e% j. D `
" q5 A/ ]) F+ V4 g0 J答案详解4 l7 \9 i. B9 p# z' p V2 H- B: ~
. ^( J& [- F2 E
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。1 P* b& D: P+ ~, ?% _
7 `! Y; Q$ R, F" t9 K
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
, r# \6 s$ x; q! N$ H U$ j- }8 \1 _) V4 l6 P- r
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。( L5 Q8 C* u1 v0 _) M% q8 l
. E7 G6 C/ C: q+ E% P) R4 z$ ~' d" ^
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。, V: N* {6 ~5 q7 H1 \% }
: K0 }( `/ n! j* c( @" h" P+ Z5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
2 p& B* `3 ~6 m+ M
8 b6 |. T3 ]. \6.答案显然是INSERT。
7 e4 j: B4 I3 k' p9 ]2 [
' z3 |/ V2 o; H, U" P, }* l7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。$ _0 Q5 ]% [, s% r6 }$ Y1 ^3 d
8 ?/ j& P) m" {' K' e) z8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
* J- P, w6 O; g+ l' O* z% f; q. n/ N* q/ g: b4 P7 b
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。' H. N- U' u$ U& k
2 ^$ |' _: u( n
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。) i5 B( L6 N! u
+ ~0 k% m3 B6 f) M4 N- Y11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
& L j/ K# v, x* F% h/ c9 L+ z" t" O) Y) r9 c5 D1 c. m
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- P" F' \ @- s2 t1 ^4 H4 c, ]& O; Y. t( H4 m4 a! C
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。8 y& j% | J# v& M5 `( L8 @, |
& y: u8 u% K# @3 o0 y: J n14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。4 J2 X* a) x# Q" ^2 l: J$ P
! k. Z, z" k9 u, v. I
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|