返回列表 发帖

[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。4 [  e$ [. n8 z2 W& F8 T4 C( s7 ]
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ F8 f) Y6 S1 f! ?本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。, W. p; U7 _# e: Q, k. h/ L2 H
" b& k- D: B0 C& x- [/ g! |  A, {
. }3 T$ }3 E* ]0 ^/ {6 ^( B
问题
! ?0 c. B  a" B6 |% Q2 @- w4 w8 u
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
3 l; L* r3 I# j9 i- |* e
3 p+ P" c' A) j5 `SELECT * FROM MY_TABLE* D# t9 T% }, s" B2 m$ }

5 }' {+ Z4 m) k# p# w) o8 B5 dA.如果可能,用把查询转换成存储例程
2 b$ b4 m# z; u6 E- r7 b  dB.如果程序允许,给查询指定返回记录的范围
/ F$ V0 J/ K( y4 x" L; k, eC.如果可能,添加where条件
- @( W& p* U4 G% MD.如果DBMS允许,把查询转换成视图
" @0 P& K9 _. W  b% u5 X+ lE.如果DBMS允许,使用事先准备好的语句
3 \7 r0 o& H2 M
/ _2 z4 O, ]- V1 _1 s9 p4 c: F+ P: j
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
' F0 _5 E) V/ n& e3 i
9 ?: n: n2 {8 w" u  u7 C答案:____________+ T; F2 k& X; M6 x: H( y) I* _. N9 j

' u* ]  o8 J' r# ^
" o& V' R% G5 [2 F" D7 Y( p7 i3.内关联(inner join)是用来做什么的?
" m7 n3 H* [& c* H3 W, B' |6 S
. L0 [$ h3 m, o! |% C* M4 f1 eA.把两个表通过相同字段关联入一张持久的表中& B! g5 A9 |) U8 f1 g7 Y. n' H. _
B.创建基于两个表中相同相同行的结果集
; o; ?( \& j( M' i9 p4 {4 b; a1 Z+ YC.创建基于一个表中的记录的数据集
" W, b$ M$ ?% X$ e" D- n8 e# kD.创建一个包含两个表中相同记录和一个表中全部记录的结果集  {) }2 `  H, ~8 X! r
E.以上都不对
; K: \! n+ g! }, {2 R% `- ^) z; h& t) @5 V% J& X4 t9 J* ?8 [

9 n9 C  p. Q8 n) n0 x4.以下哪个DBMS没有PHP扩展库?
2 N$ p) B+ q5 V; Q# S
- @) |+ k& u8 W- eA.MySQL
) s" j- X, i, j& L5 u6 KB.IBM DB/2
) N0 o- y* S8 G& b' u# nC.PostgreSQL7 w' ]: ^* n5 J9 G# P, E
D.Microsoft SQL Server
8 ~: L; G# l! z1 O  L$ H) y" gE.以上都不对
2 O  M; Y6 C' {& s" t+ x8 P( U+ K, J. b" e
5 T5 K( ^0 X1 c
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选); F* `* V& J' j6 b
, Y% K: Y) r9 @( ~7 {
<?php1 y0 I4 V  G6 v* O9 Q
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);( v" k- l+ M) L! J
?>9 h5 O# J/ Z! }6 b# y4 `

  ?: b! @- O4 L6 m/ b' ]1 P% fA.MYTABLE表中的记录超过1条# g7 y7 `0 I8 ]+ X9 i
B.用户输入的数据需要经过适当的转义和过滤
  T! ]1 }$ x: S+ e- c0 ?2 F/ m  DC.调用该函数将产生一个包含了其他记录条数的记录4 F/ O! ?3 Y: t/ j3 Z: g* n
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
4 H$ S) r! v9 u% n! QE.查询语句中应该包含数据库名) I; z5 w4 n; G- Z4 }

1 ~0 z; F# P' F# z; |9 i" H0 r1 z* d- V8 a- g
6.______语句能用来向已存在的表中添加新的记录。
( d5 L: w. W; j1 Y
& Q1 n/ v: Z, g答案:____________
* T/ C1 ?0 t$ m" U( T8 Y3 V0 b* C% t* S: H6 v

! X% z/ E5 C* w) v9 Q7.以下哪个说法正确?
3 w/ B4 t( G# \. V! Z* d/ r1 d% `$ k- [5 N/ G* _1 ]5 K8 w' D
A.使用索引能加快插入数据的速度1 ?; ]8 O4 T& c
B.良好的索引策略有助于防止跨站攻击
3 m" ~  i: u6 v) ^9 u7 DC.应当根据数据库的实际应用按理设计索引, h8 Z! `: O. _4 k+ h' q7 q" Z% J# r; T
D.删除一条记录将导致整个表的索引被破坏" ~5 w4 z& q) X% E
E.只有数字记录行需要索引) |7 @# ^* }$ H7 c# v; X

- O2 D: L0 \& N4 ?( q. B( A$ c  r; H- L, }) q* S
8.join能否被嵌套?
' e* J& q) A* W
9 p7 {& ?9 B/ W; b8 e' L+ SA.能2 J5 m) G& K+ @
B.不能
3 |; c) z$ p; I3 d5 ]& r
1 X2 |; M8 [2 k  U+ E6 z
6 s" d" O+ y7 K- ~& I+ p0 t$ J9.考虑如下数据表和查询。如何添加索引能提高查询速度?  s% M) J6 B+ e- ^8 c
6 Q: f* _/ M4 ]0 i/ Z0 G4 m5 Z
CREATE TABLE MYTABLE ($ n4 s' N5 n  [
ID INT,
% U+ i+ e2 j0 |4 S3 }& c% ~5 m# \9 }NAME VARCHAR (100),+ B9 X& x- H/ \
ADDRESS1 VARCHAR (100),
+ v& ]( `6 d2 eADDRESS2 VARCHAR (100),' l7 Q6 ], ~& u1 i8 |( A$ Y, n% n
ZIPCODE VARCHAR (10),% d- x6 o) ?3 P; Y9 K
CITY VARCHAR (50),
; x- j- M2 S7 x5 X4 t2 ]PROVINCE VARCHAR (2)& L0 k4 c5 ?3 c" U! t$ ~1 T4 B- v
)4 k( x# f0 i! i$ t
SELECT ID, VARCHAR, L( z$ v. K' h# V9 E' K
FROM MYTABLE  s  i5 V6 h& n" p7 e& d) m9 f. X9 b
WHERE ID BETWEEN 0 AND 100
! m9 i, r+ r/ i, lORDER BY NAME, ZIPCODE
- G* z9 E8 W+ T7 ^, {' e7 u% {& t& W7 ^0 ~0 g3 f* [1 o' A7 s; g
A.给ID添加索引6 B  B% f8 R' r9 J, N+ ~/ F
B.给NAME和ADDRESS1添加索引' O" J' l0 q6 ^4 s! p1 z
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
; C; T% q+ A4 |D.给ZIPCODE和NAME添加索引
$ C" d7 h5 U, e0 m- z& Z1 lE.给ZIPCODE添加全文检索
2 b: v9 K. y6 s8 ^! J
2 m7 P, Z* }) g( k3 L
8 R/ _# B7 s$ C, V10.执行以下SQL语句后将发生什么?/ z( c8 ~% K* u. |. s
5 U( @) ]5 X$ w. v2 n1 {8 I
BEGIN TRANSACTION* o6 C3 X9 `9 k* P- A
DELETE FROM MYTABLE WHERE ID=1
9 H- r$ P/ ~  [7 T% ?DELETE FROM OTHERTABLE1 Z8 z* Y, W5 c! z
ROLLBACK TRANSACTION0 A: _8 R2 e# D. q, B# ?
1 P9 i# c5 c8 b; H
A.OTHERTABLE中的内容将被删除
0 ~: j5 h/ T' {( g: r3 G/ yB.OTHERTABLE和MYTABLE中的内容都会被删除+ Z5 d+ @# R/ B1 ~( O# T" N2 B/ R& B
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
1 K4 L, W" c; ?  q3 w8 O$ [& k' ED.数据库对于执行这个语句的用户以外的起来用户来说,没有变化4 w. i: x* v/ T- ?
E.数据库没用变化% Q+ z2 U( g0 j0 W
  f- _  d8 O# O' T4 K* g
8 v7 R) F% r  @9 N/ B3 x
11.DESC在这个查询中起什么作用?
/ [9 A+ H  A% y
) w  o9 `4 C$ u# y0 U# o( |SELECT *, _( m& V) [+ h+ u
FROM MY_TABLE- |. A- r  k; d/ L; C: r# l) ]
WHERE ID > 08 V7 V) g6 i* r
ORDER BY ID, NAME DESC+ i3 O0 R4 J& d# m) j6 ]

* [5 [7 A# s+ k/ @  q7 ~A.返回的数据集倒序排列8 w8 R1 o. L0 ^
B.ID相同的记录按NAME升序排列6 j$ d* s) g) {
C.ID相同的记录按NAME倒序排列0 {- G- }4 y" n/ v% z5 N
D.返回的记录先按NAME排序,再安ID排序* w& @% L2 {+ O9 A& `
E.结果集中包含对NAME字段的描述
7 ^% T# H3 v. a! N( A! g
& P/ M4 F1 w. @
4 ]; Y  x: w$ f! k; ]12.以下哪个不是SQL函数?/ o( s0 N& s- H0 \  ~  A
* W: z; t# o0 h; @, A7 h
A.AVG* R6 o/ |3 h5 s) n
B.SUM
5 \$ k5 P5 t( w' J. lC.MIN
. B" o: m" {) U2 W: @2 J9 ~D.MAX
1 A  \5 i3 \$ U, n* y7 mE.CURRENT_DATE()
% h" S1 I9 g2 y1 E# p! c' p& t" |9 y" l' s, }( l6 j7 L

. l, W$ [! `. F) N  q; E* A13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?* z2 W& N1 @. g8 S# f( j! ^
6 c" b! q0 i* W7 B6 p0 I+ E) t
A.该字段必须有索引
! o6 v# w' Y# L8 j- MB.该字段必须包括在GROUP BY条件中
  Q9 P1 `6 z, d, w+ o' j$ X: jC.该字段必须包含一个累积值
- P, [! q, L) S& pD.该字段必须是主键! E5 o7 o' }& x" S: e  s, K
E.该字段必须不能包含NULL值/ R9 N0 a1 s! _; _5 |
8 Z" n! |% a2 I9 i
$ Z8 a1 Y: \; ]' e0 i
14.以下查询输出什么?7 Q* m, P* w4 ^

4 ?. G) y' d5 \1 ^! I5 Y- bSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
  d' B6 U& R) ~8 P" n& L$ MON TABLE1.ID <> TABLE2.ID- N7 K* m  F; ?5 v  i8 r6 n
0 P0 ^! _( l  E+ T+ {
A.TABLE1和TABLE2不相同的记录
- t+ e6 R2 P& ~" ?B.两个表中相同的记录; T* M- g( O. O; @  {
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数1 a8 j5 S( `+ i3 l" [4 c+ t& m+ e! o
D.两表中不同记录的条数' ?: E7 K" ~4 m+ i0 H
E.数字2
3 {$ q" ~; Z$ r  S) c. K5 ?7 F( b- R# B* M) v

8 u; d# h. w5 e7 J+ u, B5 ~, I15.______能保证一组SQL语句不受干扰的运行?
, N8 B, R2 p5 |9 s2 j
$ Z3 `; E* ~, D. A7 X9 @2 Q7 C; u! A答案:____________
. E, g% q/ Z* m0 J; K/ R1 J0 W* b' W7 U. s3 l4 q
# X2 |, Z- Z  L7 @/ w1 ]6 l0 ]

+ N  G/ |+ X/ K0 B答案速查
" Q1 |! i4 {# j8 p9 ]* a0 d0 Y; H1:BC, h1 d% d6 ^8 H- W# e$ I' Q
2:WHERE1 E. F3 T: C; f# {" q% z
3:B5 M- ~' `6 s, [+ a( O- O. p% a
4:E
2 a$ s4 o* A+ o$ b5:BD
. ~3 Y: T+ x  _( s; e6:INSERT
0 W* W- H* y. Y/ r7:C
( j. S# N% a- R8 H4 A" b8:A
6 {) e. B' d( H( Z" A' v9:C& O+ u  ^7 v0 I. l+ L
10:E
+ \; U* a: s; E" I" Z, Y11:C$ v4 K* e& h. x. v
12:E% g$ U$ P0 F  T. o" O4 b, O
13:BC
0 k; w; b4 R! R% m14:C
9 |  \" {! t+ S! _; j15:事务
: o: T. t. |# b
" n1 U/ C9 H' M: f% m6 a. x8 `
( A" S; J, C. N6 A) q: f/ l8 Z% Y  G! l
答案详解: @+ i- [5 K, c3 _; H
4 E" |4 O7 S+ L1 b+ Y: J
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。! K0 C5 v; d& E- }: y

$ V" w. D/ \  q# m* }2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
* T% K0 C) w! `9 d  y1 D$ U5 I7 M' G3 Q* r  q
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
# O( _9 W* t1 o7 w3 ^1 E& n* c  R; [$ x" t8 c
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。  c4 b9 X; B7 c
: n( `: d# q" x6 D2 v
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。2 x2 N8 U, [/ u3 \# n' F2 N! _1 K9 l
5 j+ d" H0 W" C. j1 f! g
6.答案显然是INSERT。4 G2 }0 b2 t0 z! U  m* J
! j5 s" X, M( L7 d! I& B
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
/ e- F9 H7 T3 t- D( ]9 a; {  d3 z
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。0 }0 p# J8 U  p% Y7 C; c- c8 _
. \6 t# H: x  y* F7 L- U
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。$ ]7 T# ~0 ?& O+ |/ `/ D3 `
* a0 d: i  i" y% U
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
1 W- @& z5 K. Z
+ h9 H% C4 F; ?) E2 Q- b  B11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
% @7 Q/ j) Z) R4 B
3 B+ H$ Q2 h' n4 P$ l7 m12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。, g1 ^' z+ \5 W, B$ C* `/ |

$ W; H# b4 z4 D- f* k' Y13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
7 Z5 ^$ `  a$ V+ E( U% t5 k! M% ^3 U8 t* `# {* c7 @& O/ b$ H
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。3 p. ^+ z5 f- a) }
+ T, w6 ?# ]- T6 x
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

返回列表
【捌玖网络】已经运行: