  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。! ]3 g5 ?+ `# r9 ]! A# x7 z' Y) F0 h
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。6 k! p* ~% a6 F0 Z* X' {3 u3 \
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。" w' k+ @9 `' n; E' v& M4 Z
8 p3 R% o D1 e z9 A( C
# f9 A* M: O/ y' |# i( U问题
G6 j4 d- K/ [+ Q% f* J
* `/ D, [0 [# y/ M4 L# X0 t7 Y1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)! P! k2 D- ~+ x# ?/ R3 G
' b. R8 a- ^0 Z1 ~1 T; |
SELECT * FROM MY_TABLE
8 R% I( y, d: \. c* }6 w
3 T$ U D' B# Y5 e2 Z' a! p dA.如果可能,用把查询转换成存储例程5 u, Z* B4 W4 ^* G8 B
B.如果程序允许,给查询指定返回记录的范围6 c. J2 e" s" Y( Q
C.如果可能,添加where条件/ h$ l# P* C2 ~8 {9 ~
D.如果DBMS允许,把查询转换成视图. Y9 D8 d! ^4 A6 k+ w
E.如果DBMS允许,使用事先准备好的语句
' ?8 l. r8 P$ ^* ~& V
8 `: ~8 q1 `6 u" A8 M/ L: X0 ], V! Z6 Y0 h3 N0 [
2.可以用添加______条件的方式对查询返回的数据集进行过滤?7 d' V4 ^- l' x* }4 J6 L7 j, K
5 l* b( N" [, x4 @答案:____________
% D Y2 D3 p6 @( o% A
& L- A- X1 F9 L! J. M3 V: w
0 o1 t5 L5 g# {$ S/ [3 \4 S( w3.内关联(inner join)是用来做什么的?4 ]9 G3 t9 e* R: J/ n) }: e4 t3 v8 F1 @
5 p* ]0 G% a* d; W0 O O
A.把两个表通过相同字段关联入一张持久的表中5 P( y d, C4 h: s( D' a
B.创建基于两个表中相同相同行的结果集; f, o! e% w" c& M) G0 u$ O* L7 {% \7 E
C.创建基于一个表中的记录的数据集& u3 d1 I# y6 } L
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
$ D" Z, N2 t! d8 Q; F4 w# eE.以上都不对
1 u4 D7 T( B% X- [5 s: J+ E B1 N+ ]; L2 [4 }5 G" V: ^
% F6 o7 S* p/ v1 g
4.以下哪个DBMS没有PHP扩展库?8 @ }0 _2 w, M2 G
; V% x8 O% W i6 |( I
A.MySQL
$ }# p/ S a- W3 J* X/ EB.IBM DB/20 s7 w- q1 M7 u; Y/ x+ d
C.PostgreSQL' [+ m# ]+ a1 m! {: C. }
D.Microsoft SQL Server! h" y; |1 F s, W, i* m& O
E.以上都不对; H; Z- ^* m5 y7 Y0 a- M. z
( h+ B6 b ]8 i4 k( j* b
5 z9 E( A7 \. b1 y9 t5 e ]7 |0 E5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)9 t4 [1 ^7 W5 S- i$ J
]8 l8 R, f u# b. E
<?php6 ]6 p; [+ a& Y6 ?6 @
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);4 i$ v7 y6 W; E v
?>
3 A5 {2 e6 S' |8 i' g
: d2 V4 S' ^/ e4 Z6 c# F/ O- dA.MYTABLE表中的记录超过1条( N+ X$ _% }( ?# l% ], r
B.用户输入的数据需要经过适当的转义和过滤
) }6 Z4 J3 m9 k8 b, l- I6 dC.调用该函数将产生一个包含了其他记录条数的记录
, f+ s( ~$ y/ ~2 t! K' n* @D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
5 h2 K! }% Z9 p% }$ rE.查询语句中应该包含数据库名
2 M/ g9 n' `( T6 H8 F' h% j i6 @; {' x' L$ N8 w5 T
! t( S! u% H3 m: y, o
6.______语句能用来向已存在的表中添加新的记录。9 J) D; U# `. v7 X- B0 m
6 j+ k& B- } I: ^& G; R' T) D答案:____________2 O0 b* T' j2 ^1 |5 c! \
! ~1 l4 p. r5 p2 D5 T& V2 C, {
; x, a, _- g; {% A' S/ L5 Q7.以下哪个说法正确?
: a4 R# D1 W+ P* Z% q) `. C& U3 z! b* R% c
A.使用索引能加快插入数据的速度
( z* {- ^$ y8 MB.良好的索引策略有助于防止跨站攻击
$ ~( @1 y2 e! F, bC.应当根据数据库的实际应用按理设计索引 s+ C5 p+ _2 p; \
D.删除一条记录将导致整个表的索引被破坏5 R# ~: | D* A3 d
E.只有数字记录行需要索引3 V9 c0 P. [1 Q. @/ s8 v
- q: F( ~" X% o* `* F2 b( s# J0 A R' C1 ]) f! w! e7 K* M
8.join能否被嵌套?7 H% ^7 n1 ]- w1 H* b& S$ W1 @: `
- Z/ g4 a" A& F0 ^& S5 d7 pA.能4 n! ?1 Q4 i' X0 c" W6 A
B.不能
+ w$ }- M) `# V% L% t0 Z( x+ s$ r; ^- U& Z0 `6 F, r
, A9 E. x# D3 W- \# c8 Q; q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
( d- X8 S6 B( g4 e* v& K. L1 U
4 E# x, G8 l3 c @( MCREATE TABLE MYTABLE (
- {1 }3 s% m/ Q& IID INT,. n& a) M6 F0 ^- Z, C. d9 A
NAME VARCHAR (100),: Z( z' j$ g& a' w3 ^! g
ADDRESS1 VARCHAR (100),
! e) r- l9 A$ ~+ ~ADDRESS2 VARCHAR (100),
: g0 f8 p3 r) ?: O# q: u+ D! K) tZIPCODE VARCHAR (10),
5 e, F3 L @7 j& J9 K. l6 MCITY VARCHAR (50),
; ~# S7 g: _1 E' {PROVINCE VARCHAR (2)9 L9 t" h0 B+ I
)/ P7 C; u8 O" h9 I9 o
SELECT ID, VARCHAR( n# _6 P4 y, {4 ~* Q- N S, Y. c
FROM MYTABLE
; O! V* C: e% N( EWHERE ID BETWEEN 0 AND 100
H( l3 |0 J- @' c, k; ^ORDER BY NAME, ZIPCODE& S9 W$ r& u6 N. p$ R7 q
" Y& w( `( P0 n1 M. fA.给ID添加索引5 G: Q1 P" `; Z0 u# Y) }) ]+ t- y
B.给NAME和ADDRESS1添加索引
! ?6 n' Q1 ], L6 x2 dC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引3 C+ I R5 R, f* a. L+ I9 |
D.给ZIPCODE和NAME添加索引
; M9 O4 X7 S6 z$ k2 qE.给ZIPCODE添加全文检索
/ U$ x1 s' R- y. c1 ?
6 d0 T6 k8 r1 f
1 V9 w6 Y x5 o10.执行以下SQL语句后将发生什么?# a7 Y8 I2 {5 S
$ D: h5 T7 _& q+ S. x5 K0 hBEGIN TRANSACTION
5 O! r5 [: P2 x, kDELETE FROM MYTABLE WHERE ID=1" l6 F' Y/ r, ]
DELETE FROM OTHERTABLE8 c# ~- f3 w% n% S6 o% R4 o' M2 ~( y
ROLLBACK TRANSACTION
+ v3 c0 T' N. B5 Q) }+ G
( X' |, }& q4 g8 w5 y* f" YA.OTHERTABLE中的内容将被删除
; d' H$ D9 g S% Z( b+ aB.OTHERTABLE和MYTABLE中的内容都会被删除
( Z% r# f. e x# R7 S6 OC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
0 A& v N+ x# z. |! Q& p8 eD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化/ I! l5 r) F0 _7 @ M
E.数据库没用变化
$ n* _& N l6 B8 P
+ }( _, e" I r+ b- T8 A
; R' g! N1 |4 b1 [0 D11.DESC在这个查询中起什么作用?/ D& ^5 f! a3 q5 `% X# ?5 b4 x
# r2 }: ]5 e7 v5 KSELECT *0 `( r" m U) N! `5 ], R
FROM MY_TABLE
7 c% E3 Z) ~$ K1 [, @WHERE ID > 0% a( W( g. G8 m, J0 f
ORDER BY ID, NAME DESC& _+ A- D2 K& \; M
; _9 U+ p3 I+ i+ g- OA.返回的数据集倒序排列
* }% ~/ t/ N* [ S0 W QB.ID相同的记录按NAME升序排列
0 T9 L; J) r6 S* w2 WC.ID相同的记录按NAME倒序排列
1 T' R9 Y* g' z* PD.返回的记录先按NAME排序,再安ID排序$ P7 E% g% p, n; v0 M
E.结果集中包含对NAME字段的描述3 ~ a; H! P% e9 v/ P5 D' W
* Z5 E1 G3 g& B
1 g4 \+ o* p/ y/ s c12.以下哪个不是SQL函数?2 a- H" Y& Y% ^
4 J9 d: D, l$ h
A.AVG
/ T8 H0 Y: r( [3 ?; n2 EB.SUM
$ c K" s% n! y3 tC.MIN
) ^" R! ~8 c. s) s& r3 @3 d# Y" aD.MAX
$ l- X9 _% x5 A2 p2 ?, X+ ]1 [E.CURRENT_DATE(). G# n# x9 J; T; k
8 D& w' ~1 R4 E" p# o F( ^8 S' g) i+ A
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
2 V+ ]) ~5 g0 {; @1 K) n4 o) J8 g: h% S
A.该字段必须有索引& x/ W0 V2 X# v6 m; t8 \. u
B.该字段必须包括在GROUP BY条件中
1 Y P p0 g+ X. _0 p MC.该字段必须包含一个累积值# h6 q, o' Q! j. I8 z: A2 v+ W( `
D.该字段必须是主键
8 [+ h$ K& n VE.该字段必须不能包含NULL值6 u' n0 f1 {- {: ]
6 m- U3 q# g' ?* i) k. i
8 _/ Z6 s8 x+ e |3 l0 ]14.以下查询输出什么?2 e! l! i0 a5 v* ?
4 b, j7 Y% g+ K1 V B2 q) X+ u( w
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
. @( O/ T& k) n. M% LON TABLE1.ID <> TABLE2.ID
& }( C" v6 V" d/ @6 g
( ]) L; C! _$ [* V% O, JA.TABLE1和TABLE2不相同的记录
# r0 E& j0 B% y2 SB.两个表中相同的记录
+ B$ X8 W9 I# [, e- i/ V5 ^C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数5 Z4 X. E4 h/ z+ R M. k
D.两表中不同记录的条数
3 P) b. G& [- R/ a0 @E.数字26 D! O) S4 L! |" f; r
. b l. i$ O/ l. b
$ x0 x5 d9 d+ N& _, x15.______能保证一组SQL语句不受干扰的运行?' V" H3 g( ]9 u1 @
1 o2 s7 s# P" P, Y% p+ X
答案:____________
* y& S' O+ i6 m) G3 U4 {6 E
( w! I4 a4 W, z0 U% l; I% z5 x5 \; K; ^4 t
( J7 o0 R4 B$ |$ i" {
答案速查1 C( Z& N$ q4 ^! O, Z. y2 _
1:BC
r/ ]" d3 Q+ U- U1 k2:WHERE
' I( {' ]+ r% A+ ? C3:B: y9 U. c; E. ~3 {
4:E
) a4 m% h* s5 d5 l3 G- x9 |% X5:BD
. s5 A' B. Q) W2 B+ l+ _2 x6:INSERT
% l( R, U' O4 m; t! J& }; y3 R `7:C3 f2 [8 \8 }- I$ Z/ L# |7 p+ d# z* T
8:A
0 w& |- t* W2 ^0 |% J9:C
4 g" s% @$ }% `2 b/ s1 c; J5 h10:E
j) j0 d# T7 t11:C( \$ a4 D' s2 J1 \. B, x
12:E
& s: i2 E7 a0 G& j4 T @ J13:BC
* h0 y6 R9 M0 V# N _14:C
L) \% g4 ~. W/ e# g q0 t15:事务( d! b- C2 ]# A1 P
X! r; S+ l$ y* H! o: i' \
) E& n: }" p4 p9 ^
0 N( U0 @$ U1 X; Q& P+ x6 D, d答案详解
0 H+ Q& i4 b1 W: m; S8 a8 ?% m1 v- B0 S# ?# ^
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
3 t* g$ |% k. x' @0 y$ t4 l2 D
% Q* r8 N z2 N' i2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。( M4 g) G6 B7 A- M# M- V$ E: B* E
/ X1 g/ p% ^9 f3 I; t3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。5 N) ~) s4 o( n. L
2 |; {: a6 M+ f9 E% ~& U
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。7 @7 _4 }- P G, Z2 e0 U
% F8 J3 K4 d% W& B5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
2 o7 V& F: }$ Z# x7 h1 W8 i! M* [
6.答案显然是INSERT。0 a9 Y. {% s% y! N3 q+ J9 h
! m) h8 f- K, t
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。: U; r* w% e; ~% e, K% Q# t
: p V' v. G) I+ \. u* r5 x+ E
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 w s, I- ^$ N6 Y0 \: Q* E
. @1 g. ]9 V( f6 I6 l
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
3 I3 j) }, d1 B. S* V9 w/ _
* O# R. _+ e9 E, p7 P6 [10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
! K) t! }: Z, I1 g- p
1 [; P; N, K- [$ b11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
6 U# ]. k3 B- O' ~* G2 X2 k
+ V- p; v- w4 K12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
3 a2 v+ W5 h+ O/ u; D; Z& D
" \5 V# V0 `7 d4 ~" x' T13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。& A* x/ z) F. P* D% J" g& X$ l# k8 }
; u, \8 a0 b6 O/ T& d3 t
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。: x7 i* K( W U9 B0 `
, A. H Y! t8 S* _8 a7 l
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|