返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。  X. R! L+ O; j+ G
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。1 b/ @( _$ q' |! \6 h
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。) x0 R4 U% I$ ~# [

. e0 Y4 e! g/ C" j: |, L+ V- [/ g$ {0 D& e
问题8 J. y, Z; X2 w- H: ?; b

6 Y: V" i  F" q5 ^9 t8 Q( O1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
8 i/ k# X. u, ^$ {. R, u8 V) P+ w& m0 V; z; G4 y
SELECT * FROM MY_TABLE
. z$ p, K* P) s2 f$ A! k. F8 Y. K  n, K! h# a! u) W7 _
A.如果可能,用把查询转换成存储例程$ e3 ^/ U$ p5 t+ Y
B.如果程序允许,给查询指定返回记录的范围" X: Y5 p2 K; f
C.如果可能,添加where条件
* g7 w1 n6 _  o. b, h7 cD.如果DBMS允许,把查询转换成视图! T1 u. p0 |  V# O. A! I" H
E.如果DBMS允许,使用事先准备好的语句* Q8 d5 }- [9 h/ O1 U) H6 w. g) e
9 K9 A+ |$ T; N, u: W
3 e: a& d9 p2 I/ Z5 M. k+ Q, C0 h
2.可以用添加______条件的方式对查询返回的数据集进行过滤?% h6 U0 V: ?7 n7 y

) z" u3 C3 i0 ?1 t' B' n* t* F答案:____________& r7 M: [; Y: V$ v! a

  \3 k& m" M0 j  o7 c* O% L) P/ D+ P/ }: P9 D
3.内关联(inner join)是用来做什么的?) o8 n3 A) O% f3 {0 X8 f8 \/ r

. k7 n( d+ E: s; gA.把两个表通过相同字段关联入一张持久的表中; f  }; N/ i4 m" W2 c0 E2 e
B.创建基于两个表中相同相同行的结果集2 g+ n$ A: v7 g: D
C.创建基于一个表中的记录的数据集; T4 O' ]. e% M( j  D1 f
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
( j0 R5 s+ }: IE.以上都不对8 Q5 y7 q$ Y8 K, Q2 I8 l
% R3 w! Y' D- F1 w
+ Q2 }9 R' ]5 q$ t
4.以下哪个DBMS没有PHP扩展库?
) n% n4 b# P5 h$ m4 ^
4 Y+ Z' E% i5 H+ D5 `A.MySQL; l# o: l% w: \
B.IBM DB/2
, J! q+ h7 `, H) ^C.PostgreSQL4 ^7 A+ L1 {: y8 v
D.Microsoft SQL Server: y8 v2 F' y1 z5 j0 j: |& O
E.以上都不对# Q1 D- b  e) M0 r6 w
# l9 T- Q9 k+ X/ {. C; d9 I

; o& v, h* e/ s0 C* Z  _( \5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
- z0 r, m$ W& U" Z6 K, \7 Y8 i: D; w# i& `
<?php
. ^4 h4 [' O* S$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
9 v0 {, ]! h* ]- N2 W7 _8 M1 L?>
4 B  K- E9 \4 B5 o3 _9 c
* L* j" e9 v/ E  E# p( LA.MYTABLE表中的记录超过1条
) I% @0 V3 z3 b" ]( ]. L0 E" FB.用户输入的数据需要经过适当的转义和过滤$ d3 a$ {- o+ r8 m
C.调用该函数将产生一个包含了其他记录条数的记录
. |& z8 h2 N- \6 H' S2 L: G7 dD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除/ W! s# H: a' [" m/ A# W
E.查询语句中应该包含数据库名
% P, d) f% \8 w$ b. A7 [7 i
) }" ?& t2 w1 ~/ }, k; B8 u0 `- h/ f) a- {. H7 C
6.______语句能用来向已存在的表中添加新的记录。% w2 Y  p. Z8 x- O

& r) k% @! Y7 e答案:____________
9 V  q: @1 B4 }( s0 f3 B; A0 A- V/ c/ g
$ x) {6 A, g& ?$ ~; x( h" J% N
7.以下哪个说法正确?
4 h8 x) i: X) h
% W5 F3 }9 ]2 ]9 lA.使用索引能加快插入数据的速度8 z/ R3 a5 M. f% G: O2 ^
B.良好的索引策略有助于防止跨站攻击* x3 L6 @2 F0 K' G0 }4 Z5 D: |
C.应当根据数据库的实际应用按理设计索引
: d. B  I( u! ?3 l/ e+ SD.删除一条记录将导致整个表的索引被破坏
( E; `& P7 }4 L7 zE.只有数字记录行需要索引7 C* M4 x) R/ J% V. ~

! r5 z& Y* f  |* W! I" l% {. i6 ]6 Q# t6 K4 `5 ]
8.join能否被嵌套?
# T* c5 g; ?: P/ ]" Q* M: m
9 R, v/ ~. i* x1 ^1 PA.能
$ N( _. Z) i5 k( D6 O9 A+ ~B.不能) N* c7 W$ @- {/ Q9 k

7 {2 h& s6 }) v8 W! E+ w- N% _/ `/ ~! P3 H* J. K+ w8 D+ G2 u
9.考虑如下数据表和查询。如何添加索引能提高查询速度?' G$ L. ~3 e2 y9 m' B5 |5 S
% M. K$ ?; D- p: v* S: x
CREATE TABLE MYTABLE (
% b$ i( C- `( g- V" z. l6 y! UID INT,; P8 B. f4 t5 z9 l
NAME VARCHAR (100),6 d% v) K! X) u8 K1 I# f) u% Y# g
ADDRESS1 VARCHAR (100),
6 L6 ], w8 u$ j1 t1 e4 T" ]ADDRESS2 VARCHAR (100),
+ i9 H( Y5 X2 B: X2 P4 F# GZIPCODE VARCHAR (10),: Z" J; x: g' h2 ?4 c
CITY VARCHAR (50),
. X* m, G# I& I7 H+ A! d" PPROVINCE VARCHAR (2)0 d, g/ s2 I% B0 p4 U9 x8 M1 U
)
/ l3 c4 L  x. R5 @( x5 ISELECT ID, VARCHAR' h7 r# [) i* K2 ~* |
FROM MYTABLE( ^( ~0 e5 Q9 E" j3 L  I9 o
WHERE ID BETWEEN 0 AND 1004 X; x6 k, F0 W5 C3 R  _$ X
ORDER BY NAME, ZIPCODE
. a1 g6 R8 O- I8 u; z$ R* g) B6 G% }
$ u" M0 B9 I/ rA.给ID添加索引6 ]$ ?! c  r1 ]5 n) I0 o
B.给NAME和ADDRESS1添加索引( q; ?  M- C4 L0 g
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
- B2 J1 b$ y  A' H! R3 \. \3 ZD.给ZIPCODE和NAME添加索引
2 ~$ ~4 \, j: D! ]! p" iE.给ZIPCODE添加全文检索
# j. I- F! A) y! a' q  _7 J# j, F8 u6 D3 ^* k5 w: K$ p2 R

9 \! \+ Q. [* ~: r  ]3 l10.执行以下SQL语句后将发生什么?
4 {* L/ J7 I$ o: ?
- a; s* T0 ]/ \/ SBEGIN TRANSACTION  W) D3 c) G; W( I: u' ]2 n3 o
DELETE FROM MYTABLE WHERE ID=1. D# n: ]. R+ ]3 i5 ]3 ^, b- X! F! {7 I
DELETE FROM OTHERTABLE
) P; ~7 `# f" WROLLBACK TRANSACTION
% }. H  o: u: [
- O* U- C, g/ N/ j! |, s2 @% F! {A.OTHERTABLE中的内容将被删除
3 c. b2 B4 {5 w: dB.OTHERTABLE和MYTABLE中的内容都会被删除7 d- S  J3 \/ J9 u+ s
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除7 j) m9 h$ H  N- r
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
3 B( D1 e0 l$ e9 Y  a/ x# NE.数据库没用变化7 j+ A* a  q: G8 S: w) t

' D2 J& T8 I# b, G1 z! p
' I& R+ O/ g, z2 w1 Y$ j8 o11.DESC在这个查询中起什么作用?5 ?4 b) Q* J/ z/ C; S4 l+ [
3 Q2 G' R9 Z( B: w& f
SELECT *
0 G* Q0 @; r1 I7 V, G& ^0 vFROM MY_TABLE, ~6 d! d, b! N( U1 R. n
WHERE ID > 0
) J! v* S2 O2 nORDER BY ID, NAME DESC9 F$ {" t& a( A5 C$ ]3 Y
8 _7 g3 X) E+ }! F% p. o- v
A.返回的数据集倒序排列. `- |( B& O/ ]* E
B.ID相同的记录按NAME升序排列# j/ E( X" l% Z! ^
C.ID相同的记录按NAME倒序排列2 t, M2 _2 }$ G& |& n0 A; [9 X
D.返回的记录先按NAME排序,再安ID排序4 j5 b5 O2 M0 F
E.结果集中包含对NAME字段的描述
) ?. X3 T, @0 T7 U2 S* m5 o5 d, S+ S9 Q& h4 a) Q
4 H* C" J6 S. x, D# D$ i
12.以下哪个不是SQL函数?& o# M/ F2 K; ^8 I. K

8 d4 _( I' \/ W3 g( L+ ^" Q' B  wA.AVG
( T, b& k4 W+ i; d3 i2 Q+ T* QB.SUM  z! n' t1 K0 `2 P- x5 ?" T
C.MIN
9 D! C' n7 x8 i- y" \" }" uD.MAX
( X2 J3 c* N$ [+ [$ O  `E.CURRENT_DATE()+ J5 }" j6 d, S8 j! D" F2 O

4 t# [& d  L/ w1 C8 L1 _* n/ \; [) e/ Q5 T  W
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?  Z. {* k3 e+ ~/ c4 d
  [5 r  R6 I: R) G0 m7 ^7 Q
A.该字段必须有索引
8 F5 n/ k( M4 R: m4 ?B.该字段必须包括在GROUP BY条件中  W2 G9 H+ R6 f' C0 U
C.该字段必须包含一个累积值
; n- P. D" o4 d0 v. }5 S* t% |( yD.该字段必须是主键) a4 m( }, ]; S. X5 l
E.该字段必须不能包含NULL值
1 }5 R. ?# F4 |6 @$ Q
( L6 a% v* R. |1 Z% g8 d: X+ r- [) L$ N" G3 w+ C# `' M; G* g4 Y6 a
14.以下查询输出什么?
# Q2 S7 j7 t" D8 ]% P, R
3 ~; Q2 G8 `" W: L! W- U8 B# ~- lSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2% G5 s2 M0 A" r$ \- j
ON TABLE1.ID <> TABLE2.ID0 I+ \  W  Y( \3 ], s9 F: L. E5 |; L

- E- x7 E) Z0 c7 `, ^7 ~A.TABLE1和TABLE2不相同的记录+ j, }2 V% U1 k1 V
B.两个表中相同的记录
* d) x* `8 Y: \* ^1 UC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
& r! z' _% ~, D; b  L( Z  cD.两表中不同记录的条数
  b7 a* h2 ?3 a+ mE.数字28 }+ s) [) Q: C
* O+ z; a- J4 d1 a% A5 L3 P6 \

8 h0 q8 T9 K6 W& j9 m: h" s# J15.______能保证一组SQL语句不受干扰的运行?; Z  k- k* H: k

/ A% u& ^8 M' H0 ]; ]9 B. i9 v答案:____________
+ n7 M' Z6 ]% q) }  ]! n" n  V# D0 n2 m9 h1 L

4 z+ [- b3 e8 Z( e* L4 t7 Z. }% c$ y6 J" x
答案速查
+ l1 [6 V( v" Y' i0 H% v1:BC
  q2 M: A7 X' s1 x. ^9 P+ X2:WHERE9 Q" G0 {1 D9 z' F
3:B# s7 Z+ F- C/ x" u
4:E) Q7 d6 g! p: w
5:BD
( L; n4 \7 x# ]9 O. Z6:INSERT
% E" y; @# ]( n# l0 Q1 g# ]+ {7:C* [% z$ k  J+ d
8:A
) c* E! e1 H0 X6 F& t% Z' o9:C1 n$ t  Z' p. i9 y) `
10:E! @$ _, @3 f! \- k- F- B1 L
11:C7 R+ c6 y/ ]: _" R
12:E
% M& I+ j$ v7 Q" D- w/ j. a13:BC
  p  X0 b% }8 z2 q: i14:C* }/ c0 G% ~  f' Z$ `1 l
15:事务, J; f, \! C3 T/ E

# ~4 |* g: H) l5 P' H5 d" L& f' E& U/ B+ b$ V" l
3 }5 c% {+ O. S9 P8 q% }0 x& _
答案详解' t) B$ w* T3 {1 Q
# i/ e1 f' G; e) Y1 ~
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
6 E# A3 ]! t# m0 l5 P2 _& D7 |
  W4 g. z) N0 G0 ~! j2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。" C9 k1 O" r5 l4 \* _/ m, u) c5 X& S
  M: h. l, x4 R* p0 T+ K6 b7 Q0 p
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。: M/ f( M0 M( j$ O5 M9 `
( e$ ~( R: q' p5 x1 \; C% V. P
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。  t( ~, K4 H5 v$ [9 a

; O3 ?1 X3 W5 e- u- K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
1 N0 @' T  k/ P1 Q) z3 F7 M' e
, u" l0 w4 L% a/ ~6.答案显然是INSERT。9 C1 o. A0 G1 |7 _/ W

; G$ v& K+ @) I7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。, [) K1 J$ k$ S( l" a
! U* ]$ z8 j* {. z, B
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。* G" R! M4 y2 D& B/ m2 B5 \
$ b7 J! U& q2 K( a
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
) T* X1 Y$ m: s9 g/ t5 n5 p
+ o9 Z$ U0 f% u- l10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。8 g: K9 G/ B7 d7 l* o+ l7 F4 i% ?: M
: U  P& h1 k1 ]: D3 Q1 G
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
* A0 }6 W. O% T2 b# Z- r/ g  c6 `$ m+ I' _
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
# |' O0 _$ u# x' _- S, N, J: k9 b/ d
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
) z! ]$ u8 s- B: X* Y% n( v6 c
$ ~1 o2 O; x7 Z* j4 D- T* U8 N' T14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。8 e% j& g5 [  R& b) `
' U; K/ R6 E" M: W. p/ F
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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