|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。2 [. F* d# ~! y8 [6 u5 ?
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
; ~; V9 W# T' t2 K! k- `% b+ _. N本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( x) e$ e( P8 l! y$ V: o) e
+ @8 a* K' P' o( F3 _% ^% j# }8 Z
问题
( @2 m0 [4 Y' z/ w0 G/ k3 [
2 p' J5 [$ q8 A' ]3 [7 F' Y1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)6 V) E J! t2 H
+ ^/ @) Y% w% B
SELECT * FROM MY_TABLE8 h2 D- a5 h) x' v; a
. N; F7 z6 I" ?3 V4 s6 r
A.如果可能,用把查询转换成存储例程
6 U! P$ ^4 ~+ z% uB.如果程序允许,给查询指定返回记录的范围
$ v4 \5 h/ Y+ n; @' u1 A d; D. WC.如果可能,添加where条件
# L$ V( u U9 P, K, JD.如果DBMS允许,把查询转换成视图" j2 t3 I1 R6 d7 r `; K2 W
E.如果DBMS允许,使用事先准备好的语句
6 ~7 G' v. o+ U' S3 G4 k
6 H% z, `/ l/ T/ U( Z5 m( t, L- J! x
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
8 S, ~: t7 ^3 f; u% Q+ k
5 U5 i* R, Z2 N) `6 _% b答案:____________
- S& y1 }* z( h& e' ^! N9 V0 M
- \, @! k7 p1 N V4 D9 W) C3 N- t2 u' x, `$ P/ G! W0 k J9 n
3.内关联(inner join)是用来做什么的?
' b1 y& O$ Z W/ p8 }$ D$ Y: {
2 w5 G7 X6 p/ ~4 @+ qA.把两个表通过相同字段关联入一张持久的表中
8 W/ H& o6 M6 x# ?4 X# f' d# yB.创建基于两个表中相同相同行的结果集
3 p* G+ |$ Y0 P5 fC.创建基于一个表中的记录的数据集6 `9 T8 j: P$ ^' ^
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集1 H. F& r' K" ~
E.以上都不对
6 a% T* r4 h' [- z4 L0 C+ U) ~ o
. @2 d2 V( O% b9 J2 k8 w/ e
: y' |; _5 P# D4.以下哪个DBMS没有PHP扩展库?* j1 H9 ^! O; V2 s- G( m) }- h
0 f8 U# l5 l N
A.MySQL
. M9 w5 E! ~ P% iB.IBM DB/2
) Q( H4 O4 c( v$ k% s; F3 VC.PostgreSQL n6 X/ D8 _+ D9 h# A
D.Microsoft SQL Server9 v9 H `# a: ]& A
E.以上都不对
0 q4 p8 A |! Z. h" A; c
8 `5 e0 [9 o9 x. g) a; X/ k" `, @2 P' T. g& u9 s
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)( u3 B0 ^& N& t' Q# D! R
& K; r# y8 j- u3 ]& O) I
<?php
& D+ X1 R; n. f! a3 ]+ i- X$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);+ c5 `0 h( n7 \+ b/ \' s' B, f0 U
?>' [; Q' n3 E" s8 p* y
& J8 ?- e) F$ E+ }A.MYTABLE表中的记录超过1条
; h& Q N. l+ m& u+ WB.用户输入的数据需要经过适当的转义和过滤+ V. k- p& P6 f
C.调用该函数将产生一个包含了其他记录条数的记录
$ ]5 ]7 Y# [ V, HD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
6 c6 _8 k3 _3 e( _) L. WE.查询语句中应该包含数据库名! O. ^) v( `4 @- B- d
- D! | _; h. e) `/ _( Z! G T
* N) R0 h% }9 V
6.______语句能用来向已存在的表中添加新的记录。
% J: [( {3 ^$ D# O! P" t) }4 E; K, O: w% B* |5 `( k
答案:____________( y* v& g; `9 x
5 v2 e7 f7 i; p: ]$ u0 u- a- z# I
) r* {& E3 o) u" C; I9 I4 p7.以下哪个说法正确?! v/ i2 L8 \7 Y# A; O$ }3 f- \
& A5 e- S2 _$ wA.使用索引能加快插入数据的速度$ ]0 o! N' j' E5 T0 \: S8 C( o/ g
B.良好的索引策略有助于防止跨站攻击4 m5 |# [2 y8 o/ @
C.应当根据数据库的实际应用按理设计索引
4 N) S. z q* Q1 ^5 cD.删除一条记录将导致整个表的索引被破坏
& ^# k: n. J4 i- J+ Z. v$ UE.只有数字记录行需要索引
/ d0 v5 T9 V+ ?& N3 j( e/ Q0 C2 g6 B/ \1 W% d& w) Y
. Y4 b ]8 D. ~: k1 x/ {2 w8.join能否被嵌套?2 X3 B H3 T, }9 E4 e4 T
$ _, y# a; u: Z5 l6 a* G
A.能
7 r) {; P! _7 A- G; Z) |2 AB.不能
3 Z6 x2 r. g1 q6 y7 `! J7 N( Q, h A# ^0 d1 Y( ?" c
$ @2 p Y; Y U1 ^
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
0 K8 }# i3 E% L: o+ V
% }2 h6 }( w: c# w5 q! ?CREATE TABLE MYTABLE (3 z+ ]% B, H* j2 |( N+ b
ID INT,: Y0 u j7 i- m5 O* t
NAME VARCHAR (100),
7 w5 r6 F5 O+ ?3 n5 k7 I* P, XADDRESS1 VARCHAR (100),' i* R3 h/ p" I* M/ e$ g& K
ADDRESS2 VARCHAR (100),% N6 \, P, b# n+ i0 Q" _8 F% R' W
ZIPCODE VARCHAR (10),; i' w4 D6 ^ s
CITY VARCHAR (50),
' s* P) `* e6 Q3 G2 m7 ?8 l( Q; d7 B. sPROVINCE VARCHAR (2)
# [2 `0 I3 \- W4 x( c' X+ W)
! \! I, p, R4 J1 rSELECT ID, VARCHAR
4 H0 l1 @+ [, A: H( D- O) xFROM MYTABLE1 `7 Q7 C, V# w9 T
WHERE ID BETWEEN 0 AND 100
- B' u' z/ d6 ]1 q4 PORDER BY NAME, ZIPCODE
' \. ~# e- h( L; i4 V. R: i
0 {, R6 g+ T7 a# z+ u' iA.给ID添加索引
8 p1 O& w2 M& g) \B.给NAME和ADDRESS1添加索引
. }3 \# z i( ?4 X% c% Z, f$ rC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引6 H+ @3 o( Z1 M8 ~2 _2 c0 q
D.给ZIPCODE和NAME添加索引
4 |) s" T! I2 q: X, o' iE.给ZIPCODE添加全文检索
1 i/ q& C$ D- ~" e$ o# ~- C$ [( C; q8 z8 D
, N( B( D& M) e2 c* T# q10.执行以下SQL语句后将发生什么?
. A. D X* B& h6 B, U' P3 `/ [' h- |: }1 O
BEGIN TRANSACTION# ^6 M W2 }% W# H v+ w) X
DELETE FROM MYTABLE WHERE ID=1
8 _0 h& _' F% Q9 b& e2 jDELETE FROM OTHERTABLE
& |1 c u: o3 r/ D7 }ROLLBACK TRANSACTION
& z# C: O6 m! H" N
* q$ D: q, c E6 p' v- ?A.OTHERTABLE中的内容将被删除
6 v3 g/ t( }6 j0 y! N% H5 x% r" tB.OTHERTABLE和MYTABLE中的内容都会被删除2 r3 ^: g' B0 Z! p
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除2 C5 E5 ^; k# }8 m
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化$ J. }8 [9 y$ { a
E.数据库没用变化
1 W+ M f( i; G7 j& H5 u R# u q ^* E* @: n
0 p- v) X! U! G$ ?
11.DESC在这个查询中起什么作用?) I. |3 M$ ~/ N2 ?
3 ~' y" |& n6 n+ @
SELECT *0 {3 z7 b' T) a0 c5 ~# Q
FROM MY_TABLE6 c2 k& Z; m2 o! D) I+ a' X. O+ M
WHERE ID > 0
( z' y8 N2 A" L& g* u" N; i* yORDER BY ID, NAME DESC
6 b' H7 [: v+ M( A2 j
; b5 X/ V" l9 e* ^8 M, f4 n9 UA.返回的数据集倒序排列) B, V8 N6 I H. x
B.ID相同的记录按NAME升序排列
5 G! \6 H( w! `C.ID相同的记录按NAME倒序排列& r$ V8 z9 R2 v7 e1 i k7 O
D.返回的记录先按NAME排序,再安ID排序
* J2 j$ ~6 \$ ]E.结果集中包含对NAME字段的描述- ]4 P+ R5 K3 e \) N' w
( s* q/ f/ x( ?' G
' b9 y! j, G% p% i1 l8 X
12.以下哪个不是SQL函数?) O8 x9 `, `1 A. D c" b
6 P) y( a* M0 o# a
A.AVG
% l y: ^" [3 \! f& @$ N0 sB.SUM: D1 V3 A- B7 [8 r) I0 a
C.MIN
! i( o" p7 x. f7 ~D.MAX! ^, Y5 z5 H' Q$ h' M& F
E.CURRENT_DATE()
% n% B- _- d+ |% M5 s/ x% f, k: A8 \ m5 W3 I
7 |9 M# H Y+ V5 P. T! C5 Z% A) f$ }4 t13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?" S5 z& O% b5 t9 s* r
4 f7 D( i$ P4 c4 r# b8 |2 vA.该字段必须有索引1 F" K- P- L7 L8 |* Y% F
B.该字段必须包括在GROUP BY条件中& o; ?# C6 g( J2 R, K3 J( U
C.该字段必须包含一个累积值9 f B, D% N$ [; I
D.该字段必须是主键
, T' c" i9 {4 a( Z3 N) b* [E.该字段必须不能包含NULL值
7 W5 J! y! U2 ^2 ^5 ~
; k* d% c8 M6 w6 I! W7 t4 v( f+ `) b% _5 X. P/ C% t# }2 |
14.以下查询输出什么?
4 R# F2 ^5 a/ \8 N6 ?/ B0 P$ f( d! E& q! d2 M9 J: \
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
: R0 Z; x& y j$ y5 VON TABLE1.ID <> TABLE2.ID
R+ d/ v9 f) O6 _7 J6 u) ^& }: ^. M/ e! U7 L8 D7 Y& T* a7 _
A.TABLE1和TABLE2不相同的记录' a6 k+ K, W( {) M6 Q2 U
B.两个表中相同的记录
8 p7 r" X! d5 ?0 qC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数$ k! w) I" J8 S' P' K8 B9 \! R
D.两表中不同记录的条数* s# |) E- p% v) l
E.数字2% g" P. z8 Z* i- E
. D3 q- e. @3 \( W h( ^# n: h: o& S- ^( W* N& Q7 i
15.______能保证一组SQL语句不受干扰的运行?
; q! B2 e" K" I" x* O6 t' g1 ^ i
" S9 M0 I! A* Y答案:____________ @7 l7 q5 ~; e
+ ^# n) s( x5 |
A2 h* r' P% E' ~+ q% z
3 ?$ t7 b( }3 K$ d答案速查
+ f) b3 K Q) ?+ ?1 q1:BC! d1 S' F1 R1 z" \
2:WHERE
3 u1 Q3 C" W' N2 K3:B
; ]4 S) u2 N# I% A7 v/ _8 p) j4:E
" P+ W |9 h+ @6 i% p; ?; v5:BD8 m! G* c: R5 ]
6:INSERT, F. @6 H9 w( x+ X9 C
7:C
: e1 a& c) `% x( x, [! o( E8:A
! _# Q5 S/ M0 B' L9:C3 z" B3 ?9 Q! L3 x6 q9 C
10:E1 S% q% |4 Z3 ^) W- P( t0 V+ C: @
11:C) T* u5 c) _+ h- P* n6 I
12:E
- m! G6 S+ f( Q. N$ w, q2 |13:BC, j7 y' {2 u* t9 n
14:C
' N1 `# u+ D; i8 w# V8 H" H& W- Y2 f15:事务- W# w5 l: p+ b
6 @% Y$ ]* |. }; r8 S- ]# F! C/ K4 {; `6 g) _1 J0 u* }# [3 ]$ c3 B
/ d5 t7 w2 K$ z5 u" M答案详解
$ P/ S- g9 X w' F+ z9 H+ z# S% m) |+ @
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
9 [ W5 D, N v0 a) G* w
9 U0 x$ ~6 E6 y0 ?2 }2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。5 _- v# G+ o1 f
; @$ \1 c; |' S8 Z( c5 g
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
! v! _' B" G! r- B. A' ^% Z% E7 }* Z( M$ k, j. u# I
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。0 Y( w" y3 I/ l3 I) L4 J
1 b0 R- A B+ \0 C0 a3 K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
$ Q+ Z8 c" ~ I+ y
+ a2 S# g" U. C3 K+ [( A# e6.答案显然是INSERT。, f7 Z1 k, W8 l0 b; U& l4 O+ B
- ~' B' L2 ~7 N5 h9 A7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。' j* J+ B* D# f
/ T/ w2 X2 J/ Y" [" P0 v! Z
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
K' h& R: b5 P" o2 I k/ D
- | \/ k- C1 ]8 ]9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
1 \# G/ X! C4 Z7 V9 Y2 m/ U
, n9 d- B2 |( l* n1 Q, G2 x. E( P10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。' E0 X1 p; }" Y9 y
+ ` b+ T/ Q. V H5 i' R- B$ M11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。2 N2 A, \3 J) `0 y* {) v
# b3 M# R' }* a) T) h" B1 t12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
3 o7 `( J) q3 I: T) N, c4 a! c; A8 Q1 g, G0 [/ M5 Q
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。 u% m* I8 O. X8 k0 c {6 p
4 v$ I8 `, a5 U; e {8 T
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。4 v+ z7 n. W& @8 S4 v7 `
. l1 _7 Q7 i, O" G; Y! s* x8 v15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|