标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
, u8 Q, t1 j9 |) u' j- k
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
3 Z$ z% M0 Z5 [+ p
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
# R5 `# e- W' P) a
2 }& g: O" e$ ]8 U/ D/ G3 K
1 R5 o5 [! y. r8 b9 P: W8 p
问题
5 A' U- E0 A; u) }2 v
$ G) m: m, I/ k" w( a
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
. Z k3 Z( w1 s* y8 r
2 T/ k- t3 e$ O: R* V; G' C
SELECT * FROM MY_TABLE
7 Q1 `) I. d" G: \
: p. N3 S. `/ S- C! l/ m, x- s
A.如果可能,用把查询转换成存储例程
$ {: a: k+ Z8 j m" M1 `! f* p
B.如果程序允许,给查询指定返回记录的范围
4 S y( P, p9 v S w; @, ]8 X
C.如果可能,添加where条件
~: J$ v J( `: `1 F" s& L! {
D.如果DBMS允许,把查询转换成视图
! j- g" B& _$ y8 _* }
E.如果DBMS允许,使用事先准备好的语句
1 t. P: v4 F3 A( l1 C3 @: p
" p" Z7 Z3 B: y+ E% C9 q4 }
/ w6 v: H; f; C# z. Z
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
$ y8 l1 X( E) D& A6 P
z, v3 C) e; b1 E; o
答案:____________
( N$ T$ f; U0 w8 Z
8 P6 g7 ]2 @+ l! t/ W9 o0 g' i$ y
# T% r, b# ^* d/ C' `
3.内关联(inner join)是用来做什么的?
% W* M4 B- v' O( L. |1 w+ s
7 z/ y$ \ e" e* b2 r
A.把两个表通过相同字段关联入一张持久的表中
8 f J( J/ { f z( ?0 _
B.创建基于两个表中相同相同行的结果集
0 j9 y, T: D0 O+ R$ X
C.创建基于一个表中的记录的数据集
4 C7 a) p: [3 E, W0 D
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
1 x( A) Z/ s" K2 f$ R/ C: }, w
E.以上都不对
2 e1 Z( E3 o0 j6 t+ } [
3 P. g/ m4 S# z6 _/ e
7 b" q- v- r: U* b
4.以下哪个DBMS没有PHP扩展库?
' k1 B, f2 @% V1 j) W* C `
0 Y) K* F2 I. P+ O* k/ x
A.MySQL
& G& J: @* w/ [. k7 I
B.IBM DB/2
: S. j* c/ K9 [; W
C.PostgreSQL
( E r9 d5 ?: s" z' ]% I8 C( w
D.Microsoft SQL Server
5 S( V- B' d2 x. p& N m G
E.以上都不对
5 n7 ?, x- i6 R5 J$ w' M
- y6 Y$ ~+ Y5 Q/ P0 L
/ U* {% G/ K( }, B% Z" [
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
& ?8 L9 q2 }% f3 q
& H1 e) R/ u+ p8 X3 O* n- I% m
<?php
+ K$ \5 k) q1 Z h9 c( p
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
) s1 e) G7 U- r+ a
?>
: l. b0 ?# I5 c1 L2 s
7 b/ ?+ f6 c2 z, i( w5 ?2 N8 W- ~
A.MYTABLE表中的记录超过1条
- G1 o) @: I9 W! q9 b6 N$ D d
B.用户输入的数据需要经过适当的转义和过滤
5 V- R p9 Y0 `# L" _# ?1 v& N
C.调用该函数将产生一个包含了其他记录条数的记录
1 z" \! T5 l, L E$ Z3 ^2 ?- n
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
# y O u# C5 H# U2 k: V- U2 h
E.查询语句中应该包含数据库名
, v& e7 b: l/ ]& f7 J' O- d
, O/ ^6 Z' c, ^. e+ x- d" t6 ?- m
2 Z! d* C5 o; G) z2 m
6.______语句能用来向已存在的表中添加新的记录。
@+ Z" S$ L# Q% f2 `9 d
" K! x7 x6 u+ y( u4 @; k3 F: I
答案:____________
- {8 q: }% p) {8 @; ~' q
% |5 k8 k, f3 }; ]# K2 n
$ l- B8 z1 ]7 a+ E! @# G) U
7.以下哪个说法正确?
8 ?( |/ \' g& @4 J U
, R- G& [6 b# Y* X
A.使用索引能加快插入数据的速度
( ?: d, b* f: W
B.良好的索引策略有助于防止跨站攻击
' B7 t6 }$ Y4 q5 F3 ]
C.应当根据数据库的实际应用按理设计索引
* w: P% {6 u( ?1 ?$ a
D.删除一条记录将导致整个表的索引被破坏
) Y9 q9 z7 Z' q
E.只有数字记录行需要索引
5 b# i3 n$ l8 {5 K) E& H0 u
' D0 Z1 f* r, s' n
3 B; i* s6 m/ k1 {3 h4 ?4 g
8.join能否被嵌套?
/ P7 x4 ?# e3 k9 W
( S' i* k. l" `2 L) ~7 g/ I
A.能
+ H7 J% |" j" j( ]* [9 z# S
B.不能
$ l1 o" y, m+ |6 a) d. V
) C1 J) F( s2 G0 I* H. L
8 p" Z7 G/ m. v6 w. |! T$ X
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
1 ~* m9 w6 \- {( d
& }( |/ n7 C- m, j3 i- c; {0 `
CREATE TABLE MYTABLE (
9 q& Z' `" w2 z- D
ID INT,
$ E. O7 s7 Z0 f3 l
NAME VARCHAR (100),
- @- g5 e7 [/ n9 T
ADDRESS1 VARCHAR (100),
3 W# U. l6 m$ F2 I/ w
ADDRESS2 VARCHAR (100),
; s, [ M& i: N) ?8 q0 @+ b+ J6 U
ZIPCODE VARCHAR (10),
, f1 ~3 O3 i% H: |) [" T) J) q! @
CITY VARCHAR (50),
, v9 q+ [' [, \ ~& S
PROVINCE VARCHAR (2)
# o( g1 y6 R: j r
)
; j T( z: [) V- c" p0 ~
SELECT ID, VARCHAR
. ?( [1 k* m7 U6 b; I3 O$ [7 W
FROM MYTABLE
% s1 T* d( A& o. {* a
WHERE ID BETWEEN 0 AND 100
f5 m% P q1 ?
ORDER BY NAME, ZIPCODE
! Y+ W, T2 S! m; t9 k6 W! w* K
2 I4 y' k8 U3 O: B3 c( I! t
A.给ID添加索引
4 U$ q0 W4 \1 w
B.给NAME和ADDRESS1添加索引
3 j$ z0 C2 `6 v; ]" b
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
) Z; {8 k* P& U, I- [1 U9 t" b
D.给ZIPCODE和NAME添加索引
/ ^9 ]" c$ v4 P. g
E.给ZIPCODE添加全文检索
" q, Z& f2 ?0 u$ A
8 X+ V2 r) U1 t! Y5 {
( S1 O1 t6 q6 c, X
10.执行以下SQL语句后将发生什么?
, i7 I Z7 }# N% l1 k# l
{7 T$ g7 B2 j- ?1 y: u- p& J& c$ e
BEGIN TRANSACTION
9 N, Q9 a1 b! U/ X: M
DELETE FROM MYTABLE WHERE ID=1
/ C4 g1 M$ J- {- ?6 b; v4 f7 x
DELETE FROM OTHERTABLE
8 b! A' i1 N' R( o, u# n* _
ROLLBACK TRANSACTION
9 ]; i" M6 B& S M6 j# B0 m- q
4 e6 s6 f3 z2 S% ]$ _
A.OTHERTABLE中的内容将被删除
3 o1 a& I0 N! h9 D) Y# ?6 Y! i' A
B.OTHERTABLE和MYTABLE中的内容都会被删除
- {$ J7 X$ v3 m& W+ ~6 ^
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
?$ f$ ]4 L# b; {
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
. Z3 @. l; F4 r( r, s; Z
E.数据库没用变化
; O k+ [5 @4 K
% Y7 T9 \" ]- ?" t
0 q1 L: x, g4 `% C
11.DESC在这个查询中起什么作用?
4 I! y( P7 u$ p5 a
2 c0 C# c# U& B: r& n* O
SELECT *
; n. B3 V" E8 Z2 C: m
FROM MY_TABLE
" V6 C+ j! D) v
WHERE ID > 0
* y3 v+ _4 o% C5 A
ORDER BY ID, NAME DESC
. u6 \1 {3 a4 l8 Z2 {% o
- m: M' r5 |, a& b
A.返回的数据集倒序排列
0 q2 V0 @7 g- r* W) u$ b
B.ID相同的记录按NAME升序排列
4 `& E- O/ Z1 P6 ~0 F
C.ID相同的记录按NAME倒序排列
2 Z8 ?/ r& Y+ [& u' }. k: T5 q
D.返回的记录先按NAME排序,再安ID排序
( G- V4 ^$ B5 z: ^2 {
E.结果集中包含对NAME字段的描述
! V; N3 B% v; }7 i
+ Z1 A5 e% [- \' v4 D* W% T$ n
8 }# z' ~( i& {1 v4 ?+ `
12.以下哪个不是SQL函数?
& V6 K& F& @ Q! J0 s8 }
" U2 ?, c+ T! _& t0 ~, G9 N
A.AVG
, `% ?4 a0 w6 l
B.SUM
9 F; \6 |: P7 e" }, l% _
C.MIN
6 E8 c1 b# q' y' ^0 V
D.MAX
# o8 }. l7 b- s! Y4 y% `! C
E.CURRENT_DATE()
0 ~ L8 j% z0 {" Q g
5 Z& O! N* c1 `/ Y' h2 s) @
7 v6 H) a ?* B$ }6 q ?: K' {
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
9 _6 g' K& y3 a4 I6 I6 g; R. t
% |: u% k( f9 w, W9 [2 d" ~( q
A.该字段必须有索引
( M0 M) Q: S. P; y7 l
B.该字段必须包括在GROUP BY条件中
8 r6 _, e* s; Y0 c, \& o
C.该字段必须包含一个累积值
/ J8 \0 E; a6 _$ b9 A3 J& ^- E6 c
D.该字段必须是主键
! w& M+ t. J2 u9 j
E.该字段必须不能包含NULL值
' | s2 N9 E8 i
$ _0 w- d$ ^5 m3 u% g o5 p% Q
5 ]/ ?! w& P |( v2 j
14.以下查询输出什么?
6 j! r3 w$ o) r' S+ `9 V
7 n7 u- ^' X! ^$ w) x$ G4 G7 J
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
3 w. ~/ x- q! u3 M& B4 S( H
ON TABLE1.ID <> TABLE2.ID
# l& G. p" I$ y, E
2 Z" P. r7 m- n4 @
A.TABLE1和TABLE2不相同的记录
' F: K+ b% S5 z- c! ~
B.两个表中相同的记录
* t+ Z* v0 @* S2 o( H- O( k1 y/ Y
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
4 ^" m3 E8 G6 F K
D.两表中不同记录的条数
/ K! A: x7 {) [6 r
E.数字2
4 M5 z; y' w$ f }' ^2 D
- j) ?* [ E3 |3 M, E6 X
. j. Z5 N# j0 g/ R
15.______能保证一组SQL语句不受干扰的运行?
8 g1 @4 w5 A- G* l
5 X/ ~& f' ?( I0 Z1 u3 H' l5 ^
答案:____________
2 H$ W6 |' z. ]/ t! E
8 K) S) C. {& r8 U* K
: q( P4 N7 V' p4 Q6 f' Q* h
9 X1 J6 X0 V+ U6 Z1 o9 B' `% A- D
答案速查
0 ~- ^/ k' e- r$ d
1:BC
1 w# Z+ y8 q- ], {' F6 [
2:WHERE
$ v2 T7 g- x. N* ~* Z& ]
3:B
i, m% c( R/ s
4:E
- M+ V, ]9 z6 P
5:BD
& N0 L. w' F; t9 N
6:INSERT
3 _: `! o2 Y7 d/ w! u- y0 R, I" x
7:C
% L# I. n3 S7 ~% ? a# y
8:A
# b- C b+ f, Q' r. q$ [
9:C
& X1 i! v% N% P) _1 }0 X9 l: T: p
10:E
1 E0 m5 [9 S; R; X3 R8 T( P
11:C
) a- u7 _$ P! E( S
12:E
/ k! D9 X& M( @% N$ _, w
13:BC
1 Z! P) M- o& Z4 Z/ K. i, j5 P! S# U
14:C
3 z1 k& O0 Z! e; e" e. B
15:事务
! J: t7 M X' ?/ w+ e8 S
3 @( V L5 p$ I7 Q6 u
/ O4 I. _, K6 z) @" w. [
t- |: U0 q { j0 H% E) Z5 U
答案详解
4 O& e( @0 ?+ N; ^$ E% d {9 _, v
6 F0 Q& f J& [8 z( R' Q
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
3 D* a' W# }; r! w' R# j0 W( X( o
, Z+ r8 s8 w+ p* z+ a- ^1 h2 z
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
j- j# M, v& K3 v
. Q" _9 V! T2 g. W
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
5 L& P- E7 Q6 y! w I2 q( ^ P
/ G. Q+ T; n+ `3 q. u W' _9 y
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
3 O$ H- g! S$ p$ k- t: T* M
1 n. j1 _! _, O3 }$ f# d1 T! g
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
1 w/ }, x n& E4 L6 Z( |0 o4 j
% c' A ?. x$ n/ h
6.答案显然是INSERT。
5 ^0 J# p V8 D0 z9 n: ]
. m* W8 i$ Y1 D& R& O
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
; B" \5 V' f3 A7 M0 K
. \. y( @9 Z# Y+ G. f1 T7 c
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
3 U+ j4 B a& J3 J5 ^- r$ ?! U) f
0 y; `5 w; G2 ^ q, ?
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
! \" s4 Q: y4 e3 t% o+ |! V
1 U0 o: G( v3 X( O* M, Y) O$ n
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
% C6 w- U8 t7 B
$ `0 [* O4 j" ^/ V' Z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ f7 C# v- |! @0 r$ ]$ G. W
5 c' j8 L# o. b+ Q) J8 j1 m/ r! j
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
! k1 l$ y d5 V
5 I1 J [6 l$ h$ i& Z& Y o
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* ^& U1 W4 S- T' T
" n) f1 Q" [# k- A
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
4 D9 A9 t2 s' p+ f
+ B2 n, i) k# p
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2