  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。4 s3 B4 m' [2 D
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。6 b" K+ G: {6 a
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
" m% N; L. _5 A3 }+ `
5 a# j# ?7 i" A# S( P& [
$ e! y/ g" X4 }' r, h问题" M4 r% V0 o; j9 h; F8 Q
6 _+ ^6 w3 L# x3 g* K1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
$ o; K( t. Q- R% t8 T2 i7 o' H. e2 d7 E1 `
SELECT * FROM MY_TABLE
2 C# Y9 u' _6 p Q9 Q7 V. Z9 I# e; L) R; R q
A.如果可能,用把查询转换成存储例程$ `0 a- }/ i' e/ `
B.如果程序允许,给查询指定返回记录的范围1 S3 x- j5 h% G5 U
C.如果可能,添加where条件 z2 b) s( A7 y) N$ p( N8 ~8 \% @, X
D.如果DBMS允许,把查询转换成视图
1 j4 x. ^% Q2 j# s& d- tE.如果DBMS允许,使用事先准备好的语句
* k" t3 [& I; O9 R* _& T
5 r" \ ^; L2 [! a6 o, x& |6 f
6 [6 E* Z& B) ]2 n4 {' f* K6 c b' n2.可以用添加______条件的方式对查询返回的数据集进行过滤?
( ?$ t% O9 M" r+ z& a
) {* z+ h- ?: H* |4 j/ _0 `- x答案:____________
3 a( T& i: z2 a( T7 F* F n9 |. {- a. E& N: `! k% i
5 e& }6 ~) ^& }9 t) x4 H9 Q
3.内关联(inner join)是用来做什么的?
* e" u ~8 }7 T' ^: `, X( T: O L' c0 Z8 L( q8 G g
A.把两个表通过相同字段关联入一张持久的表中
, B5 Z) D: R# O0 r# y S3 pB.创建基于两个表中相同相同行的结果集+ ?3 y. Q5 ?2 d, A4 Q
C.创建基于一个表中的记录的数据集
5 q! Y0 ]; i% }% V; R; ED.创建一个包含两个表中相同记录和一个表中全部记录的结果集! D9 U: `! r, R. }
E.以上都不对3 ~% e: S# D; @6 e2 B/ i
- d5 v) p4 r9 \5 B
6 v: y' O, }4 q& x6 g' ?4.以下哪个DBMS没有PHP扩展库?
, Z' U' \4 D& P! W7 O, e
) h! t3 K' z& ^4 H) F. jA.MySQL
/ j) A; S' X) v" ~, aB.IBM DB/2
1 z# D& Z3 A* d( n3 yC.PostgreSQL
0 w; i1 w5 j7 K, ?8 xD.Microsoft SQL Server
1 V0 [1 \0 U) |8 G5 v" m. jE.以上都不对0 d. v& V L$ U+ P
4 L4 k m8 C$ ^
( V& }' ?& q( u9 X5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)( D5 N# E9 _2 i6 k0 j' H: o* W
! B7 {9 l2 `4 H5 y* W, @
<?php
0 r' o: {' |# p+ \7 ^$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);. u1 H' A8 g5 I- K" D+ j/ K
?>' b" y7 `' X5 [( T& d
1 v" R0 q, Z* h4 {3 c7 XA.MYTABLE表中的记录超过1条7 u. Y( i' v0 @: h6 H. ]
B.用户输入的数据需要经过适当的转义和过滤
3 g v% c4 Q4 @. s1 I+ R9 p6 uC.调用该函数将产生一个包含了其他记录条数的记录
. c) ]0 }3 a: p$ sD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
/ d. L9 y/ l, V, d7 _ u7 nE.查询语句中应该包含数据库名
0 ? `2 u7 o1 m& D6 ~9 C
6 F |' X0 G m
: }5 v6 ]% L0 L6.______语句能用来向已存在的表中添加新的记录。
# d, O3 l! J+ S8 t1 T0 v( q( U9 F: n3 O1 |: R [- I' m
答案:____________3 Y" I/ p( ?4 Y5 j/ C7 h
; ^/ j4 y3 e0 [! }* N! r, ]0 e
) n/ w# X( j5 l+ l* m
7.以下哪个说法正确?$ d7 @2 C0 p9 s1 x' u3 c
/ K: H3 L3 M' z! EA.使用索引能加快插入数据的速度% X. Q, j8 h: S
B.良好的索引策略有助于防止跨站攻击8 u' G, z) g; z0 S
C.应当根据数据库的实际应用按理设计索引* x5 \$ t* F! m( E7 S4 o5 F
D.删除一条记录将导致整个表的索引被破坏: E- }* s6 u9 d, W+ u0 V" H
E.只有数字记录行需要索引4 v" z; y* S: o+ C
$ a H; @3 [1 J" {9 ], w4 k s4 r" Z! }7 G) ?4 p
8.join能否被嵌套?) _4 i8 i) x# j. g: ?: R) |3 }
0 ], t% M% Y [; X' {3 x8 IA.能
; E' O+ {6 c5 c# gB.不能7 V4 C, S) ?- K H$ q4 s
, X. H" p \& F1 G* |3 [; f8 B1 |9 S
4 {0 Y3 d: x: ^+ k) J* F2 g9.考虑如下数据表和查询。如何添加索引能提高查询速度?
: x8 f' I7 E' H* ~* h" M! i) l: r# p& [- i, Q
CREATE TABLE MYTABLE (4 ~/ y6 p( f1 d& _. X
ID INT,
1 t+ _3 \6 B( a) `# [; dNAME VARCHAR (100),+ u9 i: Y( |2 Y7 X5 L
ADDRESS1 VARCHAR (100),5 M3 M' }* k2 L
ADDRESS2 VARCHAR (100),
. R% I8 u, z* M% U/ I( ~ZIPCODE VARCHAR (10),
" K5 Q# R8 { V) r4 V: n. Z( {CITY VARCHAR (50),
$ v; W. p5 c% s8 vPROVINCE VARCHAR (2)
' q7 y+ N1 u- c7 S/ N! ~)
; |! Y6 x& x1 d( W0 b" Y" R' F/ RSELECT ID, VARCHAR
z! F2 ]9 ?! f# q: `FROM MYTABLE
, @( [- S7 y3 o/ k' G: ~ XWHERE ID BETWEEN 0 AND 100
" \+ {) O3 G& ~2 ?* f8 I: v5 hORDER BY NAME, ZIPCODE% c! w* L1 t. F/ Q- O) {. f0 B% x
& j3 J; z' c' B$ h6 D3 qA.给ID添加索引0 g. Q1 [- ?* v
B.给NAME和ADDRESS1添加索引+ {9 m* I* f' W
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引( i1 e5 e, A; Q& j
D.给ZIPCODE和NAME添加索引8 f' v, x- I5 h' k
E.给ZIPCODE添加全文检索
7 ?( P, z) b/ _' i
8 `; w6 |' f4 h1 n. {: x/ w, X8 O5 b8 k
10.执行以下SQL语句后将发生什么?
& n, `1 F+ f0 A) `9 i0 p; k( [- e4 y: z* j9 f6 {
BEGIN TRANSACTION |0 r7 |9 C& R
DELETE FROM MYTABLE WHERE ID=1, v$ C# t5 D# S/ v6 X! _
DELETE FROM OTHERTABLE
. Z) @& Q& X& K7 R6 t+ {ROLLBACK TRANSACTION. `+ S1 m) F; s- p) F" l
Z$ |1 x6 Z' T! HA.OTHERTABLE中的内容将被删除
. t+ W$ M$ n- w: O: oB.OTHERTABLE和MYTABLE中的内容都会被删除1 }- X% V2 [% _+ v0 f6 k
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
8 N4 E7 Q) R8 y. ^; AD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化5 _- d P9 Z3 w! R& h+ O# u" i6 t
E.数据库没用变化8 z1 o8 f4 }6 M' g! \" m% N
9 C* k' v3 r" s# x7 e5 j) d' p6 e* S
! K. M/ w1 G$ u% ]- Z6 x% g9 K11.DESC在这个查询中起什么作用?
% m P& Y/ i& X1 x: S
' W7 p% O5 k% P# q( a- N' DSELECT *; I: f# g6 X" H! W
FROM MY_TABLE! A2 y6 f' g* [9 o# E" `
WHERE ID > 0
/ S- Q/ \# E( o* i+ I8 h. V: z2 DORDER BY ID, NAME DESC- O2 K% m' l/ c8 N* j- d6 J; z
2 n4 i: O, A" q. _8 b% h
A.返回的数据集倒序排列
: n s; g# T1 N$ n% RB.ID相同的记录按NAME升序排列+ }: Y0 O8 r) |: w6 q2 q
C.ID相同的记录按NAME倒序排列( l8 ~) N7 l" n6 h$ j. q: C7 Z
D.返回的记录先按NAME排序,再安ID排序+ n9 l5 x4 j. T) ^( O- H* I
E.结果集中包含对NAME字段的描述
4 N0 B. q- C4 U8 \9 A( ]) K6 |2 N( g: d5 r: z
4 y4 h Y r% i" D! Y* h0 I
12.以下哪个不是SQL函数?
6 W3 b% I& b8 |" c2 o! f9 e2 D+ u; \* H, C- \2 ^, {2 F6 |
A.AVG. Q o# k, s3 h) F3 z
B.SUM9 _# d! E+ F5 l, S+ G
C.MIN
- J! I5 p% V" E3 b7 {- O/ iD.MAX
2 G# G6 M+ A' x4 x7 ~- ~E.CURRENT_DATE()4 H0 h/ ~5 ~, X' N. H5 k$ K4 I0 m
$ c! U5 p* {- m" D+ t
, c( E* H) T3 G* T. y- K2 S13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?7 [* M0 A1 o9 ^1 i5 m! y/ X- _
% u! J4 B8 _! m+ ~. EA.该字段必须有索引
7 c- [3 Q+ Y9 _1 P5 e, A5 G9 lB.该字段必须包括在GROUP BY条件中
$ z) A3 i* ?: P, U9 t5 _C.该字段必须包含一个累积值5 y! x7 a/ n8 r7 l
D.该字段必须是主键7 k: `* T. m6 I0 \" X
E.该字段必须不能包含NULL值' H2 L; u3 p! i9 b- X
4 w; _5 ?8 b3 y1 x. _1 {7 Q' i: j3 V7 x1 X
14.以下查询输出什么?
& r f/ C; D0 _5 F5 Y+ _4 r) k6 Q& u6 f& S
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
) `5 n8 U4 @+ V, F! jON TABLE1.ID <> TABLE2.ID
+ K. V& ], t3 {& x; F4 l3 _$ S7 r6 l& A; S& I
A.TABLE1和TABLE2不相同的记录
) |9 x5 ^( y; I; iB.两个表中相同的记录
$ F& a$ k2 Q# }0 eC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
# I& J# y0 K; b! {1 j* ?D.两表中不同记录的条数
% ]. j- s0 T$ z" z. S" f, ~E.数字23 c& ?8 L" y, @! ]& B9 W! o* g
2 D" c% Z( W0 }8 z# @' Q* g9 v, Y& P, ]! V* ^
15.______能保证一组SQL语句不受干扰的运行?# O: T% n+ g$ E) b
5 ^% O3 e$ _- @8 c3 o
答案:____________ ?- s( V1 y3 h
6 _2 S) v- o( m
5 l- }% J) b: z5 u
& t& J' b- ]% ~2 i7 n
答案速查
1 M- y1 S: U; R" l1:BC, N/ z5 k" W9 g/ V
2:WHERE
# Z+ ^3 b: V* x+ }% }# T3:B7 [! p3 b3 y. G7 w" c7 T
4:E
* X/ [/ W& k6 n5:BD8 E" S9 @6 o! r) F* _
6:INSERT \8 n! t! s, J) V( l
7:C) Y6 G* D4 r; u9 h$ S( i; C3 G
8:A5 N( \4 z5 a! o0 u* r% _+ _
9:C4 c* } d/ l- Z4 I; f
10:E9 D. M' [0 i$ V! R% X2 s
11:C( @* l5 q' Q" N3 B, n( s! h
12:E0 D* m4 |( Q# \! S ]
13:BC/ d- r+ M$ O6 ]. F1 h
14:C# b! @. t+ r4 u/ g# w
15:事务
. d* @7 v1 U& d* C; ^. G: L2 \; k' f8 K, h2 M
! x9 e: f! b9 Q8 Z' S
( O" C) q2 m2 Y3 h, M8 N, n
答案详解
1 Y9 l. C5 T k+ n" i
* s# b7 l0 k* X1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 F8 X3 |% W+ u. Z" M( U6 c4 x$ c% J8 N+ j
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。$ D3 w3 Q/ ?- N3 v% x
( _* l' h( P3 W d H3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 [- p- S4 p+ }
1 s$ v+ B! l4 F- G) ~; k4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
' p* U" X8 F( n9 h. g5 t3 g+ n i) |! X9 F. E- T
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。) u p6 E' x$ w0 w6 b- A$ o
8 u" F; v8 f) }8 d* Y* Y$ S' X5 \6.答案显然是INSERT。7 r" f0 l$ f: r: x3 E0 l% w
7 O2 D9 i! t2 `. E
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
. D2 z' N# X( A9 g; `6 H! G4 ]- W4 S
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
/ G( m9 K! {/ h( F, w- I
J7 ~# ^( A. v" u: I9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
- Y: K0 ?: F# N& y
9 t* M# l$ g0 v6 d; c; O10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
4 m: N" J. [- w1 j
3 p8 M0 G8 a W+ ^* k3 I2 L- ]11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ ~3 p: k* o! a: b* c. x# B2 R: Q
- Y7 m! e% h2 d* l9 ~6 m% r12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
' f& j2 D, U' u- N0 @; e
# h. }( D0 Y/ b. f1 n4 C( ?13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
/ R$ \ o& O# ~
% r$ R9 ^% j. X! C1 }14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
$ v7 x# E3 j0 X G7 R, ^
2 ~5 B& C5 R8 ]4 x' K15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|