返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
( \/ D: S( |5 |% O0 k' DPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。/ o0 Z- F' ~7 l. k4 z6 U# i' h4 C
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ w! {7 f6 t  h" h1 u4 m0 X0 N; K5 n5 @4 \; U. Y; z

3 J3 X0 N, P) ~8 r, E" [2 l  o问题" P6 D1 O( Z" \. ~8 }  ]5 j0 i
* {, l" T' V0 ^! H) R6 Z
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选), S: \( n+ a+ P0 ~) S; t2 L

2 |  ]+ _, e4 m3 l8 `7 ^, mSELECT * FROM MY_TABLE5 q% w1 Q) w2 ?5 A
9 c! H) a' H; `1 w3 r5 @
A.如果可能,用把查询转换成存储例程* v$ }$ {' @* ~3 J
B.如果程序允许,给查询指定返回记录的范围4 m3 M$ m' G9 B/ H! I# e
C.如果可能,添加where条件) h/ G- E4 V) L: m" j& z
D.如果DBMS允许,把查询转换成视图$ q1 i$ z! x! ]6 J
E.如果DBMS允许,使用事先准备好的语句) ]( p8 d- _8 S4 a% i, e8 v

: W; r' n1 Z; l" F6 S# w+ w+ a$ A! D4 h6 C: J0 J# ?
2.可以用添加______条件的方式对查询返回的数据集进行过滤?: ^; Q6 y+ @2 V8 l0 N) F

: N* e- ?  ~7 L0 h3 D! K6 w答案:____________: I3 k6 v; n1 T( E9 F1 W" b" A
9 r0 h3 \( p* y. B2 n- c

# A$ D- s9 a0 h/ U. c/ u3.内关联(inner join)是用来做什么的?- A9 j: P8 }% I" Q2 w
( d% p, t1 G) F: g: V6 S. J
A.把两个表通过相同字段关联入一张持久的表中
; m1 c. m4 r* H4 ]1 F: }9 u& mB.创建基于两个表中相同相同行的结果集
" C# `1 W) t: @$ u& N  O! lC.创建基于一个表中的记录的数据集; h2 G4 u- a. m, A5 Z* M* B
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集* N; N: ]$ k* d  N, U* E, `
E.以上都不对% ^2 i+ h4 s# W. a) A6 g
, ]' B* }# P' ?7 q% j
# ^. c' G2 N2 Q9 f- ^, i& I
4.以下哪个DBMS没有PHP扩展库?
4 L4 l+ m7 Q4 H2 D& W; e( X& Z8 c! `% W2 p9 u
A.MySQL
7 q! N( O( b! \9 J5 TB.IBM DB/2
0 H. U! i& z# b) jC.PostgreSQL
( V& y! n8 M) H$ c* Y" XD.Microsoft SQL Server
* [; A/ M4 ~/ g( f$ n( C  hE.以上都不对# m" e; g2 r- i" t

6 o% o! f, f! D( T
. J$ h& [5 ~# F# {* _6 u$ F! S' b5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)! d# P5 d! c: M1 S1 {! N
5 g: o/ i1 u& q% ]! v
<?php
# U0 R7 ?" b# F0 N  ~  L+ C; b$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);" g6 u3 L$ Y( L0 s1 B
?>
$ ]1 S: u! j$ O; l
8 U/ \1 D4 G) j. D; \; WA.MYTABLE表中的记录超过1条$ W/ V% G. z; g& o6 [& @
B.用户输入的数据需要经过适当的转义和过滤
6 D, l( t; j/ j* aC.调用该函数将产生一个包含了其他记录条数的记录. W" j, {( o3 a5 P
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
( X5 ?7 Q/ k. N5 ]: q0 R! {E.查询语句中应该包含数据库名3 E2 M# \* `" @' F4 z- h

" k/ {. V- H& g7 b! e6 C0 A! y. p  t$ a- v& o  e
6.______语句能用来向已存在的表中添加新的记录。
+ \' ]: c5 ~/ h5 l( j4 l2 T6 J2 W
8 r% f/ ]8 C1 s4 {6 e. D$ r$ K# D4 q# Q答案:____________
8 D& L1 p5 X& ^% p7 d' [
8 M% H  g' Q0 J' g2 c9 ?* E$ y+ w: m6 f% y
7.以下哪个说法正确?
  }: u- N, V/ \- O! {  X! I8 N1 N# Y! K) l( H
A.使用索引能加快插入数据的速度
# D9 U, ?; S; G/ SB.良好的索引策略有助于防止跨站攻击. n, E* _. g# z& A5 g3 g
C.应当根据数据库的实际应用按理设计索引. R% J4 x7 C( \. J
D.删除一条记录将导致整个表的索引被破坏
) {4 z7 b$ h$ O& GE.只有数字记录行需要索引
2 W* Z$ Y3 d: O) k
) X; P5 b" _4 @, a$ }- N2 n! Z( k- {) G* ?" Z. g9 a
8.join能否被嵌套?9 X. W4 u0 N5 s9 p4 ~
' z- a0 l1 S" R) a) u9 \
A.能" j4 u% S/ G  j3 k- c8 O: b1 X+ p
B.不能; `1 r- j/ Z, k4 H4 f: m) f2 C

8 ?" a# s; D$ B& B9 I# ^5 X: j# N! I2 U% L
9.考虑如下数据表和查询。如何添加索引能提高查询速度?" @  [3 o/ s( y- b# X1 Q" u

3 V# X+ `; ^4 C# c5 _CREATE TABLE MYTABLE (
( L6 Q2 |& W$ XID INT,
7 M' y* q5 h' f3 aNAME VARCHAR (100),. C7 |2 Q' p: S, G$ N
ADDRESS1 VARCHAR (100),
, V! p8 y" V% @( W/ VADDRESS2 VARCHAR (100),; P2 K* k, k8 U
ZIPCODE VARCHAR (10),+ g6 m9 ^4 D" O* J; ~7 }- R! V1 I
CITY VARCHAR (50),
( Q$ Z+ J) Y- Y1 sPROVINCE VARCHAR (2)
/ [- I" W, L% l/ m( Y): ^; l% J% S, w/ m- M' w* R
SELECT ID, VARCHAR: U3 E- c  N# I5 u2 V* [# Q- J
FROM MYTABLE
, a* [+ L9 q6 D5 ]$ ^WHERE ID BETWEEN 0 AND 100: W5 {. u3 V" M/ s$ K0 k
ORDER BY NAME, ZIPCODE9 L4 r, B* C' F

7 r" {2 k$ R3 [1 [" ^$ f" oA.给ID添加索引5 F- }5 w( ]0 C; N3 j
B.给NAME和ADDRESS1添加索引7 K7 `, k6 i2 j2 I5 ]) ]
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引3 Z- w- @8 A/ _3 S
D.给ZIPCODE和NAME添加索引
, p. U4 w  a3 q* T8 H( u  K0 h, ZE.给ZIPCODE添加全文检索9 V' \* l5 ^8 k
* i3 X  }+ N1 e, [* ^
, z" p- j- @& v5 l
10.执行以下SQL语句后将发生什么?3 r! s( B* E5 F0 S5 o+ Y2 @* T/ M9 _
$ d' [0 k* R0 q( s. b/ N
BEGIN TRANSACTION! K: [$ R  v$ Q8 s, Z7 ^
DELETE FROM MYTABLE WHERE ID=1
7 u1 ?  @5 r8 i# P6 ?DELETE FROM OTHERTABLE0 X0 @% e5 C/ n, [
ROLLBACK TRANSACTION, U2 w# _: C- [4 S7 C- o2 A% n

( z3 ?$ R9 v, n; Q1 v& tA.OTHERTABLE中的内容将被删除
( s; M  I" n& g0 S5 Q% ^+ O* L. WB.OTHERTABLE和MYTABLE中的内容都会被删除
: h- C4 V/ C# X0 _: Q& l3 q5 J' RC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
! Q6 g% T5 Z4 _D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
" A& Z4 J8 Y( x- ]2 a  U: X  gE.数据库没用变化8 ~1 l  u( r7 P3 Z
, C& d) ?6 b: \) t' h0 Y

6 l! Z) T2 p" X  `/ z0 G' D- v' g11.DESC在这个查询中起什么作用?
6 M8 [" v- ], u* o! k( A, X, B$ }: ?% t
SELECT *
  H# h; B5 V" M* ^( k1 h, ^FROM MY_TABLE) N+ r8 [) O5 V: Y- Z
WHERE ID > 0
0 P5 C6 A! h1 g% K# g; i6 ?ORDER BY ID, NAME DESC
, C+ b- I' r9 v1 G" i0 S! R# n
# _, W- e3 ]) ?$ H/ WA.返回的数据集倒序排列
8 Y8 j! G) X4 p) g. e9 d) \B.ID相同的记录按NAME升序排列
# ^3 i1 x4 c/ Z  m' l. EC.ID相同的记录按NAME倒序排列
5 C" }+ Q6 c* ~D.返回的记录先按NAME排序,再安ID排序
6 F9 h, r: c# [8 R8 R/ i2 o7 R% AE.结果集中包含对NAME字段的描述7 K% b2 W" L% N& k

9 ?) I& w* X; U. m- [" B, W6 K: F6 W/ @5 J6 q1 D3 o
12.以下哪个不是SQL函数?
3 d+ ]2 E6 M+ B) v( J  b+ y) v0 i8 ^9 s
A.AVG
8 \8 C0 t0 [( \: w4 U2 R9 F2 f; q- qB.SUM
8 n. n; @3 E; t6 l; `' N  Y1 wC.MIN
/ W3 ^3 F" f! J( rD.MAX
. r  P1 I+ ~6 e$ w7 f, QE.CURRENT_DATE()- p4 E  p$ |' m- y# h# R7 D

  n2 q2 l  L. J- h
( u. O' T7 O; i4 Q) N13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
4 e& E( t" D* `3 x& T
( c8 T8 D* u$ a7 H5 k" S6 J2 g. xA.该字段必须有索引
, K  o3 l" p& B$ t, wB.该字段必须包括在GROUP BY条件中
. w+ Y: t0 J: ?# w/ r2 t+ NC.该字段必须包含一个累积值
+ ~7 ?, o9 f( q# Y; r  z, e$ ]6 e) bD.该字段必须是主键
; c% c+ ]7 n- [8 `7 u& ME.该字段必须不能包含NULL值, |7 t( o0 a3 ]/ Z3 f
* M- ?) G! f: d! e& ^6 k
, |1 h. u1 f5 o" w
14.以下查询输出什么?
* O5 y0 {1 a% O5 J% W1 E% b
5 ^9 _0 ^, d8 o' p* K6 ESELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
% a$ i) F+ m3 sON TABLE1.ID <> TABLE2.ID4 Z! R+ G( }1 B8 V8 A. [
# X. Q# F& b. b1 G1 P
A.TABLE1和TABLE2不相同的记录
, d, t. Z: z0 \0 RB.两个表中相同的记录
+ Y: ~6 N8 i+ }& \' d5 V* kC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数9 [3 O% Q" Z# A5 ?0 v8 K
D.两表中不同记录的条数
9 h1 B: Y9 H' l( n% WE.数字2
5 O" O6 j' y% y+ t5 _# B4 I  Q9 l" t" Q/ y
  X" b. T0 {3 g) Y" M+ V
15.______能保证一组SQL语句不受干扰的运行?  E9 i5 }" {. I2 D
" k  D/ R1 q- e5 f
答案:____________# {$ |0 s) `' t& D

: s) _+ K- u4 i" C# ]' f8 R, [: ]- t! g) }$ ~  d) ~
7 p8 q% W5 l/ M+ G- m0 R
答案速查/ s5 {$ N4 v+ g$ X, S! v
1:BC
! P' H! D/ z. ?* O2 V. G$ \1 h2:WHERE
+ x5 D& R, }: I/ U8 Y( h7 F3 M" ]3:B; P% h8 p; u% }& G$ Z
4:E
3 ~; I* l( r/ Q) l! m5:BD& E  [$ H, z  x2 M
6:INSERT. v3 e9 O/ W$ q) Y. c- e
7:C
& Z4 J$ z+ E5 [  ^8:A
2 y% y1 Y: d1 }9:C* |; B2 v+ ]; V: o( y4 n) T) ]
10:E
. u' T4 R: f5 N$ c11:C
0 |& q4 ^) H2 C) Q; ?* G# h) U8 @12:E$ \9 |' j5 a2 a+ }. M8 x! _; a: c$ c
13:BC
5 Z( [* c7 a8 h0 y- H# O6 T14:C; F& ]9 U- o, k1 L, r- E
15:事务( C/ z( j, p% ?+ a1 \

8 x4 W! A9 i/ R) E
8 l& W( Y  E& r  z" h  V: x$ g
  |  _* G+ A* |8 `答案详解
9 J* d& V; I' t( @" l8 t, S1 O+ ]+ v3 r
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 A1 @' d  g/ @. E7 q5 C
" r* T* u  S/ q$ f' K) g' m2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。( Y* Y6 m+ O7 p2 r' M5 }

  a$ D+ ?7 t* M- e6 h3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。# w. A: h" @+ v0 B& g& W# M* e
- {3 u! N4 G2 v) ^& i9 H7 J: |
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。; t% A# J& N% f- s
" ], t  X, ]" a5 G- p( q
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。9 ?7 a9 F9 u) m$ D2 e$ y( @
$ s/ L# M" z- H. X! X/ \* d
6.答案显然是INSERT。, s5 i: K  N) U6 @9 A

! z% \) G2 q" S. e$ Z7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。  a6 z7 W! [* `3 f0 B
* }& T, G% a% |
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。& J( t% u, b1 c0 Z
; I8 R' M( B3 `0 A3 ]/ t
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
7 p' I7 k0 V8 J0 f2 x6 V2 ?* r5 Q) S5 s
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
5 V2 ^2 O3 V: T, [
, D. [0 K: v. d3 ~2 G( M" a. W  m" ^! f11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。6 ^6 s, V/ \" E% _

) h% B5 ]2 H4 T: J8 v12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
6 J" W' {; T% f9 _
+ e/ c% \8 _3 {13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。5 Y- W+ o% m" b$ j- `! }, B
8 i) V% F! U5 C$ {1 |) q
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
" B: O  c/ a+ Z/ O0 i: r) r. R2 x9 Y* M' t7 V) F* h2 s
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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