  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。0 m% V% k- U; U+ g
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ l: o5 N$ d7 g+ a% g0 \本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
2 n0 R6 w/ ?* C8 ^7 S4 b5 P6 `6 [$ D' A: m- c e
4 U4 w* O: E8 G7 @9 E$ t4 o2 m! U
问题1 F* G( @& P: a$ X" b$ c7 V) K4 T: p( O
* H' E, H8 w# W1 N6 Q) ^
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
3 \5 y; x3 {" s3 Z+ W6 G: R9 ?1 E+ P" j: N9 h5 d: n
SELECT * FROM MY_TABLE
* K, D: k# `) t& G U8 }- H2 k6 {- s& [/ |* P$ ?3 u8 o0 E8 q$ H0 W
A.如果可能,用把查询转换成存储例程
! y, o3 M" V2 N1 q& y" {* lB.如果程序允许,给查询指定返回记录的范围* n/ Q0 G3 m0 W5 i* _6 y1 v# r' L9 `1 B
C.如果可能,添加where条件
: U( H( u: O, N, Y, @D.如果DBMS允许,把查询转换成视图. W E: M$ r& u1 a! Z* ]9 R
E.如果DBMS允许,使用事先准备好的语句/ M6 B% G' l* O5 b' K
- E& K j2 J: }' I' g2 B
# P) {! k0 R# b0 }) |. x2.可以用添加______条件的方式对查询返回的数据集进行过滤?# C; c; ^* q- t* G; W- r! r
, ?& P( y# P; H. U
答案:____________+ c: m% r# n6 N% c4 J! C1 u
; c8 o6 A3 D, c* Z
; o- I+ a& x1 D) q" F/ K3 _* j3.内关联(inner join)是用来做什么的?
, u" ^) w. j* l4 k7 N5 t1 Q" [# g
A.把两个表通过相同字段关联入一张持久的表中
. p: ~# k- p- A3 P) ?, \B.创建基于两个表中相同相同行的结果集
& j' W, _: P( i! r- B0 ~0 \2 kC.创建基于一个表中的记录的数据集
! j/ V5 |7 [# @. w. W) c% f2 G1 {3 ID.创建一个包含两个表中相同记录和一个表中全部记录的结果集. H' ?( I# a0 N5 Y" k& o
E.以上都不对
5 L' w' {' \, a" D, K' \9 Q' o6 R9 P
0 K2 C- s+ A$ ^. V8 R& w4.以下哪个DBMS没有PHP扩展库?% c& I9 t# H9 m! o5 n: W7 z& e3 ?
5 ]6 N& C6 l1 T( `' I! v% Z
A.MySQL
0 ?$ n- ~. Z5 z* @B.IBM DB/2
. h% A" H1 N* \2 nC.PostgreSQL) {* N \& _: K
D.Microsoft SQL Server4 R, j. O; X/ R6 D9 { S+ p+ k+ y
E.以上都不对. y1 @. |, o3 ?4 @9 W- N! I7 }7 `
% x! q, E. } `5 Q# K8 ?- k' J
+ F w, H* L+ C
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
) C8 E* E3 k7 D8 N; t9 I: g# M& z! E, ?5 d$ Y
<?php
- Z. d) ]- x8 {0 V$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);$ [- P' Z. M! b5 x- G6 p9 ?# p
?>
3 R0 \! a! a/ j& X! {* z) j
# o% B6 g( |4 f$ rA.MYTABLE表中的记录超过1条4 O/ k/ W; e6 }. t& e0 G: e- E
B.用户输入的数据需要经过适当的转义和过滤
( |9 @/ R' ^1 S2 _C.调用该函数将产生一个包含了其他记录条数的记录
V0 v% M& ?% U$ h- S8 }D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
/ m2 T2 x; N; \' @( D A5 HE.查询语句中应该包含数据库名
2 x( V" Q! t8 h5 s) G, h! ?! H1 r; u, g6 P
* H& V/ t" f9 e, m: i; p9 M4 L1 w6.______语句能用来向已存在的表中添加新的记录。
6 S9 t& ]* S+ b5 j: b
! |. O3 T+ `, ], P( p答案:____________' i, c- }' q/ L% R0 g5 y
3 D* P5 g; }! K
5 Z+ S. w- C9 l! n5 @ T" K7.以下哪个说法正确?% I0 i2 X! L2 S* L& k3 t# f
& F% l' X- p! L% qA.使用索引能加快插入数据的速度
3 l8 p4 ]# H5 a) W# rB.良好的索引策略有助于防止跨站攻击8 e+ G7 v/ `& j9 Q* q9 I
C.应当根据数据库的实际应用按理设计索引0 T4 e+ L2 e |1 e/ d# F* r
D.删除一条记录将导致整个表的索引被破坏# G' V6 k3 d2 i4 J
E.只有数字记录行需要索引
2 F+ e& s4 Z0 Y& V/ x7 k) t9 i' A
7 [( M3 [8 }, t1 p
& [5 j2 h$ ~/ {( |8.join能否被嵌套?
4 R1 g' I9 M3 [8 z! v5 O
- D- G, v- U. ~A.能1 C4 [' K& O2 N, h3 c S3 L4 @( y. r
B.不能1 \2 [# u& r8 T0 c
o- Q6 ?. p z d& {2 d
* R& |. D. q# B" h4 m+ ^5 z. O& P; n9.考虑如下数据表和查询。如何添加索引能提高查询速度?: g' [4 |- [2 a- \* b \3 v, F% v. [
5 J% p& g8 ?& T8 t0 x" f1 G
CREATE TABLE MYTABLE (- |* S9 X- p- z& v2 N
ID INT,
* {5 T- |4 k0 ]: u e" VNAME VARCHAR (100),
* D$ t3 V6 _& B5 c$ C! WADDRESS1 VARCHAR (100),: ]; j" Z2 w6 ]1 ?5 ]
ADDRESS2 VARCHAR (100),
" C. A9 C1 ~- L. Y h, ~( BZIPCODE VARCHAR (10),
- W9 D1 m2 ~6 t ]CITY VARCHAR (50),3 `6 ~7 O: P; R- |! C5 M- `
PROVINCE VARCHAR (2)
# {1 M0 n& ^; i3 k. J8 F)5 C$ y A" \5 J) I' }/ j' J# O
SELECT ID, VARCHAR
5 N8 e, I0 o" S% Z: ?FROM MYTABLE
+ ?' A' j9 l# kWHERE ID BETWEEN 0 AND 100" ^$ k/ p2 D9 a
ORDER BY NAME, ZIPCODE
* t4 v( i* [9 b0 J* Q& k4 j% q3 ^/ F7 d
A.给ID添加索引
3 U: W3 r' P) v8 V+ V2 _B.给NAME和ADDRESS1添加索引: W7 q a! l. n
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
" o2 a) V2 N$ W7 [4 R6 d# OD.给ZIPCODE和NAME添加索引
' f- V/ L B: O3 D9 EE.给ZIPCODE添加全文检索2 j% t7 E" H+ M0 }
0 v& _' g2 Z# e* @
3 D. X _: Y( H" j. M10.执行以下SQL语句后将发生什么?
% L/ o( ]& N& C0 v/ P8 s; G+ E1 ?1 o0 y* j+ _
BEGIN TRANSACTION
3 W$ W5 K) n0 d; T, LDELETE FROM MYTABLE WHERE ID=1: N/ C* n0 \+ f* \& |2 I% ~( F
DELETE FROM OTHERTABLE
8 b! C3 C4 U- c' j8 y) s, _6 X4 HROLLBACK TRANSACTION
9 N( ~4 O" s- |! N
6 H# L* y5 `9 I X! XA.OTHERTABLE中的内容将被删除
A; P0 P$ d2 c F( u/ e! \9 o- G3 oB.OTHERTABLE和MYTABLE中的内容都会被删除$ s. a( _1 ^ B" A) ^5 @
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
! t5 V1 f1 s6 i# d6 X+ oD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
' c2 t3 G) g' y/ h6 z6 D4 \$ o, V8 RE.数据库没用变化
/ f& {' [/ J) V7 P0 K' \! u, D
7 m, m V$ H1 |" S' I
5 o9 Q. t* A# W) p( \- k11.DESC在这个查询中起什么作用?
5 C8 z I4 M6 ~/ `: }* E( b6 l) c0 F
! ^9 s1 w# z5 i( w% S- M6 Q" WSELECT *
4 X( _- }; T5 Y6 z) r. a5 g1 vFROM MY_TABLE
/ D. S* s7 {1 `- [0 TWHERE ID > 0: B$ f/ b$ [. G2 w z
ORDER BY ID, NAME DESC' k& w8 t/ I$ X% f% b* s/ ?
2 t' O" w7 {4 o
A.返回的数据集倒序排列
1 y4 W5 ~' F$ MB.ID相同的记录按NAME升序排列
* W. S7 F" ^8 c$ `) m* p( W- C3 nC.ID相同的记录按NAME倒序排列
1 P3 X) [# _) O4 M e- ID.返回的记录先按NAME排序,再安ID排序. k% a1 I A0 e' l( i' @2 T/ \
E.结果集中包含对NAME字段的描述1 J3 F5 v9 M/ ~7 h6 R9 I, ^/ S
- E/ ]4 s' y0 w+ z2 w' U' W6 A
9 X+ s0 m4 s% R# H1 [12.以下哪个不是SQL函数?& H- ]* f, u3 g# P
/ o2 D" Q* d+ h4 L8 uA.AVG
4 ~. B+ A* m6 U& ]% YB.SUM1 r6 v2 [, H) i( q- R
C.MIN. A7 ~* b$ H3 W, t* r
D.MAX
) k/ \; k" f( N9 c0 lE.CURRENT_DATE()1 z% Y& g4 L9 t3 W0 f
6 v# r* _4 ~8 s m& w- w A6 {8 U
1 w6 z+ B, e, [! @0 f
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?) Y* A9 W2 Z" y" M: z
7 r" b+ P# P8 j2 w
A.该字段必须有索引
: }( H( E) d4 J. E1 x. Z- e! ?B.该字段必须包括在GROUP BY条件中
3 s) Y* L$ O* o" Y" Q! qC.该字段必须包含一个累积值" U$ }+ G1 u8 d/ W9 r) f" t
D.该字段必须是主键
+ v% F% x$ F+ Y$ T# {; BE.该字段必须不能包含NULL值
8 i/ [7 i2 ] ?% j' j3 a
* n1 @' i C: S4 {8 J) H
! ]" P; l1 i, n; ]; g14.以下查询输出什么?
, r8 l( F% o1 G5 H. x
) ^) G5 F! h% J% sSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
- U# T- L- o; I: X$ M7 yON TABLE1.ID <> TABLE2.ID$ v# \. m+ c' s7 L1 j- n
5 ]. n" `6 I4 @7 UA.TABLE1和TABLE2不相同的记录) |) q& N! {7 v! Q( F& |
B.两个表中相同的记录$ s: i! c8 |7 [
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
( d+ h2 C' l+ F% e; q, zD.两表中不同记录的条数
. m k$ v. E( Z- h) x3 kE.数字26 C/ v' u( T, [
/ E: t0 e5 o" [
% K$ a( d) i* _; L3 W0 r) W15.______能保证一组SQL语句不受干扰的运行?' _9 X- N2 ]& c" G. U
5 M7 R6 L) h+ l( K, x( O4 s答案:____________' c9 ~! m2 l3 Q9 A* i; m
. C Y8 Y1 G& x5 Z) `$ z. X. ^
9 g9 d0 M- ]% e' b
/ h) b, a s& `答案速查
* l# g0 h# M, H; M1:BC
% y2 i4 |" d) Z2:WHERE/ H/ w; j: ^3 ]4 i( S* L, }' e5 r' @
3:B8 b4 Y1 F. q4 |0 L2 f. C
4:E+ z6 ]( H& f Y$ V+ e2 |
5:BD4 }$ l$ P+ Q( F
6:INSERT& _9 m( V6 l1 k6 ]; A9 H6 I
7:C
# j1 V" t8 I; r4 g+ G/ l) {8:A
) j( }9 m |2 M0 {2 N- U9:C3 y+ ~7 Y/ k% z
10:E, u1 @ Y6 `. c1 F
11:C
& z% q- O/ t Z3 x12:E) X8 F3 `2 N' O1 h
13:BC8 V5 {' X0 Z6 F& P
14:C
U9 z: W( c# B15:事务. n$ @* I! Z6 I, p
4 l# T: g. S* l/ t e! y; @" T0 l. C# t6 r9 Q- a
& m; W0 C# ?; w* l' A5 ]答案详解
5 D+ i/ H- ^, L& W4 \* V4 X# o! o6 t; M/ `0 x
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
& k8 j w9 W, ~7 E/ R/ x& ^ p" S7 o5 N# d$ X v/ I. @
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。5 \* k3 |# M. y1 {
$ ^; @5 j' u+ P3 L; l9 ~- d
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
) F$ a8 h# ]. o* C3 H& g6 F
$ w9 X4 p5 b+ G+ t4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
! W) j" z" ?, a2 ^# C8 _; ?+ p6 j% P+ b2 s7 T. b- f$ m, [
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。( V4 {& J7 K* Y
0 [$ ~1 f2 v: T( Q6.答案显然是INSERT。6 Z. s1 b+ n+ C: `: t- L/ e
h, r. [ Z" k
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
& R0 o' k# T! F+ Z
0 t' O$ W; E3 l! W8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。+ u" n# { Z v, ?1 p4 c
& Q, w5 T7 a0 P% z$ m- }+ O
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
0 Y# B6 H4 O6 ]" K
/ e- m$ B1 I6 m2 }. A6 T10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。* l& p8 X/ H) w2 `7 o6 _ p
4 m0 D; z6 q% G11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。5 Q3 ^. _4 y3 R T! f6 ]
/ ^ _& D) M" Q1 E2 B
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- s' i! ?/ b& Y* ?- ]3 E" l' r6 K0 B. k* b3 M. T9 B7 p# D9 R
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。9 @' B$ ^/ D Z! |
8 x& b+ R) ^/ e) o2 O J
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。" v; w7 u; D" F" [; g7 I% d! N
. ^, ?( D" D7 ^" ?: |4 p0 H% x0 o15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|