|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
+ c( r7 j9 O U( GPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。3 ?( l" L6 N% G
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。% `7 [7 Z0 b- S, Z% g
, B1 D5 ]; s5 a. I2 n& G% J0 P
& Z- n3 z) i0 F( G! f) }/ ^ K4 o问题4 @% d8 P' r% K( M
% d2 i0 S8 |# A% W0 y
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)( n+ O- o9 ]% @3 x- M0 g$ Q
: V9 l" ]6 G' A' _
SELECT * FROM MY_TABLE+ J0 V, ?7 ^" f2 @9 x( ]
5 h8 m- [) R- f; Y% C UA.如果可能,用把查询转换成存储例程& {3 t0 G9 A$ A) Z4 I+ h
B.如果程序允许,给查询指定返回记录的范围6 o: f8 _, C% t& B
C.如果可能,添加where条件
! N1 j% F& r$ V* }- h& bD.如果DBMS允许,把查询转换成视图
9 H. `8 i! C" LE.如果DBMS允许,使用事先准备好的语句! z& p. h) k! ?/ G8 m* U: z7 u' J+ c
: f& H6 V' f5 ~, j& W) n3 v# c
4 l2 [. r, k- }7 ^: j5 s2.可以用添加______条件的方式对查询返回的数据集进行过滤?! e. m% @ U4 N8 R. z
; v, x9 Z8 ?- a/ U% w% W答案:____________) E% o" h2 Y2 |; h
+ l" e/ d9 E Z# W9 E
7 z& l( ]6 L+ i' c7 ]
3.内关联(inner join)是用来做什么的? y- B. |' |( `% O
4 a; c: X/ R( ZA.把两个表通过相同字段关联入一张持久的表中
! |) x+ p, P" }# e' D) A) nB.创建基于两个表中相同相同行的结果集; U* s+ j7 J" M" e
C.创建基于一个表中的记录的数据集
2 R9 K/ g5 s& ^. MD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
; {5 `" A; z U. E' r2 dE.以上都不对( B K8 b7 `$ @2 n c Y) h
; s2 M6 b) O/ @" A7 h
+ m' ]6 `- B! m7 G4.以下哪个DBMS没有PHP扩展库?* B* j6 x4 O9 `$ ~
/ v2 ~, f! g5 f& q' H( n
A.MySQL
( f d: e2 r# KB.IBM DB/22 j( _3 i5 P5 E5 ~4 x$ F
C.PostgreSQL
& R5 ?/ i2 k% T4 g1 ZD.Microsoft SQL Server
6 \' L# U5 N7 PE.以上都不对; }4 Z8 e$ z) A' ~6 ?
* M' T9 |' X, [- i9 T1 U, ^
+ u* `* c" Z9 H O" [( n6 g7 z
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)) N0 {* u2 @0 S ^- n4 N, U6 L% V
4 i( u2 J, w, K3 K8 m5 v2 e D+ w<?php0 v1 T4 G1 G0 L- r3 Z' q8 A t
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
5 N6 Y$ p3 o* @: {7 f3 Y4 ]' A?>- W2 q$ T$ b3 t {, h
# ~7 W3 g2 h- [% [) R& e; CA.MYTABLE表中的记录超过1条1 Y7 E5 w7 k3 Q$ U( b2 R# j
B.用户输入的数据需要经过适当的转义和过滤
2 c! n* p* D% g/ F% v: z! s* J) NC.调用该函数将产生一个包含了其他记录条数的记录 Q; k& o: h+ m4 ]: C! P
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除5 v! r$ d4 R- m$ O5 b- p
E.查询语句中应该包含数据库名
# t& Y/ B8 _, b- q; n9 |/ d+ G7 |, b& Z
) a6 M# l* T# Y2 x/ @7 L
6.______语句能用来向已存在的表中添加新的记录。
* }0 q) _, \, p1 r) c& ]; r% t# s8 A- T- L& ^+ {! L
答案:____________4 j2 _- A. q0 F) a# {. {# w4 _) L
) W: d2 l4 z! {- @
4 B4 P% n# q; M
7.以下哪个说法正确?% ^% M0 U! s, F8 E1 |
; `3 g: n7 e* U
A.使用索引能加快插入数据的速度4 N6 o; {, p' e) L
B.良好的索引策略有助于防止跨站攻击
; ]5 H9 p# U2 Z& qC.应当根据数据库的实际应用按理设计索引
3 ~2 w4 {% N4 d, yD.删除一条记录将导致整个表的索引被破坏
- o8 O' I$ H! {( dE.只有数字记录行需要索引7 `* Z' ^- \1 [% r* ?- ]% T
3 D5 q' R: k! u9 u/ ^+ I) i
) i) ?& E- ]; c& u$ p6 x
8.join能否被嵌套?* d4 M" e0 C( J& D! a
! z* M- O) |! q: R2 z
A.能, |! s5 n+ @- C. `; `! e
B.不能
# Z0 a* n: ?/ a! H* _* F% C
1 j7 y* Y- i* E
+ R+ x) K$ f1 a9.考虑如下数据表和查询。如何添加索引能提高查询速度?, P) z8 Y2 }0 R3 t! I$ H" g
t% k3 v9 ]2 NCREATE TABLE MYTABLE (
( o8 D7 X& F9 o0 N0 j4 Z: `" u; yID INT,
1 b# a9 y+ S, |) Z# b) CNAME VARCHAR (100),
/ X" i Q! A& K8 O. o4 L0 A/ _9 hADDRESS1 VARCHAR (100),
' T9 G. ]1 z+ F0 f4 w+ ^ADDRESS2 VARCHAR (100),
; v- T! D7 g1 q" E0 }/ N" XZIPCODE VARCHAR (10),
7 q' K: q U! D4 v7 v% tCITY VARCHAR (50),
. F |( |7 y7 M# TPROVINCE VARCHAR (2)- R6 T; ~; U; i. {5 @
)
" u6 o* Z0 A* T4 f' m) c' JSELECT ID, VARCHAR" ]2 d0 ~5 N5 |. Z9 ~. K
FROM MYTABLE
5 o! p0 u& g6 t' p6 p8 Z0 e0 W) CWHERE ID BETWEEN 0 AND 100' w* M2 |( L$ V/ ^ b# I! O
ORDER BY NAME, ZIPCODE' N0 q/ R+ E ]) b
! z! ~$ `- V/ x1 s* C cA.给ID添加索引
: v) [$ J* z" ?6 r, bB.给NAME和ADDRESS1添加索引
2 x+ c9 B& ]# W! W* f2 P$ D! M7 sC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
- H( _6 @$ u; P6 I% ^+ c0 zD.给ZIPCODE和NAME添加索引
* s% u3 {/ q: u0 WE.给ZIPCODE添加全文检索
9 @ G7 `' G! E3 Z- w
- C2 ?7 ~1 ~( ?, Y, h# I3 i3 k3 y) l3 z. J& ?. P C% f& i
10.执行以下SQL语句后将发生什么?
' h$ O8 [/ N7 o3 _/ A5 |
% S. C3 { W8 r2 o0 U: Q& CBEGIN TRANSACTION
. f, i5 [" s: P8 g8 W( M WDELETE FROM MYTABLE WHERE ID=11 M8 f) u3 b( f# Z# j b
DELETE FROM OTHERTABLE& N- K7 c% l9 o& ]' V% |$ c
ROLLBACK TRANSACTION$ j: [9 M1 I, r# Q' [
{- B0 I) R: C% G
A.OTHERTABLE中的内容将被删除' A' \" ] X! \' c F: I
B.OTHERTABLE和MYTABLE中的内容都会被删除
' C: G% n" O5 i; d5 ^$ _C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
) u; f5 S) p% kD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
7 U$ e5 L: ?- @8 FE.数据库没用变化2 E1 b- G# G- m% u; |: N6 \* y+ N
5 T$ R: D" ^& O* ]# {6 o! E/ B6 x. @: N) |. z; p" @7 r+ B
11.DESC在这个查询中起什么作用?7 V' T% n2 w% W" r0 T
! m& j& f) K0 @
SELECT *+ y6 a% C' F" I' k9 U$ X% m: \( L
FROM MY_TABLE7 j0 J' }' p0 N
WHERE ID > 0
5 N5 ^/ e% Q. n: ~* \! T3 e! z) SORDER BY ID, NAME DESC
& ^2 T* y% H. O5 H. A _7 R- T- l0 {* e6 Q
A.返回的数据集倒序排列2 o; I+ d# ~& a/ M8 P6 |2 H/ u; e
B.ID相同的记录按NAME升序排列
9 |+ Z6 k! F$ j* z% CC.ID相同的记录按NAME倒序排列) l/ S, G1 L) ^! U1 g: i, ]
D.返回的记录先按NAME排序,再安ID排序! ] s7 d L1 z* J% K y) p; W
E.结果集中包含对NAME字段的描述* W+ D- i0 m* f0 y
, [' X/ K2 k) i! ^, M
; r# a: ] ?3 i' e2 S' T12.以下哪个不是SQL函数?4 s' F- Z3 @2 k5 i' u; m( C* H
" D1 C! d/ r( m, `8 Y7 q) ^( d) wA.AVG4 L+ C+ l: o$ X% o1 |) r1 T/ [1 A
B.SUM- p7 B6 B% u( ?$ ]: C1 w
C.MIN
0 t% U+ t6 D- \: }; @; q( nD.MAX
% [) C1 D# W# [8 Q. J2 YE.CURRENT_DATE()
, `/ M8 ~) T. |' s* j3 z7 d; J* H& [% H/ V& U% S
0 W# X) f4 T; I4 J. f! x. ]" k13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
! G, S4 } a# x( u) @/ T
1 h; Q* Z V1 d( p0 m3 XA.该字段必须有索引* w6 f0 o$ Y. \$ }" y
B.该字段必须包括在GROUP BY条件中
+ r& n; P) X7 I# `3 M" ^; KC.该字段必须包含一个累积值) ]: E" G' H1 }/ O
D.该字段必须是主键) G5 n4 o: z, }
E.该字段必须不能包含NULL值
- L. Z6 H6 ]: r$ g7 r O* o, @" c$ z' l
5 n2 \; n% R! a) _6 X14.以下查询输出什么?
1 r$ L5 a: e/ d G5 w e5 ]
- {0 P) Z. ?5 ?# x# ASELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
5 p) b) Q& [: }, t) i! `ON TABLE1.ID <> TABLE2.ID% U. i% z4 y3 ^5 |, z: ?4 S
; i9 r3 X( {4 N/ i
A.TABLE1和TABLE2不相同的记录: c8 _, O4 z9 n5 X m0 {% ?
B.两个表中相同的记录
, S* ~9 M: ]+ k6 s5 Z5 K* W9 z0 HC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数+ h) Z% F/ }8 X8 }; R& A/ E+ _
D.两表中不同记录的条数7 k3 x, h, n9 q( Y* |
E.数字2/ K" l6 {6 k, o
! X, F- P6 V' v7 x# o4 {* r
( {. X0 E G7 H( M; y# Y$ @4 u8 r15.______能保证一组SQL语句不受干扰的运行?2 G' Q3 ?4 Q8 b! R
% I% Y; W' Y% z5 i u' y
答案:____________
/ a# [7 ^6 O9 {: {" Y! u) F% |2 Y; {( D3 n4 I; ~+ o7 j
; r& H+ P9 Y f" h4 f! u
4 o8 s9 s3 ?: n' d q: {- C答案速查9 j7 g w# ~/ @* F8 x& r2 U7 i* Q! J
1:BC
) k) t9 M9 F, _% Z: I7 R2:WHERE
( }: U3 h3 I9 n) ?3:B" i. N- Q; P4 Z7 B# @
4:E& N/ Z- E! h$ D3 o
5:BD8 l6 }$ V6 T/ P9 w9 b. \' m& \. [6 `
6:INSERT
1 R& k6 V. B7 a8 V" o# j7:C' c/ }0 ?9 J! ?, }. q6 l
8:A
7 d8 t u+ v7 ~9:C6 M7 q, Z- J& n( V
10:E
" C4 c- d7 S# d, u; D' l' Z11:C$ k# O( a( h5 ?$ J4 M
12:E
$ D& [- O. ^# {13:BC2 J6 Z9 E I* \2 h9 b) Q
14:C' Y$ i; t, q/ T, A; X
15:事务
) j# b2 z/ C8 ]9 f; T
: A$ A7 z/ g, W( Z! M/ j" ]7 L) o, u; Q, P) t: G+ B
# V/ R/ y. J1 v" {& }& }! o- a8 m
答案详解
. |! C3 {' L4 k. D' {
5 R$ f& r. |/ X2 B1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。, i" g" A& X6 `
9 C8 r# v8 H$ d) Z. I
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。1 Z8 B! y( X% q9 B: |
% A) ^4 l6 z6 p1 [& x9 E3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。" @" D% w! R; ?
& q2 A/ ~1 L6 `$ M Z# `4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
/ u7 P8 H- n1 w% `% w$ m; Y! S t8 g! O% X
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。6 o( i1 P* j( G( ?0 E+ ^ [
5 E1 Y0 B( q8 E9 P$ {6.答案显然是INSERT。
3 }- m4 C, l- R" W1 s
3 _. f- x% C* t c2 ~7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 q) D; f0 W6 I/ x7 z
; z. ?9 h) j8 f! S# Y8 v8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。& d) J! L) y3 I# K/ ]
n& H5 v0 r3 k' w6 A9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
+ u ]1 r9 _0 Y& c% ]
' H& d% G7 J F# t0 V9 A10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。7 z' b" | `, E, K: ?$ e
5 c8 o: ?9 C& V2 N) _; h9 |
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。; p3 B" x5 [1 O
; i$ _4 {, _! D1 V3 p. N1 @12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。6 @5 F9 w3 B, _3 i! L3 Q
, v+ W! h5 \: }; v% `
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
& G* R3 k5 c% R' |
U) R% }3 ]. z }& g! [- A14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。; U# ?2 p0 I1 t. m- o7 z* N/ W3 d
& v. m: ]; ?' z1 i
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|