  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。* C8 d1 M8 k) ]& U; y; }1 X
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
. V8 [1 u+ d" g/ M8 Z+ x- U本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。$ M# Q8 a6 Y: T! H k, F. W, A
7 G9 {$ K$ n2 e/ @6 b8 O
. g5 L7 @/ E' {) k+ Z
问题
! M/ ` U7 L7 K
: M9 S3 X- m6 B- z. z1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
" V7 V+ q1 J7 o5 b2 Z5 O5 P
2 X7 U# c7 w# PSELECT * FROM MY_TABLE
: v; G- m$ h! F+ I$ K& R, J/ ~9 C& K/ {& J" j4 _1 q6 c
A.如果可能,用把查询转换成存储例程
( h1 [! Z( ^' y$ ?, D( v5 \+ d$ XB.如果程序允许,给查询指定返回记录的范围
2 c7 y" m1 ~- H' p4 T3 |; mC.如果可能,添加where条件
$ r1 M* n9 N% c0 v) zD.如果DBMS允许,把查询转换成视图! T6 C* T/ ^; Q$ W; D3 k5 s$ V
E.如果DBMS允许,使用事先准备好的语句9 {* l) u y; K5 r) B; h! o
m! {2 X. F% O f+ A# d
1 z7 Q7 D! l0 m2.可以用添加______条件的方式对查询返回的数据集进行过滤?
9 ^" Q8 I% X+ A, }3 m
$ L5 ], B3 G! Y: }- I答案:____________
" J' {) Y6 i4 I8 n( f6 `$ t p8 {) X2 p- y: g6 t
8 x; f3 Z v/ T8 Z
3.内关联(inner join)是用来做什么的?
; m6 N% L: n6 K$ |' v j
0 j; O2 C d# x+ \2 RA.把两个表通过相同字段关联入一张持久的表中
`! S7 S' V: P- [" OB.创建基于两个表中相同相同行的结果集 y+ T: c9 N& ?
C.创建基于一个表中的记录的数据集
% [. B# i! _: w4 KD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
. N1 [6 Y$ v, G3 yE.以上都不对
p$ v3 @/ g3 N: k, ?1 c! G. e% A) x: I7 X8 w# n8 R; U
- n) [/ V- z8 I
4.以下哪个DBMS没有PHP扩展库?
2 |* t2 Y2 R* ?( h" D6 p g/ H& H( B( \4 L
A.MySQL0 J! q7 ?/ V6 t/ X# ?
B.IBM DB/23 x* ~4 P& `* @4 @/ L6 J2 y
C.PostgreSQL9 m0 ?/ m; O: c \* c |
D.Microsoft SQL Server0 ~: L$ c6 X n) h/ ?$ F1 Y9 W
E.以上都不对7 }2 f! b0 Y. M$ Z& P
+ E7 T% p1 y: P+ p& e2 ^9 q, S6 T
6 j( K0 k W. i5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
, Q" r6 e. B. ^3 j
1 ^. [8 n5 d) Y7 q3 V% w' l# I<?php8 s6 D: T& o2 A! |' k( _4 N( b
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
n# _" h1 D, G: L6 c+ v! S0 ] V?>' u4 A. Z" d' d7 j8 I+ m4 Z
$ a, t% C7 t$ @A.MYTABLE表中的记录超过1条; n* M2 d6 g' ~; D; _
B.用户输入的数据需要经过适当的转义和过滤
/ T+ |" o; m1 V( j1 GC.调用该函数将产生一个包含了其他记录条数的记录
) H+ }% p/ f/ wD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
9 g" A' \8 s3 r5 ]: iE.查询语句中应该包含数据库名
/ [9 m, ? r3 K/ i6 u7 B! O& [8 n1 u
8 S. W9 e# I c" ^
6.______语句能用来向已存在的表中添加新的记录。
5 m, |+ }- @5 f7 V& `/ ?
5 I7 o! j$ ]8 ~ G8 I+ A答案:____________7 ^6 d& l9 H1 p) U
! {2 k1 p& C1 q% b
0 a/ Z' J' h& u# I1 V
7.以下哪个说法正确?
! N% m2 _: ~( c4 m4 z" q# S/ K& A9 u6 l W. A, K) e. W8 W" r* `
A.使用索引能加快插入数据的速度: u1 w7 {# K; \+ w0 R
B.良好的索引策略有助于防止跨站攻击; z/ }! M/ [! B H. p' _
C.应当根据数据库的实际应用按理设计索引
4 ?2 ?6 A/ G1 M2 z% mD.删除一条记录将导致整个表的索引被破坏
& a: w& A6 A6 r( LE.只有数字记录行需要索引( ?. g& [8 u% L8 R# P. }' j" h% G
! h) ^" A* h; B- P$ a, F
& I% e) g1 J) ]' c( l+ f: D+ p# C
8.join能否被嵌套?
0 y9 p/ @ `, ]+ B* ^7 f: X* K8 U
! ]* g5 `: _$ R5 D: _5 {8 i: xA.能" y& Z' M* w# X/ d, @8 [
B.不能0 Z( v5 V; F" l: {5 Y/ K
$ S/ _/ c9 Y. v* o, P
9 W9 X e$ a- w9.考虑如下数据表和查询。如何添加索引能提高查询速度?
6 i5 H; t9 ?& ]# d n4 N9 m9 G- J8 P0 c
CREATE TABLE MYTABLE (
4 L0 k4 `9 d. N6 vID INT, e9 d" M3 i s6 f* e
NAME VARCHAR (100),% R0 B& m; ?) K% M+ i7 U) |. |. c
ADDRESS1 VARCHAR (100), z* d/ V3 S% f
ADDRESS2 VARCHAR (100),
. a9 {- B0 [: UZIPCODE VARCHAR (10),% X: T# M; e0 j7 o* o' V8 e
CITY VARCHAR (50),; s/ b e% B8 Z3 g! |8 V4 E
PROVINCE VARCHAR (2)! e6 M* D, T/ {% X! B( Z7 @1 x1 C% f- D
)
$ q$ ~) _& i( z. hSELECT ID, VARCHAR
/ w; O2 t1 L' ?. y$ b/ FFROM MYTABLE3 M2 T' `. b, l# N# z
WHERE ID BETWEEN 0 AND 1007 `6 G! ^: Z3 ~: m
ORDER BY NAME, ZIPCODE
9 y% ^) R! ?5 G' n8 ?' |' K2 a% D6 l. z9 q; c6 B7 c
A.给ID添加索引8 {. {+ r+ L, m: c! G* l" ?3 q
B.给NAME和ADDRESS1添加索引
^- k" `4 J* IC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引7 z3 `! E3 C I1 W
D.给ZIPCODE和NAME添加索引! B3 G$ }: e w& y- [
E.给ZIPCODE添加全文检索, E0 V* J' _9 ?: [. t$ K: k u
( B1 x9 y1 ]" u+ i& F' O3 v4 O& T N6 o" y5 @, }/ |) l2 k
10.执行以下SQL语句后将发生什么?7 Y& D* N/ Y2 O. `
1 s$ ]( @9 T: ]( @/ ?5 `% f3 P. o& uBEGIN TRANSACTION$ s- J* v8 U. z7 P7 G! I0 a+ I v* v
DELETE FROM MYTABLE WHERE ID=1
* T( o P1 J7 s8 d. k! v2 hDELETE FROM OTHERTABLE
% t2 @( a$ D3 JROLLBACK TRANSACTION8 D9 {" i5 n9 N3 D" B0 E+ i" w: e
, Z: J' W3 o9 V+ V: ?, F2 tA.OTHERTABLE中的内容将被删除( ?+ m: D& U0 c/ ~ z
B.OTHERTABLE和MYTABLE中的内容都会被删除
) S# R/ l$ M3 Y, F% ]8 a3 H/ C/ iC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除/ H* a. A* g( `' q) H
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化+ J0 e3 Q+ {6 n) T0 X
E.数据库没用变化
& T) \& h# B5 S2 t3 i R2 |0 E2 i' y; q5 m% S. u* {! K2 L
$ n- K# j) j9 Y! T: {11.DESC在这个查询中起什么作用?
$ o' O8 _% ^" g0 N
8 m5 K. ~7 `* T, A, sSELECT *
* Q5 z$ i) A0 R- v, D/ r' o, R& |FROM MY_TABLE
6 B/ P5 C1 h4 c* j$ y4 dWHERE ID > 0
% m/ P9 Q3 u. P+ Z- i8 mORDER BY ID, NAME DESC5 U( ? v2 V$ P" }' \3 ~
/ L* I! D6 i: cA.返回的数据集倒序排列$ O( `; @' |5 s9 p! l3 t e( A
B.ID相同的记录按NAME升序排列
1 r7 F' `2 q0 ?7 K& P5 tC.ID相同的记录按NAME倒序排列+ u% f% I% N1 d) t, @
D.返回的记录先按NAME排序,再安ID排序! y- Q" o$ L- O ^
E.结果集中包含对NAME字段的描述
- G9 S1 J: l# f, c% K d
& R* [$ O- {3 J
$ A' N& N5 Y9 O- b% Z6 D12.以下哪个不是SQL函数?
, P* [6 p; s4 y( p' j2 W; E9 Y6 K/ P) f+ w0 {, }
A.AVG
0 \; c0 z- R4 Z# x# w, \% SB.SUM/ K! L- u' u+ D3 e$ ^* R; }
C.MIN: P- h; Y4 @& u
D.MAX
L/ [ c% H1 BE.CURRENT_DATE()$ b* b* d3 `7 C) R. } I
% ~4 e3 W6 `* A [& I
8 d5 G6 O4 }8 A/ i8 i$ I13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
4 U; N# g9 N" v# U# c+ {6 `/ B7 e; I
A.该字段必须有索引
" C' V4 ~' [: _6 m9 v Z$ LB.该字段必须包括在GROUP BY条件中
" K, F! _* ~% z* f$ X5 qC.该字段必须包含一个累积值
& n; Y, w; ]+ K/ ?2 [" hD.该字段必须是主键: ~/ T+ `/ A3 A8 b' G$ V
E.该字段必须不能包含NULL值6 b+ P" `6 A8 ?. I6 [. h
5 v" d" E9 ?9 J( i7 y4 f2 F/ t
9 w; z) I) g2 ]% S
14.以下查询输出什么?
2 X& W E" R1 M$ I
! @2 W/ p* }6 n- J5 e, iSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2# ]9 r) g% _7 Q
ON TABLE1.ID <> TABLE2.ID
' n/ c& V, x# L" U. C' c
+ }; K- {3 E7 AA.TABLE1和TABLE2不相同的记录& C |2 v) A( e, X! q
B.两个表中相同的记录9 v2 P7 k2 z; s; F
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
, T- x* U6 w5 V/ |D.两表中不同记录的条数
( z' t4 m8 _3 ~$ }E.数字2. ^/ g( K- I/ @( p g" z; \' c @
# P: H# C4 L) D; |8 J0 v4 ~4 A6 I9 A
15.______能保证一组SQL语句不受干扰的运行?) P/ n/ o7 p' V1 E8 U% l, } K9 v
. Z' Z" I5 ~% |2 l# H7 t
答案:____________. r/ a. `2 |- X) t! b
_' a; y. j! L H5 z* l. A. h. Z9 u, g3 e/ ]8 O& {3 A
( l2 `% p4 w8 B+ C) u) F x
答案速查8 H. h1 u7 F9 G: F
1:BC4 o) e' _' V0 k& e, B0 R& f
2:WHERE
8 `. T' m- Y# c% Z3:B" K7 L' p2 e C) s( b
4:E- |. G N( {: F8 Q* j4 T. ^
5:BD
8 K( Y- a- t/ y1 v* _3 G. B, K0 x6:INSERT& Q- t/ G! p, w' E# A
7:C W3 L; C L. z, d# ?
8:A
) i* [$ }3 H) N, O6 p' N9:C) L5 j0 ^* r1 s8 @
10:E; Y% f2 `0 v5 A
11:C
" L# o4 ~# z1 c' T# v, U$ T7 P12:E
) d+ f$ l, h9 n8 B/ z13:BC1 y ^# D! b# }7 q" R
14:C* b3 f( U n' a0 d
15:事务5 _3 ?: L4 f- a9 g
% F+ _8 s% [1 E
) }4 U0 k6 n' ?$ P' p/ c" U2 W- s0 B% H
答案详解; g, D: _! I/ p6 L2 e5 O% j
9 b! Y& I' f* w. e+ @1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
4 X8 P* T# |: l; B' ?$ y# [$ s( Y/ r* \. u2 {* }
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ W" _& e+ n. E; D' x# W. i0 b2 V
5 S/ D, W* [ X- w1 m2 J3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。0 p4 \% Z. L+ Y
" q$ m2 z: c+ O# x) ]5 n8 s" q+ P
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
8 D/ b O5 t" N
, E8 t! X b9 Y n% h$ l- f6 w5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
# l# P0 `, ?* f
8 J, \' e1 c$ d' m) r$ J B6.答案显然是INSERT。
2 S, z# L3 u, j; d9 r9 T8 y Z t, i$ b) ? H, U, F) a
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
h, M) c: q- w0 ]; g
# i5 b0 f1 Q1 `) D; Y" |8 g8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
q9 t5 `$ b q _4 N2 E
: C/ L2 x! R" L$ v9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。- |( f- t" s) J) m+ J3 p4 ^
$ R h1 B0 ^: l2 T: {# T' K10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。8 @# u: w9 e4 I- G( H4 ]. J( q2 I
( x' G0 x9 z$ p. V& c" t+ q4 ~+ G* q
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。3 G1 N2 _3 S) B2 N
7 y1 P8 k% T0 C7 V1 s
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。+ c3 P* J. f* j( C7 N t9 G
1 } L1 ]7 h0 z5 b0 n8 s13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
4 h' a# M" V/ T! t( x7 J; D8 U+ l5 z- K" J+ J
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
5 {8 P4 d+ e& C- b) o3 N3 T2 D
; g1 _) z3 D% F4 v15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|