  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14153
- 金币
- 2367
- 威望
- 1647
- 贡献
- 1315
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
; ^8 Q; I" x: ?. P0 OPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。3 o/ E j5 o9 B Q! ~
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。/ z g4 o5 q& t! b# v
% y; @, b5 v! [
& {4 y1 `* ]3 V$ a2 \问题
1 U I L9 f& o& n; _' G! F$ l$ k1 l( h( u' h8 N* u
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)9 a# z+ W* v- k- t2 ^' L" z
" }* j; l) r% {/ y- |: P
SELECT * FROM MY_TABLE
& P; K/ v& c3 O; N k4 @" R$ o+ ~, N! I; w4 X$ \' ?
A.如果可能,用把查询转换成存储例程 t! x8 Q0 S% X' V! W) l: V
B.如果程序允许,给查询指定返回记录的范围
2 b5 G6 y- A$ e) e# r7 d0 AC.如果可能,添加where条件
, q( u: M: ` ^0 g" DD.如果DBMS允许,把查询转换成视图4 u0 o7 ]3 n% A8 H; @; I
E.如果DBMS允许,使用事先准备好的语句
' ~; m1 o9 s+ Z& w& a2 Y9 B1 }
5 {: \2 B( `% q" X3 Y
. ~2 i& |. G: j# k* J2.可以用添加______条件的方式对查询返回的数据集进行过滤?
0 P0 J1 d) e, L/ F; v( Z) M( C. X$ Q- {# f% |1 W
答案:____________
* w* f p* e0 b" ]2 ~: V" v s3 e5 P* M5 W1 T' t
7 J7 i: c% u3 H6 m2 v2 U" _
3.内关联(inner join)是用来做什么的?) w8 U& b4 W) D# h6 P" H' I- W
) ` ^/ E+ j) S7 n/ F
A.把两个表通过相同字段关联入一张持久的表中
0 ~8 j3 S2 F! H aB.创建基于两个表中相同相同行的结果集% ]7 L8 G3 k/ x1 A. U& V- b
C.创建基于一个表中的记录的数据集$ S) M9 n% ~* ?" E5 |
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集- v) P9 C7 d2 F$ r/ q2 ?
E.以上都不对" B& _6 h- t6 L' s5 _
2 x/ E- b9 a6 t# E
/ P t. r( H7 S5 R( Y, D D) u! H4.以下哪个DBMS没有PHP扩展库?* Z, y' p* v7 K4 K9 N
6 b6 y7 O5 V1 m' h+ e8 FA.MySQL
# ?1 w& j) m# TB.IBM DB/2
; f; k6 F. H3 {3 u( UC.PostgreSQL6 Y8 C- w h; H0 O) K
D.Microsoft SQL Server7 o, _8 R0 {+ Z
E.以上都不对
# Q2 r/ I. p( U9 t& M. @ Y/ K/ O5 H$ q; a& U
* L, r v% g/ J! a9 k1 ^5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
' D& D8 h, G6 W3 y) A
8 b! f$ H4 d5 k8 H* k, u<?php% T3 g. L3 w" S1 ~: |, l7 U
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);. u1 |: r3 c2 S' s+ N( q' r* q
?>
3 j9 h2 e) h6 m/ I2 w
9 z8 X, }0 C+ j4 b: i" v0 \( IA.MYTABLE表中的记录超过1条/ I S+ Y: H6 p* |+ ]; d$ n4 a
B.用户输入的数据需要经过适当的转义和过滤
; r) p5 f& A @* e8 m$ l! ?C.调用该函数将产生一个包含了其他记录条数的记录8 I# Z% @3 U3 w4 ~
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除9 ]1 {* A2 l5 R+ H1 q" H7 p& _6 L' M
E.查询语句中应该包含数据库名( @, ~+ v' E6 d/ p
- {) ^0 u3 X2 \5 ]
4 m; u+ F+ t2 U" [0 I+ ?: x
6.______语句能用来向已存在的表中添加新的记录。4 c2 M& c; p" C7 w8 e. b( V
6 S+ M7 u( q) P* ]4 i% N5 c答案:____________
. B7 V. r2 H% s8 x; \$ N+ W: D' q) @; W' n
) W8 L) Q9 |! k7.以下哪个说法正确?/ \4 H& y6 `, a/ r$ T9 [' X, g
9 q; A9 `; r- P; |& O3 yA.使用索引能加快插入数据的速度# i% n4 [/ ~' M3 B( i
B.良好的索引策略有助于防止跨站攻击
k% G* P, H8 |+ |C.应当根据数据库的实际应用按理设计索引
% ?0 O2 O/ ?: z" s& qD.删除一条记录将导致整个表的索引被破坏( O8 F. c* J" S$ U' ?: l" D- k
E.只有数字记录行需要索引( _( M$ c/ F' U) h
1 K+ R. N1 h( k+ t9 ?% L* T( ^' ^3 x- E) I7 H
8.join能否被嵌套?" j1 m3 d: D+ y
; Z1 x# O. B/ rA.能4 e& ^8 d5 X2 L4 ?" `3 m
B.不能9 E8 h! |! k I
$ d( D0 n, C! z& u/ L \9 p, t0 ~
7 r9 Q3 s: Y& `+ u, |& s9 c9.考虑如下数据表和查询。如何添加索引能提高查询速度?( h4 \* q# l" N$ h4 z/ e( i
' Z' n/ x# r4 o6 G: _* T: _; H
CREATE TABLE MYTABLE (4 [) q' ~/ U; H2 n7 d Y
ID INT,
0 N3 j$ M" R- U0 Z( T3 iNAME VARCHAR (100),2 b! l5 N2 M# X! {2 A. ?5 Y
ADDRESS1 VARCHAR (100),
3 O9 ^* N8 L6 j* J2 O% H/ a" Y6 K! sADDRESS2 VARCHAR (100),' i% |% j( {1 E$ c
ZIPCODE VARCHAR (10),
( e6 t. `9 W o; nCITY VARCHAR (50),
1 m; y1 Z, U6 b- ]PROVINCE VARCHAR (2)$ o0 K4 G# D/ i/ ?; K
). C! m8 ?, u& F
SELECT ID, VARCHAR2 w5 u+ T2 D$ z' @+ w, L& A+ [3 t
FROM MYTABLE+ V2 o: r a% I+ v& G
WHERE ID BETWEEN 0 AND 100
. M2 `, Q3 N/ {ORDER BY NAME, ZIPCODE
% r$ x6 d1 W+ T l$ g w/ L
, z1 u3 \( F- D; HA.给ID添加索引) w. V6 e- M! W6 Q6 H
B.给NAME和ADDRESS1添加索引
3 ?+ i8 v. W9 wC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引 Q9 _" Q3 s+ O) a& j6 r
D.给ZIPCODE和NAME添加索引
% j+ q& n, F$ x/ e% Z7 A7 ]% ~& wE.给ZIPCODE添加全文检索
& C! }: n+ |' U$ H* ^. n M3 f
4 w" q9 k/ J" M- s5 M1 V10.执行以下SQL语句后将发生什么?* b$ c$ z/ M0 K! R4 ~% j# J0 ?
' T r5 M) Q# _; X/ _BEGIN TRANSACTION
1 I/ I3 j% T/ W. v' |DELETE FROM MYTABLE WHERE ID=1
* v4 U( W" o6 Q' ~DELETE FROM OTHERTABLE6 N" A5 P$ {% k( o
ROLLBACK TRANSACTION
$ ?! W z! g& ]0 N) z2 `0 V; \4 T! J$ s$ J/ R& l
A.OTHERTABLE中的内容将被删除+ S$ R4 X$ R& D
B.OTHERTABLE和MYTABLE中的内容都会被删除; }- i" ~0 }: m1 V
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
) ^, ~1 Q; b0 x [% g3 X5 q4 H) lD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化! u X' g$ Y- {
E.数据库没用变化
. C) h5 c d s* m X5 w A, M
4 C/ E" t3 a* X
+ i( i: m6 u6 n3 B% h, m11.DESC在这个查询中起什么作用?
8 t1 J1 o+ p+ E+ ?( ~5 c
7 c- r7 j+ c# p7 i* R# I4 a6 f7 dSELECT *; q! Q* Y; p @* Y5 U2 S
FROM MY_TABLE
0 D- f, W0 h. T6 R" J" A( oWHERE ID > 0
0 g: t1 H8 V9 CORDER BY ID, NAME DESC
3 R! A7 ~1 O: Z1 e6 i: Y' n1 E* @' _2 D: d% I4 N8 J6 e6 M0 a
A.返回的数据集倒序排列
6 m9 I. v" b0 V/ sB.ID相同的记录按NAME升序排列0 B( l4 S$ j6 T8 i; B* ]1 ~
C.ID相同的记录按NAME倒序排列2 I8 L4 a9 z% i1 O% s6 a4 w( D
D.返回的记录先按NAME排序,再安ID排序
! a/ n8 m/ w. QE.结果集中包含对NAME字段的描述
6 ?) n* I b8 }
4 L, |8 w p' S7 [7 }
. i8 M: v; o2 g U12.以下哪个不是SQL函数?8 ~# m6 [3 \$ m) u
8 E9 L" ?: S6 y2 s" J4 E
A.AVG6 y9 g* h9 H% \" M# y$ b* ?% |
B.SUM
' y! V1 W; a. W6 y+ k7 KC.MIN( v0 m: d- I% }: j3 N0 q
D.MAX$ `# V2 e4 y6 V* @& s8 b1 Y5 `
E.CURRENT_DATE()) ^) z* D, v. V* U9 [) N& V
- B! ^) F/ |9 H# T9 d
/ f) Z' p5 M: b2 o7 S2 P
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: o- N5 u/ Q5 F: t0 W, z% v
1 O$ m: t; L# T0 ~* G tA.该字段必须有索引
' j6 K& O8 Q" M" |$ L( [3 {B.该字段必须包括在GROUP BY条件中( |# ]# B- R: Q0 H
C.该字段必须包含一个累积值
- D* W L5 ~4 s6 WD.该字段必须是主键: r" B) b: t' `9 X
E.该字段必须不能包含NULL值
: [! l& n: O R- Y( f- z# o% E/ u4 Y/ \8 h
; V$ d4 l ? Y" J- Z9 f6 ^& b! v
14.以下查询输出什么?- z2 V4 [3 u* C3 v) E0 i
+ [+ H4 ~+ t# } J% l; j
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2, K0 S2 M# j/ `# M, [$ U* B
ON TABLE1.ID <> TABLE2.ID
1 M; r% o* T5 ^& S( Z: B5 D3 ], p0 v/ Q' |
A.TABLE1和TABLE2不相同的记录
, }+ r6 d6 `% d* [" N, K. R: PB.两个表中相同的记录
k7 S3 ?$ M( \ k4 @C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数& E6 {5 g9 k" D" y
D.两表中不同记录的条数* I$ {3 l( Z+ r- O- E( a) {
E.数字2& @: } Z' z) Z
, T1 D$ Z7 p! ` \ H
* L! d* B: a: [3 H% a; Z9 j15.______能保证一组SQL语句不受干扰的运行?. ~9 N6 u9 g8 d) i1 |& x
5 _: f( O3 U# s R答案:____________
, D3 v5 t4 z: \7 D& F4 s8 Y; F1 B& J* N" U2 A. Z$ ?
W6 c+ E, f1 |3 ?1 \4 y
+ \$ } h* t Q
答案速查: `* t6 |5 D" W, `# O: r
1:BC' o% Z! }& S$ Y$ U
2:WHERE% O5 t# B, j; f3 E# y; Y$ E
3:B+ }; V2 P! |, Y
4:E! Q4 b( a8 @. @
5:BD
& c0 t0 V$ z5 V+ q- ^6:INSERT
# F# X4 N( j/ {& W% A7:C# `- Y3 Q3 k) n3 Q& ~
8:A
; k: t: E" b+ A( U |3 d, ~4 _9:C& L$ }( E4 O" \; F% R
10:E
4 |9 F! V6 k. Z11:C
+ h c0 o) _* n m12:E4 P& H2 q' O! ~
13:BC8 m5 ]& `; x$ _, w4 p
14:C$ t I2 e2 v- H: n! G
15:事务
) J7 j6 s6 E) {) |& n( I4 [ i5 |- \6 E4 K5 A* n
5 z( ~7 C! P( N/ g5 k/ L7 p8 x9 i& w, H( e1 [
答案详解0 m3 f. v$ m" p0 i
' c- N: |' B$ @+ S2 S) J# {4 Y1 a1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! i8 p! e9 H& o6 U& G0 A2 G1 _; u- l- t9 E( f& J7 K: w
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。# ?; i" I; j( V9 u4 z) t
( k5 d- \5 q, l3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
' N" ^ W5 a9 Q3 y" l' s+ p
7 ~5 A# B1 C5 f% E- Y( f" @4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
" {7 V6 K. E0 F. ]/ B8 v; @& ?8 K& a2 J) ^ v: r) F, N6 h& s: r
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
# V, G1 X# z/ g1 m: d$ b* D- d. c
6.答案显然是INSERT。5 K- I0 J8 E# U
6 V/ J5 z* d# Y; Y+ H
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
' z& x" X6 F5 y" ?9 _/ E; n. t# M, X, T
/ ]- ]2 I8 Q; u# D2 X" ^8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 j8 G8 Y& U0 J; e6 X% S' r: }2 S8 ]- T, l* ~
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。0 y7 {6 E) w* m
' _! V6 e, Z4 R8 Q10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。* k! Q y. P5 N3 U/ r5 \
9 h1 R, t9 T4 w* ^. t/ |" j11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
$ {1 E" N. C# Y& I# s7 H# Q( K& h
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
& k6 P9 k! {0 Y4 Y2 E8 a5 c
+ { a, h9 T9 W5 ?13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。; X/ M( L- ^) M$ K& u7 C( P6 \4 X
9 Z* l0 a5 B0 g# _. G
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
5 s' S' K# ?6 n) \/ D& ~& O
$ q; A7 p6 o6 O+ a( O4 [4 `8 V15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|