Board logo

标题: [Zend权威认证试题讲解]第九章 - PHP与数据库 [打印本页]

作者: admin    时间: 2008-4-17 14:44     标题: [Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
, u8 Q, t1 j9 |) u' j- kPHP支持许多种类的数据库,可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' CSELECT * FROM MY_TABLE
7 Q1 `) I. d" G: \
: p. N3 S. `/ S- C! l/ m, x- sA.如果可能,用把查询转换成存储例程
$ {: a: k+ Z8 j  m" M1 `! f* pB.如果程序允许,给查询指定返回记录的范围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+ s7 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: }, wE.以上都不对
2 e1 Z( E3 o0 j6 t+ }  [3 P. g/ m4 S# z6 _/ e

7 b" q- v- r: U* b4.以下哪个DBMS没有PHP扩展库?
' k1 B, f2 @% V1 j) W* C  `
0 Y) K* F2 I. P+ O* k/ xA.MySQL& G& J: @* w/ [. k7 I
B.IBM DB/2: S. j* c/ K9 [; W
C.PostgreSQL
( E  r9 d5 ?: s" z' ]% I8 C( wD.Microsoft SQL Server5 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 s7 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 hE.查询语句中应该包含数据库名, v& e7 b: l/ ]& f7 J' O- d

, O/ ^6 Z' c, ^. e+ x- d" t6 ?- m2 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 ?$ aD.删除一条记录将导致整个表的索引被破坏
) Y9 q9 z7 Z' qE.只有数字记录行需要索引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 g8.join能否被嵌套?/ P7 x4 ?# e3 k9 W

( S' i* k. l" `2 L) ~7 g/ IA.能
+ H7 J% |" j" j( ]* [9 z# SB.不能
$ l1 o" y, m+ |6 a) d. V
) C1 J) F( s2 G0 I* H. L8 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- DID INT,
$ E. O7 s7 Z0 f3 lNAME VARCHAR (100),
- @- g5 e7 [/ n9 TADDRESS1 VARCHAR (100),3 W# U. l6 m$ F2 I/ w
ADDRESS2 VARCHAR (100),
; s, [  M& i: N) ?8 q0 @+ b+ J6 UZIPCODE VARCHAR (10),
, f1 ~3 O3 i% H: |) [" T) J) q! @CITY VARCHAR (50),
, v9 q+ [' [, \  ~& SPROVINCE 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 WFROM MYTABLE
% s1 T* d( A& o. {* aWHERE ID BETWEEN 0 AND 100  f5 m% P  q1 ?
ORDER BY NAME, ZIPCODE
! Y+ W, T2 S! m; t9 k6 W! w* K2 I4 y' k8 U3 O: B3 c( I! t
A.给ID添加索引
4 U$ q0 W4 \1 wB.给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, X10.执行以下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: MDELETE FROM MYTABLE WHERE ID=1
/ C4 g1 M$ J- {- ?6 b; v4 f7 xDELETE FROM OTHERTABLE
8 b! A' i1 N' R( o, u# n* _ROLLBACK TRANSACTION
9 ]; i" M6 B& S  M6 j# B0 m- q4 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; ZE.数据库没用变化; 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* OSELECT *; 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& bA.返回的数据集倒序排列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$ n8 }# z' ~( i& {1 v4 ?+ `
12.以下哪个不是SQL函数?
& V6 K& F& @  Q! J0 s8 }
" U2 ?, c+ T! _& t0 ~, G9 NA.AVG, `% ?4 a0 w6 l
B.SUM
9 F; \6 |: P7 e" }, l% _C.MIN6 E8 c1 b# q' y' ^0 V
D.MAX
# o8 }. l7 b- s! Y4 y% `! CE.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" ~( qA.该字段必须有索引( M0 M) Q: S. P; y7 l
B.该字段必须包括在GROUP BY条件中
8 r6 _, e* s; Y0 c, \& oC.该字段必须包含一个累积值
/ J8 \0 E; a6 _$ b9 A3 J& ^- E6 cD.该字段必须是主键! 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 j14.以下查询输出什么?
6 j! r3 w$ o) r' S+ `9 V7 n7 u- ^' X! ^$ w) x$ G4 G7 J
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE23 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/ YC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
4 ^" m3 E8 G6 F  KD.两表中不同记录的条数/ K! A: x7 {) [6 r
E.数字24 M5 z; y' w$ f  }' ^2 D
- j) ?* [  E3 |3 M, E6 X

. j. Z5 N# j0 g/ R15.______能保证一组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$ d1:BC
1 w# Z+ y8 q- ], {' F6 [2:WHERE$ v2 T7 g- x. N* ~* Z& ]
3:B
  i, m% c( R/ s4:E- M+ V, ]9 z6 P
5:BD
& N0 L. w' F; t9 N6:INSERT3 _: `! o2 Y7 d/ w! u- y0 R, I" x
7:C
% L# I. n3 S7 ~% ?  a# y8: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( P11:C
) a- u7 _$ P! E( S12:E
/ k! D9 X& M( @% N$ _, w13:BC1 Z! P) M- o& Z4 Z/ K. i, j5 P! S# U
14:C3 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. W3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。5 L& P- E7 Q6 y! w  I2 q( ^  P

/ G. Q+ T; n+ `3 q. u  W' _9 y4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
3 O$ H- g! S$ p$ k- t: T* M1 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/ h6.答案显然是INSERT。5 ^0 J# p  V8 D0 z9 n: ]

. m* W8 i$ Y1 D& R& O7.答案是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) f0 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' Z11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ f7 C# v- |! @0 r$ ]$ G. W5 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  o13.答案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# p15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。




欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2