  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
3 c' N# t$ l8 @7 pPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。& a7 ]/ ^* U, I. S; ^1 o4 Q3 e/ b4 d
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。& y( B+ G, B6 r2 b) C. ?5 ~
& V% n9 l: q$ P/ t1 m& D$ U" g0 y2 f
, @+ M# G0 @% {( ^6 j5 S7 m问题
|% H# A4 m! V# h$ v8 [6 g8 _) E% s2 \, ?* z3 o6 o) B" b( O
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
) g# ?3 x+ f8 [ H3 V) U- W- l4 g( [, b' F" P5 `) {
SELECT * FROM MY_TABLE
; P; L2 N/ c9 ^6 E) ~
2 }: |. b: V/ p8 y3 dA.如果可能,用把查询转换成存储例程6 l2 G: {0 v+ Y9 o
B.如果程序允许,给查询指定返回记录的范围' P* q2 F! j8 R) ?+ w
C.如果可能,添加where条件, x% H3 u( ]- m! ~: V \# `; l+ R: B5 X/ |
D.如果DBMS允许,把查询转换成视图! |7 b8 J- o6 Q" g
E.如果DBMS允许,使用事先准备好的语句
2 |+ v& I/ a2 |9 d- G! L& e& r. I% M. M; {
2 ]0 g# ~. s, j# s9 ^; w9 o) F# \9 ~9 ~: o) F$ Y/ T
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
4 ~# u& q; g9 j* E$ L
! g6 e6 g9 n: T Z/ q, R- i答案:____________5 }7 w M- l1 D+ x9 T0 b
% K/ t8 q* g& D+ B) a# }$ g y$ A. R8 y+ B! k# V$ ?7 l
3.内关联(inner join)是用来做什么的?* m @# e7 }6 J0 v) u; J
& g; h% X/ }* D' C0 x2 T9 [
A.把两个表通过相同字段关联入一张持久的表中
' Y" g( U$ U( |0 e! C7 c; U2 `; VB.创建基于两个表中相同相同行的结果集# }) N# w! s8 T2 `2 t; F% z
C.创建基于一个表中的记录的数据集
7 i& P! U6 c4 {( `6 i/ eD.创建一个包含两个表中相同记录和一个表中全部记录的结果集5 ?/ b% [2 l' Q
E.以上都不对
' x% U5 I" v. l* P6 C
6 W- r. f9 h5 c& ]" E6 W
" W; f' z' t0 g9 d4.以下哪个DBMS没有PHP扩展库?0 h9 u# ^9 g+ Y/ X' |" l% ?
) P( x ^3 @; f- w9 D( e0 F0 v
A.MySQL
: Y" i9 {1 Q# W7 G8 n; M+ y3 nB.IBM DB/2
: o# g/ y2 y. k" Q) x9 mC.PostgreSQL
6 p7 V! z, e: v1 gD.Microsoft SQL Server1 V& |9 ?0 z& j+ j7 g
E.以上都不对3 T" [: H }" U0 j- g
9 K- P# _% w9 a* F- m( t* n
) h! `- @: v" x$ @5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
: k) w1 q/ h- G4 V- Q3 c* ]+ G, |% o7 }- I" l6 }3 q1 O/ Q
<?php
- x0 A3 m; E- u7 q& x$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
7 W( y) h; R4 E/ Q. Z7 t) E1 L?>) Z2 |6 ~1 X+ o9 e: Z$ w# m6 \$ Q
! Y% A2 w* X. C4 }
A.MYTABLE表中的记录超过1条 y6 ^9 Z+ G. O0 |
B.用户输入的数据需要经过适当的转义和过滤
6 Z- e# S2 M$ Q! g9 N# i2 b! nC.调用该函数将产生一个包含了其他记录条数的记录
& P0 p9 [0 i7 V( W% N; ?9 OD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- |* k; @) i/ m: X4 W R& ~3 U4 yE.查询语句中应该包含数据库名4 m8 s$ w" q7 w
$ |# K) U* @9 N; } d4 X9 Z
" N! }& W6 k) ]* z, I: g. Y4 ]6.______语句能用来向已存在的表中添加新的记录。
9 @; P8 \: ?5 q9 n. a# z% b4 }; f3 R- k# b# P5 W% Y2 P
答案:____________
1 r4 v: Y: m5 r: \& d
+ U6 q/ H( _) Q) n" Y5 j( \/ ^# u" D
7.以下哪个说法正确?/ X$ M% S1 T$ ?
; X7 |. k, X) Y0 PA.使用索引能加快插入数据的速度
( d- W6 `* |; G/ @& ]B.良好的索引策略有助于防止跨站攻击+ d2 @$ ?7 s' H |
C.应当根据数据库的实际应用按理设计索引- d) B [+ p# a- |* y5 C/ k3 K5 W
D.删除一条记录将导致整个表的索引被破坏+ I v5 H* R) T) E' T
E.只有数字记录行需要索引
, Z& r, q3 Y6 [
0 r4 A! i" ^" l9 B* E& m6 Q, S
2 x5 v. l. p- h; {: B s q8.join能否被嵌套?
6 ?0 \4 T. @ v1 N, S
/ O" _8 C: \8 k; c) E1 y' X' PA.能3 G, D/ A3 b" }1 }
B.不能
( V5 L% s% e/ o1 M/ ?$ S4 O- x/ K* ~8 }4 h# x
4 k, ]3 X+ m, C9 O9.考虑如下数据表和查询。如何添加索引能提高查询速度?
+ K3 B7 c+ E S8 T- H
5 U- @1 `2 i& v% d% gCREATE TABLE MYTABLE ($ [# W. x( {% X0 N
ID INT,0 ~$ S" R I7 \
NAME VARCHAR (100),
. a! X. L/ U. NADDRESS1 VARCHAR (100)," D! P. O1 R+ x" d: _" v
ADDRESS2 VARCHAR (100),
/ ^" S! P: L3 nZIPCODE VARCHAR (10),
3 q( F( c, }# ] U1 b+ m1 OCITY VARCHAR (50),8 N5 j v5 Q* S" ~8 g; Y: P7 I* K
PROVINCE VARCHAR (2)# G: `# j! ?6 |) J
)
9 g& n! N, _9 Y) s3 U) Y I# m) VSELECT ID, VARCHAR
$ P5 b* P/ n2 C, c3 V. c, ?. ]FROM MYTABLE7 |1 U" {& Q# J h; w% z
WHERE ID BETWEEN 0 AND 100, P% f0 ]% x- x( Y4 H
ORDER BY NAME, ZIPCODE
: E# f+ v' C, V) \( R q7 W% I* D
( }8 g. a7 S( z- M5 sA.给ID添加索引' t* c2 Y& I$ s1 L2 V5 q
B.给NAME和ADDRESS1添加索引
0 f! R6 k/ S% m" ^+ W9 dC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
% F) Z1 {/ J" c' P% ZD.给ZIPCODE和NAME添加索引
& r0 h7 B* o; P" p* X8 p: QE.给ZIPCODE添加全文检索
( ` K% {/ ^! |3 m2 Q/ l% V5 [5 v, M8 y) y
$ z1 u8 `/ \3 [% }- R% |10.执行以下SQL语句后将发生什么?" p& L+ R5 o, J- q) P& b/ Y
& V' ^( o1 e; s* O* ?
BEGIN TRANSACTION5 i& K. ]$ f& m& b2 G a
DELETE FROM MYTABLE WHERE ID=1$ T0 L, `1 W# J. f
DELETE FROM OTHERTABLE
7 q1 l9 D( V" l$ Q5 YROLLBACK TRANSACTION* J, i/ F2 A" W+ Z
5 |" b8 F, M& r' W2 q5 K& t
A.OTHERTABLE中的内容将被删除
5 L2 K4 S& K7 \/ Z+ xB.OTHERTABLE和MYTABLE中的内容都会被删除
. R. h: ^) `! _7 _8 v3 m+ C) HC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
; G4 _# ^3 ]7 R: CD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
( l5 r8 p# W3 |& m {E.数据库没用变化
1 s- `8 v/ U' ?* Z) {
: z" ]- H9 G/ ~; s7 g9 r! S! b- Z' c. s! K' t4 ?" `
11.DESC在这个查询中起什么作用?1 f {4 E# Z J) A( |# K; B5 d
, C% t1 D# u4 D1 ASELECT ** n3 o1 t" Q5 ?* w1 E& o
FROM MY_TABLE# X+ v5 X( |* d: Y5 q
WHERE ID > 0) o' D- _7 E4 z8 ]0 f3 O$ u
ORDER BY ID, NAME DESC
1 z& c; k* J9 u# `2 O
" \( [$ Z3 ]( LA.返回的数据集倒序排列( {6 `: e" m0 {) I
B.ID相同的记录按NAME升序排列
5 F# d% ?- _, V1 d$ I6 @1 TC.ID相同的记录按NAME倒序排列
# r# F' ^% G, Z: ]D.返回的记录先按NAME排序,再安ID排序
# Z& \/ s: m% d: d& BE.结果集中包含对NAME字段的描述* F- q( @+ i4 H/ d; Y! {+ T
8 A* \% Q/ A" ]5 c& c6 l; E/ s
" W# T- c- g+ B: G
12.以下哪个不是SQL函数?
% p6 n$ `" i5 c. w
# I% `! e- [8 [( ~6 t) V& UA.AVG4 D; z# l) {% f0 \
B.SUM5 ?* S+ l& p, e, o
C.MIN
3 f7 `5 y8 b" G+ q6 M. q7 `- qD.MAX6 U7 T# s- w4 Q8 T# R
E.CURRENT_DATE()
# ]- d" ` ?- W
5 L3 M& Y& E* h9 P9 f* P5 m. N) E8 O3 c4 L
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
% c$ O- Z2 {1 ]+ D5 f, _, C
' j( N7 b2 p$ A( E7 [$ xA.该字段必须有索引6 T4 f t6 \$ r+ F% I, Z o
B.该字段必须包括在GROUP BY条件中: J5 j6 T2 s" q9 c
C.该字段必须包含一个累积值
l8 P6 R6 G- [ F, p1 r& XD.该字段必须是主键
" K$ R" a. S: B5 `: _E.该字段必须不能包含NULL值# Z/ N3 k% x! V/ _3 T+ g! {
" U) m- v+ F2 K( d
% m8 f( j9 _8 \0 y# `! c' U: J5 \14.以下查询输出什么?# o, E6 x8 l: J' L9 M) X& U" P. {
" a# n: a3 _. d- qSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
' Q+ Y3 B g& a6 {1 T- d; XON TABLE1.ID <> TABLE2.ID* p7 p) Z# R* x$ L2 O. K5 ^
# F0 _7 d- r* ^& bA.TABLE1和TABLE2不相同的记录* N, H4 O# v8 H
B.两个表中相同的记录! Z& z& }3 S2 V; N3 c
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
& M6 v+ g4 a6 yD.两表中不同记录的条数
( W/ H2 ` L, ^' fE.数字2
% ]* S% X- U2 j, U; u9 m0 m, v1 x0 A' V
& ]5 B) _+ o. |: b/ S15.______能保证一组SQL语句不受干扰的运行?& I; I) u: _5 }8 B
7 y* w; w# ~ ^% q9 K9 s( ]答案:____________: e; Z) Y1 ?' q) C. G# U( }
; ^# X+ B; k$ m. ?% U% H0 i+ e
& C: G: ?: U! Y8 A; U. N: K. U. H0 Y( E1 R' n8 K3 ^
答案速查
2 \' b6 w& Z4 F! @0 \1:BC
8 X/ b; z* G) e( ~/ ^! b, R2:WHERE
R$ B E" t" v$ A( {5 Z; D3:B
" \- e F V. d. q4:E* |/ Y' Y/ a, m6 ~% ~. T- ~( C
5:BD; | d, O# p, `( n
6:INSERT
7 R' Q# _! z L8 u7:C$ R( D' c+ o$ Q% D
8:A
1 k, y* ^# s d/ Y5 M( }4 P9:C0 G& F! R8 K3 t% _9 [: Y3 X
10:E
7 j9 r( A) J. X1 f2 Y% ? `% r' p11:C
) S) X! v2 U* a; S; N12:E
" b6 J4 n( x- _# R+ H$ Z2 d13:BC
9 y$ P, r% t3 A; C ]14:C
* z# q: W! V" p+ I6 Q& u6 C15:事务9 g2 T8 V0 w9 n( }
' L0 g0 ~5 y; @+ [# a' y8 b# @6 n
5 p! O; W* a) p/ F% X/ n* Q/ b. O5 d) D
答案详解
9 @$ C' B0 v; r# z/ n
7 [. i' B6 Z5 }* ?5 Y, \8 j1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
2 p2 Z- U2 j% U& u* g- p
5 b2 z2 o- f9 ~2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
8 W3 l" j3 z3 x- p6 u: Z# T; ~8 D+ K) a% \; x# M5 J( h l9 [, l
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。( y/ [ F+ J1 W0 S
8 f% Y- e0 v) d, d4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。2 @- ]! K" d8 E; x5 g9 V7 M7 Z
P. ]% d& O$ D8 i+ d7 F. E5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
: y+ Y( B8 R' O' p2 U( x+ M7 i7 `& O) G1 ~7 _
6.答案显然是INSERT。. |4 l9 [( r4 `
: }$ F5 a d7 y2 l. d$ p! Z
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
6 ~' T7 J3 w) O4 I. N+ R* B
9 ?- @8 a9 F4 [1 V5 a T. Z8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
2 F$ ~% `! q( q) e! p8 Z8 _# m @4 T
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。" G0 v7 `) M; `7 t
2 m5 F2 d% o* l- o4 ` V' s+ C
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。) h- v, {% Z' m& G+ N4 T% I0 m1 X
" Y- V4 w" [" e11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ E2 J1 L- G% A6 L) v- |# E* Q
: \5 u6 D% Q+ I, V2 j8 s12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。2 c g! ] d3 Y2 g" }8 q2 I" t5 T4 d
, ~, p8 T6 e w" u
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。" b5 u; s9 G# M) j# e* c
' `$ t) ?5 }. j+ D- }, f+ `- F
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
# A9 _& `+ J' K! k. J& ]& j3 g9 E& y, S+ H! X" F m
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|