  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
3 Z {% R0 L Y# O u1 [PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
/ I& t+ T! _: b I6 B* S9 c7 N本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
6 u$ o: r* ~% Z0 y. [* P8 z7 R
' @+ R1 z/ A7 y% [
6 a( ?1 h2 X; _: _6 B& @9 h问题 u9 _/ p5 d) Q! K! x3 y$ ~9 S8 e
. q3 m2 _" X# \* ?1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)8 f& N8 b9 n+ _& ` x# q! s
7 `# K8 x- {; N$ c( ?/ p2 [3 ~: mSELECT * FROM MY_TABLE; [" I4 q* o& D# T' @
1 z* K# G: w6 R+ G- e; Z
A.如果可能,用把查询转换成存储例程
" ], [/ B$ j4 S% @% `$ c7 {B.如果程序允许,给查询指定返回记录的范围
0 Y ^" _& Z" V/ |C.如果可能,添加where条件
0 f& k6 T# R7 p5 J" q! GD.如果DBMS允许,把查询转换成视图
' ^! f( I, c( }4 D E5 OE.如果DBMS允许,使用事先准备好的语句9 z( m/ y7 D" r, X
) o' C0 Y! ~) l8 p$ G/ _) G6 g9 N. ?8 j* E/ O5 I( u
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
7 `& p6 A( q! n1 {$ s& Z T$ e
) e- O0 t% i6 A: B. l! d- h答案:____________
; N1 r$ q! E& D( }# y; Y- _6 u |
9 m0 l0 ~: }6 ~8 C! c, r* J6 t8 b) v
3 P- Z5 L" B- s! q6 S7 V3 Y% o4 E7 A3 y3.内关联(inner join)是用来做什么的?
X( r4 A- B, M# _( P* ?
9 e7 V% ?) N" gA.把两个表通过相同字段关联入一张持久的表中1 B: ^/ a8 T; K1 }" F6 a
B.创建基于两个表中相同相同行的结果集
8 l% M r* d1 ]C.创建基于一个表中的记录的数据集) k) P5 l3 |/ d, e3 e2 P8 S
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集: Q% k, `, `8 \4 ^3 q, C4 j/ W
E.以上都不对
$ h) V' B# Q% d6 f; H: h+ ^9 d0 ~; C# B
- h. y$ f. O( M% m2 k4.以下哪个DBMS没有PHP扩展库?. i6 C( S) A4 | V! y
4 v$ d' N9 H) x7 I# @3 R/ N9 Z
A.MySQL
L; F& O7 \; K: M* @0 FB.IBM DB/2) Y" i# r% x& [. g* e% U. e) }
C.PostgreSQL
T+ w$ B! k4 j! o; v6 X6 y7 }2 U- pD.Microsoft SQL Server
% G% @- R- h1 R3 Q9 [8 HE.以上都不对
7 |: G k( ?4 t0 }' Q* R. z$ Y$ B; K1 Y4 M9 V! F
, k/ H V$ u l( C+ e4 |
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
) @/ x. E% S( e0 H/ u9 o* `+ z+ [5 |! e& _" _& e7 R2 b) F( Q" v
<?php
% g6 T$ l( q. U. `3 [( {0 r$ Y$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);7 R% L0 z- F2 g3 s/ ~
?>2 a, z: s5 Q& h. A; N y: P
; f- v3 Q7 t& h0 {0 y5 {
A.MYTABLE表中的记录超过1条, { |1 ^. Q' ]& y9 ?
B.用户输入的数据需要经过适当的转义和过滤3 O1 b/ W% L* D( H$ z8 M
C.调用该函数将产生一个包含了其他记录条数的记录* i. f3 E( V1 u! {2 k8 p& m& A
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
4 g7 R5 t9 }, l/ ~E.查询语句中应该包含数据库名
# l8 y4 v5 L ]- P5 O7 ]/ J8 \, ?+ I, p- K
! ]9 V7 c1 R' }' x# G. M' p$ B5 \
6.______语句能用来向已存在的表中添加新的记录。
- Q# H( d/ _% m6 f1 O# }* H' R, f3 `- S' X0 b# q$ Y$ y
答案:____________
& Y# ]4 U7 n1 T4 h& B6 W% e
0 @& b9 k' m# L, a: G3 Y. m" M) U V' H+ B! s7 f }4 ~
7.以下哪个说法正确?
: M5 X4 c" c7 w
" t5 z$ {8 P' u% O# Q YA.使用索引能加快插入数据的速度0 ~ U/ {. c+ g6 V& Z2 H" _
B.良好的索引策略有助于防止跨站攻击
8 u- u$ J3 U* \+ e: GC.应当根据数据库的实际应用按理设计索引8 b8 j; N" o. I
D.删除一条记录将导致整个表的索引被破坏# ]9 d6 T6 t# y
E.只有数字记录行需要索引
8 ?* Q a; g& O. j; i9 K- J
$ v* B0 Y( A0 Z
7 O E0 W0 v" j9 R8.join能否被嵌套?$ r% z' ^. A% o/ S6 Y
?7 z% N( m- h3 B4 @5 A
A.能8 C8 P. d% l) n. ~
B.不能
# b$ B& [# S$ c) L1 ]+ E! H7 f7 ?* I2 i S# t
& j% u$ E$ ~" Z. b% U4 [
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
9 z' b7 f* I }6 {6 ?" H& a1 E8 L+ ~
CREATE TABLE MYTABLE (
# {) b! ?# ]1 L: ` i# gID INT,
4 e9 \# w9 ^) L Y) j6 p1 `" c9 hNAME VARCHAR (100),$ `% U4 _% w% O4 M2 O( g- m. X
ADDRESS1 VARCHAR (100),
+ ~6 ?0 L6 K2 L4 {ADDRESS2 VARCHAR (100),# s2 s/ b) ?5 X% s- L5 {9 `/ V7 X
ZIPCODE VARCHAR (10),- X: u: V' A% U0 L6 B) g: @
CITY VARCHAR (50),; }6 m2 @9 i l
PROVINCE VARCHAR (2)
: i" K1 b/ f1 q/ s9 i) B) e& u/ d# K& x)
" o9 V2 \: e# bSELECT ID, VARCHAR4 c5 k& {2 h. `# @
FROM MYTABLE
: m) e5 V, O5 |/ o' q, ~WHERE ID BETWEEN 0 AND 1009 Z8 k3 N# B: k% J
ORDER BY NAME, ZIPCODE+ c$ X& c0 `# H9 [
" x( o' O4 F' R! m F4 s
A.给ID添加索引: E1 m2 [* m8 ]6 i) h- N7 @
B.给NAME和ADDRESS1添加索引4 `# N' ]2 F/ z) z" A% Y" h0 C
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
* y# H% b' g2 ND.给ZIPCODE和NAME添加索引/ K4 W; X1 V& _. N( Q8 i1 g" k. v
E.给ZIPCODE添加全文检索# r* ~5 ~; \# U% I! W9 i# B
: K: l6 m: q* A3 r; `2 h3 K0 p R! T/ u
+ s; ]9 i' k2 D1 U10.执行以下SQL语句后将发生什么?; l8 r# J% {6 o$ I6 [# Y# R1 a
! d4 ^2 S$ }5 A6 S+ u2 _BEGIN TRANSACTION
) A# g, i$ I$ b8 f5 I, W5 j2 Q* sDELETE FROM MYTABLE WHERE ID=1
# x3 a D; q! M8 n) C( fDELETE FROM OTHERTABLE. Q5 j9 z# N* t8 \$ W* f
ROLLBACK TRANSACTION
) ?& l/ a' S [3 W1 N! q
( Y( ^7 q9 o' B% o! S# {! m/ }5 M) UA.OTHERTABLE中的内容将被删除
* U8 J G8 V$ a7 j, @% O) OB.OTHERTABLE和MYTABLE中的内容都会被删除
7 f, l: R, I5 ?. A. q( S& QC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
- l# F$ S. `$ i7 X7 d5 M4 rD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化2 f* T" \. c9 ~( U. e
E.数据库没用变化: q# ?0 }6 ?: I, H4 w; u& P
0 a) m- J7 U4 q& P2 F! T
8 \/ h' L$ ?$ ~9 s! R
11.DESC在这个查询中起什么作用?
1 Q( Y' z( X9 K( @# y" I" l! }$ s+ }. H
SELECT *7 [/ t2 l, G9 y- R
FROM MY_TABLE
, _$ W1 Y0 H0 U4 r2 CWHERE ID > 0
. E* s @2 s" r6 Q8 W0 h# VORDER BY ID, NAME DESC3 X% s5 ?. u' d) ]8 P; A
$ @* D8 P- Z+ B' r. D5 \' I
A.返回的数据集倒序排列2 x; _$ H, ~ }6 p+ ~9 Z1 ~
B.ID相同的记录按NAME升序排列' }( ^: k* a/ b: r$ m
C.ID相同的记录按NAME倒序排列. W2 g1 r! c* b) V) G) G4 s2 a: D
D.返回的记录先按NAME排序,再安ID排序
. g0 P8 C3 {9 U, g# b+ sE.结果集中包含对NAME字段的描述
' s0 f4 M! u) v2 m4 y7 N* T9 e: [: v4 {9 v; v# P$ X2 c
2 Z7 L2 D! s. Z8 Z, v" y
12.以下哪个不是SQL函数?$ H7 M! E9 D; [+ f8 A
$ n3 I' j3 L4 H: J9 \; M
A.AVG
& _' I& E* m% D- q& w' n8 YB.SUM
: @0 A3 m9 e3 |, ^/ BC.MIN
5 e7 Q% E6 i8 m# n: _D.MAX/ [$ |: r" a7 x+ P0 e) d4 t; Y
E.CURRENT_DATE()! M! D4 N$ @$ B& ?
# N) k/ T( U1 ^5 E1 h# X
7 ^! ?! Q1 {: R- F+ r7 u) O13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
) @2 y8 e" _3 x# C( ]* L
5 a- r7 ^( x8 M) n2 K/ UA.该字段必须有索引0 ^3 y' Q* p u3 {% Q' j7 ?) V7 O
B.该字段必须包括在GROUP BY条件中7 Q! w D4 \# d# O9 s: f# ]0 A
C.该字段必须包含一个累积值9 q9 }# q6 f0 b- M* g4 c& ~& T
D.该字段必须是主键
& g# ?& t( u; pE.该字段必须不能包含NULL值! _0 e! V9 ~0 g, `- K
0 q' q3 L% u& P2 D
! n2 q b1 a; N- ]9 Z* c
14.以下查询输出什么? P! {4 E) ~1 V- Q! T: K$ A0 B: Q
, _5 o- c' J0 M8 i' _1 gSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE20 ~6 @7 U! }6 {/ ]3 w% V9 F6 V
ON TABLE1.ID <> TABLE2.ID6 Z1 Q' t0 B R- F! }; U
; C/ V0 f* I, R; M
A.TABLE1和TABLE2不相同的记录% C% p& O5 C* b# W
B.两个表中相同的记录
v6 ~6 z( d; L2 J; V% ?C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
7 m# C8 d: @' \3 q$ f. ~D.两表中不同记录的条数
/ Z, F' C; m3 WE.数字2+ i( s% g: ~) k Y* @1 C
/ o4 ?& D0 N8 k" C6 a* M3 X4 ^
0 c |( x3 \! k" V9 _15.______能保证一组SQL语句不受干扰的运行?$ \8 \7 G3 C- m+ C
. t3 r7 X! u, b; N* K6 A答案:____________
; R! Y; T& [! f) _/ ?3 r+ n' G# G7 S0 v) [
9 u# _5 `4 A2 D: \* }
6 y/ G7 T& _$ u
答案速查# y& |1 n5 D- B3 {3 ?' d
1:BC
3 D- o H* {: B* |2:WHERE! n& j' O( f6 Q& R' k
3:B
; |# \; `9 j4 `" e2 k# [4:E
0 ]* {& I5 L4 A" P8 g8 Z5:BD
- a; C7 d1 a+ Z- p6:INSERT
* D% ]0 t1 ]% O& H# Z7:C8 ^2 ]# A J5 A
8:A9 S+ l r% k8 H! Y5 o6 I
9:C+ Z0 H0 R% i' D/ ]- S$ m' Q% A
10:E, k3 @, @) D2 [& ]0 y
11:C
7 s: u. j$ S2 u12:E4 ?! G" g+ x" V5 _. W/ w
13:BC- ^. t2 b- A5 I" G6 Q
14:C3 p, R, B( I9 _1 {8 N
15:事务5 V$ @; a6 W6 q9 D
9 T( ?" d* e. j, ~0 f0 F0 ]! T* T0 [1 y. r+ w6 Y8 i
1 L# s% \6 l1 w答案详解% s- s: w. \8 C2 u% b- o
! d! \1 e { `: ~$ I
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
5 u2 X4 _6 \. R1 X4 p/ a+ x# \5 c+ ]6 a
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。, e. I8 h9 D! l7 J' J4 p
3 ^/ A+ h) q5 t- ^2 ?# {2 X2 L2 {3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。+ I& o! `1 ~5 H: Y$ G. \( h
/ t* k8 m: E* U/ g! @- l8 g$ F4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
( \: o' W$ K0 X+ @# k8 K$ T0 ^+ K) j& L% f, C6 H4 N6 d4 i6 Y- |
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
8 T' A9 q4 F8 S5 m4 X% S
$ z. h: f0 J `% t a/ z9 M, d6.答案显然是INSERT。& T' N7 r# g& g2 ?
) `6 Z0 Z: t! W y) P% j$ N7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 A3 m$ [# Z# `# h$ M; K; Q, K6 \
" f, z @9 o x
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。2 G8 X" R: O: j6 _9 f" B8 k
( k) p* b1 H$ b+ l9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。# d. y7 |1 s: s, ~
8 n% @: |! [( ` H& y/ F K10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
7 I: x5 S1 R8 ^" v% ~- O! O4 F
, E) z: m6 [+ |4 l0 D3 j( p11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
4 n9 D }/ M4 F6 v- E( i
2 F% V/ ^ U M& {0 j. E) L12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。$ J S7 E8 H2 y& W4 Y
( d. ^5 `/ x$ C2 }
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
3 R( H7 u: ]2 n- H! K( ?* ?& a# u. y+ C- c* T `
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。3 v f! T O, o% i0 D% O% ?
3 m& ^. B+ U& G* c/ c: n: n' W
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|