  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14159
- 金币
- 2370
- 威望
- 1647
- 贡献
- 1318
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
0 w$ I& `2 [0 g& ~PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。9 l, d% x9 G0 D' Z3 q+ U
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
; e% _; {; V6 ^5 M. _ q- y$ r6 R. F5 ]
' R* m2 G3 X# G8 @9 V3 t* G# e问题
3 [+ U, W, F3 ?) [" p+ A+ }* H0 N4 ?. ~
5 S# g2 _5 M6 X/ o/ i5 C& r5 e1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
, M, h4 F/ Y/ C- S% V/ n! G8 w$ i% {# m4 n( z
SELECT * FROM MY_TABLE# u$ o$ i5 m; ~, C {
( N4 ?) Z, w0 v, P% `
A.如果可能,用把查询转换成存储例程
; \- s5 d( h4 x0 kB.如果程序允许,给查询指定返回记录的范围% ~/ m9 u' l4 o) i6 n) A2 B% X3 J6 x
C.如果可能,添加where条件
0 F$ g# i, M5 YD.如果DBMS允许,把查询转换成视图! y7 z9 A9 m# i+ {( y! A
E.如果DBMS允许,使用事先准备好的语句
) p1 j/ |$ p8 Q A
6 K; _$ \% R7 ^* y$ m2 c {8 i, G) s$ [7 z1 Y
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
6 q# z: a/ ]9 m1 j$ S" R; r- H& v- P9 K1 C% O# S" V6 n4 Q
答案:____________& H# w- f8 ?; ~# E* [
& Y% C# |* B6 N- k" d, D
6 U* F- Y! C2 B9 p% i# X: Q8 S
3.内关联(inner join)是用来做什么的? b- u$ J1 a4 A# y* s/ G
1 e% `/ N8 M' L: D1 ^* G8 ~
A.把两个表通过相同字段关联入一张持久的表中
6 P& D. p$ p" ]B.创建基于两个表中相同相同行的结果集
, y) f B3 P4 {$ |6 W: V" t/ V4 IC.创建基于一个表中的记录的数据集# y2 _9 [4 @2 [( e/ Z) i2 w6 W) w
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
9 S, O) q. L& V7 KE.以上都不对
, V! I* T0 F( u. m- y/ c0 p( i! H! |: J( v; a
' y z: ]& r% I' o% S( G$ C
4.以下哪个DBMS没有PHP扩展库?
- H1 K8 Q# N/ W h
) K8 @4 e* J5 F( y5 q* w$ xA.MySQL
" I/ d" p1 ^4 p: m, q6 V+ i/ _B.IBM DB/2
% {! b4 P0 U, C( |C.PostgreSQL" h0 g# v) ?& o4 A9 @
D.Microsoft SQL Server
x, Z1 x8 x( s7 zE.以上都不对5 Z- Q6 ]9 ~6 Q; u$ E/ |% [" G I
0 n( d$ K& p: Y) Z
; o9 K! t+ D: k- C1 ~
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
0 T8 T0 i& E" X& ~& G6 ]
v+ ^( `% {" O$ K) L* w) c% E0 v# C) j6 Y<?php2 I% @- q: K S" H% U: u
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);, ~1 @/ Q1 t$ q. D3 O5 B" y# h
?>! ^0 j8 j8 [9 Q) D6 g' i8 v8 k% @% [
# F* A) ^: t; b: r- aA.MYTABLE表中的记录超过1条- I* O8 U; v* D
B.用户输入的数据需要经过适当的转义和过滤: e7 G0 C/ X' C/ Q, u; d
C.调用该函数将产生一个包含了其他记录条数的记录
& d4 Q, f, q- a. {* q6 wD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除7 g. z% O/ v* p! j/ b* R+ p' _
E.查询语句中应该包含数据库名
. P+ b3 K5 x: M3 u! k
) b: n; q L( W/ m
6 }) k }4 j) S) R* u6.______语句能用来向已存在的表中添加新的记录。' c; `# D5 I! S
9 Q Z1 L# g+ @+ H答案:____________" z( p3 v0 o3 Y( P# C5 t% }
9 y0 {8 @# |% R7 n
0 f7 `( p- y. i- p7.以下哪个说法正确?/ r' u. F; ~) [ x4 I
8 x0 D( W# l9 B3 A' _" S9 T( KA.使用索引能加快插入数据的速度
2 Q1 `6 F2 d; ^; cB.良好的索引策略有助于防止跨站攻击" n/ Z2 j2 \- w' a# e! e
C.应当根据数据库的实际应用按理设计索引
. Q6 l7 d0 O' i$ D& s% {D.删除一条记录将导致整个表的索引被破坏
) H, G$ @. i% V2 Y: Q& ^, BE.只有数字记录行需要索引
1 x/ o3 u) W& D" G9 ]2 P. `
4 e4 p% K: S9 A9 a4 D; b5 B0 |. Y; `
8.join能否被嵌套?
8 E. W, m5 Q( {9 M( b$ I8 s: ]& g6 e3 }+ `$ p% ^
A.能
% L3 @. l* v+ v- |5 X$ J# OB.不能
; i9 Y6 A' v! c4 Q# n, z1 f
* x6 C# q( R! r
% R+ F) x0 u, z2 |9.考虑如下数据表和查询。如何添加索引能提高查询速度?$ D K- I2 B# E# u
; `/ M7 ^7 w& U& o1 D1 OCREATE TABLE MYTABLE (2 o! c1 }. w2 e! o" G3 S2 w
ID INT,
# n7 r/ ?" m& Q' X& _" oNAME VARCHAR (100),
7 a4 k/ ]: H3 ]5 g1 ^, qADDRESS1 VARCHAR (100),) J9 i8 T: f0 {0 G) @- [
ADDRESS2 VARCHAR (100),- C8 P, P7 E7 D! r- v
ZIPCODE VARCHAR (10), H' f. [) H- ~; X2 k2 E# p
CITY VARCHAR (50),' W' a' O1 N. G: t
PROVINCE VARCHAR (2)
& }( d' |8 [& z5 t O, })
1 ?9 k. O( s6 m NSELECT ID, VARCHAR. S: E. d1 j$ N) ?0 ~) t
FROM MYTABLE
8 J8 T0 m; R8 L xWHERE ID BETWEEN 0 AND 100
1 B, H9 ]0 p9 }8 G2 {. WORDER BY NAME, ZIPCODE
- J# j( v: w, r+ K5 k( y- B- O2 ^! \: ^+ ^, C4 e
A.给ID添加索引
. x. C- G* A8 @: y5 BB.给NAME和ADDRESS1添加索引
" j$ n& P& n/ \( Y3 l- VC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引* Q2 T6 m- M# |0 h8 c9 A9 u% w
D.给ZIPCODE和NAME添加索引" h i. D9 V8 N; p5 u* O
E.给ZIPCODE添加全文检索" z3 R$ k W" l
- r+ \3 d j: D7 q1 T# j
! n9 q# u; Q8 E$ B10.执行以下SQL语句后将发生什么?
% t( @% [. J" f4 b& Q6 X
; D2 k0 j% K3 j GBEGIN TRANSACTION+ F7 c; ^; l4 r6 P C" o
DELETE FROM MYTABLE WHERE ID=1- u, g3 l4 Q8 y3 H
DELETE FROM OTHERTABLE, B& K; w. i5 |6 m% I( J6 E
ROLLBACK TRANSACTION
- r B7 A# J2 s5 [. k B
& s1 i; ?% C3 n8 _' O5 sA.OTHERTABLE中的内容将被删除
0 c) K/ _+ A+ Y! i& K6 B: A# X WB.OTHERTABLE和MYTABLE中的内容都会被删除2 k; L+ c7 M3 S
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
: _3 [9 ]/ j9 d& jD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化1 j) ] ~) n8 g% b! t
E.数据库没用变化$ A3 c3 C) ]4 Q4 W
" O6 W' }! x# n. `7 D& k( ]$ M. W! w7 v" U9 z
11.DESC在这个查询中起什么作用?! }' H/ ]$ K+ Z
$ u5 |! M4 f* j& _. ^: n
SELECT *: [( l9 b3 Y H! z8 c
FROM MY_TABLE2 ?1 m5 A! H: `+ x, f; A
WHERE ID > 0
! ]' }* {& B( c1 p# V7 nORDER BY ID, NAME DESC
0 H4 @. D+ `6 \7 | ^% S. M( t i6 G( y+ e$ V/ ^" `' v
A.返回的数据集倒序排列4 r$ T( c, ` n k- t
B.ID相同的记录按NAME升序排列
5 C. x; [! R: b3 F8 @C.ID相同的记录按NAME倒序排列
! o6 h/ q* O$ s- f! i* PD.返回的记录先按NAME排序,再安ID排序
; b4 ]# ^9 [; X; p/ x) KE.结果集中包含对NAME字段的描述' N$ P: ? M m1 G5 y( Y
3 _/ v+ Q' ^( K" C+ K; ~0 ^: \6 |4 F
- O% X! M6 W' ^* O' ~2 I
12.以下哪个不是SQL函数?
$ X( Z8 Z7 V! W9 L- q; L8 Y. t) h3 B
A.AVG! b$ L5 Z! T/ E1 H/ N0 J! d
B.SUM
4 b5 W0 p9 B% U+ U8 j2 aC.MIN
! p; a! C% R5 \# QD.MAX3 L3 o [$ V5 o( M" u9 y
E.CURRENT_DATE()
3 i/ z0 _ t6 d0 Q: @& X1 v0 B- x7 }4 X
: @# b M- z2 x6 x
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?) x! }* c1 M5 x
1 z1 @. M l8 L+ B
A.该字段必须有索引
6 j6 k9 L5 i! [1 {2 ]4 SB.该字段必须包括在GROUP BY条件中
3 o5 X7 S. g2 l6 ^( D) L9 J/ RC.该字段必须包含一个累积值8 M% q/ `* {7 o* s7 R" U( O0 U
D.该字段必须是主键. W, d4 {: w4 e: l
E.该字段必须不能包含NULL值
2 w: \& Y! b' z- t2 X* G/ H) d; P
; u7 G& N+ X' d
6 k+ M& s5 Y" `- g! q5 R* F14.以下查询输出什么?7 {- o2 {9 v. n2 o y
5 u1 L; M. Q: C) v
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
( C% L* L& P$ A2 f4 x+ a- a% q' [ON TABLE1.ID <> TABLE2.ID
E5 o4 N0 [7 X0 X0 B" b
, p* t3 X7 Z, ^1 A& }, WA.TABLE1和TABLE2不相同的记录
6 S: o6 D( [- d' }7 CB.两个表中相同的记录
3 C; z- B: X- j7 ?5 x! J& e3 OC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
! b+ x/ F: E! p& G! e# D: s9 LD.两表中不同记录的条数
- n' s2 B5 y V( G: ME.数字28 P2 s( s. h+ }, r! P+ x: I
! b7 _1 m j! Q' t
* h, w$ V- M' K5 f( O$ @3 [1 l0 d3 C15.______能保证一组SQL语句不受干扰的运行?3 t: g' |* \2 _- n, S
; q8 g% S6 a" C答案:____________7 T; k" j$ Y6 Q/ s4 G
. A6 [2 ] X Y& g
9 v1 \( {2 a# |, o- d3 ]5 P9 G4 z7 J/ c' M) h$ J' J5 S! R& ~
答案速查
}# I$ J; y0 _1:BC0 g2 c% o1 ^2 @
2:WHERE/ ]* H2 r/ z/ j( _6 c. W
3:B" `; M/ |9 s& e% ?: U
4:E- X* m4 W9 c. V) y: c
5:BD; y) g& X/ [6 s/ j& N2 ?+ R! o( s
6:INSERT
1 p. D# N0 V$ v V/ v* l7:C. ?/ m: _! V# [5 s" q% Q5 s
8:A V- s( g5 G# `) r% H. r7 x
9:C
8 Y* S* m3 A" G( ~( K# E. ^10:E
$ s% m' M) u7 j! L7 N11:C" h* J0 ]: s6 Q& X8 H% y# Z
12:E
8 ?% G" _- }' s+ K, B13:BC
' ^3 [3 j, J4 S$ r" S14:C
- L! R+ t# A( W15:事务
( v( \$ _5 I6 D& m" c. y, u$ m( p8 ^( |, X9 s! W! G( r2 G
1 T3 {$ t9 Y8 p5 Y+ M; t4 h) A) X. p5 P* t, ~" c
答案详解
4 S H/ p# _+ M E! s: s
, P$ q* K u. k G, @1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。! ?/ R' [+ T% f
5 X9 {. X# x6 N& `2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
" p J- s" Y8 Y8 q; u# l8 k7 A6 D9 L
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。 {0 ?" U7 i6 x6 a
- v# F, ]3 Q9 l9 c
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
' W3 U+ c; N- D" p
0 |$ h% @6 c5 C4 a4 w- _5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
" } ]# h2 x6 p; R3 Y4 t2 _8 H9 p+ L( Y
6.答案显然是INSERT。" D) W# ?8 {# u0 r# k4 a
0 W6 E T, I& X4 N4 u1 Z% f7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
) ]" f9 W7 }5 s
/ r) X# |2 k4 U2 z2 O8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
0 p% K& ~9 S1 C6 w% L0 O( F4 H _$ ^
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
1 d9 T) [. B" l7 J& Z/ q0 ? W0 a: e+ |# ~0 Q* _: z& a3 K% U) [2 ]
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。# ~5 Z- {% x, `5 V# Q/ m
5 c, `) D* O: _- `+ o' A
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
9 ^! a5 u8 V3 x$ d" {: @
/ x. v; M' n, Y' \0 q' R) P12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 C4 M) x9 B! o v+ h/ T2 q# v- S9 d8 c0 w# D! A/ ^: @- b
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。2 M K# @ `8 |% L' x& s( ~* c
( I5 a% t. t" a. d, R9 e' O
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
1 Q/ E/ X+ z" J! P# G
" l5 N: \# `: R1 ^$ Z1 i15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|