|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。; |' l4 q" s' O: v6 k) }' Y1 d
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
p( c' s* X6 K* d9 q2 z: \6 ~本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。9 ?6 |$ u O0 h7 Y. a4 \
7 ~6 `% }2 ~) a7 X# K' Q( Y
5 S7 R5 @% T5 V7 W. F
问题
, k- ]2 U( t& \/ g; w D2 Z$ @; }# S& d$ K4 {
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)2 y: ]' q7 q- N& C) R4 s
. z8 s, a: \- V/ B3 v+ e+ q2 XSELECT * FROM MY_TABLE
) ?6 S4 ?$ V. q+ k L. A, T) e$ Q: X$ n9 ^4 O, S' _1 S
A.如果可能,用把查询转换成存储例程
4 t1 j+ K! e5 }! F5 M+ X( P' v0 V2 lB.如果程序允许,给查询指定返回记录的范围
) F$ J/ z& X* E- a' X; RC.如果可能,添加where条件
' ^' O! b1 S9 }' w' w- ND.如果DBMS允许,把查询转换成视图
* b+ S5 _# X% E/ w7 Z, n- j; KE.如果DBMS允许,使用事先准备好的语句- `1 X( W$ Y9 K7 G O3 w) ]
0 l6 S+ m6 j& C
; y6 p' \/ E6 N$ S1 g
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
, b" C, g% ]) `2 G. t: F' S& U- j: K6 ?# p% L+ Q
答案:____________
9 S( l9 U) i; H4 y; n, {9 \
1 I4 t- S* A: t6 y g9 L8 |: C+ p S0 S" B
3.内关联(inner join)是用来做什么的?
; U# F" z1 n4 A
2 B9 G* E T8 ZA.把两个表通过相同字段关联入一张持久的表中
$ ^ }' M, s7 oB.创建基于两个表中相同相同行的结果集
3 r& I, v5 d2 u0 h( f! i# a) R: F9 ?C.创建基于一个表中的记录的数据集
5 ~( ?- u* ?: X+ T' F+ VD.创建一个包含两个表中相同记录和一个表中全部记录的结果集% J A1 E2 N; q
E.以上都不对
: x2 l) b3 G4 z: v' p3 z# L$ t5 \4 j" [/ z
( @0 x" h0 ]9 ^( L# K
4.以下哪个DBMS没有PHP扩展库?7 h2 \8 n" j8 z% e
1 H3 [5 y9 Z. X1 x. H4 t4 oA.MySQL
; m* J% r( r) n/ Z% @0 rB.IBM DB/2$ H% a: Q& A l; S) M* O2 L
C.PostgreSQL: a0 d+ H3 z4 q2 r, L1 q
D.Microsoft SQL Server# G/ v% |+ y- W$ z, Z ~$ f
E.以上都不对2 v- V) c# I/ M
' Q ]/ K3 W0 o+ h0 k; S5 `& }: P1 W- {+ }7 m# L7 N: }9 T
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
( g% H, Q t. |! b v
6 k0 h# n0 R: a. v# b<?php
' `$ z# r; T8 p- Y( e$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
% }4 f5 g; A+ N/ h d# i% Z3 V5 H?>
. p" C3 H/ I- c4 ], C M0 L6 O- j7 S0 p% |: I
A.MYTABLE表中的记录超过1条* j4 ]) r; i# L! ~4 O# a" i
B.用户输入的数据需要经过适当的转义和过滤9 j& Z& \& Q. b! n/ B: P. F3 X7 v; H
C.调用该函数将产生一个包含了其他记录条数的记录
% ~! v U- u4 z9 G. P: mD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除# o. V* Z5 c- A, t
E.查询语句中应该包含数据库名
" L! |3 i, i! k2 `6 J* w: M( V
& E) z. o4 Z A5 J: p2 p* y- I2 o$ q! h$ R- }5 \3 H
6.______语句能用来向已存在的表中添加新的记录。$ j0 b+ W/ s1 j4 x) l: i, H
b) E: Q/ G3 r% ^答案:____________
! j- A+ ~4 G) l# C( B4 D& U7 u D, ]; d" O/ M( d. t3 E
" R" a* ^- g5 U1 t; X" p0 k
7.以下哪个说法正确?* z3 I4 H: k- t7 Q2 k1 _
$ p2 e1 T+ O. ~
A.使用索引能加快插入数据的速度4 [6 Q K' L c) k0 W
B.良好的索引策略有助于防止跨站攻击' t$ a* v/ ~) Y! @2 m+ L
C.应当根据数据库的实际应用按理设计索引
: J0 s2 i5 }4 ~ w. ED.删除一条记录将导致整个表的索引被破坏( f0 a+ ~1 E) }# d
E.只有数字记录行需要索引
0 V# a8 z& m- k) a2 m B
% k8 y' n/ v4 V$ _7 d _1 O2 ~% L& J( J* j
8.join能否被嵌套?5 }5 a6 j" O2 E& J e+ @
2 x) u3 V% s' x( K
A.能' x' n# n# F3 x( V: k4 H
B.不能: x/ b( |* J5 v e3 G( W0 P
, N% q' C' q4 b% m3 v' p S) t( j3 a4 ]; ^) h# [$ H
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
) N9 N; H' p9 [8 H0 p: X0 x$ ~( o6 R* Q/ C% A! O# N5 S4 m
CREATE TABLE MYTABLE (
& M" C+ L+ J% K. B( j" M# _$ N; nID INT,# }$ ?/ ~/ g4 m N: ^0 M$ ~
NAME VARCHAR (100),
/ @& h ?) n) LADDRESS1 VARCHAR (100),
2 B! f! O6 ^' k$ x% H* ?2 fADDRESS2 VARCHAR (100),
, [# s6 y5 y: i! b, k9 WZIPCODE VARCHAR (10),
- v6 {$ R, S. G) b& Y9 G+ yCITY VARCHAR (50),/ ^; z! ?, I4 }. T! S9 k
PROVINCE VARCHAR (2)
4 f2 D+ b& D o( b* T, z- i)
- _% S8 J" Z1 {5 bSELECT ID, VARCHAR
% R" D% o+ I/ o* yFROM MYTABLE# H& b: ]0 J) H' h, K
WHERE ID BETWEEN 0 AND 100
/ e) u& L |' F7 ~+ A8 NORDER BY NAME, ZIPCODE
E5 Q/ t3 _. ^3 Q
: G, F; S* M$ @! ]1 _" hA.给ID添加索引* K4 i I% x# S9 q
B.给NAME和ADDRESS1添加索引8 F, w' G! @" ~3 K: A- R6 `
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引 d+ p) W, @; z1 [" m2 x
D.给ZIPCODE和NAME添加索引
5 j* E0 x5 W6 F( m5 K& J" |% h: CE.给ZIPCODE添加全文检索
1 K. I# O) e( [0 K" z( C; Q* ?6 d; o2 N" z. h+ |
6 l! j5 q$ B7 u: G+ D, B- H" K
10.执行以下SQL语句后将发生什么?
7 o; |6 {# ^' X7 ] @! h3 O: a8 g' }/ o$ i" ~# J9 X: [+ `
BEGIN TRANSACTION
; P. }5 f/ [# ?) c1 ?DELETE FROM MYTABLE WHERE ID=14 R& Y7 T+ T2 C" M% }
DELETE FROM OTHERTABLE) Y' t# i8 k' l: `& ?9 ~
ROLLBACK TRANSACTION# K( Y4 S2 `3 E0 F, \* u8 v, G
4 w' y9 N* H0 iA.OTHERTABLE中的内容将被删除2 j* x% u+ q; E( q+ D+ N7 O9 ~$ g2 M
B.OTHERTABLE和MYTABLE中的内容都会被删除/ y' B- b1 Q L6 S# q( _
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
1 ]0 Q& b. s* J+ q2 aD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化: f8 C% o; \# G0 e) W
E.数据库没用变化* e1 n! { p' D) C* A: `
4 G. J4 \( _) f, X: ~
9 } d( G* H' A; }- a% U11.DESC在这个查询中起什么作用?6 X( G2 b4 c2 E/ f' @
8 _7 A2 r: M" ~* HSELECT *
# A' p6 d* T3 ?- \4 t% z" pFROM MY_TABLE
2 f& T& |2 a8 j2 u1 U3 D. RWHERE ID > 0' I4 t4 [- G" ~3 m
ORDER BY ID, NAME DESC; U" c/ w2 X, D' s% |
$ y' e. ^ m q+ ?' X
A.返回的数据集倒序排列0 J' X" P& l: \
B.ID相同的记录按NAME升序排列$ h' v* _2 R L
C.ID相同的记录按NAME倒序排列+ Q; V5 a8 q5 a
D.返回的记录先按NAME排序,再安ID排序* g, a+ J5 _( [1 R0 x0 O) O
E.结果集中包含对NAME字段的描述: H4 j y, O( a) O, z7 R
4 i* T# i! k: s1 E- f; ?
$ ~+ W+ c; v; T
12.以下哪个不是SQL函数?5 G' I6 J6 f7 h6 K+ h/ k
$ L" X2 n- j5 k: p( H9 D) [A.AVG
& u" {. m- g$ W. SB.SUM
8 p+ M( t# B9 o! xC.MIN' J4 w( X' Q/ A4 L" l, `/ ], R
D.MAX) j |4 {/ U! p' M
E.CURRENT_DATE()
+ @# S* B9 W2 `7 T7 t+ O( t8 Y9 X- @( z r' J1 Y
9 Z4 p# G* b" k13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
/ g+ t' E5 \/ I- b$ A, b& h' N/ b( M0 F. M n! c( L5 I
A.该字段必须有索引
; f. z* [( n+ Z5 B) y# l, E$ RB.该字段必须包括在GROUP BY条件中
5 t( k" ^9 _7 v; y/ l o* PC.该字段必须包含一个累积值/ d& T. Y, Q8 M- Y! i) g
D.该字段必须是主键2 ~# B/ V1 P6 ?8 p' }# Q0 n* w! e: q6 F
E.该字段必须不能包含NULL值
; i _: l' |5 W* ~- H0 d$ g1 D2 G
. n9 x7 o6 ~+ L- P- n7 l8 j0 l' M# y6 }
: ~ _/ q: ?% N0 I14.以下查询输出什么?
# K; U$ I, y5 h/ J1 ^/ H) D2 U) N, o4 E
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
; q2 L% O5 K) G cON TABLE1.ID <> TABLE2.ID. R {1 X1 O7 `* M% E5 X: h
7 b( u% e: Q. [! l) R) S' c% e, K
A.TABLE1和TABLE2不相同的记录) e: t; ^2 ~; S# A* G
B.两个表中相同的记录' b% h1 R& R0 \. f _3 V+ q
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数 x- {* ]9 d/ X, h% V: U. p
D.两表中不同记录的条数/ B* ]1 D' W( @+ J& i, h4 B1 `
E.数字27 ?* K! T1 P, Y o$ i" @2 D
`# C4 L8 `4 I; y W% {
8 c Q2 s) `, g
15.______能保证一组SQL语句不受干扰的运行?
k" H/ j, d7 N* S0 i, |2 [: d6 ~5 Q2 G3 X( L
答案:____________. L1 A# c: s) [
# n5 ^6 o% o) e% H3 ?( o3 j2 x5 }9 A) A3 [' q1 L) W
9 _9 \$ g+ j1 h/ x; Z1 j8 p) C& Z3 S答案速查. U9 r) a' |& k/ A/ ?
1:BC1 m+ f' @! P3 R0 p+ S
2:WHERE9 f/ y, `: C7 T6 \1 g7 E3 V4 w
3:B
9 U) m, [# D+ ~2 ?- y4:E; z' d! s5 ?" g# k" H+ H# q8 J; ~8 t2 g
5:BD
8 C( c: k+ G( I5 F6:INSERT& C7 c! e1 w% N n# h. q( b
7:C3 c7 T/ A3 W8 ^4 @. O3 E$ H: K
8:A
4 [) C( X2 u- d& O9:C* z6 d4 \5 o% l8 ?- c6 K
10:E
2 W. f8 z* k! S$ G11:C/ _6 r; d1 x `3 P* q' R3 y
12:E+ h9 G& a6 j" h. r/ N
13:BC, C0 q: b# ~2 q f
14:C5 B' i! }' Y$ R1 p* H
15:事务! R0 ~# ]0 ]( m# U
4 | R- @* D) ?
/ _) @2 C2 d6 o( Y; N8 w
5 H0 d# H) I1 m; o b$ e答案详解
0 q6 c# ~1 `8 ^
, |) t# h, i1 \1 l- U. k8 h& P1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。2 _" R* r) s" x+ c
1 y0 k Z+ {% ~2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。' j# s: f: E5 t ], \" p! d
6 x6 P+ X% E, F0 G* c( W3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
6 m, F" ^/ [3 Q- r
5 A1 u3 B& L& P4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
8 D) j% Q! e* b3 o4 N4 y4 X/ S( ~
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
0 X! ^: y& n, A- E$ [
6 S6 _4 P: H$ Y9 O. G6.答案显然是INSERT。9 r% a' F6 T3 o# v
3 Y: L8 R, e2 O$ G. g# X7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 A }- Q$ H: O# x6 `& G
6 `! Y7 b$ b( w, J" Y. o) R
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。7 J( Z1 B, _) l8 A2 ^! ^
1 v7 |+ J! W/ y5 y# d; G
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。0 j' u- ]7 O. T( {1 ~
+ {! I3 a1 F' L0 ?" g1 O4 e10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。2 \6 r( {2 H3 [2 F1 W; Z+ G
. ]5 e v. x T11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。9 M+ }2 s* Q4 D8 D4 `" w8 o/ `: ?
. ~% R! I- q0 e/ N# f
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
% }2 M! U2 }3 C) v2 d" O5 [& y' ~" E8 V
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
$ l2 d$ _- Z9 n
0 {) H' n2 z, X. K/ d14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。6 ~8 s. k3 a8 |, n$ i
, k8 X! E0 _* d- U" C; O$ c
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|