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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
; T; V5 a+ D7 g3 Q% ZPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。6 ]4 E& J( g$ p
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。7 D" ?/ n3 z0 r* g! k) H1 e
0 H- |+ X  K$ W( m
5 T( h9 U, G0 p3 x8 {. N# ~
问题% O$ w0 G  n1 D( S' Q
4 q, z2 M# Z: J
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
- P6 z5 l* I  N7 r) |% ~$ Z* j9 ~" C" j
SELECT * FROM MY_TABLE/ ]/ l8 `7 T; {' u+ y: J8 R  N

& P4 s0 M) t7 r  @4 ?* pA.如果可能,用把查询转换成存储例程
7 D% c+ c1 g3 x: SB.如果程序允许,给查询指定返回记录的范围7 B( K* p) f) T, i: Z
C.如果可能,添加where条件. T! k& c& J' p( t
D.如果DBMS允许,把查询转换成视图, b  M# b. F/ x) T: K( r
E.如果DBMS允许,使用事先准备好的语句# A8 r; F) D0 ]
9 p2 z; r% f, {7 m4 X4 i- e9 F

: D' a3 e2 h" g5 {2.可以用添加______条件的方式对查询返回的数据集进行过滤?
5 R% y9 Q1 _9 G$ e+ ~7 n9 E
( G1 J" }8 g1 |8 S答案:____________% z9 I' i7 ^7 I+ |- c
' E$ J/ C0 X" k7 C

, k0 G/ l' C( W7 t3.内关联(inner join)是用来做什么的?% V+ {) S* @9 v. w+ X# W' n

9 o+ y" G/ n6 NA.把两个表通过相同字段关联入一张持久的表中
4 b) U: Z' t: z) V1 ~  F. z( p) }; h8 VB.创建基于两个表中相同相同行的结果集4 l+ \3 o) {' i0 R
C.创建基于一个表中的记录的数据集& `0 A- y8 U5 a4 Q: e
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
; {9 h0 X# _* p5 ~4 d1 A6 vE.以上都不对
& [6 j& M: K+ Q' P: l; p& M+ }' W0 L/ R1 o

2 U, L7 j! x% T8 R8 ~4.以下哪个DBMS没有PHP扩展库?
5 w1 a2 A0 J1 Y! M$ P' K9 t2 G' r. s% p
A.MySQL& G8 P$ o$ e  w- v# V
B.IBM DB/2
% m0 `7 W. G0 Z; y$ \C.PostgreSQL7 f/ E4 s2 L% s) Y
D.Microsoft SQL Server
6 J- `; ?  _6 e& R! iE.以上都不对
: y/ w* W! [5 f3 E) ]0 g; W1 x0 o% [, y) R( E7 q

" R8 v6 S" t. r1 t" N4 Y5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)8 ?/ J* ]5 H) l/ r3 j

% ~+ a5 e  v/ L, b<?php: {% h/ G' R+ L
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);1 c7 p3 i" H! Y* b- \
?>8 k% q( k6 e6 c, o# T: r1 ^
2 w$ M- G) d5 u" a9 z
A.MYTABLE表中的记录超过1条
1 g6 U  m5 g6 _  g% h2 A" U; zB.用户输入的数据需要经过适当的转义和过滤
$ O3 q1 ?+ r5 {. b( q8 G' P& LC.调用该函数将产生一个包含了其他记录条数的记录  V8 {: S# R+ z& G1 l- J" ?+ w* x
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
+ f5 G& d) a2 R. d$ g5 oE.查询语句中应该包含数据库名+ H6 _" l; X7 V
% n- x# F7 M5 C' Y6 s0 H% G8 S
& g- ^% |: o9 u# Z
6.______语句能用来向已存在的表中添加新的记录。: b/ L- Z. P4 n

' l; s1 B( E' a  Z, F  l  C答案:____________
9 |$ t: e( Z- V& Y& k% Z1 ^4 [0 x$ q- C
- u( W! M* i3 s! A/ v" L
7.以下哪个说法正确?
& Y, m! S. [1 p! _7 k- N) \/ x  H' J) B$ ]. W
A.使用索引能加快插入数据的速度( K) ]' G5 V4 T; s. W
B.良好的索引策略有助于防止跨站攻击
. D, i+ {2 B& ~0 j* CC.应当根据数据库的实际应用按理设计索引" A4 d$ w1 _& f( `  m2 ]
D.删除一条记录将导致整个表的索引被破坏
' o5 v) W8 t9 e1 D' sE.只有数字记录行需要索引8 _. ?& F1 w" e* {

1 @; E; K4 e8 g$ B, X# _
* k5 {9 k2 ~2 {. i) K& u6 V8.join能否被嵌套?! d; C4 I+ h8 I" c8 P/ o- N
0 q5 C6 E; z- z1 K- t
A.能
; }0 a) s/ T9 L; ^/ f, CB.不能
5 M6 D. X/ Q% j- N- s; I5 Q
) v6 h6 N# D" L; I! p# p8 I! f% _0 E
# M* X# v6 H3 ?9.考虑如下数据表和查询。如何添加索引能提高查询速度?" e& s. v$ {% V
. M" z5 I( W  |; J( S; |. c; \9 V& S
CREATE TABLE MYTABLE (
( M4 G' Z  V' _9 F# C2 sID INT,
6 j& b1 K0 p; j2 l6 k3 fNAME VARCHAR (100),
8 \' o3 b' ?- u) F, I2 {6 {, _ADDRESS1 VARCHAR (100),
' _) e& o& s9 G4 G- R" A7 TADDRESS2 VARCHAR (100),; a) ~  o. ~, I; g: A
ZIPCODE VARCHAR (10),
9 q$ L. C4 [) U( r# Q& K+ Y4 r4 aCITY VARCHAR (50),
; q, Y, s# K3 L2 |! n% p9 LPROVINCE VARCHAR (2)
# V$ D* H" T5 @% J( e)
3 c- \6 H$ n  R3 o  l$ dSELECT ID, VARCHAR
, ?; l/ w: w! iFROM MYTABLE
$ @: f$ k" ]. U( FWHERE ID BETWEEN 0 AND 100
2 y4 ?. [- F( HORDER BY NAME, ZIPCODE* w2 e* P  X  f

$ C! E4 E0 \5 J9 \" O# ^3 R" UA.给ID添加索引  t) h, s  S* Y* A& L
B.给NAME和ADDRESS1添加索引, T+ R; M- k% a6 R1 }
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
9 r; q3 |6 F8 \: _" K  m5 X7 lD.给ZIPCODE和NAME添加索引
+ l. A, L+ Y7 L' l5 B9 {9 H' H& @E.给ZIPCODE添加全文检索
6 M9 _# s' g/ F8 R, [2 d0 z8 X1 E& P6 o2 w. h0 m+ }
6 j0 U$ L2 t, Q3 H
10.执行以下SQL语句后将发生什么?( r; @, j+ O% k; x+ b* L
: ^. \4 K7 S2 o7 |. q
BEGIN TRANSACTION
) {. X* H* F! L1 B% V5 [0 u) fDELETE FROM MYTABLE WHERE ID=1
" ^: B( E9 ^, ~- k( O2 @9 j- UDELETE FROM OTHERTABLE
# j$ @" L0 p# s3 YROLLBACK TRANSACTION" ~6 D( g  {- d6 C! S* Y( \- P
4 w8 |8 t& \6 `+ G- l% S3 K
A.OTHERTABLE中的内容将被删除
2 T3 p+ K, j+ F  f2 t1 uB.OTHERTABLE和MYTABLE中的内容都会被删除  R4 j; P: v& v5 ^) }; j
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除7 _6 r  B- f7 T# h+ l$ l, x7 b8 w
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化) O5 m' c- s6 V: e5 s( `4 K" H
E.数据库没用变化$ c( W( n2 u( x$ _( z
9 y( p- V4 O% s3 p" l, N
# T0 U0 `: x" z# X1 {, x0 |# o3 [
11.DESC在这个查询中起什么作用?3 B( `: K4 r. W

( s( H3 R+ }" ^- J: BSELECT *
" k6 {/ ]) F3 A) W+ r  @; XFROM MY_TABLE9 t+ X1 K# _1 [7 i+ i4 I1 ?- x4 D
WHERE ID > 0) @5 K+ n- X! y2 w( f3 P" O2 W
ORDER BY ID, NAME DESC
( R& @' M6 f  n4 U
- d7 U: q2 P/ G$ zA.返回的数据集倒序排列
4 }. b; d" F9 Q7 s' Z# f, tB.ID相同的记录按NAME升序排列
8 a; R. B' Q2 H2 U! K; d; ^C.ID相同的记录按NAME倒序排列6 P& T: o+ `' ]) P7 z: s5 f( L
D.返回的记录先按NAME排序,再安ID排序& f+ L& t5 e( \" l
E.结果集中包含对NAME字段的描述" ?' z2 Z4 e! T; L: u6 l+ r. K
+ z5 ^5 R3 l5 g

* Q! l" C" B0 k# B" O# {12.以下哪个不是SQL函数?
" g9 h' {# H: V: I' E7 B6 R
  l& v! i# T; }0 DA.AVG
0 j; ]: ~% T4 k* m. H6 KB.SUM
. Z' z8 q- M* `9 G! e0 t" GC.MIN
; D- G- @: ^9 ZD.MAX
" c" L- ?: l/ d' F* M9 I+ C) m" xE.CURRENT_DATE()% [" g" X. N- t# F1 @: z* B0 q2 @
1 P7 _! a+ q: n* x5 `8 e
1 ?! D0 x2 \, Z5 x! a9 b" w* h, G
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
+ s, r1 s" j" `" ]6 g9 L4 n& m# p% d4 g5 Y2 k& B2 {
A.该字段必须有索引9 ^. ^! q. D% Q$ T9 \
B.该字段必须包括在GROUP BY条件中
  U) q; k/ e) V7 iC.该字段必须包含一个累积值6 F# o- e! r! X  W
D.该字段必须是主键
* e/ y* i, n9 sE.该字段必须不能包含NULL值
' Z& _" w, [' S3 w
$ m) ^  @+ x% q+ b8 A" J# q- Y; a; P+ P! U& E
14.以下查询输出什么?
: C8 l5 w/ L7 C( G/ y$ ^* c1 v! M+ s7 l; A% d0 F
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
$ i  z* @3 P  e3 }9 eON TABLE1.ID <> TABLE2.ID: K+ D5 q: ?" |# \+ ^+ y: f- ^
/ ^/ u' e, T/ N2 y$ B
A.TABLE1和TABLE2不相同的记录
  _2 Y" \0 B4 ~. uB.两个表中相同的记录
$ P' d( p. q+ J- vC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
" C- }3 ?" r5 cD.两表中不同记录的条数
5 {& U, A6 i. K/ ?( D6 OE.数字2
. T( M9 b! l1 D8 `: [% ^
: M) q. S. q3 N6 r+ R- m
8 d( O6 m4 s1 n& U3 L/ P9 f15.______能保证一组SQL语句不受干扰的运行?
+ k; [- j2 T: @" o: r. n1 @6 O9 r3 u& f
, l/ T7 \5 X% R! B答案:____________
4 H/ e5 u3 n7 `' Q" L! F
+ z6 V; y0 b. z* C) j$ i  r* N) Q' [( u+ n2 n+ ?7 L

  b+ n. [& w* d1 s- U答案速查8 T4 ?! A, T' C+ C  W3 }' @& D
1:BC
% v' W3 d( @$ Z- o2:WHERE. l1 N/ @; ~6 Q+ l) C
3:B
1 y# v1 `, `/ J9 E( F: m! W$ B4:E
) B% q- Q% ]! e1 F- ^0 [6 s5:BD- o/ j+ I1 w$ q
6:INSERT
& @9 n0 y  d* N2 A0 ~6 r7:C
8 A2 I" i- X: E- U8:A* o3 v8 c& \/ u% c% ?1 d  X
9:C( k6 G. |# ]+ e5 o' z; v4 r) O
10:E
+ a8 Y* i" o( r; S6 Q8 p- t11:C6 _3 M9 ~- d. f* t$ b: G
12:E4 Y) @+ P; n; L5 t  L: s
13:BC
1 r2 Z7 E) T' c( j- P14:C
! o) ~3 t$ k$ r, w( |/ D8 w15:事务
4 }0 @& b% N# j& S1 K$ s/ v" d$ U

  b, L, F  ~9 G9 J5 z7 I
% q+ g* u0 d. ~# Y* f% D/ n* }答案详解/ [6 K+ w6 D0 l! w, J$ x, ~* n- H# r% j

% {% R, H1 h3 H  k+ l* s. P1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! @& ?( P7 E5 f. q
- f+ D; A9 U; H5 Q2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! F3 |( k" N) ^# n
$ L" @- z, H6 U; i8 m
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。& X- ^, p& V8 L) i2 O& \4 n: H5 Z
( I+ {2 _* n- V3 t' @
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。; Q6 {  A2 F8 x" a$ A6 Y
. Y& d$ U' Z% {6 F/ X8 }
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
2 u& q9 ~4 g% L  @- {  R% o0 `0 t% T
  N4 T/ {) m4 r$ F4 s( u6.答案显然是INSERT。4 j+ t" Q. r8 Z" }5 X8 O8 \
: E& I2 {) j2 A  q( D& w& s
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。8 P4 N' T/ R' S8 o4 K$ |# B' ~
& q1 D/ |! K6 S2 y
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
- p5 W5 u) S  {9 c
  H  S; d$ N6 f% G9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。6 Y3 s( L9 ]  U% K0 W
& v! V1 i* B2 B7 W) V$ N: ^
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
- y# ]1 L+ G4 y/ k8 r/ o; w" j
$ N; f% O8 c4 t11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
. O( v  M& u- u2 G* O" J/ W' L& x) j( N5 M$ U" I; E
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
. Z6 }  c+ y! [. {# o+ J
4 e" U3 F$ A: J1 \4 M; H13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。0 r" y% ?, ?7 w; D2 S/ k9 T( U

% `* x9 J& `  W  g9 p1 [: j14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
% ^! M; C+ U2 A' h. D' J9 K* D$ [2 q* e! ^9 Q
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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