Board logo

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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
* N, S- X( i7 A; R9 ~9 [" V, ZPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。9 r9 S; s3 S2 S- U+ s- e
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。, d: u# y6 m) u* K: C

% ?, u  O+ {8 C- U# L/ Q+ D; q3 X% R
问题
' k5 }: A! e! R' H8 f' Z& A9 u, V, E# r6 a/ h3 {
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
$ s1 ~0 f9 P: b8 s+ k0 R! U( y6 M3 N! e6 I
SELECT * FROM MY_TABLE4 c( p$ \$ F9 q  t8 p8 ^

+ C2 M0 S) P# W5 q/ {/ _: |; NA.如果可能,用把查询转换成存储例程
. M, X/ ~. a7 u" R$ VB.如果程序允许,给查询指定返回记录的范围
( T; ~( P0 i5 `8 sC.如果可能,添加where条件
! {9 G8 {5 M- I# L5 ^D.如果DBMS允许,把查询转换成视图
1 `: F4 A! V8 }* u- o. W' _2 WE.如果DBMS允许,使用事先准备好的语句
5 v. C7 D" q$ p0 U9 q2 W, O4 Q. C# M$ M5 C% z6 B3 `

' l* Z' M3 H! Y4 |0 v6 D6 d; N2.可以用添加______条件的方式对查询返回的数据集进行过滤?
% D1 {! L3 T) x. ~
& T5 Y0 q; K& T2 Y% y$ q7 W答案:____________; w5 `8 v4 ]4 `
: q4 S7 [0 O3 h6 K% Z
% J$ c+ {( M$ y6 k& u
3.内关联(inner join)是用来做什么的?, G  O9 V6 l: [0 @; s' u

* _& H% Q+ K' M( K( s$ bA.把两个表通过相同字段关联入一张持久的表中
4 c; C% K% |  |' }/ XB.创建基于两个表中相同相同行的结果集
+ C- p$ Y/ a* s, O  |" I' k" zC.创建基于一个表中的记录的数据集4 M5 G5 r2 l1 B1 s) E* @/ f5 U/ r
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集) D5 V+ E8 }. E' h# P2 j
E.以上都不对
7 ~" g  z. R2 I6 Z" [) h
  n; ?$ O" E; r& N4 J" b. l
$ h. x+ O1 F' O4 H; P( L8 k" |. x5 Q4.以下哪个DBMS没有PHP扩展库?
' C1 K2 c! A' G2 a& i2 d
0 {+ L  E+ t' `" P' U( u- Q! MA.MySQL
+ x8 h) T; O5 G' K& q% ^. aB.IBM DB/2
, |" |& r% K0 D, g: {6 HC.PostgreSQL
" y/ M0 r/ g, K) JD.Microsoft SQL Server& }0 h9 z$ X$ }! {. k) @& }
E.以上都不对  N1 S" D/ Z# R" Y% [5 X
3 g1 i8 P2 r2 g  V. s- i6 Z. z

, A# U2 |6 c' ]+ r. B/ ^5 }4 R5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)0 ~  v! C) e+ B, D; }' Z( H$ l. }
4 \7 y3 O) ?, Y4 \6 d
<?php
% Z) j. L6 c# H1 i9 v2 w9 s$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
; E2 t' Y2 k  t; u* M* I0 N( G?>
4 Y% R7 C% C% A' C# i2 L5 w8 z* _2 {8 f$ e# X. W6 h
A.MYTABLE表中的记录超过1条* w+ N' b3 ]: k( v
B.用户输入的数据需要经过适当的转义和过滤9 ?+ s' K& H) i5 r3 a! U% O
C.调用该函数将产生一个包含了其他记录条数的记录
$ ^1 S) F, j4 [# ID.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
, X! E1 Y, v+ W) J3 t5 yE.查询语句中应该包含数据库名! t8 g. s3 s; u1 a+ Q" o$ H

- c8 Y5 e; r( Q' u' A; S) _
8 M% R, M4 V7 a# \5 n" q' N6.______语句能用来向已存在的表中添加新的记录。
: e6 m# r$ f; k; G3 `, q' ~5 q8 f( X1 f- U
答案:____________6 r' A: t2 z3 c- G+ g

- C' n$ B6 w" v5 \$ z
& R( A6 X: K' n; L9 Q- W7.以下哪个说法正确?
8 w& I* u8 a& w! l  P* ~  j2 j; z' I! m. O- e" W0 `, _
A.使用索引能加快插入数据的速度/ T" J4 m& |. h1 _7 c& V
B.良好的索引策略有助于防止跨站攻击2 D3 }  ~9 P! R8 N4 m! ]
C.应当根据数据库的实际应用按理设计索引
( U1 ]6 s7 M1 n- X/ e8 B" ^7 wD.删除一条记录将导致整个表的索引被破坏
( ~( x4 Y( @# ]9 uE.只有数字记录行需要索引
: D4 a) u' f1 f- A3 c& r! b/ x1 n& t1 I* F8 F

1 `/ b0 O; l7 V8.join能否被嵌套?1 Q8 q8 x' J* T8 X" s

1 Y$ D9 l+ V* `7 v6 MA.能! ]" i9 g! {) j9 x
B.不能
" e4 S% F# D0 h8 ]) V; c0 c4 T* |3 z" v7 b3 {; Z. O

( D$ k& D4 Q: v0 j% Z- s( Q9.考虑如下数据表和查询。如何添加索引能提高查询速度?) [" ?8 g" T  T1 }5 i/ `0 n% A
' G$ ]& c: C$ m3 a, a
CREATE TABLE MYTABLE (
+ @4 T+ x1 J, eID INT,' M/ j. [0 E- A8 e- ~* k, p3 v
NAME VARCHAR (100),% v0 e7 I+ Z8 K1 G
ADDRESS1 VARCHAR (100),
6 G' W1 k" e* q% v# k1 n2 b# M  s2 RADDRESS2 VARCHAR (100),
% Q/ V; B. a2 q5 S) SZIPCODE VARCHAR (10),3 k$ O( g. }/ h3 w0 b" Y" @' e6 ?
CITY VARCHAR (50),4 M8 ?$ X, I/ O, P8 Z
PROVINCE VARCHAR (2)! ^- z! {; G7 s  ?7 O( D
)
! e# s1 y: ^6 a( D" NSELECT ID, VARCHAR! y4 [7 S# b6 k' b9 Y  l% W, i
FROM MYTABLE
$ x( Z0 u/ ]  cWHERE ID BETWEEN 0 AND 1000 v" D! E& y* P( b4 s
ORDER BY NAME, ZIPCODE+ T' O; `4 j# W2 m2 g

8 s( M. {$ w+ R2 p1 p  }2 h6 Z1 W8 HA.给ID添加索引
$ e. A0 c; {% q* p: T/ aB.给NAME和ADDRESS1添加索引
" W9 @8 A' Y6 f# dC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引/ P  x" x; [5 M0 b/ @3 g: Q; U
D.给ZIPCODE和NAME添加索引
6 S6 h' ]3 S* _$ S2 gE.给ZIPCODE添加全文检索
( R; s+ L  K# S+ P; Q# c! r! f. X- _, G2 \1 S
& n% E: A6 ~& A" f+ {2 _( u
10.执行以下SQL语句后将发生什么?3 A& Z8 f2 }2 w- j
" ~9 ?; c9 m% s8 N' U
BEGIN TRANSACTION
( n" z6 F" B0 k7 W6 O/ vDELETE FROM MYTABLE WHERE ID=1  B) T3 e0 B2 P1 I, f' I
DELETE FROM OTHERTABLE9 @* n/ W' D0 c) y  m: `5 ~+ Y* n  |& D
ROLLBACK TRANSACTION* K* e! ^, g( G/ d  ~- R
2 O- `& u2 J+ c" w' x- Z
A.OTHERTABLE中的内容将被删除0 `! j+ k) T8 v! @+ z
B.OTHERTABLE和MYTABLE中的内容都会被删除, r, O! C& [% G( g
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
4 |1 z- L; i/ o- H9 @D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
6 d) I( `$ G  b3 Q5 @6 |" J0 YE.数据库没用变化
+ i& F) u  q, @. {& n% G! m' p7 ?3 k9 s: w0 \7 F

1 |* W" P$ e# q) w6 _- T6 L4 @11.DESC在这个查询中起什么作用?2 J+ ~9 ^% N0 k6 u. ^, m

5 h  j: t, n) r/ M) Z! Z; L1 WSELECT *
/ L2 ~  Y! \  B& n' H* q# a" ~( E- }FROM MY_TABLE
! }9 L/ }1 P. `" F5 ?WHERE ID > 0% [$ ~9 p% z3 b7 J5 w/ d; i
ORDER BY ID, NAME DESC# F' ^/ s0 d. R1 u- `' K

/ `  J9 l' d- f' F) CA.返回的数据集倒序排列$ v* C. J+ J9 ~0 P) X, @) E
B.ID相同的记录按NAME升序排列. ~8 `2 l5 p* v! E; A* _
C.ID相同的记录按NAME倒序排列
$ Q+ [/ w6 t! ~! N; _( oD.返回的记录先按NAME排序,再安ID排序
7 f# B) d1 Q5 A! A' @+ GE.结果集中包含对NAME字段的描述
5 J7 p6 S$ e; n# M1 g& x
" A" Z/ t7 w4 ]  n, a8 q& n: h0 [. i8 u$ B3 L+ M6 r
12.以下哪个不是SQL函数?
' C% B1 U! p" t. @6 \/ O2 l0 Q1 F" Z- c3 r
A.AVG* Y/ H/ Q7 U2 s  K4 ~/ P
B.SUM
' l$ x  B# u8 z$ R/ S& z) ~C.MIN% L) S2 L$ H/ J6 |
D.MAX
7 Z+ Q" Q+ z3 [1 N) I6 T" y* W1 h( \8 rE.CURRENT_DATE()
7 d1 e: l* U5 U7 c) D3 A8 M! c
4 ^! @) C  u0 U4 Z4 v" y3 e' o5 j1 S7 x+ H+ v, l( m
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
* I* ~( g- w0 a. q& A
/ Z# Z+ h4 X* E3 PA.该字段必须有索引- b9 V, m& W5 {5 b5 z4 ~
B.该字段必须包括在GROUP BY条件中
$ m- y7 e5 [2 UC.该字段必须包含一个累积值3 v$ U" @5 i; U5 Z9 z9 r
D.该字段必须是主键- p: T7 b; a5 A( }) O4 C
E.该字段必须不能包含NULL值
6 q5 l& O( c! i! K
: T) U  B6 ~; C: M
5 i& w5 c9 _: C- ]5 c( N1 ~14.以下查询输出什么?
3 H5 D* ]; Y5 O  M* `
0 {- X+ ]* k* h! ~, Y) O, |) HSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
: U9 W& k3 z/ W+ R5 ~ON TABLE1.ID <> TABLE2.ID  g  i- k. F  x+ x& [( A& |$ v
: H! ]* c7 s; Z: \
A.TABLE1和TABLE2不相同的记录
. B$ v3 U# W: C3 ]3 `B.两个表中相同的记录
5 Z( G0 Q3 k, O$ @: XC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数3 S: Q8 s5 _( w2 D
D.两表中不同记录的条数
+ x) A3 f5 g  X/ y4 B- L. hE.数字2
" k- f5 G0 K: ^- h- E# E- m: y# w* K
( U% V7 T' G) Q# _; i
15.______能保证一组SQL语句不受干扰的运行?
; o3 B2 F9 K/ d! [- D; R- ]% g
: v; d$ t+ a% `  R0 W' W1 p答案:____________) A7 J6 k2 J9 e
% Y( Q) W% O; @" K6 q& a. b

& n; k% \5 ^7 N! C) g- h
# W/ m# \5 |  O& \答案速查
- `3 H+ V% ~( \7 y0 y! k. {) t# }1:BC
8 ^1 _% \( O/ c( J0 f9 k2:WHERE" s4 q" \9 f, h% |; a# b- {" c# Z  P
3:B
0 W- D; B$ W$ m+ n# F4:E
4 G3 g9 ]2 Q6 }9 c3 ?5:BD* Z* r% L4 H7 q, A1 q4 \3 M; b5 g
6:INSERT
6 E9 L9 X% J4 ~* x0 G# d7:C- T- n" w( o' N' |
8:A
; E4 n" [" _" O  N8 o! X1 u9:C
( F" i2 q. \! l" R! y7 i10:E  _* ?9 Q* q/ H9 C5 H) r, j6 P# e
11:C& A5 ?$ S; Q& X5 ?4 [
12:E2 {& G1 s5 R* g* Z
13:BC
0 a" h  ~+ C+ z4 ?14:C
1 }( d( n1 n* }) E- x2 n; R' b15:事务
& H* ^0 Q1 L- C. b! Y' |4 R) o7 s3 a5 u$ l, i/ U# Z
5 D% J7 f8 d* w0 Z0 ~: j  W
& E. z) }# W8 ^
答案详解# L) a4 `# B- g' E

7 L/ \5 C6 L3 q4 }5 a1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
% e! K: w$ k: \% d$ u( m
" ]0 n8 a$ `) G! d1 K2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! u# [* M; R% I

1 @( Z: E! K+ H* F3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。% h8 Q9 B) [+ v: S

; M" Y% ~3 J9 z. ]5 N5 W- D! I4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。. y; K' a" m  [1 ~+ N: Q
- s7 f- K9 ]* j9 v5 `) F8 w
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
' `- ^& q. f7 h8 V4 Y$ y0 d0 n+ W3 [0 Z( Z
6.答案显然是INSERT。; B* F; t) {0 J
3 _; H: w6 u4 w; Z- U
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 g" N% [- w1 C5 r! [% Z7 `' T3 D/ d4 U0 }3 c! s$ f) g' r
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
( x+ }% K. T* Q3 Y' ^' A
  @3 [$ T) M/ g9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
: t6 i+ @$ L; o  v/ S, X' P  `2 v# I
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
; q) ^- ~& A6 a( z; J* E# X0 y, G
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。/ O$ e8 P$ ~0 \" I6 o9 G; K! X, w, p
, w; S* J, q" d& Q
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
4 _0 j4 {$ G" ]# u) g, }) f: c2 \+ M* ?/ C9 Q
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* L, E5 D2 W# X5 ~7 ~8 G. }/ D. U+ H- Q% r
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。" G5 M+ d7 M3 u* Z) B/ a

, V# [+ |* f! `* v& L' E% P. k2 b15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。




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