返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
% [; k5 h% g) OPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
" `+ a) B! k( ]4 u# M本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ E$ |- z5 E) }, ^/ P* j! S' Q1 a  j6 o0 o

( f0 @- v: @( ^9 Q问题
# G0 Z* {1 X9 ?, m' |" ]' W
8 T2 r/ M6 K* ?$ x6 Y9 L) Q& O1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
6 x9 A) i- l! ]+ C5 j4 G
' R. u$ V4 I; `# g$ q6 ISELECT * FROM MY_TABLE& U4 J) L! w% c8 }
+ Z) B  G2 w8 ]# O% |; R
A.如果可能,用把查询转换成存储例程
  V' T0 j8 U; v0 M( b* _B.如果程序允许,给查询指定返回记录的范围
) f+ u8 N7 w5 e( C" `8 CC.如果可能,添加where条件
1 Q* m# A6 A$ n3 jD.如果DBMS允许,把查询转换成视图
! h/ r9 O0 q! \4 \3 lE.如果DBMS允许,使用事先准备好的语句$ P5 q2 b6 W+ a0 D' c

" ]: n8 s  s3 Z$ p* L) q
9 m! v, |, K: }2 G7 N/ @4 s% N2.可以用添加______条件的方式对查询返回的数据集进行过滤?
% [4 L* `  [4 p% G+ _9 F+ V+ Q0 q. E/ }9 r- c7 ]# F
答案:____________
; K( t% r: y+ Y4 U1 H/ P" k+ N; R  y0 G( ]8 H" c. L
: O7 V' ?  K9 Q. ]7 v( m* R
3.内关联(inner join)是用来做什么的?$ Q: U* Q. |, L* k
9 T2 ~: L. B0 [; @3 z
A.把两个表通过相同字段关联入一张持久的表中
% O& B9 J9 X7 I: t' T# |7 a$ B7 iB.创建基于两个表中相同相同行的结果集, j3 B0 S0 n  B. {+ Y
C.创建基于一个表中的记录的数据集
; X4 G2 W. w9 R1 c: W- k8 }D.创建一个包含两个表中相同记录和一个表中全部记录的结果集& x( U* A7 C$ s2 W$ B. U
E.以上都不对
5 f+ P4 @) U. U
4 H" w+ G5 M6 _$ h5 j$ c' R; M6 r" @; r- T
4.以下哪个DBMS没有PHP扩展库?, V9 S1 }; g$ T& {  s7 e1 s

! j6 s" Q# v" A/ K" X& e/ [" V1 PA.MySQL3 C$ e' K; r, S8 T  y  m
B.IBM DB/2
  A0 N( P0 [3 m: {6 CC.PostgreSQL
! z$ [/ r, X9 h- x8 A4 b3 o, PD.Microsoft SQL Server. j! Q7 H6 a. U4 z# `9 z6 L+ K) u
E.以上都不对  A4 R0 Q& N9 e; T7 t, ?; Z1 W5 X
- l7 [! O3 t* n3 U1 ~. }
9 U, Z% Q6 E; [! D# t- |# [
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
! Y* C. a& e; A: ~% k6 ?% M( U4 C. q& k
<?php0 Z# M; V8 Z9 D; ^/ X$ T2 a! |
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
- p4 ~: t& {9 `! ~  n# F2 Q. b?>" s: F) |2 b! E/ R
7 J0 l* o) q4 O5 d
A.MYTABLE表中的记录超过1条
% }; z$ U  D/ q) t& PB.用户输入的数据需要经过适当的转义和过滤2 T6 Q1 j; }# \8 p( r7 z
C.调用该函数将产生一个包含了其他记录条数的记录
$ p$ x  Y3 d! V( ^+ UD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除# x. x7 j8 s3 E2 ]6 u
E.查询语句中应该包含数据库名& ?1 B+ o9 h) U% V: W

% s3 G# ^$ K1 s3 N9 `: a+ a: q/ v& N& d$ ?, T: i
6.______语句能用来向已存在的表中添加新的记录。9 j  [! e4 _$ Z5 \8 ]1 [1 g
& t: `* B; f: X$ O
答案:____________* z) D3 G6 s! R0 M. S8 i
' u/ K+ i4 t- W8 j) H
- ^0 c/ t0 o9 O% @- |! b' e
7.以下哪个说法正确?, H6 r3 k/ B! ?/ q% f

- Q+ [% ~3 `& }* E; X- X. o9 I/ ~A.使用索引能加快插入数据的速度0 ^3 D: F) _+ ]' m! h. f$ S
B.良好的索引策略有助于防止跨站攻击5 n1 }7 n- u' c8 e, s
C.应当根据数据库的实际应用按理设计索引
5 M$ a' }6 j5 w. `8 ID.删除一条记录将导致整个表的索引被破坏
4 s# b5 r3 Y9 C7 z- O2 X7 o0 DE.只有数字记录行需要索引1 J! \9 c" L$ W' o2 [! |: k1 w
/ `  A0 d& @8 D+ @0 d, N
) O. L% o- }) ]) A0 l  z1 |7 `8 X
8.join能否被嵌套?- `6 n5 a- J4 J0 J: O

* b# n/ X- `$ H/ K2 \2 bA.能
/ V  k; V/ r4 A. S  |2 B7 ]B.不能
) E% Y; h2 H& s3 b0 i4 e4 b& |/ ~" \: f/ s2 X" B

1 l  M) s- _  {* D7 x: O8 V  g9.考虑如下数据表和查询。如何添加索引能提高查询速度?7 F" j3 X6 C% K3 l

2 P/ i" N1 W9 ~0 W) _CREATE TABLE MYTABLE (8 j% m& R. u, A5 u
ID INT,
5 g1 P; m: [( W8 l8 WNAME VARCHAR (100),* q+ X. T; n/ K: R6 n( T, Q: x
ADDRESS1 VARCHAR (100),( W, L$ W7 M* ^2 q9 I6 ]
ADDRESS2 VARCHAR (100),* \( d* b) e$ ~" X4 x
ZIPCODE VARCHAR (10),
9 Z& G& b2 \/ {- SCITY VARCHAR (50),
" m! l+ |- i  E  pPROVINCE VARCHAR (2)
' X8 I" |  h1 U! ?)
$ d) @: J8 k6 T" H( Q' m7 u. Y" mSELECT ID, VARCHAR- E+ E+ R' K- O7 O! b! N$ {  x6 S
FROM MYTABLE
$ c2 A7 ?( u/ c! P: K5 O& IWHERE ID BETWEEN 0 AND 100
, ?. {: \6 \2 PORDER BY NAME, ZIPCODE( }- ^! A( @) ?  t$ O# w
$ ]/ K0 x. m( X4 M$ z
A.给ID添加索引
4 t4 E  Y2 F+ {, eB.给NAME和ADDRESS1添加索引
$ @3 U4 B0 }  z. \C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
) P, J/ }: N6 @& r) wD.给ZIPCODE和NAME添加索引* u" J- f+ ^2 M4 Q4 G, v: j8 g  \
E.给ZIPCODE添加全文检索0 y( Z2 Y+ I/ `

" D( R7 P9 h, ?! W4 @4 q1 R9 l  w$ K! ?# [( R8 Z  M9 t
10.执行以下SQL语句后将发生什么?& c/ g2 \$ ]. ~$ g7 q2 `
( @. @" w4 P: T6 `+ b1 n
BEGIN TRANSACTION
$ ^0 Y  n* r! _; V: \1 k; b, PDELETE FROM MYTABLE WHERE ID=1
9 ~9 H$ m5 B; \  z( c/ H6 @% IDELETE FROM OTHERTABLE
4 p2 B2 u' K1 R, h5 E" WROLLBACK TRANSACTION
' U) X% Q$ O$ C) l0 R" B7 g9 {  P7 s0 L: Q( k9 R
A.OTHERTABLE中的内容将被删除
- {2 l9 y# {# f0 p9 @5 R6 NB.OTHERTABLE和MYTABLE中的内容都会被删除% H! W6 D. ]. q6 t& |& R* h
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除& g& d: `- G& L' R/ l+ A
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化) {5 P) C% G! _, ~
E.数据库没用变化! J: f5 g) P6 R; k2 b$ \7 x

" P. v: C" M8 S' w( P
5 q, ]" R% w% S) e# D% k11.DESC在这个查询中起什么作用?
* O: R5 l) h+ z' n' `& p
- v% u6 g/ Z6 l' O; R8 R% e' e+ eSELECT *
. t3 {+ ~. ]! r' tFROM MY_TABLE: K/ j; i/ B9 z& ^" b1 q
WHERE ID > 0$ T2 M9 t8 ~$ p
ORDER BY ID, NAME DESC4 K& Z& |  @9 F" v4 R: h
# ^% A: l( y* L' z2 F
A.返回的数据集倒序排列
" e0 c9 X& \8 b$ v, s) ZB.ID相同的记录按NAME升序排列. q# d8 d/ h4 |# U; z" n# x. ]
C.ID相同的记录按NAME倒序排列' f' u: l) S& _* N9 Q# b
D.返回的记录先按NAME排序,再安ID排序
' t+ M3 l$ I! u* M2 K- q6 ^7 s/ T' G8 uE.结果集中包含对NAME字段的描述( k; ?- ?! H0 Q( |% U0 I* X( I! f
, B% H0 t- A) c  U
: y' T. V" g  }: d" Z- b
12.以下哪个不是SQL函数?7 G0 h- e, @! {' J! D+ U, o) U" i

2 M2 a5 w6 a3 J. d) _A.AVG
- `+ }. k! L+ s. B4 YB.SUM
- J( v9 J- D" w- C: g" L% o2 jC.MIN% a& ?  u, w) M7 Y8 z; X! E2 I6 A1 X
D.MAX
9 j, ]- {, c9 yE.CURRENT_DATE()
8 {7 }% P. z; O- ~. G" e; L! T( p3 N6 C4 O& O( Z

" T8 p( O) d4 E# i: H4 {13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?0 u* M! D5 Q! _
1 Y7 ^/ n+ D' k( W) N' u  ]
A.该字段必须有索引+ F: D7 i/ P5 f% |
B.该字段必须包括在GROUP BY条件中: P( Q, K/ g. X3 I$ ~& j
C.该字段必须包含一个累积值
2 m3 t6 m' N9 p+ _& ]$ H% |. BD.该字段必须是主键  q+ f0 V6 m/ w! A. V
E.该字段必须不能包含NULL值5 t, V- }: L9 F3 o" N
+ u4 q/ ^; i5 e6 d
$ F% B" C' C3 J% i' v) a
14.以下查询输出什么?' c- a' C- k& i+ ^0 x1 s
$ A6 J0 \# s& c; G" R
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE23 A+ h7 X" n& R5 ^
ON TABLE1.ID <> TABLE2.ID
1 f0 R( j- L7 [) J3 I2 x, J% l& n2 F
A.TABLE1和TABLE2不相同的记录
2 x& ?* q$ c6 E3 x0 SB.两个表中相同的记录; i5 p: H6 y7 f0 C2 p  d. {
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数( N( ?: [: d6 v  g; V) n8 q
D.两表中不同记录的条数4 l: i8 Z1 Z4 k' R; y
E.数字2
# N+ R- Q4 S; H/ X* W7 y( r$ O$ C% k2 ^/ R3 t

9 G) C2 A% W8 x7 w9 G15.______能保证一组SQL语句不受干扰的运行?) }: C4 W4 i  g" {
8 V, L1 D9 G/ I. ?* L1 m+ k3 `
答案:____________
$ G" F. n* o" W- J9 ~/ x2 t) U1 [6 W4 P

, ]5 e( ]9 D$ k( P. s5 t0 ^( y1 h( P7 h# n& K8 Y" g5 Y
答案速查" [# z  |% U" w6 a0 f1 K. k
1:BC! s9 J$ w- i9 t
2:WHERE
8 H/ \' _4 ?! n2 U; J/ s5 V0 R3:B
9 k$ K; W% g( h& y4:E# M3 Q) A3 q/ A1 J
5:BD- i& _7 [  h- ~3 P& X0 m& V" F  [
6:INSERT
* P; P3 k- p7 ?7 @8 {9 N9 i7:C
, t4 Z" n: ~+ d1 _) A8:A
" \. d: i( V4 F# Z3 {  w9:C& P6 p! }2 @, n* p  H' G# l
10:E
6 J0 Z6 F7 ?# n" L11:C2 s* h: o8 K7 P9 [" [
12:E
8 I& s  ~9 t$ V3 K4 b13:BC6 u' `& ?  j# w) D$ [
14:C8 Y9 {: d$ O* r
15:事务
( P: W0 g+ ?8 d% g, O6 D( [9 Q- e& Y' j3 n7 P6 F' \# {

, G6 O3 B+ H3 L: Y3 }7 p* {  O; |2 p+ t. m; h8 _
答案详解
4 O+ \( {" \- {' a9 k/ o; z# @: t
0 ?/ f( f0 j% c$ J2 i# L& @1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。6 |# ^- Y" E) q6 ^  X1 F1 ^
3 @/ N0 p" J0 V$ V3 J
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。2 c' _. P, l  B  ~( Y

- q) H1 p0 w+ s+ g3 m3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
# a' g& n) }/ V3 h  Z- o8 |/ j0 q+ p6 R. a) J
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。- j# ~3 R9 K- d  ?

& E! N! w! q4 l# _$ a; E5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
# ^" P2 {( v7 a% }+ y# X5 s* X2 O  A4 B( \
6.答案显然是INSERT。
4 }7 [6 R$ @! t- G. g
  ?) k/ U  H1 V1 @7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
4 z+ e! P2 s4 S4 v$ x) q$ o3 X" E; O( ?# x/ z: P1 v$ `$ o
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 M, `# ~, X. h# I
( y1 ?* d7 q" Q: r9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。5 e9 W! g$ t+ W& I& y6 \0 t7 _

2 E( I% W0 n: ]. s  b10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
$ I1 J6 v. v: n) v% Q: [/ t5 z, v8 w4 V/ S$ }6 J  Y1 O
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
$ K! K8 z4 C& U, ~0 z; ?) p' g% s* a, v( b" W
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
9 m  t/ B; X1 h5 R: @* h  F6 f/ p7 O0 s. n; U
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
  c' X# P( S0 d: s" Q8 t% \* K5 M6 p# G0 |0 E$ V- T
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。& R4 J" H7 O+ B. Y$ }9 s  |

. @4 K9 n4 s( k! Y1 B15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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