|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
& X: e4 {- t2 c& I2 @, hPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: z6 {3 v9 Z! N本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( ?8 t# o! t3 Q
5 [6 x, p4 n3 w$ ]: r& T; j/ ?/ c
# \* J9 F# H, g: u5 n! u/ z问题
* K# s9 V( A* c& R0 b
. r: z9 [% A- i$ _0 H9 Z* E1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)3 |, n2 K U' @* p6 y7 o. ^
2 f+ H, d: ~- U" e' E0 Z
SELECT * FROM MY_TABLE: i0 `! B* S; Q. N: T* }4 H9 _
/ E+ B1 |( i& G3 E: yA.如果可能,用把查询转换成存储例程* j6 K" O0 X. s9 @& c2 E
B.如果程序允许,给查询指定返回记录的范围7 r6 R; E8 |- A& |2 y; G! v
C.如果可能,添加where条件; a8 W& D( G( C; C
D.如果DBMS允许,把查询转换成视图
1 k+ D, z% ]7 {$ [! q. M$ mE.如果DBMS允许,使用事先准备好的语句0 @- E* l9 k0 H( B; _' g$ z
5 H, _7 v+ f' t1 E* q: P | R7 x
, P3 Q& [7 W3 x0 @2.可以用添加______条件的方式对查询返回的数据集进行过滤?% j9 ~: V/ r; T
4 V* N6 S' G. ]答案:____________7 Z* j& P: l1 e' I
# K+ b2 W; l& Z, N
7 c" }, I' Z! x. s- t3.内关联(inner join)是用来做什么的?/ B9 |, }6 m2 G% L' K4 R7 ~
" A6 \( H7 v& a( zA.把两个表通过相同字段关联入一张持久的表中7 H% _0 g2 q2 [: z, M
B.创建基于两个表中相同相同行的结果集
6 E# F7 D, g: w9 X' D" OC.创建基于一个表中的记录的数据集
2 L6 K. d% O* N4 jD.创建一个包含两个表中相同记录和一个表中全部记录的结果集$ w7 I# h2 D; L; ]8 V! o
E.以上都不对2 z$ r" l. E) E- M
; X: i6 @1 f0 @+ r2 E- K4 g$ |% |# a- Q/ ]# w a9 N) d
4.以下哪个DBMS没有PHP扩展库?
! \$ _3 A& B; C _' T6 C- \! C) w! ]& v$ M
A.MySQL# f! f8 M) G- c
B.IBM DB/2
3 U7 E! [ w9 \- v" [* _C.PostgreSQL0 w5 R0 P( B9 \3 `4 p R7 B8 l( P. k
D.Microsoft SQL Server; s9 p9 F' m( W
E.以上都不对& l: D+ l+ ^1 q
4 ?0 t6 T3 K0 D! a
- x9 i) A/ u4 J5 ~- n) ?0 S( j5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)! r9 H3 d" w, o5 Z! z0 M( `
4 T, q4 N i/ c: j* ~4 e2 [
<?php
1 _: Q% ]" Y" N, s$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);( L8 h5 R: g. Q0 A$ k! g
?>. ^5 v! ~: c! Q/ n6 }" A5 ~
; W( {9 m5 e( e/ I3 q2 qA.MYTABLE表中的记录超过1条
' \8 E ]! g8 _B.用户输入的数据需要经过适当的转义和过滤
# }( h, I# o$ p, v, CC.调用该函数将产生一个包含了其他记录条数的记录
1 V" n3 H5 N- T9 ^0 c, \# P, @D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
2 v9 i6 Q. P# P5 y& c3 C$ w5 hE.查询语句中应该包含数据库名1 f+ D' @( |/ E# T$ g, a
; D. Q5 |3 Y& U
' T. g+ O$ a7 C) M+ h- x6.______语句能用来向已存在的表中添加新的记录。
0 e# [& t, k0 }0 g% v6 v* q5 {' x* t; ~2 a
答案:____________% S, e& R" x4 S2 c) E$ K. J
" E2 X$ k/ e9 s: G
+ c- k" s$ y% `1 p0 w H% V
7.以下哪个说法正确?+ w; T1 N3 R- R4 S, M
8 |+ G3 F3 q# x
A.使用索引能加快插入数据的速度! J0 O* V) _# s$ w& }
B.良好的索引策略有助于防止跨站攻击
# ^( r9 V. d Y: AC.应当根据数据库的实际应用按理设计索引! }" S7 t( x3 @0 R% ~8 l( Q$ T! e
D.删除一条记录将导致整个表的索引被破坏
& w2 V2 y4 }5 k2 |" m& PE.只有数字记录行需要索引9 w, j: X4 X: q8 v0 F
g: @' z' {. W2 n% R5 L* k$ Z
% `; s8 _0 h, {% O8.join能否被嵌套?
' R, g0 x5 C+ H2 A7 ?' y1 W4 z- J) z! [4 `5 u- H
A.能
5 Y* j, l. m; [B.不能6 G5 C! ]- m) y# g. D
" ~ ?5 w% P4 k3 x2 a4 P$ G6 L* s, s1 C% Z* v# c1 G
9.考虑如下数据表和查询。如何添加索引能提高查询速度?8 ]+ ~8 {2 L3 p7 I ]" ?6 L
+ |% M5 J$ m; O. R) p( ^. r3 Q
CREATE TABLE MYTABLE (
4 d4 V' ^6 W4 pID INT,' J* s* d! ]+ G' ?
NAME VARCHAR (100),5 v* w7 l: k/ G! M
ADDRESS1 VARCHAR (100),
! F; f- Y% x z; ?1 xADDRESS2 VARCHAR (100),9 v/ E- ]$ j0 f$ {. V% h
ZIPCODE VARCHAR (10),, |7 }8 D; K# c, g" v
CITY VARCHAR (50),
5 h, X& u4 {3 Y& a- HPROVINCE VARCHAR (2)
F8 `, ~) b; b0 }% D)/ c( ?' d! \; |" E9 o
SELECT ID, VARCHAR! Y' F( d. u) l4 I4 `0 ~( f
FROM MYTABLE e1 [/ O" r3 H( B
WHERE ID BETWEEN 0 AND 100
5 J9 b0 K9 P+ z0 |. r& }ORDER BY NAME, ZIPCODE
0 Z3 i* F( C7 Z" d, j6 U, R+ R( ~ H0 \/ b, ]* g* H- C! C$ V: U" s
A.给ID添加索引
% k0 t5 w; V x" t/ c8 s$ u- \B.给NAME和ADDRESS1添加索引
- z1 _) p% k. E9 [9 kC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引$ m* e6 m9 i- @9 X+ i& [
D.给ZIPCODE和NAME添加索引& D' _5 S: O9 `. x# O9 s
E.给ZIPCODE添加全文检索
9 }: Y; B: g: n; o- o3 N& o8 f, G/ ?* z& `1 V
0 H( Z5 o, s) i/ F4 v
10.执行以下SQL语句后将发生什么?
7 M/ Y, E# Q+ C* S5 ]' C6 F8 H- |- x
' T5 O' Z, m9 E: R6 v$ K8 P3 pBEGIN TRANSACTION% O; R3 h5 y% h% @3 o
DELETE FROM MYTABLE WHERE ID=1
) B; c: q: f7 o5 E2 fDELETE FROM OTHERTABLE
0 K& q* t6 q: X, _8 f/ h& d. NROLLBACK TRANSACTION
9 W8 v' Z t1 e9 H) v% I
- J* a6 }, [, N$ C8 wA.OTHERTABLE中的内容将被删除4 _% l) n) @# M3 j j. p+ x; W
B.OTHERTABLE和MYTABLE中的内容都会被删除$ M4 R( w# H9 u5 Q) v( K H
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除9 U+ ~8 \. g+ [8 U0 w; \; m) o
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化; m5 h2 X/ r' e ]# m7 }2 L, m. x" }
E.数据库没用变化
# p) a7 k8 d& a7 a3 Q# L( ?* g2 J- u' E3 |) K
7 ]" B0 W" N: b; E( g! R. |! f11.DESC在这个查询中起什么作用?& T2 N* f: M0 J; E: N. p m+ h
# f( J* k$ L" P& o: X' H
SELECT *; M% A l- d) I+ B2 F' k
FROM MY_TABLE
q3 Y# J6 c! |: c3 k; rWHERE ID > 05 j/ q' D/ w! X% l/ Z9 d0 E
ORDER BY ID, NAME DESC
' N, H$ ?# W8 c/ Y; m
$ r/ A: q% P7 |. X( xA.返回的数据集倒序排列
1 h: b+ ^% Z, ~% I5 DB.ID相同的记录按NAME升序排列1 M/ i6 r1 w8 o, T- a' L
C.ID相同的记录按NAME倒序排列0 i4 v" {6 t, D9 }; z6 `9 k3 q
D.返回的记录先按NAME排序,再安ID排序
) e5 n8 q# u' K- [E.结果集中包含对NAME字段的描述
+ @3 m/ z3 j( S# R: h8 `; ~
! v+ Q6 Y$ ~' R8 V( E0 M. i6 O/ f# w. g! Z: k: \
12.以下哪个不是SQL函数? a! ~' c3 }/ `
: K4 A& J- b5 S. v6 ?0 l; i- j8 O
A.AVG, k! @% V; ]$ a6 N8 o' c p; Z
B.SUM
U/ W+ X9 \% S! M V7 uC.MIN
% ]! B- g8 ^3 [5 m" ND.MAX
8 q/ S5 E+ p/ ^" K' `& ~E.CURRENT_DATE(). T; m7 C" f) Z0 \
8 N7 p+ x$ M" {7 p9 u" v7 ^
7 d5 b7 ]+ v1 L0 x$ ^
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?0 Y) B4 _2 u6 w4 T$ u; j' z
; k9 L5 h% {1 k0 ^4 NA.该字段必须有索引
5 v9 {, M% u+ ^# h5 lB.该字段必须包括在GROUP BY条件中
0 f# T5 L' F+ ^# aC.该字段必须包含一个累积值" }% T% S/ O' q: a& H+ ^& b
D.该字段必须是主键
2 d+ S5 `$ A( p/ ?3 BE.该字段必须不能包含NULL值
' ]6 N* t J% v, _& e+ }: K
3 e5 A* E9 e7 I* C8 M/ E& h9 r4 \! G4 R
14.以下查询输出什么?
* j; y* N" X5 E' a4 u
' c# U& ]9 X2 d. @1 ^- ~2 ]* BSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2+ c' X3 T# ]7 x- T$ _
ON TABLE1.ID <> TABLE2.ID& C) {, o+ |2 k& m
, {- Y$ W$ ]3 f/ m( C7 eA.TABLE1和TABLE2不相同的记录0 l2 k+ M8 A2 `! L+ R3 [
B.两个表中相同的记录
. G2 d8 H: E& E$ h. iC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
& u# ~( [, R/ HD.两表中不同记录的条数& f3 A, i( o. J8 z4 ?
E.数字2( t) z, o8 b* e% V7 y$ L
% T3 i5 h' \* Z1 y1 R& A9 n5 \7 G l3 l9 u
15.______能保证一组SQL语句不受干扰的运行?5 f- m+ Q/ f* G2 y1 C0 P' l
/ a( O6 x5 Z' i4 J答案:____________/ f+ D U1 e( A" i+ E6 d' m0 Z: ?
0 D! O P+ r% B3 [8 g' V! g; k: j" g# L
, ^' d1 H) N: V N! q0 m
答案速查2 d% i& ^9 }2 M# P- T
1:BC& [" b+ F2 t5 Z0 n" B: A
2:WHERE( Y3 _0 X2 d$ b( s$ T( H Y
3:B! k) i$ N. f; {
4:E* e: x/ V2 W! m$ A- t& V
5:BD
1 ?2 m! P8 h* N7 r. R- ? j' b6:INSERT5 @# o! s7 B9 O( k
7:C# q; i0 D, M9 J6 X0 O
8:A
2 Q- H) @! D! U7 M* A9:C0 w- q6 g$ D& d/ \" i% c
10:E. w( V9 R" m4 u' O
11:C' c* F8 H0 ?/ X9 s" v6 {2 i
12:E+ B$ y4 s4 K- A
13:BC' [6 I8 Q0 r6 I& \
14:C
& o H. V, I3 x. J2 K7 x( z: E% j, G15:事务
E6 L L) r d; |* l, ?& J' Z* U+ _& V$ V) u' _
/ S: q. s/ H2 K% t3 G8 e
4 e9 V( J7 y& g$ O3 t
答案详解
$ W# V3 _& w/ z. w. Z/ A
/ B: A3 x* p2 r; m0 r1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
: B8 a; \3 Y0 o6 y* w8 e" S
4 B$ W" N: Y$ D' [/ u" r0 h( I2 l2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。2 f) s6 h0 e. Y" m+ ]
5 q' c* F. C$ B _* e$ _
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。. I! D, T# ~9 b- n
% U9 l: d8 ]0 ^8 u u
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
9 Q( p- u& e& z7 Q* a& @' h4 J4 N0 z, y$ ^$ e
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。2 Z8 K5 e4 k' O7 F$ i6 _0 r9 W+ N
# B: E3 E/ [( m4 z
6.答案显然是INSERT。* @* O9 U4 u: z8 g' V
+ [0 {- D: g" t7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。& Y, `8 y3 E! K0 B) i, { G0 E2 V# @
8 d5 ~" F$ u0 W/ n9 ]
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。4 T* j2 G" [" z; e
- i' L6 P3 \9 c. B9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
( a+ {0 c! a8 Z1 z
* @" C' [/ W+ [8 { ~10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。0 a9 z8 W7 Y) S2 a4 j( l+ x9 t
' u9 i/ L2 y- j0 m, I
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。' K% Y9 I7 F1 \: x! r5 X3 N. S
. h9 \; p/ a/ c7 I12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 @/ f! `' w, R! r6 e& J5 o; `( X2 Z# l6 S5 ]% G9 H
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
0 ], A5 p# }, Z9 S+ q& S8 P
& x& z, _: E7 z14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。% q& A; P, }* N M7 E$ @4 Z
: \1 z4 S, d8 Q) q1 |15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|