|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14433
- 金币
- 2502
- 威望
- 1647
- 贡献
- 1450
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。5 J- n) {/ T9 N9 P- t
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
. F: V& @8 b2 D# v9 m, W本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
* g) f! |. n. E& Z5 t% S. c/ D# V' K& p& R7 Y' T
9 h# O' m, _" c0 N. T6 ~问题
0 b* B& J3 @, b2 F/ P7 T1 P# S6 e( _' J- c9 G
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)) H. ?+ k& S5 @5 F
9 U$ i3 |8 |& }; d4 QSELECT * FROM MY_TABLE
- A& V9 F4 C. ~: ]) B& k3 [2 M! Z9 h! |; i. v1 a
A.如果可能,用把查询转换成存储例程
' @; d; u$ V5 LB.如果程序允许,给查询指定返回记录的范围
6 U; }! v+ r. ]C.如果可能,添加where条件
) w0 j4 E1 e( H3 |* h( ]% u L# W' ND.如果DBMS允许,把查询转换成视图# f& j6 G! O* b9 r, f
E.如果DBMS允许,使用事先准备好的语句
& T% z. Q8 Y g5 z2 A4 V( h
- Q; j B; x ~0 O: N# q3 {! z0 B; f! y0 E5 J+ S. Z" ~
2.可以用添加______条件的方式对查询返回的数据集进行过滤?4 V& E6 k) n% R" e" s4 n3 n
$ @3 x+ V% g- ~4 W% Z5 b+ S
答案:____________. q4 Y0 i: t# |% w
- z/ w) q' x7 G
2 {* k* Y: N6 y0 I2 d
3.内关联(inner join)是用来做什么的?, v& }( f' U6 A& K' R3 j6 k
6 L) u/ Q' ^- V5 a2 D BA.把两个表通过相同字段关联入一张持久的表中. F4 k* t( E6 w- ~/ C0 o6 a* b
B.创建基于两个表中相同相同行的结果集
; Y/ m- Y/ u) g# k6 a& KC.创建基于一个表中的记录的数据集9 W5 l9 n: e( G, p
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集5 Z4 F) b1 S% T w6 C8 d1 n8 L
E.以上都不对* \3 d: S4 u! L) z) e
5 P1 k& `/ @3 Y8 k1 n/ |
+ O5 H' F$ u2 d4 H& R6 n4.以下哪个DBMS没有PHP扩展库?
^3 j5 D! \" w8 r
) Q0 S& T4 v {+ M0 wA.MySQL
) v; T6 b5 }0 }+ @" ^" B9 T$ m! |3 x: uB.IBM DB/23 M8 k% b4 c) q
C.PostgreSQL
+ h/ P# E, L1 L5 f: PD.Microsoft SQL Server
, v0 I6 i" y/ iE.以上都不对
, Q) k$ t# f% z% q9 d$ K! C& C5 z' E5 Z) u# t
% s7 f% b" J+ t
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
. U' Y; Q* h* |# J! t% Y- W
1 m3 l7 n3 r3 E1 z' @ p<?php
' U- W! d. i! ?; w0 x2 } I, V$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);1 k+ Z$ `6 g$ Y7 g! k; o
?>1 E+ F9 C3 ?4 y$ N, V; \
! ?# P l; @" B$ Z% h8 {2 O6 @- UA.MYTABLE表中的记录超过1条7 b. _# a0 Z& _" w C
B.用户输入的数据需要经过适当的转义和过滤% n- K) E! m' L: n2 i! x
C.调用该函数将产生一个包含了其他记录条数的记录
! [9 \% ~# S; B6 a; n& {" wD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除- F! J6 k t/ C* c- r
E.查询语句中应该包含数据库名4 x$ q) X) S. e+ G" d
& w4 Y% B6 M P0 j) c1 V2 t
8 d* ~: {! Q( I) q- K' a* `& i
6.______语句能用来向已存在的表中添加新的记录。
+ p9 [6 S- e6 c5 j0 ]- a# k9 l
, Z& C) w: q7 S# Y1 T5 \答案:____________ C4 x: }7 I2 |4 o+ D: T
9 A' O4 P# ]- U/ g+ \- ^% H6 a' l
) t2 i) p( N M2 F# a- p7.以下哪个说法正确?1 q. m7 l7 b$ V) w/ ~4 @* t" {
# I6 N3 J2 J" Y) xA.使用索引能加快插入数据的速度
* A$ t; N3 B% o X. j. nB.良好的索引策略有助于防止跨站攻击( w+ }2 f, W9 C7 F9 k
C.应当根据数据库的实际应用按理设计索引( e' o) X8 H& s0 L
D.删除一条记录将导致整个表的索引被破坏3 _% s6 N; j$ i" ]6 Q' g- [
E.只有数字记录行需要索引
& G0 ~- V# V, N# B5 b
. d1 V2 C1 _4 Q- a2 m" v7 s! O/ G1 f4 l' Z/ [: N8 {' z
8.join能否被嵌套?* v9 u5 H3 ?7 s0 N- w" a
. ^, R" w0 D9 e9 @1 |" s, d. y3 H. N+ r( YA.能* X; x7 y+ F/ R3 I, @. i
B.不能, n9 q. T3 O6 {& B: T2 v
3 _, N3 V- X7 B, Y, e. V
, R! B1 u7 z" \3 d, [: s9.考虑如下数据表和查询。如何添加索引能提高查询速度?& L6 l' \( w- X
" g9 T$ T: X4 V7 f7 H0 i3 JCREATE TABLE MYTABLE (
* k5 r) H5 ^( wID INT,
, S4 Q, i1 G0 o- |3 H$ E4 Y+ r- F- QNAME VARCHAR (100),
V9 ~! b+ ^" WADDRESS1 VARCHAR (100),4 Z- E" E4 H" L9 U/ F
ADDRESS2 VARCHAR (100),
. y# i! ^1 e8 dZIPCODE VARCHAR (10),7 n) L/ s5 C4 _2 u
CITY VARCHAR (50),2 n# n# V0 W, I+ v
PROVINCE VARCHAR (2)
7 `/ Q g' i" X7 ]+ {6 A# U)2 i( ^/ O+ P1 v7 J: z$ q' J7 ]8 k
SELECT ID, VARCHAR+ [% T4 }- s3 `1 p$ g$ \# I
FROM MYTABLE" V2 M6 ^6 e% x6 a( y
WHERE ID BETWEEN 0 AND 100
: j7 i8 z( `) l+ O1 FORDER BY NAME, ZIPCODE
! t$ V7 ?9 E3 W* [' M
0 C7 z8 B" R3 e9 RA.给ID添加索引
) }8 I) ^/ V1 r' OB.给NAME和ADDRESS1添加索引1 o/ r) z$ A2 x- k x: C
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
9 k; p) w9 x- u( A9 A6 V( hD.给ZIPCODE和NAME添加索引% o! T) ]4 D. l4 u; |# F& H
E.给ZIPCODE添加全文检索# O! q. [& R: W( X) A9 x
9 W. r, x: _- O3 t: _6 x' \( s& J0 U; I, C
10.执行以下SQL语句后将发生什么?
8 f- \- ]: A/ c; }3 Q$ T
6 R! t2 H1 [' dBEGIN TRANSACTION
7 Z$ t; _8 w! P5 `7 a# \DELETE FROM MYTABLE WHERE ID=1/ s8 d( B G" c1 D
DELETE FROM OTHERTABLE
. x) I1 g& q1 ^7 p' ]7 D* I' j+ ]ROLLBACK TRANSACTION1 i1 S6 ?+ P! \
3 \; `4 F2 T& o7 O: K6 F3 h+ s) EA.OTHERTABLE中的内容将被删除
/ B8 j9 @# g, B- A/ GB.OTHERTABLE和MYTABLE中的内容都会被删除
! i' \4 e& c3 m/ V5 B( ?C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除$ d1 ^$ N/ m% Z: {; J. E
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化9 } a! m4 U! Y* G
E.数据库没用变化
; w c$ C" A9 O4 i1 o0 t
/ h4 m' d5 X' Q5 O( W. A
7 u) `; | r7 [: _5 { J11.DESC在这个查询中起什么作用?/ D5 `, G4 U) V1 L* K* y0 S
# y5 W2 a: I) X3 Z* X
SELECT *( W* F9 U. N9 H7 n+ @; R/ ?0 O
FROM MY_TABLE; M( b* a; a0 `3 W" j9 @7 o
WHERE ID > 0
" { y% s; }$ K/ x/ W) VORDER BY ID, NAME DESC
; w/ H) A! n9 K( E" q/ |
2 w) V H) P' g5 Q# [: K4 g6 rA.返回的数据集倒序排列
6 d$ Z0 Z2 K6 [; f1 bB.ID相同的记录按NAME升序排列# p4 l/ b ?6 }- |) X
C.ID相同的记录按NAME倒序排列
* u5 j: }" v7 Q) g$ `4 O9 Q. CD.返回的记录先按NAME排序,再安ID排序
) ~- F. ^; W2 qE.结果集中包含对NAME字段的描述$ G, ^/ ?& R C. X+ _
1 p, a/ |0 r/ x( M2 h* @5 x( u) a: K* ^
12.以下哪个不是SQL函数?+ h6 C. ^% H/ m/ T2 k! u
- E' Q* B1 K6 G! j2 D9 _7 [6 X
A.AVG
9 v7 X: K# O7 P( O R. }$ KB.SUM
( C( D" Y* T9 G% t# g& `) \9 m7 Z& RC.MIN, h* f5 G) J1 Q' g
D.MAX
8 L0 n2 K( r& T0 ^+ a* S) \E.CURRENT_DATE()) N' A) [/ X# c5 G
9 r7 P& d0 J& F: H" t
4 _9 M# \) w) C+ x9 D" [13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
$ V1 B+ j3 O3 O. \; A# @! u# {5 g! p6 E3 W4 X/ c' M0 X
A.该字段必须有索引
! Q! X- d. U. l2 ~6 A6 S! nB.该字段必须包括在GROUP BY条件中% v" \( i$ p- @7 G/ Q3 `
C.该字段必须包含一个累积值7 M$ a! Z% R- C
D.该字段必须是主键0 `( d& i; d1 H/ C- Y5 {5 B7 Y
E.该字段必须不能包含NULL值
2 y; v4 P: o7 s4 b
( O( ?* d4 C+ @, _; O- i% {* _, }. v2 J. [4 _. U/ e
14.以下查询输出什么?' d- i- k4 P. _2 W
; i. c/ D0 X! z! i* _6 ~5 iSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
3 G. v. w1 N8 f+ c& u! L7 zON TABLE1.ID <> TABLE2.ID
* `( T- o! F8 h4 T' ~/ Q
4 C$ V& \: y; H) q4 _" SA.TABLE1和TABLE2不相同的记录# U% X x. U6 Y2 M
B.两个表中相同的记录
/ t' S, b \3 D s5 e& GC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数4 |5 ^, l% o) E
D.两表中不同记录的条数4 r$ w3 \$ |/ ]) c: g. v6 D
E.数字2. B2 Q) J/ m& Q& Q6 J
( v2 Q) o2 h' \( y T$ k; K* m' d: D; `. o
15.______能保证一组SQL语句不受干扰的运行?
, Z0 _! Q2 V. F W+ j5 `2 F, t, o. `. a" H- t* f6 y
答案:____________; b- a- H; D' A9 t0 y' `
5 ?! R0 ]" r1 b+ e. x# g
; ]# E4 H4 @! n: ]: q2 o7 A" Y
5 j* X% N. F; M3 z; L
答案速查
- I4 B7 d6 h" g3 O1:BC# B& o j: t4 B# @
2:WHERE
) [3 G2 z; D8 |# K$ w3:B
6 A. D) H# k( W4:E
6 r, J. n) o1 j9 I9 @8 H( B) u5:BD+ j- {" t& ]1 t: O4 z' `
6:INSERT
+ { b, Z6 Q+ t5 G7:C, \+ t4 p+ }1 e$ F
8:A& s- W" Y% g- _1 \+ Q
9:C
8 E1 S R9 G3 l& r3 g. U10:E& z% O" d( ^; B3 U+ l
11:C3 L7 N* S& E& d, B
12:E3 t0 N, j1 _9 X$ k V
13:BC
* {% J9 @: c; I7 z5 ]7 o4 x14:C
! U' x; t ]- C; y- A% Q7 F15:事务+ R9 P# [! {4 O7 S: g) W
& h9 }# d# D8 O
. H1 r5 R/ S) ^$ y6 B( `: x+ z- T e* C6 R2 O; p' w
答案详解3 M L. v2 }$ ~; Y
1 ~9 k2 ]5 |# p, z. q; n _
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 }2 j% w% D8 \; P8 x1 v, E4 [2 q h) E
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
5 E6 r2 J7 l: r W0 i
. `" w0 L$ U+ M' \& X. O/ Z3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。! c1 r! P2 l. [9 k- \
* o& R0 _! ^! v
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。6 \4 W x& T: s# E M1 q+ Q
$ p, E, M# x9 B4 P& O5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。, p. `0 B1 ^! N- R+ Q/ D" V
! n" M) X# A! d/ h( x% [# Z& M+ f5 a6.答案显然是INSERT。 H) x4 d+ m( `8 Y% ]; G
* s; j* |7 t$ t5 F5 B, t. L
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。. O3 L! K. P( B `0 X }4 k; ]
7 A( W6 i" l% P
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
/ C9 C5 @$ U8 E# z; c% o4 D/ K! u r6 [% S" B$ c
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
$ q7 k+ h( L6 C) i" M7 Q5 D( A8 T# W: I h7 t0 Y' Q, s
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
0 ~ j& ^" G+ l7 X" c) w7 s! E" [" q r
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ ?0 H$ n; R, B0 g3 {$ i3 ~6 p9 W |7 U8 d
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
/ p& S2 Q2 T# D" Q( E% @1 P
^* B, D Z, l5 X13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。* { L( N" O" o0 o+ W
8 r0 {) `9 W: J6 \' J
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。& E7 ]! {' B3 B
1 l( Y9 N4 F' X4 V$ d7 T15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|