获得本站免费赞助空间请点这里
返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
, v8 r5 _& A. \) V6 Q. tPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
- P& a5 \) H- R$ G# V: W2 B本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。) Z* z( B+ S" R9 Z( v1 y

' N" k* T0 |, I+ h& M# O3 ?  h6 [) V4 O& S5 f& ]
问题1 M! U" t4 o! S2 }0 I

& h9 [) T+ z# L6 e1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
0 O4 B! X$ B# c( m
  b! [9 U# \; o& G$ i3 wSELECT * FROM MY_TABLE6 ?5 y4 c+ q$ g" a# {* V- R$ H4 C
3 Y: H) K- }" r2 a- {+ W! U
A.如果可能,用把查询转换成存储例程. s* G# h% ]5 p6 ~: r0 Z
B.如果程序允许,给查询指定返回记录的范围6 b+ ]9 _; ^' L, [0 }. z
C.如果可能,添加where条件3 \/ O- s0 m7 [; z% B9 G
D.如果DBMS允许,把查询转换成视图
& V. v$ Q8 M. S/ V* F6 e. f9 ~E.如果DBMS允许,使用事先准备好的语句
4 o' b$ G- {3 Y; J  I+ Q& |9 G
: l8 l2 ^* b2 T6 \3 h; R& u# n" @# C- y  L$ d; P+ j: U
2.可以用添加______条件的方式对查询返回的数据集进行过滤?" R& Z1 u  i% O2 U; y# g

4 C' ~$ _: z% x. B; F1 x答案:____________2 R/ {9 V  \0 l3 K3 s+ m
' m! I/ [5 b0 y

2 p3 {* s2 H/ Y1 \3.内关联(inner join)是用来做什么的?6 P/ f" f4 I2 a

% U3 Y  M* \3 L  e& y' i7 f& H' DA.把两个表通过相同字段关联入一张持久的表中
: h- V  m5 d' r' X/ DB.创建基于两个表中相同相同行的结果集
! o- p, j  I$ g/ @) J% N+ |C.创建基于一个表中的记录的数据集$ c, i' r9 G, N5 G: Z& p# B
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集/ j, t% ?3 w0 n" h9 g: a
E.以上都不对0 F3 \+ l; N' {8 E! x- l/ Y3 O! C
" S5 V- _* l; g. \. u. N$ \  m- ^
* ]- ^) R) ]0 q* S( f- o! p
4.以下哪个DBMS没有PHP扩展库?6 Z) c3 v1 R: v9 ~4 k' U. b! ^
8 j3 h7 f0 ]; }7 I0 G
A.MySQL
% u( l2 X4 ?( z9 _B.IBM DB/25 g9 v0 {+ z. Y  G
C.PostgreSQL
: c, W8 i+ W/ f; G' s- t- _D.Microsoft SQL Server
/ v! ~6 L7 p4 @E.以上都不对2 K4 [& Z1 ^% n3 V' B

3 L. r$ i$ ~/ E. X
. D" i9 q3 b7 I: |/ Y4 O5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
, M/ s+ g' g( k; z0 [  H5 Z7 Z" z2 c# ~/ a
<?php
8 V% t) o, A' W$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
( U, Z9 B2 O' @3 Z: c. I?>' K: ~0 C1 P0 z! T+ Z
8 p2 f% R9 C6 w/ ^, m  ?
A.MYTABLE表中的记录超过1条
/ N( ]! r7 |' J' R: d# A7 @4 B$ TB.用户输入的数据需要经过适当的转义和过滤
0 U+ a/ J" M6 z4 k7 hC.调用该函数将产生一个包含了其他记录条数的记录: z; {8 _1 e+ a6 A; y3 }
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除2 Z2 J8 y+ V0 r
E.查询语句中应该包含数据库名3 X& m. Y; z+ e# x; M- d- L
+ G* S& K* F4 L# g
1 x. Y' c2 r9 m: z7 C% b) l
6.______语句能用来向已存在的表中添加新的记录。# y( m) n5 F7 a* |3 J, `" r7 E$ q# M
7 P4 D0 r, I0 T9 }, h5 R
答案:____________
* e. s. N9 [  |. T2 r% [+ q7 C- g$ ]7 D
7 F% c( {5 G3 O4 D- }, o
7.以下哪个说法正确?
% ^2 J2 ?9 j( l1 d0 [- _( U$ h) l/ }! X$ J; v
A.使用索引能加快插入数据的速度) x$ C: g8 c; o) j$ e& F
B.良好的索引策略有助于防止跨站攻击
* B4 U! n7 Z2 T& x: S; U6 YC.应当根据数据库的实际应用按理设计索引
( a# Z  y# Z, r9 |: ^8 k7 `D.删除一条记录将导致整个表的索引被破坏
2 c- K3 P' v5 bE.只有数字记录行需要索引/ r6 Q- j' X, e3 ]. X7 T9 h

7 ~  w% d0 u0 B/ W& r
7 e- l7 I& x* N; C7 K5 ]" @8.join能否被嵌套?
& I, a$ n; B. ^) c& a: y2 C; \5 F# j/ {7 X1 i. ~9 q
A.能$ ?  n% ~4 e/ d( w# o* R
B.不能2 v. Y! z. s  E
+ I, ~6 p7 p- h+ k5 N& Q
3 r. s3 ~- O) v; Q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?. L7 }. w. C8 h( {
1 N( y* ~' @, h
CREATE TABLE MYTABLE (+ ]0 _- n0 I6 V
ID INT,2 C2 i" K2 X2 O7 m3 E. o
NAME VARCHAR (100),
  P( w. N3 C' a& N, f& E+ N- {ADDRESS1 VARCHAR (100),
# B! c5 G8 l! L- s: tADDRESS2 VARCHAR (100),
* p/ x$ ^3 B$ @- P, u: SZIPCODE VARCHAR (10),
& }9 R. @0 K3 K0 s( X( I! g1 QCITY VARCHAR (50),
5 [" |) i4 `4 ?1 ]; lPROVINCE VARCHAR (2)
) N/ |, G7 ]- H1 Q. p7 J3 _' J), p; B7 h/ i5 M& \# u
SELECT ID, VARCHAR( O* b& h- h# `6 w5 {7 w
FROM MYTABLE' w# @" y! l" c& ~  F9 W& P$ j
WHERE ID BETWEEN 0 AND 100
" o1 C7 N% ~  M* X$ M! E* ZORDER BY NAME, ZIPCODE
# P; @; d, }" E4 o" u0 l( A% X/ Y
A.给ID添加索引
) }, U8 C* r: _9 ~( M" SB.给NAME和ADDRESS1添加索引
) ?& G" e# \& |& k2 ?C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
' Q8 f! {5 _8 q' v* x6 _D.给ZIPCODE和NAME添加索引6 f0 g1 z: [8 n5 r3 n* q" w
E.给ZIPCODE添加全文检索
8 M/ @7 I, |0 H) h6 I1 o( r" |
  e, N' s( P! Z: f  Z+ e9 Z
  }/ a, e( V  j* I* \7 d6 a. z10.执行以下SQL语句后将发生什么?) l, W% T- L) C% _1 S7 D

! f0 F" h, }6 Y  }BEGIN TRANSACTION
+ }5 Z# c: m/ p0 P6 m9 `DELETE FROM MYTABLE WHERE ID=1
' A* {4 ]* x; w- `* a0 O+ GDELETE FROM OTHERTABLE
6 Q4 L- o' m2 Z( PROLLBACK TRANSACTION
) ~* _6 J8 ~, r. W$ N$ s, r
* B! g3 H, U  P! j( hA.OTHERTABLE中的内容将被删除, _% O& }9 U* y* h. u
B.OTHERTABLE和MYTABLE中的内容都会被删除$ F$ Q7 p. w7 y6 N) \+ s
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除. _1 a2 u% }5 s  V( t9 |
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
" |0 F. g( V; e- A& h  D0 |E.数据库没用变化7 A) |4 _. m& }* S

6 T3 _, f8 F) C" N1 n
; q/ c  c1 E  j2 N: Z: ]; t. F11.DESC在这个查询中起什么作用?
! u% X( h+ D0 g% ?, G) `1 _8 T' d+ ]6 _. X0 ]* W4 s5 [9 _5 z
SELECT *# H$ p( a/ i; y9 \5 _( Q3 @! o
FROM MY_TABLE
  H0 d* q0 }) O* M" d' nWHERE ID > 0
4 `$ S: \2 a# j" @2 VORDER BY ID, NAME DESC
; T/ Q$ x7 B7 O- a4 N. C( G' J% z- a5 t: P! J
A.返回的数据集倒序排列
4 _6 f% Y" c- ^1 i8 i" FB.ID相同的记录按NAME升序排列
( ?7 l. F( V- V* `+ ]6 kC.ID相同的记录按NAME倒序排列
& |$ C& {) H" R. x% P5 c5 {D.返回的记录先按NAME排序,再安ID排序, N: i0 H3 C6 v
E.结果集中包含对NAME字段的描述- @; p6 J( T! B3 b+ k
- B9 Q( I* }$ H. y: T8 v

, @7 p! x1 F- z12.以下哪个不是SQL函数?
3 q' d' n) a5 u3 @. |$ F
" t9 z! M1 h" n8 Y& y* ^A.AVG
: ~6 Z9 E! Q) h1 R$ _* j* jB.SUM
, p' _2 m! u/ _C.MIN# q+ O0 U% ~! @; ]& m* F
D.MAX+ N2 T: w7 T/ Z3 j+ J0 Z
E.CURRENT_DATE()6 j& p( L6 U. i* c4 U
- N' J9 _- m( I

, m% |7 a: Y8 @+ ^, O13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
5 `. [8 ?( x2 ]1 C$ R0 }0 D! ~  u. O  g
A.该字段必须有索引
; _6 P! m* q  [. h8 m2 ]6 UB.该字段必须包括在GROUP BY条件中4 n1 ]& b7 T: ?7 z! g9 R
C.该字段必须包含一个累积值9 s; p& X0 n4 r9 M& c
D.该字段必须是主键
2 B- M5 x6 P0 ]  fE.该字段必须不能包含NULL值7 _4 a! n* B( `" ?

8 }5 y; `8 @* e0 z. S: ?2 c) H- z2 \) w
14.以下查询输出什么?
2 S9 W$ }* [. |8 n. D9 e3 l; a+ Z. W: N( k  u  @
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2" C3 e* i5 E8 y9 _* S6 a' _! N3 v7 k
ON TABLE1.ID <> TABLE2.ID2 [/ U: c+ R) r' L

) B+ c! ]1 \' B& V/ c& Q0 f6 fA.TABLE1和TABLE2不相同的记录
; N# K  s6 z1 U2 ~6 r& aB.两个表中相同的记录- u* L$ H; X) x5 ?" F( f4 L
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数- L) {8 f7 q4 S/ e
D.两表中不同记录的条数' j: @1 t( S4 f1 o
E.数字27 k% p9 G/ ~$ X/ q5 ]/ m
0 O( O& j6 m, a9 n
9 p8 A& P' K3 d6 b4 U' Z+ ^
15.______能保证一组SQL语句不受干扰的运行?
3 q( ?: {3 z+ A* }, K$ j0 C. b: v  C3 m' m) ~: e( L
答案:____________0 z. ]# B$ c& [. E
+ ]; v7 B- H+ ?

" F" ?. q9 F& S0 W! l* n  P0 y4 p4 m, J9 ^. n% l3 J6 T
答案速查
- }' j% a! l0 `+ O! E1:BC4 u7 k+ q; b' b5 b$ J6 D$ h2 Z) z$ s
2:WHERE
( h; a/ p$ }0 r3:B+ u: t6 r7 |1 V1 P$ y% u
4:E2 v, e  s. P. i
5:BD  c$ i$ e8 `/ H( p' t- q* H$ ^
6:INSERT
4 T" x+ q1 q8 R2 M* k* t) K7:C6 k( c: o" j, j- N3 N% p8 A; d
8:A
# k0 P! c: q) C% C6 u9:C9 r% R. L$ H2 S2 L" [( e) m
10:E
1 y3 {* p* d  Q6 S3 L11:C
* c) i' ^# T* X& `12:E
2 B3 e$ ~' }, T! M- m3 t7 j13:BC1 \- E& i3 j6 Q& X3 ^
14:C
$ {6 [3 t' M6 l$ S+ q" b. ]15:事务6 W  N# ]7 d$ A" Q5 J: }

/ G8 {: V- y  {
: h" D* I. f8 o1 H7 s6 }0 s
- B" ?7 U; z* q( ?答案详解$ ]0 B& L3 Q- L5 u' r3 Z
! ?' q" u+ L6 J6 c! i  i: G
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。) w) v' ~- B: A: F

1 P# S! d) T" u1 U/ m- B3 t8 `/ l8 Q2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
, b  q! J$ ~# n/ z, ]) I; `( S  U! X8 E# h  B& o: W
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。& j: K( q$ P# W1 X  V
: W( c# z* S9 w' `3 Y' @5 B
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。, O: O* ?4 s) @: [8 D$ _4 z

1 W; y! I4 w! ~, i0 J5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
& p9 T$ ]6 o+ V% ]: W2 u! x& |/ z+ r1 v: t/ }% l/ I
6.答案显然是INSERT。( z5 Z* ~  w! Z# ~1 y7 q; W# h! j

; D- }7 H. q) r7 {2 F# U; ]7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
! P; J  c6 ?+ X. J* A1 l+ k1 u3 w5 D
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。9 ~. o0 c  q/ U

2 g8 h3 E- K" h% c; h3 z( T  X9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
/ M% p/ h; {; }: L
) W+ P! Q0 w( o# C+ S2 {% \" L10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。0 r7 m# l3 {/ o9 Y3 o$ d
, c* e* X( \* Y
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。: u4 R1 U# ^" {0 V7 e; {  V

* B2 u* F% {" Z" Z& q12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
$ V9 l3 c# o& s  C9 V  r% P5 p* R4 ?4 e1 }2 p3 c( H# z
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# G- ~4 j  T$ B* v2 |7 q% Q+ E$ H3 h- K3 _, P" j3 n
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。% w2 m% F; d8 e& m2 Y
/ Y0 B. B1 }7 m, \$ q/ f
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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