  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。! {- H- \' u. U
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。 q/ f6 _& k( G# B' I
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
/ p2 A) m* g. w( Z* D4 d7 Y! I8 J: P5 ]+ {1 w+ O# j
% S4 m* T, a% _4 `: {3 d2 J8 F问题
# q* ~/ z. Q: k. s% w2 K. E) Q3 G( |
- `, T) v1 f, t0 u- r1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)' ]' k" O: U1 \) I' v/ V' _0 U
1 A8 N) i. f6 ~; |
SELECT * FROM MY_TABLE
3 W% U2 e$ c! S: Y4 @5 u* [7 d7 w) W0 H+ q
A.如果可能,用把查询转换成存储例程" l2 S. Q# ]" l1 q) `! I
B.如果程序允许,给查询指定返回记录的范围3 X( G' \/ ~( s1 I: G6 v
C.如果可能,添加where条件
4 H( _' j! W4 z- @% GD.如果DBMS允许,把查询转换成视图
2 O" Q5 _5 `3 n e6 z" [E.如果DBMS允许,使用事先准备好的语句/ H1 V3 o2 [2 y
6 f& w' ?/ ^6 e$ }2 z
W* u. D; A0 h: z. M- w
2.可以用添加______条件的方式对查询返回的数据集进行过滤?, X; q; G2 `: K
# X' H4 U$ B. z& n答案:____________' Q5 ]% f% }" o) ^+ z
6 I& Y7 R# q* _
0 [/ _, t- y, `4 x( m% u3.内关联(inner join)是用来做什么的?4 r# F8 d2 T. p+ p' C
! Y: b! u' [3 }6 k2 M) s; H1 n* FA.把两个表通过相同字段关联入一张持久的表中& R4 ]! S( E$ j5 H. T2 t' `0 I
B.创建基于两个表中相同相同行的结果集/ T# v. h8 }5 M$ G
C.创建基于一个表中的记录的数据集
0 a/ Q. q3 s m: C rD.创建一个包含两个表中相同记录和一个表中全部记录的结果集! O- n" I$ d' u1 g4 I
E.以上都不对% W m. ^" k+ \
- t' }( A' E) q+ X; x
# p, x0 O# q- i8 I( `. D( N4.以下哪个DBMS没有PHP扩展库?, i+ s/ u% q$ \3 [
- f4 r8 n& Y1 u) I0 O7 J; k
A.MySQL) g! M ]' ^8 v2 @6 C
B.IBM DB/2/ D+ U% e F, E7 l7 @7 o
C.PostgreSQL9 W* _& Z r1 I
D.Microsoft SQL Server3 w7 K2 V" n/ n8 n$ I5 v
E.以上都不对1 B" ?& T5 E8 k0 i" N/ u, X/ i) _
& j4 o+ h4 ?1 W3 D( N' k+ h
8 x* c) t: f8 l0 G, T5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)3 K- s) T ~4 |: l7 n; `; w. c. I
3 W& m# I: b( ]+ N; e% \; Y
<?php( M& K- d. H8 Z, K; K
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);, B; f/ M/ K7 \' ^, {) |
?>
3 g8 i9 f4 B9 o1 n% G7 E" H0 |
! `0 O) n4 M9 H/ @7 oA.MYTABLE表中的记录超过1条
7 Q3 w u7 r I3 h# V0 [, W: x+ M( h, I: DB.用户输入的数据需要经过适当的转义和过滤
: I$ e( G2 Y: YC.调用该函数将产生一个包含了其他记录条数的记录8 B# Y( r$ r d' B5 n
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除# a; S0 S- a7 E c# C6 E0 e
E.查询语句中应该包含数据库名, o* b8 U" Q$ \4 J+ T7 K8 n& S4 E
$ _# G" G" o6 v, w" S7 p2 G+ V1 w1 e7 [' F& G
6.______语句能用来向已存在的表中添加新的记录。4 q) i( N4 L/ U
% V: Z) w, {/ Z5 ], b) z9 b4 R. }& c4 l答案:____________# ]9 d, V" Y3 M! N* V
3 [- f6 S+ E" g# r7 {4 B0 E
- @- B6 {; u, P: x7.以下哪个说法正确?" ^: g2 v$ C# W; W6 b- Q
* D( k; N9 S9 Z n# X8 R( p& NA.使用索引能加快插入数据的速度( k& x# N, @; n& n7 @3 o, t( b
B.良好的索引策略有助于防止跨站攻击+ i6 y7 r7 R4 W/ E f& [0 W
C.应当根据数据库的实际应用按理设计索引
) ?9 Q. ~- X3 S/ {& g; aD.删除一条记录将导致整个表的索引被破坏$ p' i$ C* p& H! a
E.只有数字记录行需要索引
8 x& U1 b% h! K6 U' j6 o% e5 x5 N1 P8 v6 i E9 N" E, e% U
6 f: U5 ^0 y7 w. n3 m3 d
8.join能否被嵌套?8 \0 ~' c2 O9 d1 G; l
7 B/ \$ l! P8 J& I. M) B. B
A.能
6 I2 v. }7 U2 r( h* ^6 SB.不能
; @+ L" g$ D1 {) w6 G- t
' n2 v! `& n8 g3 y$ Z4 I0 v* z
+ _9 o/ z9 N$ Z9 g; y1 ~$ R- f9.考虑如下数据表和查询。如何添加索引能提高查询速度?
: Z: t4 ~+ c* n
7 \* A2 L/ v! P' e4 u0 z' CCREATE TABLE MYTABLE (3 I! _, a. ~: S& G
ID INT,4 L: _% G( h4 W6 ^9 \* H% c3 F
NAME VARCHAR (100),
9 o- @' \0 o# O% q2 [ADDRESS1 VARCHAR (100),; S' f g) o0 d! S1 r
ADDRESS2 VARCHAR (100),8 u- s1 E7 Y( u4 m3 t
ZIPCODE VARCHAR (10),6 S9 v: I0 X3 y. U2 q0 ^3 F9 P
CITY VARCHAR (50)," L+ K$ c5 B9 C; e' R5 W$ P
PROVINCE VARCHAR (2)
$ c- S- l6 n8 r. y)4 P2 [5 l5 j) f- M
SELECT ID, VARCHAR0 D; Z/ z/ u, ~# d, h
FROM MYTABLE
3 u+ F7 u, a$ l( MWHERE ID BETWEEN 0 AND 100
3 ]; Y3 b/ D+ @. B; k0 z4 B/ X' UORDER BY NAME, ZIPCODE+ s) F. p' q: \0 }
5 m5 M6 e$ [1 p) uA.给ID添加索引+ T( b. u+ ]2 O8 e8 x; I) J6 k
B.给NAME和ADDRESS1添加索引' G2 A c* Q# H$ k* V* C+ v
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引& b- w# G* n6 U, w
D.给ZIPCODE和NAME添加索引( ~0 X1 x) x+ C% ~) o
E.给ZIPCODE添加全文检索0 J: r' s# T* Q0 ~ T
# t" o6 |2 W% m; y. _5 ?2 p) S
) D B" t8 b3 j. T7 P0 {: F3 M! S; l( h2 B10.执行以下SQL语句后将发生什么?1 I, x1 S9 J4 j0 a
( Q2 s) S# g7 M8 z7 KBEGIN TRANSACTION
5 ]) M4 @/ X# m3 I i. QDELETE FROM MYTABLE WHERE ID=19 T. T3 k: u" u9 w& ]4 |) M
DELETE FROM OTHERTABLE- E/ \6 }; O5 X% Z) s" i, K
ROLLBACK TRANSACTION5 m' T9 H8 i1 `! n" M6 { n* E) Z
2 w/ p% Y* i8 H* b5 yA.OTHERTABLE中的内容将被删除
0 A/ J4 w( L: ~" J8 O. r8 oB.OTHERTABLE和MYTABLE中的内容都会被删除
1 ^% M+ h! c {5 W) E9 }9 LC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
6 q( @5 @/ l! }2 v% \ wD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化$ a+ t' y3 U/ _' v9 S9 K+ m1 X b
E.数据库没用变化" x# J& H5 ]$ E% E2 D
4 D2 m/ C+ w7 R: P
. `+ w; B$ F8 \/ m, [2 S11.DESC在这个查询中起什么作用?
7 I4 H) M5 @2 m* u- H
5 [7 G$ m( i( Y1 k( w. S9 \& W% c. x( fSELECT *9 h8 \7 X1 c3 }
FROM MY_TABLE
, F' d% X& E# ~4 U2 r. T8 d$ YWHERE ID > 0
8 B; R) i/ G4 K+ N+ g# ^ PORDER BY ID, NAME DESC
0 E+ P) Z% u/ Y: W8 T' \0 f: \: x" y3 y
A.返回的数据集倒序排列2 t5 L- @* s1 |9 s
B.ID相同的记录按NAME升序排列; b6 I! J0 N4 N- Q, m
C.ID相同的记录按NAME倒序排列 R5 u; D/ C: a" d9 d
D.返回的记录先按NAME排序,再安ID排序
* ^& ?7 N5 [6 k8 c3 UE.结果集中包含对NAME字段的描述
- E2 s) [5 e5 G( w x8 S
2 N# S! I6 R& |& m* m
$ J: a7 c. I: t8 \& V12.以下哪个不是SQL函数?
3 Y% L& |1 z Q- y' Q. ^- ^
: i8 C- k7 N7 o+ F# l" hA.AVG7 T' k! C- I! q6 N4 \
B.SUM
: q9 K; m& |. dC.MIN
1 N+ n' h% m7 n+ F" TD.MAX
. E" `0 T+ {6 @3 }' DE.CURRENT_DATE()
3 z9 M) i9 t* m* }& l
1 {0 F% _' C0 b7 N* y r
3 y. m% X I, ?- j: v13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?: X; E+ U* Z9 m9 d! R
1 z- q" L0 B# e) J: |
A.该字段必须有索引5 ]; L" Z) a' Y/ o3 w! B
B.该字段必须包括在GROUP BY条件中 o# P/ ?4 e9 f$ h/ S0 n
C.该字段必须包含一个累积值! y* c, B1 n: u( l, V# q
D.该字段必须是主键
8 h- G9 H( {$ i4 ]& n' o5 C% t4 bE.该字段必须不能包含NULL值. f) H3 G' b6 | f v1 @, ]
- `0 j; r2 Q. |$ F9 x3 z% a: u* X/ V
) n' [% k( K2 J; ~) g
14.以下查询输出什么?& D/ u) I: A( R$ |
7 g% ~# _1 L7 x" oSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2& k1 m5 k) ?' J" V1 E9 H- u: q
ON TABLE1.ID <> TABLE2.ID
" l. t4 m2 Y. E4 Y- H( R; `% M; i9 r
A.TABLE1和TABLE2不相同的记录, u j. b8 I$ s! g) r
B.两个表中相同的记录, @( {/ @9 ~/ X5 R6 i
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数8 E( r3 D I1 ?; ~7 T: t
D.两表中不同记录的条数
8 U( r$ J% S+ o7 R9 `$ S% uE.数字23 l+ P ?7 D- G! m
2 Y, a7 R% q$ X5 A
' T& ^3 W$ c* S" O, m7 B( k4 |15.______能保证一组SQL语句不受干扰的运行?
) q1 t, ]$ `3 Y- j- I% R7 w2 H$ x, C: _( E/ E/ S
答案:____________
" D+ K1 P& K3 D! f+ [. Z
# V' O( a' _% S5 T6 \8 I4 s3 V6 F6 ~0 J
- Q) ?' A9 p+ N
答案速查' s5 @. r1 r* g2 ]7 }( [+ g
1:BC* o3 |2 m: ~. x
2:WHERE. T3 M$ c( d! c) Q. r3 _. N
3:B. \' V g) l3 I" G5 L
4:E9 S& a- C- s6 ?: i' z6 u4 Y9 R
5:BD
' ?0 I& k3 r7 b6:INSERT
9 B/ |/ m5 H4 x0 \% e- r* ^9 R9 D' q7:C% W: ~4 ]& d$ [6 ~* o0 b3 [' Y9 r; ?
8:A
/ {* T0 [% G$ p" z$ d: w( X% ]3 S1 M9:C+ d, i0 t' h. Z( p, `
10:E, I* ~: O! R7 q+ s8 V
11:C
% E/ e7 s7 j/ ~+ s12:E5 D& d' L+ x0 M& T% \1 F
13:BC
* F0 X+ S& a4 b I! t14:C
2 P1 Y6 M2 A$ B0 w6 s" G [; I: `15:事务3 T B0 l) n9 H* S1 `$ j( o
! q, ~- B) P; j# f
2 [* t1 v# y# ]
2 Z: J5 C- e/ }- V: o答案详解
- q% Z6 |" j4 J9 Q% s8 ^) ~1 x1 E
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。" w# Y+ e8 r2 f c
+ \/ Z/ T( Y a% g c7 O! c" d! }2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
# o" {5 y9 ]6 C( d" v
: }4 g, \6 i( P7 f3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
2 p1 _9 X/ f4 [% j) j0 }
4 u& |& Q& J8 P# R) K9 F4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
1 a! p7 ]5 f6 Q9 h9 s- h0 m* n' E9 h: D, w
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。( d# C+ }" D9 i- ?" X
# M. }# m0 h3 A8 B# y8 }6.答案显然是INSERT。
- i* I! U8 {, P8 |0 |) W8 ]/ v9 W. T0 k7 J9 L4 i9 O
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
& w/ R6 J \; O) Y |
( J% Y8 @# A9 Q8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
3 f! |4 f" }9 _2 }; n0 ]9 M g+ ?& S M' m1 H( r2 i S
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
; a, ]! d7 f3 X0 s/ `6 O' q
) C5 S8 s, a; H& A10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。4 H1 v2 d2 a0 u" ?: n6 r* c
! x9 x+ n: ~/ w3 N3 h
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
: t; |8 [' i+ R1 A
6 r0 P6 f$ p' i4 ~7 |5 [) H12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。. g3 Y1 A/ B' z( ^/ |% _
- d3 l; j- ~$ n/ O! r* ^
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。- z) {0 O2 ]; q! |2 L" [( z4 j
# i0 Z* i' |$ [2 I/ x; h& L; a. n, r6 T
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
6 [5 z p- ^& h1 b( m. H8 s6 q6 H
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|