返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。' M- r2 }4 B2 [) f: H
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
2 V! M. Q' h/ L7 i本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
+ D( c8 |% D& \2 ]* T) O8 T9 s% t) P7 e; I6 l8 {& a$ n

2 Q" K- ?: l: N8 r; v, Y问题
# i0 p7 o9 s* h2 Q: \: t* U' {# F8 @6 N5 y  g
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
( v7 O0 _; M+ E5 y1 d& T+ v* A
0 `- C4 V% J$ Y1 p# f( lSELECT * FROM MY_TABLE
, g* v( C" V; g' ]# |. z. O# H5 C
# A+ |3 ~+ O( ^. _A.如果可能,用把查询转换成存储例程# _/ i' d$ O. n0 q) q' |5 G" c
B.如果程序允许,给查询指定返回记录的范围+ }; {' ]3 U, l. M/ R0 |  _( ~; g
C.如果可能,添加where条件
# I3 d/ B  O+ w, [& T; x9 L  X6 _, L0 WD.如果DBMS允许,把查询转换成视图
* i1 m2 W7 Z* p' a6 E- _E.如果DBMS允许,使用事先准备好的语句* q$ u$ c8 a8 O/ c- U

; j# w. w% z6 b" h( N0 ^5 `0 G1 ]) }/ S' w7 q& ?0 T0 F$ Q
2.可以用添加______条件的方式对查询返回的数据集进行过滤?7 m7 D4 M- d4 u" C1 e/ ~

3 e& \3 X0 u; O* N1 ]答案:____________3 u% a) ?4 f; F/ p$ o: \" j  V7 M& L
0 ?1 s+ n7 x: ^- U1 P( Y, q

4 t9 t% B; M$ d% x3 p( s! }3.内关联(inner join)是用来做什么的?
6 i# f( E! ~' f' l, _( j0 u1 g% K+ i$ C5 `, h, _0 H! _" T6 {3 V% ]
A.把两个表通过相同字段关联入一张持久的表中6 T) {# B9 Z% S% X4 y8 A$ c
B.创建基于两个表中相同相同行的结果集
" l. W: i) \; N4 b5 f3 FC.创建基于一个表中的记录的数据集4 j7 ]9 ~& c- a! b, w' J4 w& G, u
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集( L2 H* l0 x, o6 c! f+ o
E.以上都不对3 }. J6 A5 v4 V) ~

  [& o2 P2 h- R  u2 z5 a2 V3 t- s5 b  I. M4 q3 U
4.以下哪个DBMS没有PHP扩展库?
& {& T+ I5 u& x! X. ]
: ~# ^6 @! o8 `( b- [A.MySQL: f, c6 w/ r; n7 E
B.IBM DB/2* O1 S6 Y  A5 P) j+ H2 e
C.PostgreSQL
3 R+ \% V5 k% a/ G6 VD.Microsoft SQL Server
4 J' o' z9 I' KE.以上都不对4 d* [% w3 o7 R6 D8 x2 o( e
3 n3 _% m" Q0 y3 z. B' w

! L0 m4 A/ m/ D4 r% S5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
2 r, Z" t+ p6 V5 `6 ~( S" o' T9 X9 d$ _5 l
<?php  P* |$ r  m$ `: K; l5 i& m
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);$ `& O+ r1 r: G4 i2 ?
?>
2 H- H. k* I# @* z
2 `3 f: u& \5 G- E. ~9 pA.MYTABLE表中的记录超过1条
. |9 b/ d/ u1 \$ |* I' K: ?) e3 M4 F" tB.用户输入的数据需要经过适当的转义和过滤: b; P  U- E3 s3 u, }4 H
C.调用该函数将产生一个包含了其他记录条数的记录
# D3 K: m4 s$ X( ED.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除5 U& q1 b: J+ @$ B0 G& K
E.查询语句中应该包含数据库名# h5 e4 Z8 C7 |, X8 Z; B. H& C

3 m' h0 V, o3 ^6 Y4 s6 e
+ N0 i3 }- h3 h4 x" K4 H' ]6.______语句能用来向已存在的表中添加新的记录。# ^6 U, U; C' }9 ?  u

4 A5 T7 S+ Y* b6 J答案:____________6 S6 [# v% W! R1 `& P9 J( @

+ o) \0 z' s( [& h
+ w# ~+ T6 y( h) I7.以下哪个说法正确?
% A6 Z7 @6 N3 P  ?# t/ M; n( j7 z4 c4 m. l
A.使用索引能加快插入数据的速度
0 {& x9 C2 W7 ?! o+ `9 {9 _0 O+ zB.良好的索引策略有助于防止跨站攻击5 T9 z2 ^9 R5 W4 R0 W! ?. `5 {
C.应当根据数据库的实际应用按理设计索引! _7 k; }0 _: u
D.删除一条记录将导致整个表的索引被破坏
/ s7 z7 H# P& R2 M# K; R  u+ u$ hE.只有数字记录行需要索引
5 I8 v" l+ d3 _4 \
0 C- E- t; o- b. z9 v5 i9 E
  _# [$ V( v- B& S# _- \8.join能否被嵌套?
/ h: ^2 ]4 T! l# C$ }8 h. V. ^7 |" G# Z/ C
A.能. k+ o5 N0 ^  q8 n. B2 X8 o
B.不能
, t& z" o( W+ P0 H$ o' I2 R( M) m" F5 v0 B# s1 }

  R+ i+ R& e$ R& ^  U, y% |9.考虑如下数据表和查询。如何添加索引能提高查询速度?! L5 g8 `6 F- I0 a! U4 I4 P
. K7 I& n' ?) W' \. {( _
CREATE TABLE MYTABLE (
* ?. w. y" w; z+ nID INT,
4 l/ n" g& M, F' C" k1 x$ h6 ZNAME VARCHAR (100),
% K  g0 ]# H9 r+ H% g, \1 \' {ADDRESS1 VARCHAR (100),4 H, a) o% g, B! o/ L% `
ADDRESS2 VARCHAR (100),! B& F" b# Q% I+ E( u" r
ZIPCODE VARCHAR (10),
; ^, q- c7 H" g) }0 z3 UCITY VARCHAR (50),$ n, O( z6 ]. `3 t0 C' L
PROVINCE VARCHAR (2)9 \  x6 i  E+ P2 n7 Q
)* {8 B# j+ ]5 f) x% z4 @
SELECT ID, VARCHAR- d2 C% R3 t0 D% J# u6 H
FROM MYTABLE
( A! U- p/ J, J7 V$ p6 FWHERE ID BETWEEN 0 AND 100
( U& f% L7 v/ o, Y5 lORDER BY NAME, ZIPCODE
: K' j% W( F- q# O3 q6 I0 ]: n2 y; o6 I% _; w% g7 C
A.给ID添加索引
, Z6 j/ n# I4 K% T4 n, QB.给NAME和ADDRESS1添加索引4 z9 ]* A/ T4 B, v$ K0 `5 K0 ]4 Y
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
/ s# ^# `! \2 }/ |  k' lD.给ZIPCODE和NAME添加索引3 v8 Q' ]! L% f+ p! G, J6 U' o
E.给ZIPCODE添加全文检索5 s  ^# v5 W5 @0 c% t
# \* I4 ~9 V7 o/ X* j( y* U
! Y+ r7 @1 @  e& O2 f' s  \
10.执行以下SQL语句后将发生什么?- g5 E# @" L' w( P

9 ^* x( n& z- ~% }BEGIN TRANSACTION
) X, @, ]8 H& A' P0 D) @DELETE FROM MYTABLE WHERE ID=1* u. a7 f3 `) E0 I% @4 b
DELETE FROM OTHERTABLE0 L* I; |' H" _: J
ROLLBACK TRANSACTION) [, r- |, F  A& z' `  y. ]- M, Y

3 l, P6 i9 v& g6 x' J8 e4 ?A.OTHERTABLE中的内容将被删除: |# S4 R0 ?5 d( i2 N
B.OTHERTABLE和MYTABLE中的内容都会被删除
% P, h9 b8 Q0 LC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除% A( Z$ C) y8 E. @8 s
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化# e; x' v" n) q+ e$ P* Z: @) |: X
E.数据库没用变化. [* W) }" ~3 S) O
, |+ |$ L/ V4 f

! B# R0 K. {, Z11.DESC在这个查询中起什么作用?
1 G; d, I" F1 f. Z
; G5 S3 ^2 ~* L* ]5 j% d( s+ SSELECT *4 Q- ?$ e( I+ j0 h5 J1 K
FROM MY_TABLE# _' W$ {, U5 A  a
WHERE ID > 0
' K- ?, v# r( v' qORDER BY ID, NAME DESC
# s2 e0 ]- K$ ?. C5 A9 D# ?. o% c% H# d) n
A.返回的数据集倒序排列! z2 H7 v4 @5 m  b
B.ID相同的记录按NAME升序排列
0 m/ t, ~; H( m4 P4 x* {6 E% zC.ID相同的记录按NAME倒序排列
+ _; U$ g' S/ q1 [. q. x1 r8 YD.返回的记录先按NAME排序,再安ID排序
: h# A$ }- N3 X% d& hE.结果集中包含对NAME字段的描述
' h# x' Y) v& E4 ?- C/ T) B
1 P8 j4 {( A4 q) ~$ V+ |
1 d9 X. s  R0 N! B% Z12.以下哪个不是SQL函数?, w+ \0 M! {( v, U+ Q
! J: K6 r4 y5 G7 B0 g0 O) ?
A.AVG
* }, m; c4 y7 b  a2 t' EB.SUM$ {4 y& {" P- G! q
C.MIN, h% ^: H/ q% g9 q
D.MAX
, H/ Z  H- t$ k7 }) s5 |: O2 sE.CURRENT_DATE()
, |' A5 f8 Y. q- {- N1 d! i9 y6 y$ [2 a' J# P" x
; A5 q0 D8 r& [% i0 L9 j
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: S' v* u: K( H' u0 i
1 `% {/ m" o# \/ _# }, N8 X8 mA.该字段必须有索引  w+ p1 E7 R0 `- V. h  a5 M1 e
B.该字段必须包括在GROUP BY条件中- V, a: ?$ V) n3 j: Y
C.该字段必须包含一个累积值3 j, g# Q/ B+ Z; t8 B. x" _' M
D.该字段必须是主键
$ r# O+ V1 Y8 y  b/ Y9 Y& @E.该字段必须不能包含NULL值6 p) b/ j! i+ }
# \' v. _7 R$ G9 c; k) p3 a) t
. m6 D, G" n6 l9 D) X- @- l; |2 y6 h
14.以下查询输出什么?
; w* h6 R( ~9 i. _% s: _) J! q* H% c
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
0 w8 C. K9 }5 r0 e) b4 a: w( jON TABLE1.ID <> TABLE2.ID3 f7 b' M1 Z! U4 l$ d8 V% D( h3 Q

& r. T6 N% c* ^+ _; ZA.TABLE1和TABLE2不相同的记录. R' ?/ z$ Y$ @9 _+ |7 b' P! x. O
B.两个表中相同的记录
6 @0 Y+ k9 ?0 q$ U6 uC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数. T+ `8 s! z, F/ `5 T) w
D.两表中不同记录的条数
( ~9 d8 u# r5 }8 {1 B  OE.数字2
( L, _# x( Z/ U5 |$ b! I% C
. u+ T4 h. z+ S! E
% Q! S! n8 j9 U. P: r15.______能保证一组SQL语句不受干扰的运行?; f8 r" |" ?& v) D8 ^

) B1 A+ c7 D4 ^( P9 _答案:____________
( o: |! H- A1 z3 ~! m
' B* s: Z, r* T' X1 I# h% g
7 A8 |: U% {2 p: O" l
. M  \$ j9 W3 ~1 X答案速查
$ `" q: G8 ?5 y$ w, g2 B$ S1:BC
; \( f- y, ~7 p2 x% V" O2:WHERE) t( o7 J6 r- W# ^) y
3:B
( R' g  j, g0 [6 H4:E! f. d1 {+ m- b# c+ @4 {! H2 _; ?
5:BD- i0 ~3 g4 e# |, T, w; s: w& s0 y# X
6:INSERT* v2 l6 {2 E0 A3 ~2 T6 j/ B
7:C9 l5 u+ q; F2 O6 \7 U, ^: u8 z
8:A
! g5 S' {% C" k. `- Q3 {8 G- M) W9:C
$ [& F- o. C. l, T10:E
8 S  \$ u% a6 A7 X, R11:C
- Z) r' {/ F* r6 B  j0 j+ H, A" H9 F3 w12:E
  n7 K+ t5 v8 z: S- W! b5 C2 f13:BC
, s& _* V( _' N' O3 a" }14:C
  r- k% I  l. R7 u% L, C15:事务9 `+ g/ W& ^9 O

# S2 Z. L% N: G9 U  U0 d* `) e; |5 Y* ~+ p3 n

& l& y9 L' Y7 C) N答案详解+ q% W% K4 w# h$ `" d' _
5 Z. t1 Y1 G3 W7 L+ e
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
* v/ K/ E% w! A7 J. r* x
1 w+ o0 Q& h0 o  P& H2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。- X, ^$ N+ w- A; }8 @9 A

/ f8 [0 J" I2 L( e3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
2 L7 i$ G  F/ Y- u3 _. p. T# \) t& p! E8 m* C* J! J( t5 Z
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
( C  ?# U$ h* m9 W1 V7 L
' R* B- W2 @$ [/ D9 q4 |5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
8 E% a3 D* ~& v/ b  p
  E0 M8 n1 Y  Z& Y2 B0 g6.答案显然是INSERT。8 f8 Y6 e! N+ M4 U* _- }4 I' F
* g# m3 D9 h& z7 E
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。- k, c; Z% f8 D: R9 Y" h: A

; C- Y: E  L% T6 C& u9 F0 T8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
7 \6 ]2 H- n7 b. b* D2 e
: G- C6 f) P+ {; W9 L9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。7 ~, R; E! w7 w( ?4 U0 E

8 |# i; ^$ h+ I( t  ^4 i10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。, d0 e. {  g5 Z$ U8 i( z) C  W. m

& }5 R- G: I$ n+ w# y. Z11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。1 ~$ e, R8 S7 \# e

1 W9 W) r! c% h% ?  ?12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。3 O" z0 d6 C; V# O5 b. M8 ?  v' s  r
2 s( Z2 o% Q; {1 C# r
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* M- Z4 c. X. h7 |( z- \* z/ J; p: e5 L5 m3 U6 [+ `3 J4 u
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。1 w4 f- [$ {' e

9 I$ N% d6 h# ^9 V: P15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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