  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。& J6 K( m8 z5 ]% H! p l
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。- w9 ^) p) C" X: O7 A4 \
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
. F$ `/ m" d9 F" {, Z
" c1 {4 C& ?- `2 @2 f1 g3 G9 L2 U9 n& @2 {
问题- H, {1 J: e& i6 f+ z( I9 ^
" D [- l% j6 O
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)! e0 E& O: R# _( e% e2 h6 @
! l& u" P' {; w7 [. o, w! MSELECT * FROM MY_TABLE
% d/ h% P3 D R$ L! w; J a5 A! K; S2 G: F* s5 w' p. k6 H
A.如果可能,用把查询转换成存储例程: n7 p6 A9 y |; I3 k( E3 }0 i0 b
B.如果程序允许,给查询指定返回记录的范围
$ k' p8 s* q+ n G. h. ZC.如果可能,添加where条件
6 m3 I( l1 y0 ]; u7 w) X. L) n' qD.如果DBMS允许,把查询转换成视图
3 F3 n3 F+ B3 f& W+ ^0 ~0 bE.如果DBMS允许,使用事先准备好的语句
0 g5 S; m4 ]* t; i/ P3 o: E# C% I, H+ G% l7 o4 [
4 z6 r* |& N* A/ Z" |& f2 Q( l
2.可以用添加______条件的方式对查询返回的数据集进行过滤?9 i7 ~4 \ ?/ G( s
$ K* b0 t1 N" k+ h
答案:____________7 X- l+ S0 Q5 R! h# p
- k) J( y8 y, t9 a; H
) i- I3 ^1 s$ b
3.内关联(inner join)是用来做什么的?
/ j- |5 D- ?+ C2 [7 R$ g; n& k; N3 v2 W4 D: ]% f
A.把两个表通过相同字段关联入一张持久的表中# v3 o/ k' w8 w+ `
B.创建基于两个表中相同相同行的结果集
2 v" `3 |- x5 A; L, KC.创建基于一个表中的记录的数据集1 I2 P" l& F! @' D1 ~4 ^
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
2 q K# n4 D+ Q$ ^9 n- f$ e# `E.以上都不对& A$ I; j4 x0 e. m. \
% `# `. A1 y* l$ Q4 l6 U& M! u0 {: E* S* ]& m
4.以下哪个DBMS没有PHP扩展库?
& v+ b$ X, x2 j5 d4 T
* W `, }" j [0 [A.MySQL
9 {2 a l f( h4 a) k% `B.IBM DB/2* U: D2 Q7 Y* S8 @6 F% L
C.PostgreSQL
* {; h! b' m- A3 e3 UD.Microsoft SQL Server) w8 x$ }! v% d" x2 m2 f6 N
E.以上都不对; B! a+ U) D5 i; p
, M6 @! `& y/ z( s. w
" {8 o. z$ q; }1 g5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
+ l/ Y0 w3 F/ y/ g5 N. W6 S. y& ~4 U
<?php/ }5 v8 u5 F( a6 k0 I4 |
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
1 {2 t2 A7 L R. s. Q?>
4 q z' M7 J0 l* v" c6 v7 d6 W. i* Z& K7 }
A.MYTABLE表中的记录超过1条' o0 P$ f6 r& }% f" J( V/ X
B.用户输入的数据需要经过适当的转义和过滤
% U5 V2 h' u" e8 ]3 ~' mC.调用该函数将产生一个包含了其他记录条数的记录: e9 N% n( Q4 h( H
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除 N3 z# G0 I* k6 t
E.查询语句中应该包含数据库名
( B) N5 M5 X. J- t! W8 a
9 o# s; q. w% n& T* `
r. X4 B* ~9 p% d% G6.______语句能用来向已存在的表中添加新的记录。8 Y, g6 q* S8 D! v( X: T8 V
5 s5 n3 u/ W$ a, i! U: t8 ?3 C
答案:____________/ F0 |. D3 ?/ ` V
" |1 l- ~ T+ C
; `% Q( B5 K/ D: k: L
7.以下哪个说法正确?+ ~4 v. x. e9 f+ D2 F# c
8 j, Z u' Z7 K3 t# t$ l( `
A.使用索引能加快插入数据的速度
7 Q# x" `$ x" k5 TB.良好的索引策略有助于防止跨站攻击, l+ n/ _) @! t6 W$ r
C.应当根据数据库的实际应用按理设计索引
; i! X; q d6 t1 j) X) ED.删除一条记录将导致整个表的索引被破坏
! w) i" B5 x% W* g+ W/ bE.只有数字记录行需要索引
7 r; K9 c" E) h- R2 Z! Z" u% @- Y `
. P! F( _6 a* w: j* ^: d8.join能否被嵌套?
! u3 R: e5 N. b' v* V+ m
9 g. P6 v3 u/ Q- B/ ~A.能+ r& d5 ]4 j' {5 C5 T
B.不能
U3 J' W1 K" I$ [! C
, p. U# c. A' O! c& r8 l9 D' s* U, E) o3 g: l9 [2 a
9.考虑如下数据表和查询。如何添加索引能提高查询速度?4 ^" f/ J+ D7 Y2 r5 u" t
% ?% B! q: @7 v0 O w" I) n0 l
CREATE TABLE MYTABLE (& ]! i8 I% c4 h$ T \
ID INT,
- c3 }2 e4 {( b8 U7 s" bNAME VARCHAR (100),
) l& ~2 |$ K: }( Q0 F. p) k' r+ HADDRESS1 VARCHAR (100),
u9 j6 `" O4 S5 d) g, G' pADDRESS2 VARCHAR (100),
$ R- I6 K4 I! f" E- NZIPCODE VARCHAR (10)," E( ^' g/ p5 K1 z& ?
CITY VARCHAR (50),
0 J/ w, f% x' G/ w2 ^% D) d2 aPROVINCE VARCHAR (2)* ?4 D. E3 x+ H0 X) a
)
; ]. c9 ]3 K0 p8 O! X9 L% pSELECT ID, VARCHAR% @( _+ c, Y! E# q1 R! u+ U6 M- N
FROM MYTABLE
! h! c* n$ i, ?- n' RWHERE ID BETWEEN 0 AND 100
( h$ s. N+ ~7 `# bORDER BY NAME, ZIPCODE
; o4 Q! u+ _4 k, a
/ g& ], T# c* tA.给ID添加索引
) ?( t# ^- _" ^/ N( S6 ~$ xB.给NAME和ADDRESS1添加索引
; F, B$ N/ B( w7 YC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
$ `% x: h% `2 y; C, o$ kD.给ZIPCODE和NAME添加索引; [4 q9 I/ W4 u! S% [
E.给ZIPCODE添加全文检索7 V, ^& Y! C3 r/ e& M8 ^) W% Y
- W+ j- j% o3 K3 T+ {1 Q1 i: o# O. I3 s' G
10.执行以下SQL语句后将发生什么?
( L- l; x+ [' Q: V3 f8 J0 E2 x6 B+ @' F$ {
BEGIN TRANSACTION5 w) l, y0 O5 ?5 \. P) ~
DELETE FROM MYTABLE WHERE ID=1
- S: K( x6 v* @: R4 C# x8 j% PDELETE FROM OTHERTABLE
- d& c2 Q( Q' K- OROLLBACK TRANSACTION
. [* E* N, u7 G, d, F/ w; R5 T% s/ z* [
A.OTHERTABLE中的内容将被删除) N x% S/ a, s* s
B.OTHERTABLE和MYTABLE中的内容都会被删除3 B3 e$ m0 F* [2 _' ?/ {6 b% e
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
. o# M3 e3 u- v" nD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化* s) ]" r& G% ]# ]+ R* [) L
E.数据库没用变化. _" W: p( x) `/ L3 r- P
# J1 N0 T9 a- D$ K& j
$ f' y7 h9 K+ k( W' f Q11.DESC在这个查询中起什么作用?' d% J" J& y! ]1 T( F
& f* c0 f% J4 I3 L- X: d, x$ F
SELECT *- y1 D: K$ U, O! B* I
FROM MY_TABLE) y& k0 U( s# c" `3 f1 }5 C
WHERE ID > 0
" C- U! \- A5 k9 |ORDER BY ID, NAME DESC
, |" c {( D; u7 r: u
- P3 p3 A: u8 [$ X- y" Y" gA.返回的数据集倒序排列+ h* P1 K- T$ v) |' o6 K- \( r
B.ID相同的记录按NAME升序排列8 k% d$ ^* N. X5 |- E! N
C.ID相同的记录按NAME倒序排列
+ X2 J' [ z$ j) q1 ZD.返回的记录先按NAME排序,再安ID排序# S+ S1 d a' O+ J3 M
E.结果集中包含对NAME字段的描述5 v* M( V6 h% D, ?, S! |
; ?$ f- A8 a3 l( U* ~
f; g& J' c( n% K12.以下哪个不是SQL函数?, c. O- y7 K2 I) v
8 p: {7 q3 J6 B4 ]A.AVG
: p5 ]4 ~' }; qB.SUM
5 ?# s! Z( x: \$ D hC.MIN; T) f, n9 Q) q# |; i
D.MAX
, @0 `' T; V/ LE.CURRENT_DATE()
7 d: S7 f( [" l! v
9 E; s8 `$ e5 ~7 u1 C2 J/ V/ M$ l2 w" _; H0 F9 Z
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?3 ^) _& o% a1 F3 m1 s: p. e
0 u5 t5 c* X+ {$ B) U$ t+ G
A.该字段必须有索引% Y7 D/ }7 V: r6 ?: ^' l
B.该字段必须包括在GROUP BY条件中 ?5 l; m \ A, w& O6 ~) {9 R. ]
C.该字段必须包含一个累积值: B- d& e/ d9 f; w9 T
D.该字段必须是主键/ r0 D4 |% ^7 X. k* {& A1 [
E.该字段必须不能包含NULL值
r6 b/ C8 Q% a2 M) P8 M6 W* t3 s* K% N$ _3 U i# p4 p& H
. G U; f7 x/ O% r* \! ?. I8 h
14.以下查询输出什么?
8 t# g) f5 d+ N4 k8 K' e
3 Q3 T1 N6 A. k: n8 N( F; xSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE25 ~) o/ r2 r! J. Q$ a n
ON TABLE1.ID <> TABLE2.ID
2 N7 f& @! }. Y1 B# d! }' w- H' T! n/ W, d' F5 Y
A.TABLE1和TABLE2不相同的记录' Y1 X$ x6 L( [! R4 w
B.两个表中相同的记录
$ u" G, S2 U# N9 f- Y" _C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
* T! ^5 Q& ^. l5 V% W6 p* f, ?D.两表中不同记录的条数: ?$ T3 @. f8 x- P
E.数字2! U5 z& K: i& Q+ F+ D8 |
$ D! p5 b" P* c
0 x7 I. n6 _+ q15.______能保证一组SQL语句不受干扰的运行?
' y. C/ h; N' b4 J. b: [( r h# F
$ k) K/ [. ~: t答案:____________
0 B/ ]" O; P( u% F; j
6 b+ o' p1 g/ Y
1 Q6 ^% e' t8 q4 ?- I2 F/ n9 }% c. B T% {
答案速查' i& F" H, H+ O+ m1 V
1:BC
4 a( c, u' v7 F1 H" l2:WHERE
0 j# V# F$ }% V3:B5 z1 V0 i! [0 g( H+ Z3 N
4:E: z( _" p/ d0 o3 U8 s) H
5:BD
( b6 I* Z5 j' @$ D3 o) |7 z6:INSERT
1 a" x. {- f, b7:C
0 A: W. l! v9 n" |: v# J6 {$ |) y' ]8:A
. O; T T/ D4 l8 {% V) H. ^9:C
3 S9 K/ B2 \; K1 f* n10:E
: w; @* F5 J2 u11:C
# w+ C: v# C- h2 A12:E. J$ [7 p+ `+ B& r& R ?6 Y1 e9 J
13:BC& K% o/ |: Z6 _4 v
14:C
f" e3 e6 t. N( `0 g15:事务
1 p* i) N- a2 n1 o4 V: J$ _- Z# p9 d7 o7 p4 o
* S1 l' F! p- l9 ?
: R* q) z7 @! h6 w9 @3 P
答案详解3 \/ v1 w" m% P! |1 ~" A, O
% \0 W. {1 _. B2 y) O$ U' o1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。4 l9 b$ j& W% a/ r- `
7 `7 [& S3 a# t3 D9 k
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
9 T8 a2 f- r/ j8 \- ~
1 }- g. _% Z( y* O' j3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
1 \+ |9 k6 G' ~4 s5 v ^
) S7 H# g4 c; J: U6 ]8 L) l4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。- o0 Y! W) {' E9 ?& w. L$ a
8 M/ q8 v. ]; W
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。$ b# l6 a. }7 q" z- ?
$ \; Z7 t( L/ l$ a8 p
6.答案显然是INSERT。8 {5 O( o; k) i8 w9 H0 I# Q
& y5 a+ M# W! k2 p1 @! r: D7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。" w( h3 F2 _2 u/ A
1 T' D' g' T" |8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。9 V0 n R! T9 s' k, M& e5 G
2 {' a0 v3 w6 H, L1 `
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。' d/ H% K" @/ R3 a
4 q6 Y4 v# s' W$ d! X% L0 s8 G
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
) [( k4 C" n: g3 i! G8 C( N$ Z1 g
. u& Q/ I8 Y+ Q) c$ w9 t; z. l11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
) t) G( K, H: L5 X# X2 z) \4 c8 F
, f* `; o; {8 C- U12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。: Y5 t" t# \7 u$ j
* W& j$ @- g$ W( `9 _! S9 l13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
. L5 v! Z8 N) h1 |4 @1 q* P$ _' T2 g6 v; h. F* w+ d% z
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。$ Z2 C8 D! G+ |; r7 d2 C8 E; G
+ x# k$ O2 X1 s% D) @; g0 E15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|