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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。# F0 J. z2 b: s7 a7 s- G. k: u
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。: C: g) O: z) P( o5 @9 i
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。7 K8 l( w& E+ w( [8 Q9 x

/ P1 L! P3 _/ \, H1 D7 n2 [& C  F, Q
问题
/ N! R& R& J* f- B  g4 D  W/ j: f0 V7 L3 H5 t# G
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
$ ?: ~  w( F! X; T" |) r9 B% M" k+ I4 }+ Y. K8 ]' l
SELECT * FROM MY_TABLE& ]" D# t( h: l% z

% p! h3 W% o) X/ d# q4 \# W: {- OA.如果可能,用把查询转换成存储例程
* d& m# ^( C8 X+ Y4 [9 IB.如果程序允许,给查询指定返回记录的范围
0 e) v6 ~4 x2 t, w5 `1 EC.如果可能,添加where条件
) v& u- w2 ?" v! y8 T# |" E0 J1 HD.如果DBMS允许,把查询转换成视图
& S3 t% X& X7 O  RE.如果DBMS允许,使用事先准备好的语句
6 p, [! L& c& |8 P% E5 m  H% F: B. K7 ~  B. V3 N9 s
9 \! i" W: S# e* J# m
2.可以用添加______条件的方式对查询返回的数据集进行过滤?( X: M/ W" D: y1 w3 q+ x6 b8 g! c

$ d& D& W, M6 c+ j) R2 I$ g3 B  a答案:____________
0 R( C+ f4 z; i
4 j8 Q9 @. I! D. |0 K7 {7 X5 i7 E( ^2 K/ A( |# u: ^
3.内关联(inner join)是用来做什么的?
# h5 ]# `8 \# ~" A5 {& U& c
1 j1 y- L/ a9 E8 e* P+ s& lA.把两个表通过相同字段关联入一张持久的表中
. G+ _+ r& P6 i' G8 C  C# |( t% ~3 HB.创建基于两个表中相同相同行的结果集
9 L1 i5 S8 j, R" B9 O% UC.创建基于一个表中的记录的数据集: r  Y; y' v9 K
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集/ }% H! L& a+ Q; `6 h* @3 y! \# H
E.以上都不对, t; c6 w' l! k$ i% c0 V5 H. E

* j' M$ F. B' p# J" w' ?: {2 W  q. l" g' {' t8 \6 Y
4.以下哪个DBMS没有PHP扩展库?* A0 v6 F% a/ h0 {0 A/ S
! A  p( \6 ?8 [6 ^
A.MySQL4 {0 x  R5 f5 v
B.IBM DB/2" |" n8 J9 }/ `) e( A" j' V/ W1 O
C.PostgreSQL9 p$ |4 S5 v) `4 K4 m  Y( R
D.Microsoft SQL Server
, |5 ?& V! S. N6 AE.以上都不对! w( `7 z  ~3 H+ k& j+ l

& k2 l8 }( b0 h- x; l! ^% |! v
8 x7 U# L+ D; [5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)$ _3 @9 s+ X3 I) V! r4 N, M. h, G
: I: x/ K3 E! s. G# t6 h( c
<?php
$ x1 K; g6 N% p8 _: Y$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);& E1 S* W4 [1 @! a3 L8 |
?>
9 N# e- c: Q2 @3 D3 N6 c% \& [
" K4 H% E. b* e$ ^. F2 V6 pA.MYTABLE表中的记录超过1条0 y  S6 j: o# V' f7 N
B.用户输入的数据需要经过适当的转义和过滤4 i0 i1 G6 e9 b9 O5 J6 ]
C.调用该函数将产生一个包含了其他记录条数的记录
( @( y" b; ]! R7 s9 ^4 ND.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除  B8 G& v- t. S7 V" [; q! q% G
E.查询语句中应该包含数据库名8 t8 `4 B7 ]+ ~: @7 W0 R

/ }# |5 V) I2 W
) W6 l% ]6 `5 W- p& g7 y2 e6.______语句能用来向已存在的表中添加新的记录。: J1 A" @( o* E

7 k3 ]2 d8 H$ D4 \& ~& E9 z答案:____________: ^5 g6 v1 n% N6 _+ k  s- a  o
9 e7 Z8 d! U( _" v' s4 c& E$ F
) T3 v! v# ~) K2 Q% U6 O+ D! H
7.以下哪个说法正确?
  b8 f" U/ _# x7 p3 R# H0 O, P2 J6 u# f3 T! U5 S9 H
A.使用索引能加快插入数据的速度# G0 m# V- C% o+ Q4 _  R
B.良好的索引策略有助于防止跨站攻击
* S4 ~" Z% K; b. z( V0 z8 ^, [  EC.应当根据数据库的实际应用按理设计索引7 w# Q+ p0 X5 P6 }# d( |/ j8 f
D.删除一条记录将导致整个表的索引被破坏0 R+ Y$ V( l0 m
E.只有数字记录行需要索引9 q, k" H3 v6 T5 X& C( n

5 p6 Q. R% b6 G$ V+ c. R2 e' ~" F% H# {! {) i
8.join能否被嵌套?
% D% v1 S6 g# ^6 H! O6 ^& O; h- p( L' e3 A; B$ o+ ?- k3 a$ }
A.能
9 J/ Z2 i. v& W$ l4 k* {B.不能6 y  [, q* a! O  z4 E+ s/ W+ g
# D/ c$ S* {" Z+ n/ p6 P
+ ]% H( W4 u/ H% k
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
8 h% q  J) F$ g8 v: X& @$ X( s
  o! E! r9 k, _6 [" l+ J" BCREATE TABLE MYTABLE (
. N( j  f* \  T5 B8 R) pID INT,; \! w: ]4 X$ w" X9 m8 ?
NAME VARCHAR (100),9 b) _8 U: w* r4 k* \& d) [
ADDRESS1 VARCHAR (100),
( J: q. h6 ~# |ADDRESS2 VARCHAR (100),
% X2 p% ~2 A. I, r7 W5 PZIPCODE VARCHAR (10),: E  W5 Y& y. @5 i
CITY VARCHAR (50),9 d' Z6 U1 v7 g4 e1 J+ E3 m
PROVINCE VARCHAR (2)
7 u4 ~* Y" g- Q' B: u! p9 u)0 S0 p* n7 `3 z% v8 s# d
SELECT ID, VARCHAR
" y5 L3 K6 b, T) {8 T! xFROM MYTABLE
- J6 a, Y7 u. U: `6 c% cWHERE ID BETWEEN 0 AND 100; t/ q  N5 f3 u- l6 ]+ S
ORDER BY NAME, ZIPCODE. o8 {! D; b  F& K0 s" X  q2 y+ W6 Q
8 s( F- I  G8 S6 V% \* b9 @- }, H. |
A.给ID添加索引
8 R8 @9 @) G" `  {+ uB.给NAME和ADDRESS1添加索引
0 N! p0 p# g- x8 a# h# N" T) j$ qC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
- }' m$ H0 y1 R4 S, g: v1 r/ nD.给ZIPCODE和NAME添加索引/ d0 j4 r2 @) R0 `* N  T
E.给ZIPCODE添加全文检索$ r9 C5 a  y' j: Z8 Y7 p/ v3 G$ H
# A: T0 s( v* n6 Y9 T2 ?9 K' k. f
! W$ Y/ W- C0 O9 o+ I0 h
10.执行以下SQL语句后将发生什么?4 s" `' @# m9 G: @$ I: c+ e; i

- F' [6 c9 l# A3 C1 ^5 w, c" GBEGIN TRANSACTION
. _( f! [  \+ z/ y4 ~8 j# mDELETE FROM MYTABLE WHERE ID=1& B5 @/ F: A' y1 D5 n( y4 k6 |
DELETE FROM OTHERTABLE: k6 x$ B- _2 ^  C, |/ ]
ROLLBACK TRANSACTION
9 Z0 j3 S  k. O+ {$ Z3 r' q! G  u$ z
A.OTHERTABLE中的内容将被删除: [4 |% F6 ?( `! Y: n
B.OTHERTABLE和MYTABLE中的内容都会被删除, N4 N( p; B/ l1 \
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
% }/ s0 X# }( nD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
% Y3 t- \. k- T) g$ q3 z2 Z. VE.数据库没用变化
5 j' ]* }* t  }( T! X. ~. T& k* ^" `! l6 b0 q% L9 s

- F; |# s" M* i& A4 Q11.DESC在这个查询中起什么作用?
( r; n# p& g/ |8 ^# @- @  [5 u; W; @. ^
SELECT *: }6 o2 D5 Q( }( W- W  Q$ {) ~
FROM MY_TABLE
" f- A) Y" x1 C$ Y5 S; t6 K  b% ?WHERE ID > 0- T5 ~8 U( `! m+ l; K
ORDER BY ID, NAME DESC0 ~: E( V8 G$ F6 G* v1 P" K; _
* @- o1 \% f* D. O$ e* U
A.返回的数据集倒序排列- y( U0 l0 O" Q# @, h
B.ID相同的记录按NAME升序排列- M9 w3 m; b5 ~1 l. K
C.ID相同的记录按NAME倒序排列" Z, r6 z  J# l
D.返回的记录先按NAME排序,再安ID排序
( ]/ B" T. u3 R' sE.结果集中包含对NAME字段的描述/ j1 W2 _& G; y3 R+ h' ]

, }% y) E. i6 f( |$ j+ x  \
5 g$ a& |& Z6 i# B12.以下哪个不是SQL函数?9 K7 G+ q2 l8 N/ j. P- t
8 S' P/ S/ @, i% p- r
A.AVG" F' P8 n' Z# `1 `0 |; \7 _
B.SUM
6 U" F" @% R7 ~  N0 iC.MIN& D2 c1 a% H) s  J8 j
D.MAX
5 b) a0 x+ b: w& `E.CURRENT_DATE()6 x$ ^- {" @5 A9 T7 Z

2 o- c- q+ D  H: S
4 a# n4 j% e. k7 J1 X13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
2 ?4 V- P) j" u/ \! C! R4 u
# p6 Q" a, m  S  t; N( nA.该字段必须有索引
  p+ F  B" B5 x  K5 L" c3 d; b6 ]9 u& IB.该字段必须包括在GROUP BY条件中
: T3 U) }6 |. `2 _C.该字段必须包含一个累积值
( ]; n: w1 L! S$ `$ x4 H  ~D.该字段必须是主键
- A" }* G2 R) I+ P# l5 OE.该字段必须不能包含NULL值( e; y4 B7 ?) T" {! ?: N
9 Q; ]$ o9 W8 {6 S0 L3 p- @
4 w. S1 k: l! x! e0 N8 J  e% g
14.以下查询输出什么?
7 k1 F! y/ u/ j* f2 O8 T# ^6 I* Z2 S/ t- Y$ X3 H
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
; o" `8 v8 |, \1 V. }. f1 OON TABLE1.ID <> TABLE2.ID
$ I6 {7 z8 {8 v- Y6 i6 o/ \
$ f8 n7 ^7 z+ C( O# @  H0 ?! z8 v4 f+ IA.TABLE1和TABLE2不相同的记录
6 x; O# N3 c4 `B.两个表中相同的记录
7 ?6 q% r; R5 g5 w" M% pC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
% {3 ?, g  x; R9 {, rD.两表中不同记录的条数
9 E6 ~5 a  }+ H0 \2 L, _E.数字2( v/ c4 F, N+ x+ O; F" s
# l0 T! A% [! ~, P% Q0 h

  P% c  q. C& b" _15.______能保证一组SQL语句不受干扰的运行?& @# K- a8 {& }1 ^4 n

; {" f8 o" T$ ~: {  K0 V答案:____________
& Y) {$ E7 b3 \! p1 h% L* _1 J5 e: r0 w/ o% O8 P" i

; S# B# J5 v$ [8 g/ v2 k. t8 I. E  b% w2 k: Z+ d9 F0 G
答案速查7 l4 j) ?9 N) `7 L3 r6 G' r6 F
1:BC
4 T$ Z& Z6 S! c, g( h9 {2:WHERE
. g" p+ U# ~  e$ V+ o# D3:B. S( x. j; W6 U& X. l- n
4:E
, P$ V9 H/ n9 E. V3 r- k2 S6 L! V2 V5:BD
: s1 R( u" b/ S0 u* h1 c6:INSERT7 l8 E' \1 R" g5 C/ B- j
7:C0 F4 o% \* l, S& Y1 c0 N
8:A: o% B9 ^; _5 [) }6 j+ O
9:C. d  D, c4 u+ r3 R" Y
10:E
- j- f! D5 @; O: h/ Q11:C
  U/ B( c3 P0 X$ m8 j12:E3 [3 S7 K) @- N
13:BC
& ^. ~7 h8 r. a% N- W14:C0 t/ n) Q1 y. D# Y: }
15:事务
9 c0 z2 b9 V6 }
8 q' d. i( o6 Z  s
8 R, E) s. J9 t2 D0 V; r( b9 q+ A4 ?$ |4 a" l
答案详解
  r& }, o( e1 A- {$ ]) I+ O, @! t: o( B
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。( B9 W. F$ V) m4 x6 I- K3 o; y& ~; l) Z
- O- g2 v) T7 H  |: J
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。+ j( q6 I% V" I2 i) S
3 ?3 q2 B# z7 R' ?  M7 g# i$ J  Y- Y
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。* M6 n, M2 m- g  P" D% s

5 P( U+ N- E2 _  h/ H, x* S+ }4 q8 f4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。7 \8 Y* R: l2 e+ g7 f

+ d3 W* D4 a3 d: D$ I5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
; N& ~0 I" q0 c+ s' k4 z  S$ O5 p( o9 A# g- ~
6.答案显然是INSERT。
6 ]  V% t. u" i4 u- Z  K9 f4 d$ L3 H( C1 l. z+ S7 p; l% h
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。: F$ K' p; P6 n1 T6 V6 w
. O/ ~+ d3 W, r$ p: s
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
1 Y( l! g, i1 i* C7 |: F4 C, j) E
, x% t& U) ~% V7 P, i7 N! ^/ I9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。5 r8 S9 v2 H5 w
5 f: U0 C+ ?2 b+ N) j6 f
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
5 I) G9 G8 y8 {7 ?, V! _; ~
6 u! T# T! w' u1 g! M11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
9 X) s1 u, @2 f
3 J7 J/ h2 U0 Z. H$ d! J12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。) _; e9 S, F8 k- q, w* f

. A' W' A% I/ h  C13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
: p# n) a& S! `. b' F
( w* e6 N2 K5 B. V/ D14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。; Q' p+ E6 b) N$ d) E5 r/ ]
, w. y, R+ e; m1 p
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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