|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。' j4 ?) u" F- m: H$ L9 a7 Z
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。6 {9 C: U0 \, M8 [
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
k2 I- U9 f& ?& b9 J) W G. ?' _8 w* f% k7 m. z$ ]' \
- D C! j) h8 }
问题
0 T4 ^' |5 A! J
* t# }' \6 v$ y2 Z1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
# G. M; l/ |' V! X, S2 P* v6 E2 l* r; m7 `) q4 r+ }
SELECT * FROM MY_TABLE; E6 H( \8 c+ v# n
3 w: ~2 w) N7 ]* F) o
A.如果可能,用把查询转换成存储例程2 F/ w) D" b. X
B.如果程序允许,给查询指定返回记录的范围
) k! p. L J% Q' N# Z! R6 Z2 SC.如果可能,添加where条件
% |( @/ x+ q4 ^4 i: U gD.如果DBMS允许,把查询转换成视图
' s D+ U% I' x" ?6 R/ D. B; _* ME.如果DBMS允许,使用事先准备好的语句
5 N3 ]. F6 B$ y- ~
, |) }! v* z' D+ Q: i9 u) G' m1 Q& h. w4 a/ ]
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
6 z' O7 b# L4 j( ~' c/ U) a% @4 A
+ ?& |+ H7 m, Z. y2 h2 Y! G2 V答案:____________
$ t: ?6 p' \8 W, u2 K! O: p: c4 g {0 G+ m9 Z+ B8 L
) P+ W4 G* Y/ }- K2 A9 e6 Q
3.内关联(inner join)是用来做什么的?$ g$ x% q3 a! n/ R+ u' G
5 t/ I7 I* w, t7 ~
A.把两个表通过相同字段关联入一张持久的表中; U/ U" _' V/ A, E" c' Q
B.创建基于两个表中相同相同行的结果集
& B: I3 d9 s/ B: Y0 |9 l5 oC.创建基于一个表中的记录的数据集
1 U( d, ?. f. y% B; f/ d$ WD.创建一个包含两个表中相同记录和一个表中全部记录的结果集$ ^ w) D# c# P+ K5 v' N
E.以上都不对 {& C9 c2 P0 J$ \2 I8 k: @( w
9 {4 R) A" A" D/ x3 y4 V
$ K4 D: D; v) g) Y! R/ z9 ]5 f
4.以下哪个DBMS没有PHP扩展库?
# Q* c% _1 k% o6 i4 g* s* o. ]1 m; `: \! o; V1 ^( I9 l
A.MySQL, d T' t# U1 a
B.IBM DB/2
/ V# u9 Y% f+ y6 q5 zC.PostgreSQL
% e% N" P* z1 zD.Microsoft SQL Server3 e& P% F1 v7 t: _, Z5 n
E.以上都不对$ _8 e9 e, ?3 Y8 E3 k F
0 S7 r$ k( D+ g$ O
/ v: d) T% B2 n5 k2 m2 u- H5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选). Q! R* N$ G( t' d8 b
5 y6 i1 N9 ?7 i' j<?php) h, S- Z& b& G
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);0 t/ M0 ~, c! t$ M2 j8 T7 J& b
?>
5 ^) P+ k5 x# D0 V% f
' F! {; _* ^) w. GA.MYTABLE表中的记录超过1条
, Y6 J, M; D* ^- q1 Y6 t5 YB.用户输入的数据需要经过适当的转义和过滤
. F4 b' x. |" L oC.调用该函数将产生一个包含了其他记录条数的记录
- F- N, d/ f& v4 ND.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除1 p& H+ t, a. N( i
E.查询语句中应该包含数据库名. u6 Q8 C% C# F% }& E. F
9 J% [' ]4 E; _0 ?! ?, F- `$ d+ j0 s
6.______语句能用来向已存在的表中添加新的记录。
5 m8 ^: k! a8 L5 \# y9 f0 W3 l/ t' q/ S0 v3 l
答案:____________
# l& g4 w7 u# M7 s* h8 k8 L
) J4 l. b/ E$ `8 f( s6 Z) J- C3 u1 l9 G) R+ @
7.以下哪个说法正确?
1 t( o& G2 |# Q) f" E: ~
! s R0 r8 W2 q0 MA.使用索引能加快插入数据的速度
$ \: e: I( T) D7 @0 N- i+ `! xB.良好的索引策略有助于防止跨站攻击
# u2 m, e3 t$ R/ O. t8 |, V$ KC.应当根据数据库的实际应用按理设计索引4 ]5 g7 O u! s5 w: g4 v9 H
D.删除一条记录将导致整个表的索引被破坏
& {6 X) t7 a a; s# B) r! [* RE.只有数字记录行需要索引
$ Y G8 W0 o' R% u3 K& K- j6 e
" g+ y6 n( j" Y* d$ j+ H5 N+ M3 A+ _; v/ b+ Q4 x$ `
8.join能否被嵌套?# @! D0 J) a% F/ ?; |2 Z
1 E3 t* d& k4 t# Y1 ^( a' s
A.能
' R. Q1 @% U8 B3 E. fB.不能
$ G' {0 O; @, ~0 w7 D2 D
( B- V2 y* p# k" B' c, ~; @! L
% A0 l5 F/ Q9 J: k$ q9.考虑如下数据表和查询。如何添加索引能提高查询速度?+ `7 L+ A% C. J1 N2 V' y- P9 D4 F
. y8 S% z2 t- {2 N' l' iCREATE TABLE MYTABLE (# B5 P- ^: |$ d3 Z
ID INT,
$ Y, Y8 \/ U# Y# a8 z, V, _: \NAME VARCHAR (100),
8 H8 V. Y5 a# k e' [ADDRESS1 VARCHAR (100),+ P) q* t$ R+ W/ S
ADDRESS2 VARCHAR (100),' A! m* c8 [5 G( M! I
ZIPCODE VARCHAR (10),( G1 r+ U- N3 X% c5 ~( ~
CITY VARCHAR (50),+ T) v! M4 j% }2 R
PROVINCE VARCHAR (2)6 E7 f" A' S' E; x6 Q5 o" Y
)9 D) u% M }. @: X' a
SELECT ID, VARCHAR
, [$ ~& a' I) w* ^- x( C" _FROM MYTABLE; R2 [0 m" {% Z9 ]6 ~
WHERE ID BETWEEN 0 AND 1002 o1 `% w9 D+ t4 r2 ^; `
ORDER BY NAME, ZIPCODE- |5 }1 D/ R' U0 n9 [8 E, x4 W
2 ]5 D- M- t9 H) kA.给ID添加索引
% J7 `9 }7 S x+ sB.给NAME和ADDRESS1添加索引* O0 \# G7 W, ~
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
1 D' t) }. X; sD.给ZIPCODE和NAME添加索引
" y& F9 @ _6 B$ _( n/ i, BE.给ZIPCODE添加全文检索
7 y; Q3 M2 c# P* L/ i0 @# W. N; ]3 j* Z+ f: t0 f
3 M! w7 v0 x# w& _$ I8 R( `
10.执行以下SQL语句后将发生什么?
1 x1 s& p5 l4 P0 W3 x" U4 D! [6 _7 b
BEGIN TRANSACTION
: T2 z# T# C- _, i7 EDELETE FROM MYTABLE WHERE ID=13 q: v* Z* l; V" \. Z
DELETE FROM OTHERTABLE) B" j; c% l9 _; a
ROLLBACK TRANSACTION
! ~, }! S* p% |- S8 x0 N6 C' v- g6 `6 w
A.OTHERTABLE中的内容将被删除
& [4 S U2 k5 I7 k0 c2 m/ W; e5 jB.OTHERTABLE和MYTABLE中的内容都会被删除8 O5 T8 Y/ l6 U
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除- U; M$ z3 h6 X8 y
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化2 @4 i! T6 H. E
E.数据库没用变化' d0 d4 f4 m1 q! K' P& T
# D& b: ~ N2 Y0 S$ d
& D) i$ U! s& t+ o1 W
11.DESC在这个查询中起什么作用?$ A9 H% t3 ?5 W8 Y3 e* b" u
( l5 V. Y! M# b! B, K! \ x5 ^: r
SELECT *! R0 F" K3 L1 ^% j5 Z" ~2 W
FROM MY_TABLE9 B: L4 o- d; a9 K& O& o
WHERE ID > 0
. a% T- w- J, n! m% `6 F6 e2 a) NORDER BY ID, NAME DESC+ ~; |9 B2 M! }" x# Q
1 |; v. h+ C1 h0 @! nA.返回的数据集倒序排列: m4 X+ ^6 W2 \& J$ J( M5 e
B.ID相同的记录按NAME升序排列9 r2 _$ | i7 k/ D' n) a, E
C.ID相同的记录按NAME倒序排列9 J3 P" j- y7 e% K
D.返回的记录先按NAME排序,再安ID排序( g0 T6 I, I, Y7 e+ B1 q6 @; H2 W
E.结果集中包含对NAME字段的描述6 ]- O9 \9 [7 S! R
/ y$ h8 z' t7 f: y
4 r2 g* E S1 D/ X8 A/ {# G8 i
12.以下哪个不是SQL函数?) c! K% ]+ X- v; _# c5 \. d
1 H% J z+ R9 `, m1 P- {A.AVG0 H1 n! l3 F$ y5 X$ L2 Z+ s3 v
B.SUM
. \1 o! z5 i( Z7 R; i; F& x" u# jC.MIN: m _) o$ l7 |# n/ u9 O) U
D.MAX2 ~4 A/ b( m" E) d
E.CURRENT_DATE()
6 a5 l+ h, l: y+ [ T5 ^6 ^& B' `& u8 P
2 Y: p$ W/ E$ u5 l, ~
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
0 \" E; `1 _5 l% O' K* o( z& B- ^4 P* t( A* G1 n- y% M
A.该字段必须有索引- q6 N/ T( Z! r; `. P
B.该字段必须包括在GROUP BY条件中& {7 u8 I. ]# u- {, a3 G, z
C.该字段必须包含一个累积值
8 z$ M. R- A9 q `1 _D.该字段必须是主键; X* w3 v; K9 G+ y; n/ N( E% { B
E.该字段必须不能包含NULL值! c( d8 |4 @* G$ y. X
- A& L0 _7 O* P( e$ f+ B9 v
+ t: W4 y( H/ ?: ~% y6 c; l14.以下查询输出什么?' c& S( A/ E# u$ f4 f; n8 w9 \' G" n
* h2 ? ^* b; \# t
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE26 {( H- N9 c) L9 R% f$ f
ON TABLE1.ID <> TABLE2.ID" t) x" N- t7 u, B! r! ~( F
4 ^! L+ t0 a$ H2 F: v6 \A.TABLE1和TABLE2不相同的记录
& \ v$ |. [8 O* f8 u0 cB.两个表中相同的记录
6 @2 {5 j8 N% F6 s$ dC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数9 _; B" |6 c0 v" J( \7 ^6 [/ U: E
D.两表中不同记录的条数5 l9 z/ c- E& N( L X5 ?1 H
E.数字2. I6 ?6 i1 m8 V2 L& V7 n3 O
# C; T( ?, ]# C: }2 h8 s: Z$ |+ m. A* N( e9 P6 K( O
15.______能保证一组SQL语句不受干扰的运行?
1 J( i$ t3 b7 E' I
7 [. Q& B( V& S$ m答案:____________
0 y& Q/ B* ~" L. s& @; o5 O; D6 w+ r8 f% D, A6 P ~
, j' w: M3 Y' e2 u
8 I" q) ~: ]% n8 B0 H. `
答案速查- b6 B0 M$ k% y3 @6 H
1:BC
7 s" T# }7 W9 @8 Y4 p; h% {2:WHERE
" G$ Z5 ^+ [' u. ~! D5 ~3:B' j7 i" @. V% j; P; R
4:E. [" N) }* |# ~, \; N
5:BD
2 @: P! V, H$ c! B/ j& y+ s% f( [6:INSERT/ `3 x2 a+ O; {$ b$ N
7:C* ?* g% G: Y0 L4 M, U! U5 V
8:A
" [4 b- F4 }4 _, o9:C
3 D: _3 i1 [* Y) s4 N10:E G6 g: I4 n+ l8 C/ J
11:C1 f; q5 V' C; v. G" ^: Z9 K! P$ r
12:E1 g% x: i! K# u3 F$ O
13:BC+ J; Y: N2 w6 w0 F
14:C
+ b) {4 C1 K6 b5 l" C l0 |* X15:事务
+ o R b, z: T2 [2 {! \) P; F9 M7 a( T; |' E p7 p! c
3 I' Y, ]2 n" H7 m
; v" N' s' M) J8 ~: h D6 D
答案详解8 a! H3 @: @ Z1 T; T
|4 C9 z& U( E8 e& L9 H7 d1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。) Q( c" T8 L0 M) `) X
4 n+ m2 f G3 S# R
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
1 T2 Q* o8 N- W9 {. o+ ^
! l6 e/ o/ A3 O) V3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。& U7 ~+ @+ E, E) e1 P5 b
J/ X" A3 \6 Q" Z" X2 _
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 a! p. Y1 Z* `7 W- y( C% K8 |- t7 v2 N' J
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。! ^. M6 U& M; h2 n$ L. O5 n
/ P8 u6 h: q: \$ C) I# \, T6.答案显然是INSERT。
8 Y9 ]. H. @1 w- Q2 W. W
. T1 U" a* r5 o. h1 C7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。$ W" {7 R. b- r
# W- H; ^# M8 f6 G) G0 E8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。* H. w( J- ?5 t& T3 e/ s/ V9 d
$ ]/ G! P5 S2 h2 z$ c
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
; H2 o) k! I: H& M& _& s0 O0 l; c7 x
: q0 K2 S" G) S10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。. D; w4 r5 c1 @# r
: w$ j* c5 B! R
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。5 _" E% ` p& v7 F
8 d- @' ]* v3 n7 t5 `
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
/ M0 R. D3 H5 _* r! k( s& `6 _: x- ~5 f+ M/ f9 t
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。6 ]& W ], V1 T0 _2 O1 }
2 s: ?+ f1 F/ y6 t1 Z14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。$ ^6 N4 ~3 c; n* S" z* g; L
9 k; F' P. v* O1 p% j! C
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|