返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
2 `) _, y9 W0 L* kPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ g' o, U" w5 l3 |, Z* h9 ]) ~3 ?本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
: y& e- F0 R' S4 O+ P+ g4 l7 j
1 ]4 ^9 x+ `2 W  k8 C0 h4 Z+ g! g) G0 Y7 _& `
问题4 a: i8 W: l* `% e
6 g: T, C. C- W4 q2 ^
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
5 x1 m. v2 i; G1 k. \9 x) s/ Q: T2 t# o) c4 ~+ @% w7 Q
SELECT * FROM MY_TABLE7 ?) F" d: s" |7 I6 L9 D; q0 Q

+ O+ ^6 m: J* l# |$ vA.如果可能,用把查询转换成存储例程: \" }& b- X) t8 B+ j
B.如果程序允许,给查询指定返回记录的范围1 J2 P9 ~0 X$ c2 u( L
C.如果可能,添加where条件
7 d8 \$ c+ W, ?: C* OD.如果DBMS允许,把查询转换成视图; a+ B$ y; g* Z1 Y9 W% ~, F
E.如果DBMS允许,使用事先准备好的语句
$ B- I0 o8 k) O) Z/ l5 q) _! E9 r7 G! W

" z8 Z" x1 K9 g% H7 b  ]. [3 @1 j2.可以用添加______条件的方式对查询返回的数据集进行过滤?6 I! w5 @0 M* A' X: s9 h
) N, P0 `% ]) S* r* Z3 n
答案:____________
8 H8 R3 A; x# [: ]8 Z1 ]# g8 Q
& T, s, Y) O# y& G3 T+ K# i2 {% }8 G2 g) t. C5 U' i
3.内关联(inner join)是用来做什么的?. n8 C5 f0 D8 W# n& a

# k. J1 p3 T% y6 h2 b3 FA.把两个表通过相同字段关联入一张持久的表中: w: H# O! ^; t7 v# r! j& `/ e
B.创建基于两个表中相同相同行的结果集
6 j( y$ U1 U1 A( d: nC.创建基于一个表中的记录的数据集4 i. X: d" t9 ]6 X0 p* E' `
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
. @, T! V: Y8 s7 W' T0 g% `( X5 h- W4 CE.以上都不对
  d5 M- u  Q$ a$ G, F/ P4 ~. c( j: k! d! n

( v: {% ^5 l5 U0 b4.以下哪个DBMS没有PHP扩展库?6 [1 Q: c$ ]# ^0 z% w9 A" n% V
8 A. i: I- Y  }7 m4 \! F! ~: R
A.MySQL. {7 m1 m) k6 w4 s6 N* d0 d- f
B.IBM DB/2
; M5 D5 G: K" S0 k) l- lC.PostgreSQL
0 X# Q# z- E$ b0 @D.Microsoft SQL Server
5 Y. U( I; r+ T* q: A7 l) VE.以上都不对
" D/ \2 G- v1 Q; u! d" j9 o
- i. J4 ?1 L! b2 a, m. Q" q" u' b
3 _  L' i) {5 H+ n3 _5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)- q$ H% C: z9 C
* K5 ?2 f% {% |0 k7 s4 i
<?php
, f, K4 ~: }7 ]$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
; ]. M, N& T: \?>0 e6 I+ Q9 @0 L1 T6 b* l. q; i
% J8 {2 f6 ~& }+ h
A.MYTABLE表中的记录超过1条1 I8 q6 v$ @9 U) l9 A5 R- \$ L
B.用户输入的数据需要经过适当的转义和过滤
+ G6 h0 ~* _" \; Z5 KC.调用该函数将产生一个包含了其他记录条数的记录1 N. \, K5 n; |( \' k# F
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除& A7 E% p9 }! {4 F! o& i  L
E.查询语句中应该包含数据库名, q. n2 G$ L8 @  [, B" k

* X% x& _4 m  c  \9 ]" p0 f% M7 ~& m% I4 o: k1 x7 v$ y
6.______语句能用来向已存在的表中添加新的记录。9 P! U- e* H' ~# r( [
; h2 \, M* A$ t. r  h& }
答案:____________
+ j+ Y; Z5 V* ^" Z; i5 p4 T# W/ `2 O( I
( b) h5 x# n2 F- C+ {+ m
7.以下哪个说法正确?& m+ y7 L' G' k' q( \0 z
( D- {. b0 F- C
A.使用索引能加快插入数据的速度
7 U* {, q2 U/ o. [' [B.良好的索引策略有助于防止跨站攻击% [" }/ x/ I0 G+ Y9 C  z
C.应当根据数据库的实际应用按理设计索引1 q& `; Z( p& ^$ K& m
D.删除一条记录将导致整个表的索引被破坏8 H/ \. F% n; V7 g4 s) d
E.只有数字记录行需要索引
* H+ b& @) ^% d- h9 m7 a' X9 K  y( c1 ]% H7 |  d
' {+ w) b' L: i5 D
8.join能否被嵌套?
5 F. {2 L& n. j" S6 f) u: p# K6 ^0 J& q" `2 |% r8 [
A.能# e8 C) d8 I8 N7 U$ W- C. I& A5 `; H
B.不能( ?9 Y8 V. D$ X0 W% |& _
$ a" J2 m* k& b% _; w
( ]  ~7 z0 ?; }. p4 I" p
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
8 H" z' y9 E) ^3 n: C( \8 o3 W: U1 ]! J- b
CREATE TABLE MYTABLE (. g) ^$ M: B$ a4 j; Y, ^
ID INT,
2 I* g( }" r: R6 u- A% j2 nNAME VARCHAR (100),
4 r) |# _2 `, c; J, s. rADDRESS1 VARCHAR (100),
. ^4 d# D2 C! t2 u6 RADDRESS2 VARCHAR (100),9 N, i" a, n3 M& z2 r" S0 c0 Z( F
ZIPCODE VARCHAR (10),# T: A% Q1 h; ]: R* G$ M' A
CITY VARCHAR (50),! P! [- e" O% U# x7 L+ i5 B5 h
PROVINCE VARCHAR (2)
) w& [& y! w; F; s! I)
8 l: i- w2 @' NSELECT ID, VARCHAR
+ I0 p+ w3 g  z2 h# c( ZFROM MYTABLE
- S# b6 C# W: y% t5 OWHERE ID BETWEEN 0 AND 100
; C/ \2 `  {* g( b9 fORDER BY NAME, ZIPCODE
. `# V$ E9 W5 y+ I2 u) ?# C2 a8 G& J% i0 ~; Y, _6 p2 V* y" P
A.给ID添加索引
9 B; f* h6 W2 D+ D! S3 Y  C: g. wB.给NAME和ADDRESS1添加索引
) Q/ j" L4 W1 L; P: wC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引6 b- ]/ y: ]1 `2 A  W( ^; W
D.给ZIPCODE和NAME添加索引( {6 }9 j% q- O. ~$ L1 T! L( R
E.给ZIPCODE添加全文检索( V+ x0 N. s* I/ K& R' o
$ A9 e5 ^) I& {

& G8 i  n$ m8 {6 F" m) R& j$ Q1 P10.执行以下SQL语句后将发生什么?% {2 D8 I% Q4 C' d' c: o  e- l. \
/ t$ c0 n# [  T/ m) U
BEGIN TRANSACTION
5 B$ M0 m( D' k& M, @4 lDELETE FROM MYTABLE WHERE ID=1
1 q& J* V8 Q3 ]1 tDELETE FROM OTHERTABLE. X! F7 c  j$ |7 [. {+ c
ROLLBACK TRANSACTION6 L- w$ ]3 w- X# d3 j# `/ [/ \
' \9 y9 r! ~  K8 S4 p# I
A.OTHERTABLE中的内容将被删除
, e. D  I6 e# y. Y8 z+ U2 VB.OTHERTABLE和MYTABLE中的内容都会被删除
0 h  {3 j2 M% u4 H1 bC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除9 _& \' a! g' P% p1 H
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
) X# J$ J  G) S  ~E.数据库没用变化/ J  j! \' C4 b2 V

5 l$ k+ v& H  L/ c& V9 z& w' s1 _  `( W" K# U/ r
11.DESC在这个查询中起什么作用?
3 J8 a+ E; A7 |# I% i- y$ L' F& Y+ w& u0 `% q, a. W- W! j
SELECT *
0 [7 K+ `# k0 N9 l2 |FROM MY_TABLE+ w! v( J* h, a: z
WHERE ID > 02 `7 R/ K. y# I4 k8 O# m
ORDER BY ID, NAME DESC. }2 q1 x4 D+ {  N' d( n2 J) K
  b7 y( T! N" n7 r! J$ ^0 A5 p: n
A.返回的数据集倒序排列5 y, Y5 p6 C6 L
B.ID相同的记录按NAME升序排列
0 {4 j2 C7 N# G3 L6 LC.ID相同的记录按NAME倒序排列9 N$ n% [" P: e5 Y# f6 Q& t' @5 @8 W! w
D.返回的记录先按NAME排序,再安ID排序, {5 c2 c  T. N6 V/ Q
E.结果集中包含对NAME字段的描述
- m) e+ Z7 d2 G' k
) Y1 r* p  E0 W) H: E, n
4 n( u% o4 T& c( c; t12.以下哪个不是SQL函数?
; e9 d! N, w. q
6 s: ]2 K3 ?' l( n4 uA.AVG
. Q+ N; M& l9 }' ^5 G8 M: RB.SUM
+ q, [; E! M. ?7 U2 n# ~C.MIN
, u2 |9 s6 z% h' ?. b1 rD.MAX/ m. n( ]$ n& s: ~3 d  i
E.CURRENT_DATE()( j1 {4 T/ \, I" x/ z

) Y6 ?) M# M: W; ^8 _6 c8 h
- V: C0 I" O3 i9 E% M9 n0 Y$ U+ W13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?4 Z& V, y( [- q

: J5 W: J  U* ~$ t% LA.该字段必须有索引
, s. c. M9 S& ^) P' Z% I+ oB.该字段必须包括在GROUP BY条件中; b5 P( B$ r% i$ T& g1 M
C.该字段必须包含一个累积值
4 a$ F) _; A8 J% B# m* U" `D.该字段必须是主键" T# t6 z- i4 i  ~* }1 e% I
E.该字段必须不能包含NULL值0 i/ V/ ~: g( |! \# G/ S% _0 J

. B! ^1 @1 _  `$ _: s# O& @, m, h  m# I) d# ?" g
14.以下查询输出什么?
' E- \: [3 K  Y7 B0 ^- @% g5 E( _# I+ g
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
! T  f: Z- [) P* v/ G3 h# h8 rON TABLE1.ID <> TABLE2.ID! @1 t2 Z; Z, c% D
% y8 |" i# _9 S4 l+ g
A.TABLE1和TABLE2不相同的记录3 o0 w* L; s: z& P7 B/ K* ^
B.两个表中相同的记录
6 h9 f% ^% t, A2 c; }0 i; gC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
$ X7 }  K' q# d6 m) z) {D.两表中不同记录的条数
+ X; A0 ?0 @& U7 b1 rE.数字25 F: L6 y( |! z1 J" h

" Q: x  T- V) X& b4 K7 L. X; K9 l4 o5 B
15.______能保证一组SQL语句不受干扰的运行?" \& s! s& c$ P6 m

3 z; g9 ^0 z1 A, m' M3 p- _答案:____________
- P& V7 f. t7 n1 d8 A: i5 F4 X  }2 H7 I% `. b+ |

( m; f% W' \3 ]2 m9 Z" I2 I: \  R
2 @3 l( F: k: L5 @0 F9 E答案速查
9 k  e4 a2 G$ O. W8 y1:BC
8 e( |% \+ }5 c8 s2:WHERE
% }" Y1 r' Z4 S3 }& r" Q; r3:B
' x6 {" z3 w: q4:E9 d1 i- d( x; A
5:BD
3 B+ Y1 _+ ]+ ]; F6:INSERT' d0 T" H, `. f9 m$ J
7:C1 Y* `$ Q' Q+ p8 K, M" M
8:A
" Z( w' ^3 j  L8 t9:C- _1 N  ~+ p/ A7 i- ^! E/ `
10:E
8 d/ V+ G6 N/ s5 F6 o% w11:C
9 [& n3 \: j0 Y, L/ H: c# V12:E
* m- Z* |/ F7 L6 ~13:BC
( x8 _+ R% \" w2 R$ _& v, ?6 e0 p14:C3 z% }/ `- Z. d. |6 _/ I3 m
15:事务9 B" Q  }/ o. l/ B- R

- f! @) E$ B# g5 |) G' c
2 b4 o) @( n" s% J. u
. @) _( x3 J9 @( y1 [答案详解
$ u! W' W# m8 ?. @+ _* O4 B* A( V! Z+ s5 M- K: j
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。5 f" r0 q) F8 {* {
2 q. ]7 @# Z4 ?
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。5 k+ T5 f8 N) U' ?6 y
+ D, \* Z/ W$ [
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
( p" V' H! M1 {7 X& b, Z" }* E& ~' h& l3 L! @& h4 m4 F
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
1 r( p7 U; h5 B) d
1 I3 g6 T% H3 t, r5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
3 {) C4 L7 m4 X
$ w$ L. M; ^# x; Z2 `3 K# X9 A6.答案显然是INSERT。& q# A  J, l3 Z+ x7 h7 h
3 c% i3 V. c7 O7 r+ Q
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。. N) w( i% [: H

. l- p2 t8 `% I8 C5 H8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
8 k9 o# [9 Y" O; d. o% |
9 y7 H6 z8 p0 w) x; |! g5 t, E9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。5 M5 h/ o% O+ L) @5 h

7 ^5 h6 y3 F' z& f8 k5 O* R10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。4 ^* T" z. X8 g2 a
! U+ F4 p9 v# u( o9 Q" Y
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
9 d% `( w- u8 F' U5 h/ g4 g- n+ j1 D* S& Q( r  P0 V2 H0 d
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
) ^9 H- g5 S1 x  z# e; G' ~: u/ `
& w8 @' C' d+ @* e13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
% u3 J$ ^+ A9 Z3 L. C
7 y" o4 V- M) ~- a  E6 x& Y14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。' s; j0 I3 |8 H" \; @+ P
! ]. ]( B) m6 y( ~9 t  ?
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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