  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。" q+ X* C8 v) b$ Z. S7 i( Q
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。5 C, y( P1 p% ? [! z) s( P
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。: T# n! O Q" h O4 n2 Z: o
: e! L. D& d- I4 q0 v6 O
7 e) M/ n. w+ t% Y/ T. m1 k问题3 J0 `* {8 `1 v. Y/ F- Z
; I8 ~$ G b& Z0 j) r1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选), ?# _% s, O# F$ O" C3 W
1 r4 E( e3 D( x6 P4 s7 W
SELECT * FROM MY_TABLE# ?5 m; J( O5 _/ g$ i4 L" V/ P
5 q& E) N0 n% i: S
A.如果可能,用把查询转换成存储例程+ L& m, k) A7 J/ i* C( {; [2 T+ c4 J, c
B.如果程序允许,给查询指定返回记录的范围( l# O+ q2 w6 x; \/ {+ o
C.如果可能,添加where条件
( D+ U* h1 ]- \4 QD.如果DBMS允许,把查询转换成视图
% r! Y# Q+ h; O! h. T1 R' FE.如果DBMS允许,使用事先准备好的语句
" a4 J3 S! A; s! {0 G
2 f# v9 {9 ` q* K
6 k" h9 r% L6 n6 t4 Q2.可以用添加______条件的方式对查询返回的数据集进行过滤?& E4 o! A4 ]5 I
& K( h. g5 v1 W2 ?$ q9 d8 t/ I- e' ~答案:____________
- U K) J3 G+ H7 N! m! C
) v9 Z6 N# y/ I* }3 |9 W
+ L3 u) U% Q# h) `$ c/ {3.内关联(inner join)是用来做什么的?: T1 l' `5 r" o/ p
" L2 O8 L3 c; ?! r; r+ AA.把两个表通过相同字段关联入一张持久的表中' u( P% @2 x1 k' f# O
B.创建基于两个表中相同相同行的结果集7 w% O) ]1 d0 b( S6 c
C.创建基于一个表中的记录的数据集( Q* `. `: l, [: t% ]
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集* f' q& I7 h- a7 z# }+ \( B* q& v
E.以上都不对1 G' B% M" K9 ^6 H/ b$ b. a- T& \
6 m: t/ \3 t) }# r1 }9 e4 ~( g3 }4 H
4.以下哪个DBMS没有PHP扩展库?
* u9 ?/ c7 h- t( o
0 E; r3 C5 K. r# P" j/ xA.MySQL
4 ]+ t' k9 |; k5 | g$ @B.IBM DB/2
+ N- Y* g2 \) L% S- U/ n9 f! A4 E3 PC.PostgreSQL
" m e3 p2 B7 AD.Microsoft SQL Server! t5 x `+ z. e2 ^
E.以上都不对
% N- W! Q) N3 Y+ p$ N7 C! B3 H: w# w9 D# J) j% T& ~2 R
; `! \7 `9 J! u h8 G0 m; C5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)" _" m/ b4 {0 O1 e/ t: m# Z
4 |/ z; Q% h4 x8 I6 I% r7 l
<?php
& h( [7 F/ C, o2 h/ f; Y. K$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);7 O) ~; t6 j9 j! ~
?>
9 T7 f& ~3 @6 b \* p2 K) ^
$ [0 l# @8 E8 M* Q, O( V7 yA.MYTABLE表中的记录超过1条8 r9 F! I, P% G; q
B.用户输入的数据需要经过适当的转义和过滤, ^9 g4 Y1 ^2 O& Q& \4 D q
C.调用该函数将产生一个包含了其他记录条数的记录
: V: f4 e2 m7 {D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除9 l% }2 L& X5 P. T( Z
E.查询语句中应该包含数据库名; u+ G8 c, g( E; S4 U9 M {
/ Z1 X/ K9 c% {8 }& R- K, }2 j; A" ~$ u
/ h! V( d3 z: c4 _- e
6.______语句能用来向已存在的表中添加新的记录。( ^- p1 e0 O+ T1 F
, M; G5 F8 ~) m, Y答案:____________
$ r; ^) ~6 ?0 w3 @7 f4 p7 ^% {+ z4 H$ }
2 r) D" K$ t' Z) U, [
7.以下哪个说法正确?/ k3 g! L! w$ l+ N) A
2 f+ ^; N/ `9 d, h
A.使用索引能加快插入数据的速度
. U8 W) C( I8 s% {/ J% }( ? R+ }0 ?B.良好的索引策略有助于防止跨站攻击5 l/ m" v, h+ [- @: n3 V
C.应当根据数据库的实际应用按理设计索引
1 b% Z( Q0 {/ d* \, `D.删除一条记录将导致整个表的索引被破坏
- k5 Z4 v1 E$ m5 x$ ?8 KE.只有数字记录行需要索引
7 Q" q9 F N, z1 E- W3 M
$ p2 Z% a5 u" Z- _
: T B7 p0 U. o' `8.join能否被嵌套?
9 C, k. t0 G9 h( ^* E* ^6 ^* P4 ~% [- Q+ W& P# o H
A.能+ L. b) S d6 r E
B.不能
! y9 h8 e, }6 F# ^. E
4 K7 K3 C" u% z, W; @% ~% P! z9 p6 B+ d$ p8 U, s
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
, i% j" i. r* W6 l" \0 _: k& I3 R2 E, k( P' w; b+ p
CREATE TABLE MYTABLE (
% {; D% Y; {) f4 A8 KID INT,4 ]8 b# J0 B" p8 M
NAME VARCHAR (100),
) I1 k: U) l3 @* q) O o' ~7 JADDRESS1 VARCHAR (100),/ j* B& `) x" x3 d: V0 B5 f
ADDRESS2 VARCHAR (100),- N5 Z! T' s% F1 o" {) Q
ZIPCODE VARCHAR (10),1 @1 }1 j) p" _& u4 F
CITY VARCHAR (50),
# D2 L5 I: t1 m+ r5 B) Y& JPROVINCE VARCHAR (2)& d8 a* {: w6 F' _" j0 L3 X
)- s0 G7 u# U) P2 ]
SELECT ID, VARCHAR
7 [' \4 o* I& T# V+ B# F; GFROM MYTABLE$ b5 L% U3 N6 ]% u- M7 b. h: E% s3 F5 m
WHERE ID BETWEEN 0 AND 100- \# Y; u1 ?6 t' O$ d6 r& z
ORDER BY NAME, ZIPCODE. a h- {0 L$ |3 t
# Z& m# g/ e7 B; A5 p& N; m- Y$ ?' z
A.给ID添加索引! v% X Q" U$ @. Z/ v
B.给NAME和ADDRESS1添加索引
' Y* C$ i& w/ \C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
$ H, c% s0 C7 S7 wD.给ZIPCODE和NAME添加索引
" y7 L) `; A% }7 Z! y. jE.给ZIPCODE添加全文检索
9 B0 U4 \* m7 P0 g7 t' i, r" D& k$ j0 L9 ^
" G) R8 t! s1 Z. R: J8 }10.执行以下SQL语句后将发生什么?4 v& V) Y" U6 k
; e) }( J4 N: I' {8 B: H' b I
BEGIN TRANSACTION
4 W0 z: M, ?: N7 yDELETE FROM MYTABLE WHERE ID=11 `7 S! K7 |: {+ D( p9 H
DELETE FROM OTHERTABLE; g) V, y2 ]+ I2 g
ROLLBACK TRANSACTION* j8 h4 P. b! }; S& a) r$ P
/ @6 ]" u; r( f/ j% DA.OTHERTABLE中的内容将被删除+ R3 C2 u$ Q" G, d t* ~
B.OTHERTABLE和MYTABLE中的内容都会被删除0 m: Y* S3 q/ m) U4 m6 i& `
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
% A+ R; h& X$ N! ]; ID.数据库对于执行这个语句的用户以外的起来用户来说,没有变化+ z/ ]+ J3 z& t& j# p
E.数据库没用变化
$ z6 J4 m; Z$ T
( ~' J( T3 I1 Z6 [
6 u9 O+ Q7 U9 `1 p11.DESC在这个查询中起什么作用?
7 ~) Z5 v, L5 Q
! B: Q2 ^1 N' X z. NSELECT *; f: Z3 ~, {( D: U9 p5 ?$ w% E& w
FROM MY_TABLE
. Y3 }. L0 a2 ~5 j$ u3 t& n; EWHERE ID > 0' D* `! K, y5 o; D, P; J4 M0 X$ H6 o* f
ORDER BY ID, NAME DESC
& P- E2 r; G: m2 @! W* l
6 `% f3 E) H* G5 G# r WA.返回的数据集倒序排列
) n9 ]$ r R4 IB.ID相同的记录按NAME升序排列/ H# I, P; j: i0 F& f6 Y! [
C.ID相同的记录按NAME倒序排列
6 z8 }7 S! G% [, |! {D.返回的记录先按NAME排序,再安ID排序
0 u: s7 m2 y3 g0 A2 c5 ]2 cE.结果集中包含对NAME字段的描述1 a2 V7 ^8 A7 a$ O: ^
M! H) V5 J: q2 v9 C
7 A2 V# A# i7 y# u3 N12.以下哪个不是SQL函数?( \1 K# j4 u/ p! x1 X& S
; M5 C7 O# b; Q% Q% q# C6 B9 g4 f% K
A.AVG& u: M6 \$ K* F1 m9 A
B.SUM8 o( ^" N4 J9 m
C.MIN
" E i! @4 Z5 sD.MAX
8 H5 i6 n" b: z9 P" S# `2 s) pE.CURRENT_DATE()
6 Q* ^& ~; M% r8 {0 C% q# t
( } @ j; N9 r- T( I
2 F' }: B7 @2 P- g9 ]13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
1 t V0 r) x" l5 Q# t/ H, b0 {% w( A3 F1 P
A.该字段必须有索引* f( @( W7 ~5 a; t/ i9 D5 Q
B.该字段必须包括在GROUP BY条件中
# u/ Z+ H2 c8 X) g( [C.该字段必须包含一个累积值0 x+ i0 K; N R7 C ?; h. a' _" N
D.该字段必须是主键& }, t4 M* A/ L7 {5 q" v
E.该字段必须不能包含NULL值1 y* ?9 b# Y: Q' _) C$ [$ _' U
. E( o A1 t7 _# ^
9 o( n5 [& |9 q7 k) p
14.以下查询输出什么?$ u8 t: ~' l3 a
3 z% _+ j4 M6 d: W( `; L& p: y
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
( H5 ?) t* Y. T: CON TABLE1.ID <> TABLE2.ID
% f6 w7 v% R2 z8 Z) z0 N
8 `: w4 C7 H3 ]9 a1 W: D* o* V' u2 b, ZA.TABLE1和TABLE2不相同的记录
1 T F5 [6 K: V6 z& KB.两个表中相同的记录
2 {8 |" [: h) OC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
- i% Z, A. K. o8 oD.两表中不同记录的条数
5 s! Z9 G- a( c" @$ }( L: K! Z$ TE.数字2. q& T4 g2 i T0 y J
" k! w5 Z4 j2 k# T3 B
/ f4 X3 }& k* s- n4 m8 F15.______能保证一组SQL语句不受干扰的运行?
! B- R, s& o; \3 b( X$ U
" |9 u1 W6 L5 |; `+ }答案:____________
0 t, b- R0 N5 D: P4 x6 F! R" m! R$ e) D
7 f' d3 t3 k3 h, V0 E8 U7 u4 J
4 L( c9 J3 `8 b' z答案速查! t& I! Q4 d; }/ T5 M. W% l
1:BC- n( J) \& b* s4 B4 n2 G! R
2:WHERE, t: c4 G d# W
3:B& U4 A; Q9 @7 }# q
4:E6 E, G+ `5 ^$ M& Z7 K2 c" P+ {7 X) _
5:BD
4 ~9 V i" q1 r6:INSERT) G2 v& Z& C* {- ~# a( T9 t1 A
7:C
- }; X1 C5 v6 y/ p3 z- G' a8:A
( }( G7 B1 E/ C) c( I3 U9:C5 s5 {7 [, [; c6 E9 t3 L
10:E3 J/ a/ G: {, T4 o4 E" ?# V- ]0 f
11:C8 ^5 k) B, o+ i! e! F1 g7 k
12:E
1 Z5 {1 {; k# G) g1 w13:BC; K% q& j' [. P( f
14:C
/ P* l% D9 _ ~3 S/ c7 u15:事务3 u) N/ [8 U- J
. `' D. z( V9 z. [" q' [2 X1 ?% l6 V* A1 {; I1 v) @9 @- G8 M
, w' y' z& i8 c
答案详解0 @4 U; E! Y8 F
( o3 i: a4 J1 M" I$ |: F& A1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。' m* o2 C; [7 h p* `
5 w8 G2 B* j2 l% |7 A8 @2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。+ |! o( m: v, W- G: k
1 u" M3 }& D* A3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。, V1 Y) Z+ f+ Z6 o: c
9 u! J, A# p; M# c q$ Q
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。0 ]2 U4 e, u7 a. h! O' ?
/ k% ~$ I+ B+ w8 n# c6 I: }+ L- x
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。! m0 T! r l# |1 I: K
) c* x9 U" J2 H& ^! A% a5 h
6.答案显然是INSERT。
1 R# G( R. l5 h$ A3 q2 M% j, r9 E" ?( B7 e; ?( l; _/ |; X
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
1 A& k, @+ s+ T/ A5 e4 K
+ H' P+ j5 _7 }1 o' p" K8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
" Q" h/ M: n5 M' U7 W4 G: `% g; {% S
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
# p- g1 G W" Q: {# i* W! T' L% J
8 ~9 {- O$ V' p! L8 G9 ^9 T10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
" e* l# `7 Z# v- Q0 `
8 {. v5 A+ @2 S+ h+ ~! I0 ~11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
! N2 _. n6 [. \. C, P- s% C: y8 Z$ @% F
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 L8 P, Y. Y V7 [! {& w( U' H
' T2 L/ H0 }) P$ E% A1 U7 V5 _: s13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
0 W2 M1 J" n6 C
9 ~0 p+ y H: o' |& J) S. j14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
C& w+ i! c) l" W' I L) |6 R8 `* ], W0 W3 n( H6 n- u$ ]
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|