  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14153
- 金币
- 2367
- 威望
- 1647
- 贡献
- 1315
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
& P7 ]+ ?+ X/ O/ s* E7 ~PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ F& a9 {! Q3 v2 @& t本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
; A$ R; f8 ^! j1 y( t+ `: U/ N2 A4 i3 _" p+ D
- }4 t% s( c7 y- | {' p# q
问题
0 B0 |6 Z; U& L8 R) P$ p! o6 Y
" t$ X, h5 o1 u, l1 T1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)5 T& f# K* N& E8 @
8 `6 { U! ^2 U" y. I# j, M0 {SELECT * FROM MY_TABLE
& o( t7 ]$ S2 f7 N5 e3 I+ d/ G0 L& x& V
A.如果可能,用把查询转换成存储例程
" Z' {! k0 q6 qB.如果程序允许,给查询指定返回记录的范围: l9 ] S- N# n. P- P9 O7 [
C.如果可能,添加where条件
& }" H4 L% X! ND.如果DBMS允许,把查询转换成视图
9 L7 @1 T6 K) ?( E5 v( N# Y" VE.如果DBMS允许,使用事先准备好的语句
$ u: h+ h' y- e# ]
/ w# O% i% P- [
+ {1 L7 H; E ]" m+ I1 I) {2.可以用添加______条件的方式对查询返回的数据集进行过滤?/ @( S* c8 P* z; y7 j
' d$ D5 W7 M) a" U! R1 W7 S* d; a
答案:____________
: m' K3 p7 p: y- Y& C, m4 C6 Q4 y- i6 V: l
; C% v) q: ^6 m8 }* f( N0 d) C
3.内关联(inner join)是用来做什么的?
$ T- J6 t" R/ O: [* _4 B2 g* j& T+ N3 ^% h3 b4 H+ Z: U
A.把两个表通过相同字段关联入一张持久的表中
- \6 Z2 x- _9 z- w V/ ]1 ?B.创建基于两个表中相同相同行的结果集3 n/ X0 i+ X9 \0 T
C.创建基于一个表中的记录的数据集4 v% J% P4 v% L* }+ e
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
p8 E1 R* j2 I. }E.以上都不对
7 I8 M" f1 M& U# ]8 H4 Y; A7 e2 |
+ Y) e9 J9 e/ O* ]5 l& D6 i
4.以下哪个DBMS没有PHP扩展库?
3 G% \! r. N- d& G' C! ^
" y% Y, w# Q6 E$ fA.MySQL
0 m4 U+ P3 R4 x, Q {B.IBM DB/2
" h% S( a6 g! A: A6 j% \( aC.PostgreSQL$ k# T' p! U4 f/ U
D.Microsoft SQL Server
7 W @$ P0 U& \/ GE.以上都不对
* Q% ]4 x. m0 ?, b- o; E" g. E# U o; L
3 W1 ?1 B' \0 p$ [! C
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
7 d7 k: N }% [- q( R0 ^+ P( {# H
7 W! O: P7 J' b) [& r* L<?php" n+ ~3 e, }( c6 |2 p
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);2 i( M% {% P! i' V3 [* N
?>. d% b" Y9 S' }4 f% _1 C
6 B: [0 M0 I) {2 O; }& }9 j+ }A.MYTABLE表中的记录超过1条9 H$ m* Q+ q. h3 B: t6 `' e
B.用户输入的数据需要经过适当的转义和过滤
T- g0 u4 m, D `* K& JC.调用该函数将产生一个包含了其他记录条数的记录
4 Y7 A6 V; J% c7 kD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
# y9 P; u6 q* rE.查询语句中应该包含数据库名/ b/ T; R# M0 n8 y# X( R
7 q/ B: G' R" z. [) M
( B; X0 l1 H4 N9 y6.______语句能用来向已存在的表中添加新的记录。
" @- f" E7 g. U8 [8 h
$ Q2 p- I8 R; ~ d9 m: {) k+ x答案:____________
. l9 I6 w; X0 k& n$ U6 F
4 |$ b! _4 c* b; U2 W; i. v" p1 e" h1 [2 B; B: D
7.以下哪个说法正确?9 B6 d: s3 i3 q. W
' {1 c+ e+ U* {( r. h
A.使用索引能加快插入数据的速度
1 w- b& d! s- x8 }B.良好的索引策略有助于防止跨站攻击" ~& u, q7 _0 v4 S
C.应当根据数据库的实际应用按理设计索引
% L% Z1 d) s# FD.删除一条记录将导致整个表的索引被破坏, q2 O7 Q% h) }/ S
E.只有数字记录行需要索引, V$ L9 W: {1 H2 N
3 D# `6 s3 K% N+ g7 H" I0 `
9 f5 G2 e* p) z. Q' j3 l2 m8.join能否被嵌套?
4 A5 D9 k+ c' k; U$ Z
% h9 U1 H$ V4 O! G1 s/ Q7 H, LA.能5 C {+ _1 O! T t' u1 Q" S
B.不能7 k j7 y y* i! v& D& u* ~
) p$ r* j1 C1 M: D. ?" b, F7 v1 G( M
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
* P0 @8 b* E0 ?8 K$ G+ i; x: P7 V5 X/ d; d2 y) W3 V" l
CREATE TABLE MYTABLE ($ h; Q$ g# ?. {6 D" i
ID INT,
9 V6 \$ b: t8 c# f U: ]1 ~NAME VARCHAR (100),
; Y' H% z/ Z- Q! o7 a2 FADDRESS1 VARCHAR (100),$ k% d9 o3 v* I
ADDRESS2 VARCHAR (100),; k! Q5 F$ ]: D9 V$ k
ZIPCODE VARCHAR (10),
% @! s3 E; \0 \1 TCITY VARCHAR (50),- s( L' z- W. R' ]9 t9 @
PROVINCE VARCHAR (2)
/ A9 |- z# o4 M& Q+ z)
/ V4 u5 `4 Z" g. MSELECT ID, VARCHAR# j/ E' H ^: d# y
FROM MYTABLE
1 y5 v- `6 ]& ]- EWHERE ID BETWEEN 0 AND 100: N& U& {) A" i q. P
ORDER BY NAME, ZIPCODE& W& p; ]) F9 Y- w
x5 o: [; I( c* {A.给ID添加索引
$ M7 B2 Y9 v' c* IB.给NAME和ADDRESS1添加索引/ L# R2 o1 b! E* b( t9 s
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引2 I5 L, t+ f. y# h" x
D.给ZIPCODE和NAME添加索引: q! q" ]7 y# E6 i4 J/ W
E.给ZIPCODE添加全文检索! E) o0 X* z& b3 R& N
6 y' O+ y$ J% }+ B* w
) L9 p, E# R5 j6 T10.执行以下SQL语句后将发生什么?
! `$ |: H6 x% m0 y# v" x0 ^! Y9 _: W0 \( C$ v& p; G
BEGIN TRANSACTION
5 J7 z9 P1 w0 c" x+ b( UDELETE FROM MYTABLE WHERE ID=1
& r+ u4 G1 J9 C8 z: HDELETE FROM OTHERTABLE( Y T9 X- R2 v$ W7 S( J9 v
ROLLBACK TRANSACTION
* { K3 }, Y$ i, P4 @5 n2 G. u' i6 U7 i
A.OTHERTABLE中的内容将被删除# Z2 ?. U P$ E( f+ Z- G! L
B.OTHERTABLE和MYTABLE中的内容都会被删除
% [# u& |; B9 j3 F( e6 H. |C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除# |) M4 d8 _, l
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
: m* g* K) q4 u2 R" |3 gE.数据库没用变化
7 i& x' R$ c$ T6 h! X" k1 L8 q8 Z! @7 k, ?# G2 E8 m/ w: K
: X* c. a+ c+ X
11.DESC在这个查询中起什么作用?: f; _4 ]# r G/ a5 M) l
5 j. @1 ^& ^& X2 zSELECT *
{8 e2 h, Y6 O! oFROM MY_TABLE
( i: X" c, M& NWHERE ID > 0
* B$ d7 S6 }" R7 k" ~ORDER BY ID, NAME DESC
1 W% P" m4 Q( t( y% h" x! D" y* c, p7 a L0 Y& d. k
A.返回的数据集倒序排列0 |: }; R( Y5 `. e K, Z' V2 w
B.ID相同的记录按NAME升序排列
% x" m4 X- B" S6 D" AC.ID相同的记录按NAME倒序排列
" }7 H! I3 l5 i1 O) v6 YD.返回的记录先按NAME排序,再安ID排序
6 a0 t& X* _7 W9 x m5 T$ KE.结果集中包含对NAME字段的描述( u6 G# S% M; F$ s
/ `9 I+ A; ^+ j% k. A" I8 J5 c$ P2 E F. k: L3 w6 i
12.以下哪个不是SQL函数?
% f0 B& c$ S: g: n' B0 m8 u7 D/ P# ~1 A( G; _- s# P7 F! u0 q
A.AVG
/ r- ]2 Q" q% _% x! w+ oB.SUM
9 m% k7 C! w0 M6 C& V; Y; U: k0 e- }C.MIN+ a0 F8 w1 G ~
D.MAX, q: R" f: U3 y9 N9 g+ c m7 o
E.CURRENT_DATE()
+ S( |; |# f9 [& M& T. Y
" i8 S( e {4 {( ]6 a
* C* G) _* {* t13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
+ f, q- n- |- X$ ^. L) Z" ^% y9 A7 l2 F9 h o E9 E
A.该字段必须有索引
' K! |& Q- q- X6 rB.该字段必须包括在GROUP BY条件中
* A0 v. c F$ ], F5 F6 _' `) ^+ jC.该字段必须包含一个累积值
$ e) k3 h- R$ H6 f3 Q7 Z( SD.该字段必须是主键
$ x8 p' C. S9 }( ^' Q+ s% RE.该字段必须不能包含NULL值8 O+ G6 v$ V3 E4 P- _9 E% J& U% Z: Z
( Q% V1 J" t/ y, ?: X
1 y4 L1 {, u6 {# S6 }3 J8 f3 I14.以下查询输出什么?; }! K3 O) R& `& }. t4 C
. A. Y! N% X1 s$ P8 b
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2" v, c. t' |+ [- K" `
ON TABLE1.ID <> TABLE2.ID4 \. E% `+ l) t8 U5 y
2 Y2 L/ W' x& K6 e k7 W; x
A.TABLE1和TABLE2不相同的记录* M8 {8 I1 M: z) d( f2 t. W1 W0 o
B.两个表中相同的记录& {; T3 D! F5 ^; c- L
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数7 _; C; r" f. A* {
D.两表中不同记录的条数
7 g7 V: l4 O# N" QE.数字2
; G, V+ M! G V H9 f8 N p# r; e5 ]9 l
1 M+ e: @0 T/ O6 i$ V# e1 k15.______能保证一组SQL语句不受干扰的运行?
$ X6 X2 j) H3 D6 i2 A1 j& a1 E p7 @' m
答案:____________
# a2 U' _' E( v V7 w* D
: W4 _' R% \& K/ N: v- V+ f) ~& a& B
7 X* f7 p7 E; W7 m7 _答案速查4 L8 E- i' e; m) b# o9 i! K6 O6 i! h4 K+ a) ~
1:BC
0 e. u# K# ?* x% c1 ^4 E4 X- b2:WHERE
, B9 f' v8 Z+ h5 i4 I/ d0 J5 L3:B& Y0 h1 r, t/ W+ M. \) H
4:E) X, u/ K# m) Q* }
5:BD
, w+ P5 o1 K% ?! J# f3 Y8 _% d6:INSERT& F; Y1 z& U: V8 w) `6 W
7:C
0 v- @+ P* b1 h7 J8:A
7 Y! m& l* y4 `0 M: p9:C4 z0 T' P1 B9 w; b
10:E2 |& B7 V9 ?7 Q: V. `
11:C2 N6 r* w6 v3 d+ ~' {3 k) E$ H
12:E+ G; x! m V/ G, V. [2 y2 B
13:BC% U: K- A7 K- n1 n
14:C
( o& m7 s, g$ e8 `# Z15:事务0 p; y* r8 D2 G' u8 x
' w0 r& X* m# K( Y7 ~3 R& B9 }- t! G/ Q
) E8 y7 l+ `7 g答案详解
/ y6 j! {7 @. a& Q4 Z
# U+ \+ h, q4 i( i v1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
+ j* |9 O& T; g% z0 L& j
2 M: o# Z, ]1 x) x! P& _2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
' X8 B& K5 H( B7 m7 g" s1 e# F/ J# @) a: W) I# r
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
4 y- S1 k- R B3 k
- V) m% i3 B7 A% w3 @$ ^: }4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。6 r1 B: d# t% i, m3 e8 Q: S( k6 H
8 A4 l- ~% O8 r# A* q! ]% y: T
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
" J* \4 ^9 b, w% _3 I% f
# u) ?, ]* _! ^0 g( V4 l% H6.答案显然是INSERT。3 X! C: H3 v s
* E" c' _; V% e/ T" }
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。8 [! \! j4 d; I* N. X
" ] W" j2 G* @" X) a0 V6 V/ ^
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。: o& M+ U9 _/ Q/ O! N5 w0 ?
- o. ~1 V8 w6 M: _: P2 b9 a2 ?% P9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。, i1 [5 J4 [- D* w# {
E. C2 \! }5 ~
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
0 O) U7 `& z0 a: {- D
( K3 U4 ~! z) E+ C( u0 V0 U$ q11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
7 i6 W8 P. j7 w
+ e$ Q: E0 [( N' t12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
* p h4 @2 I: `2 b+ v% o
" f% t+ @! \3 K8 h13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。: Y4 D0 F; O& w. ^3 j# Z
1 K3 K* T. v! @7 n, ?$ l' a7 O& O14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
1 ]+ \$ H2 \5 P& O' ?: v8 r1 y# A/ M! Y, W1 \( M8 n+ B/ I! T
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|