Board logo

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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。- h' c  s. o, m" ^. Y& V7 {8 f
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。# r9 m& l- ~! `+ _5 v+ \
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
/ Q4 H, U3 ^2 g2 [+ R. A. _; ~9 Q; E) j/ y" M* c# k

* i# j. ]6 H& H4 V+ E! @' \问题, S9 X/ |) `- [3 m# J* y! w

3 J( v+ ^' j/ C% B1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)2 P3 A0 w& ~  w- D" l

4 y  o/ _$ Z8 sSELECT * FROM MY_TABLE" L! D7 A( ?4 f& m( \3 N5 x; G! ^
* ^  R3 k6 k4 W5 Q9 w
A.如果可能,用把查询转换成存储例程2 I' n3 M9 M  H0 W; x4 [( V8 S
B.如果程序允许,给查询指定返回记录的范围4 f1 s2 J9 `2 Y. ^2 s5 Y
C.如果可能,添加where条件  l9 j* f7 v; S2 V* h* b
D.如果DBMS允许,把查询转换成视图
6 m8 Y  l$ ]6 T3 F5 K0 D) ME.如果DBMS允许,使用事先准备好的语句! P7 I3 W1 p/ q9 f
' f3 l, d8 W/ e* e
5 W/ k+ O) x9 r0 J$ q5 |
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
! g- V) C- Y) J& ]2 Q8 A
7 i8 l- s% e9 _; R4 x% D1 u答案:____________9 t# x7 \+ e0 ]) ^& N1 \

6 J2 d; \6 w2 P# D0 T0 N: ]3 U4 ?4 R) ]) V1 n
3.内关联(inner join)是用来做什么的?
" T* P0 V5 [0 O- M) N. x
8 s- d9 X% u$ j7 j  }  n( NA.把两个表通过相同字段关联入一张持久的表中
7 ~  j! P' P" r+ T6 ^; R3 _/ I, WB.创建基于两个表中相同相同行的结果集- p6 Z0 c, L% p/ s4 a
C.创建基于一个表中的记录的数据集
% x$ _3 ~* r2 U$ m0 H% i8 Q5 vD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
" A9 g5 H3 h7 r5 cE.以上都不对
4 r+ Z+ K- F1 Q+ w/ d+ i/ }; Z0 `( E. Z0 T- R- E4 x: T7 W

% ?5 i! H3 J( H% S' [) G' c4.以下哪个DBMS没有PHP扩展库?
6 O4 V0 I5 v# Q! `: ]5 X1 h6 G; v. k
A.MySQL  N' l2 k  ~# T% ^4 i2 v1 E3 ^
B.IBM DB/2
. h9 j4 f3 I' u% ?C.PostgreSQL
  Z1 c: V) Q3 s6 A/ g* e0 }. N6 `) TD.Microsoft SQL Server
" Z3 H9 ~4 @# U2 `E.以上都不对
. A: P6 D  i+ i8 Y$ l/ \; N& {' {; T1 g7 [( r2 e/ ~% @

, D/ @7 R5 y7 C" `5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选), E! L: N# {0 b# P! s: |: U: c
! g) y3 V5 u$ T4 J9 `
<?php, N$ Z0 r0 e* S6 t, ^  |6 s# ~) N* W5 A1 P
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
  Z( m1 p# \% ^; q& L- E/ |?>
& ^9 ~6 W3 [+ \$ x4 D. m0 h  I( L$ C- t- F
A.MYTABLE表中的记录超过1条- `4 x6 u9 G, L: ]; z3 b
B.用户输入的数据需要经过适当的转义和过滤
7 H( K+ `4 s0 q  ]! w2 h, X% _% CC.调用该函数将产生一个包含了其他记录条数的记录
) L9 `: p- r. h2 S% qD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除- A! h2 u; a; p0 J3 m
E.查询语句中应该包含数据库名7 }4 F6 ~1 c: V
% W7 g7 f  ]& }3 ~  M5 ?* X

; O1 h  n9 s) u  o5 @% b$ j6.______语句能用来向已存在的表中添加新的记录。, M! B0 d7 D- B7 q
3 M3 E7 w( N2 W! h
答案:____________: e$ R2 n7 F! K0 e+ U& y

. S( I' L3 D3 z5 e# j
( W  a1 Q8 u0 O$ |* b9 S" l7.以下哪个说法正确?+ O: {7 r. c; d8 {2 v4 h6 O
) u3 z9 T: Q) A, J
A.使用索引能加快插入数据的速度4 G- T* ]2 k5 t  f: p
B.良好的索引策略有助于防止跨站攻击' J- n* A0 S, W) o" A- E' l: L! F
C.应当根据数据库的实际应用按理设计索引
; f: g' D0 H; V5 @( u1 l) F( r& }D.删除一条记录将导致整个表的索引被破坏4 v0 G/ P& Z; D2 q( n
E.只有数字记录行需要索引  f. ^) K3 [, n5 ^. }, C1 C7 ^

+ n7 u1 g2 @9 x# Y( s
- b) a/ M# ~) R/ K5 l8.join能否被嵌套?
) h/ {5 [7 H. G# T# m( J8 ^/ P; n$ B% O( g- h8 f4 _/ J
A.能* n7 G9 j6 ?* D4 ~& }3 o
B.不能
; N2 f: C0 M( p$ f0 w- V! \8 U
  a# H8 g8 n8 _" J4 }( Z+ d2 k& g4 U9 ?+ Z5 a/ f4 e6 {
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
0 B* V# Y' C. \' }$ j( q: R' i6 w# F7 t' W
CREATE TABLE MYTABLE (% C5 [1 e/ R% L
ID INT," `+ b& {  V+ ~' w% {
NAME VARCHAR (100),
; y( S6 |  ]5 c2 u8 L# z& OADDRESS1 VARCHAR (100),
- W% p/ i2 X1 uADDRESS2 VARCHAR (100),; _$ q! t/ R* C1 U3 Y: X" ?9 R+ ?
ZIPCODE VARCHAR (10),
( k; S+ g& v. O' E# wCITY VARCHAR (50),- R! g, O/ `, S
PROVINCE VARCHAR (2)
# U7 u; ?: M$ b0 K9 A)3 c1 b! E4 Z  x) D6 n
SELECT ID, VARCHAR
' h! l) S0 G, sFROM MYTABLE" A' T% c# u7 t7 B! m
WHERE ID BETWEEN 0 AND 100
: n6 S' {: [3 c, E2 @ORDER BY NAME, ZIPCODE
/ ^: O3 W$ N. ~8 Y& o/ F0 t+ l0 [( _4 F
A.给ID添加索引8 t: w4 }0 V) P; }; }% f) e
B.给NAME和ADDRESS1添加索引4 @9 L$ K2 C1 d( p
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
1 A/ I% G4 E- H; M" f- t; s% bD.给ZIPCODE和NAME添加索引& m8 }  P) P3 b, Q3 Q& c* `
E.给ZIPCODE添加全文检索
% U; N6 W! `/ C0 d! G4 H4 M: {8 u7 d* Q
8 x, b8 t/ \' e% I. o' e& e
10.执行以下SQL语句后将发生什么?
, ^7 ]5 U! L/ o- r6 f9 N
, ^/ J+ a0 m0 q4 ]& iBEGIN TRANSACTION0 H& e5 Q2 K5 y: o+ o! ^
DELETE FROM MYTABLE WHERE ID=10 \( I% V$ \  U; f7 F- n9 ?7 _
DELETE FROM OTHERTABLE
/ |2 W* b) y6 d' n/ W0 u; a8 N: cROLLBACK TRANSACTION
. M- u* l. O- l
" S& a' m4 k* I0 z7 X, OA.OTHERTABLE中的内容将被删除
* [5 [: ]9 v% i" |' H: q6 i  [. ~& qB.OTHERTABLE和MYTABLE中的内容都会被删除
& V1 o/ M8 w. c4 m, W9 J( \- j& k& yC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
/ m; ]- Q+ V6 {% pD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化1 m- `! ~: l2 K! U0 M9 g
E.数据库没用变化
7 Z5 u3 j  M* m! e8 l. h, s: a0 O

4 T* t4 b; |& N11.DESC在这个查询中起什么作用?8 r5 e* {: N! T* N, V0 E/ t
0 G6 V. C( U* G6 h& N& _+ p2 W
SELECT *
+ o1 }' v* R+ p9 u( K& xFROM MY_TABLE
1 w* l5 d6 b8 ?WHERE ID > 02 Z& q: n7 _$ q# G
ORDER BY ID, NAME DESC
1 Z( A& h5 ^. i5 v" S  A* W+ X( _& x7 \4 [
A.返回的数据集倒序排列+ W  p# J8 U( f" Z1 A9 E
B.ID相同的记录按NAME升序排列! m2 [7 `7 A5 U- R, E* W" X# P0 D
C.ID相同的记录按NAME倒序排列( W, E' @6 b8 ]
D.返回的记录先按NAME排序,再安ID排序) `+ s5 T" _( K% k( w6 G
E.结果集中包含对NAME字段的描述
; w, C( W4 \# @( ^" }: _/ S! a; v0 G/ B9 r" ~3 o( C1 s
$ D7 f6 X: ^7 M6 q# q% s6 C
12.以下哪个不是SQL函数?# s2 N& \! s, z1 s) c. L9 O
3 p% E) l# M+ H; j: [3 [7 x& n
A.AVG
9 `) G9 `* d3 MB.SUM
2 P" p  Z8 ?6 L$ \# j& j! jC.MIN
$ ^9 E, `1 x# q# G: Y7 }( n7 dD.MAX( y" _  S: m8 C. Z* Z
E.CURRENT_DATE()
* c$ C: f2 w/ V+ p7 {& G" s+ Q8 M8 n2 a* r# z7 I) k/ N% C

5 q0 l. H6 L7 r4 G: K* V13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: v* M: f( c2 H! `( R1 ?5 X' ~3 V7 z, T# z/ K
A.该字段必须有索引
) l: H) F- K& ]4 f& q( OB.该字段必须包括在GROUP BY条件中
' O1 ^+ v% ?- B  J  A: I  a9 eC.该字段必须包含一个累积值1 q5 Z* Z) {  A, A
D.该字段必须是主键% A- T9 F) f0 K0 E0 q" W8 i
E.该字段必须不能包含NULL值
! P# Q1 z* S4 y! G" a
0 S3 q' X! a9 K+ e( [. z5 o
3 Y4 ^: ^( ?' s" _+ `14.以下查询输出什么?
+ T: h7 Y' ?7 H
7 s1 ?) M; j3 Y2 F# OSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2  z; G1 ~% \2 ?# }
ON TABLE1.ID <> TABLE2.ID6 Y( |) `( B+ T2 R0 m/ B7 I

, J$ U9 b1 v$ `6 c7 B, zA.TABLE1和TABLE2不相同的记录
- O' j. @- n6 K7 sB.两个表中相同的记录
$ I9 E8 h; X/ s0 t& xC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数+ f! w) n2 V; p  X$ d7 ~. ]4 O
D.两表中不同记录的条数- B) M2 }! n4 @4 b+ y5 F
E.数字2" x2 j  `7 d9 t' N8 [
, Y7 V9 L' G/ w5 }
# _  {% s4 I! }4 l
15.______能保证一组SQL语句不受干扰的运行?
$ ^, n) z3 x+ h. Y$ r$ n
7 z0 a- q, ^. E7 k! T答案:____________/ ]3 S9 H! l8 _# n( d& q+ [
! U7 l) y7 R9 j
% T. e* \- w% g
" A$ z0 g5 M0 Y
答案速查# f/ d- q9 n) [! J  p- f; j
1:BC
( R& \* _  `' y$ q" e* O2:WHERE
! P: f9 e* x' f$ R: s' Z& C. d1 q* K3:B1 ]$ `$ }( @4 c  e* f$ c% h
4:E8 f  n: _& D4 ?9 v, W
5:BD8 q( X# a* E4 V1 W
6:INSERT# o( R$ L! }1 J9 d* f
7:C
2 M! X# v- v- ]1 I8:A
4 ^) ]& a/ o+ i2 S2 s5 T9 G9:C, `) @, `5 S# G3 e
10:E) w  A  `% w  T# E6 O
11:C7 h5 ]9 p: w3 Q) O. v
12:E- R6 N  d7 B. r8 ^' b, p3 |  I5 V
13:BC' p, M+ i6 `9 U7 }6 R# f9 [9 o; N
14:C
# V2 G+ E" ?' ]1 _15:事务
# O6 ]- b& Y5 w( u8 A! s1 G. r( Z) s# F, d

' k( ^; B8 J9 K3 @) U  ^$ h
/ `& ^" V4 M# I7 u$ d0 F0 D答案详解
2 I2 w% U5 D  O& Z# t
. P/ o. C1 C/ v) i" E1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
( A( z0 J, f0 `2 ~+ O- f- ]
2 Y4 `0 j, m- s% e2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
6 n. N9 n; s* V. d* \. h1 d
. [) c1 a5 ?- D$ |3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
% q% w# ?3 }7 P' I+ C7 D
" N7 ~. ]7 Q6 Z9 v  m: [3 K" G4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。0 \* h7 p7 m) R9 P2 D: k/ N2 }! t7 |
8 a5 C$ D4 S- h- n/ }
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
; p, s$ W) t9 c9 J9 `* P( Y' {# s0 e
6.答案显然是INSERT。: Q+ E  `7 _2 U" Y- D* k6 A+ Z
/ D: p4 C  Q+ q8 c( I
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 g2 T0 F2 W" a+ p& T  W) b

7 h8 n3 ^$ r2 H7 _+ Z9 B' f# G! g8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。; L/ e1 z9 [6 C5 r
8 M2 n8 E( N6 j, T) S
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
( l1 i( Y- C8 @- q% W: o8 g. W0 j4 P. O- d# l4 _" B3 c3 i+ H
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& M, F4 b" ?# b) {# u2 H1 K
, v3 _( w) V! G8 E11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ s0 z2 ?% ]9 n) Y- ^0 ?6 G6 r  }5 ?
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
$ J3 `3 K2 ]2 K/ d6 P0 w/ H, Z8 [9 t( Q" ^% A; c
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。- a' x6 D3 h4 O3 ^; R# U
. f! B& Y2 N$ d& \
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。* Q/ k+ N7 G$ Q" J( H# {2 R, X7 U

0 d! R5 P+ b, S0 T) p( ]% L6 N3 q15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。




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