  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。+ k9 M- f2 W- A. \4 M8 h/ Q3 U
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
* V$ M: Y' w& v1 J+ A本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。 T6 V4 d- |6 h/ T0 X s
. d1 ~+ s& t, x; G# b9 C( w' z: c( j
* t0 D( r: v8 i, l) ~: S
问题6 q7 V, n% ?) [( [% j6 E& m/ L1 f
" E; C4 o3 M1 |
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
) `1 [4 [4 g+ P$ [& v. ^. T
' m! C3 {; ^9 c, l: ]SELECT * FROM MY_TABLE9 a0 h5 a9 Y3 Y6 v+ J6 [3 \
) N' z7 Q4 O" l$ R# y, b6 F
A.如果可能,用把查询转换成存储例程: G* `6 ?: J- s1 o0 h
B.如果程序允许,给查询指定返回记录的范围
6 ]# l: Q# H1 C! ~3 g, k; uC.如果可能,添加where条件
2 s$ V4 b" U, z1 w$ R* U! ND.如果DBMS允许,把查询转换成视图
: V: z! L6 y6 E. z P% X5 t. XE.如果DBMS允许,使用事先准备好的语句) x" D1 c% Q4 s+ J. n$ _
: I5 ~/ l4 y0 b& J; E& B6 n
" Z% K- g2 v6 \. G9 H2.可以用添加______条件的方式对查询返回的数据集进行过滤?
. D% s( U0 \' \# L1 _4 d! S" Y! L4 F& K, @
答案:____________
4 `! g+ B- X0 d- X& n. `3 i+ T1 j& L/ {( M9 k) i; A8 m
$ \$ o2 [1 Z* }) y2 T% q% l3.内关联(inner join)是用来做什么的?
: r3 {0 L4 ]) Z9 L* d
4 |# S }$ H- w5 }- m, S; ^/ L! ?A.把两个表通过相同字段关联入一张持久的表中
+ C' j$ `/ a8 g0 `) @: {7 SB.创建基于两个表中相同相同行的结果集
6 q7 B, \ ]' K$ K* F# {C.创建基于一个表中的记录的数据集
) |# R8 T/ p: qD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
; Y+ b. V+ v9 {3 @. o+ HE.以上都不对
+ Z1 U7 W4 b9 E6 l& o
* g( V4 y( R# ]2 T' [$ e$ T' M2 s5 ~4 F8 T1 A
4.以下哪个DBMS没有PHP扩展库?! c6 W0 A* v5 O. J8 L+ V) J* L
. a. B9 T/ z) b, c+ N+ M
A.MySQL" K1 `1 @) O; J
B.IBM DB/2
! X" w" g- L( XC.PostgreSQL
7 A3 L1 e9 U8 GD.Microsoft SQL Server
3 `. y% b! j, ?+ P# Q2 BE.以上都不对
/ k7 d! N: I8 l Y
6 h( [) [' _3 ?: w+ E9 _
0 g+ G. c; z9 c5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选); E5 ^" l5 E/ M$ a( M
# @; @$ m% U4 L# y
<?php
, T- e# _9 X+ M' {, H$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);* d5 L5 U6 x* L1 t8 W- j
?>
; H6 u' n: U7 m' s& E3 e5 i. q2 u* @ e; p
A.MYTABLE表中的记录超过1条+ _/ _4 W+ |5 k3 r& h( g& @
B.用户输入的数据需要经过适当的转义和过滤1 v S; G0 ?' W- j9 X
C.调用该函数将产生一个包含了其他记录条数的记录
9 v: M1 w- }6 p9 C# wD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
6 o( F. c8 R7 X$ L; I6 {% `E.查询语句中应该包含数据库名
8 | G1 q* s( A2 d% l# E( }2 V' s, Q$ m: P: Y
- I' m/ e/ T% P& p; p! _# u6.______语句能用来向已存在的表中添加新的记录。& b V3 ^$ _% Y$ r! t$ w/ l
& \& M0 c! u; Y" K+ M5 d& |2 x
答案:____________
8 x7 P5 s8 [& M& k% y
, z# @. O. b8 h, r( [+ }% I. m9 n; i' n a! x+ S
7.以下哪个说法正确?
7 _# Z; l/ q/ e* W# J6 C
5 G t# V! R2 w6 X9 h4 UA.使用索引能加快插入数据的速度, |1 R' `: B" l
B.良好的索引策略有助于防止跨站攻击
8 w$ q9 @: R- aC.应当根据数据库的实际应用按理设计索引+ q' P7 {! `4 ?) a2 w/ _0 F0 U8 s
D.删除一条记录将导致整个表的索引被破坏
; {8 W* J) v# {+ C1 x7 w Z) X- o3 SE.只有数字记录行需要索引
/ y2 z/ r; g9 T9 p6 L/ e3 W, n- Q9 G- p2 C( P: \
/ j& T6 ~' l1 u3 S' p$ P# M8.join能否被嵌套?" O$ i2 Y, b' C6 s
0 W( `; ^8 m7 h L
A.能
! P5 [$ w! p/ h; r$ o+ `4 _5 c; `& ~0 KB.不能
% q4 }' T3 I* Q# |
: e- ~1 G ?) A5 x
, S% C1 S1 P6 t2 E0 d7 K; j9.考虑如下数据表和查询。如何添加索引能提高查询速度?* a) k. k2 c; G5 w
8 A/ x& u) \: nCREATE TABLE MYTABLE (
x$ E+ J9 g( HID INT,
/ w. m+ p( ?# j1 }2 [$ kNAME VARCHAR (100),3 @3 P) ~1 M6 \) s6 {
ADDRESS1 VARCHAR (100)," L+ V; d5 W/ t
ADDRESS2 VARCHAR (100)," |% q% B: M) a+ s, I/ S
ZIPCODE VARCHAR (10),- P0 T1 x+ C. P: |. P# V) ]
CITY VARCHAR (50),
. o; r- |, u6 U. C) \PROVINCE VARCHAR (2)! X, Y1 x/ m) r) E1 k* W
)
3 {! `0 J/ O( pSELECT ID, VARCHAR" v- N$ A9 u/ Y. s# _- D2 H6 F2 ?) ]
FROM MYTABLE
4 J' s- u, s! s( @WHERE ID BETWEEN 0 AND 100/ U2 I! O+ G/ p5 `% _( F2 }
ORDER BY NAME, ZIPCODE* L, V1 k" {3 V: s" Q8 A
- b9 W# A3 c- X. _. Q6 s7 f
A.给ID添加索引
$ E# H) M7 _8 s7 L( xB.给NAME和ADDRESS1添加索引- J6 H2 u; X+ f4 J
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
2 c# A( R& f$ i7 L5 qD.给ZIPCODE和NAME添加索引
/ s7 E. ^' V& Y6 Y9 Y uE.给ZIPCODE添加全文检索
! h" Z: u; j- @: B9 J8 X# E
9 {* g7 c8 \7 M
+ q0 w& S9 y& f& p$ Q10.执行以下SQL语句后将发生什么?
1 f6 E9 Y2 w* a+ l! D+ c5 G! s3 _7 F9 z* O: s2 A @# L
BEGIN TRANSACTION
8 P& t/ k1 h9 T/ F" T8 B+ XDELETE FROM MYTABLE WHERE ID=1! k7 G9 r5 u' B. t( }# j8 o2 k% U
DELETE FROM OTHERTABLE. K8 r2 ~% s% E0 E- I
ROLLBACK TRANSACTION
* R0 A6 }2 @. L0 e0 l' O2 q2 M+ p1 H: Z9 J+ A
A.OTHERTABLE中的内容将被删除
- w/ b- g& S* n+ a: fB.OTHERTABLE和MYTABLE中的内容都会被删除9 G: P4 T3 T4 @% m5 g& N
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
' E D, s7 Z$ L2 iD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
" v/ m9 ]$ K. `+ Z. O+ E; u# TE.数据库没用变化
4 q3 ]) {: ^6 A* T8 B$ E8 h, h2 H7 W3 `0 n9 z* O" _
R$ J: V1 T5 g4 B! S2 H
11.DESC在这个查询中起什么作用?/ I h B% J* k* X: n
% j7 j8 D: p, A- ySELECT *- O& c u' f+ n, h" d+ U7 a; j; e
FROM MY_TABLE
( B2 ]8 m5 G5 eWHERE ID > 0
, Z' q2 N! U/ \ORDER BY ID, NAME DESC
0 [& j: `; L6 C. X/ ?
8 a( O" t2 E2 l/ D. xA.返回的数据集倒序排列2 P/ R; Q2 x& \9 _" G
B.ID相同的记录按NAME升序排列
$ d r" H+ d) hC.ID相同的记录按NAME倒序排列
- s. j, B+ B- @* LD.返回的记录先按NAME排序,再安ID排序
4 P& y& I: z) XE.结果集中包含对NAME字段的描述. u( H; r: ]5 U( L% u. h2 J
/ Y, P9 a* k c4 E& _2 t/ Q7 [* q. t) [+ R6 q
12.以下哪个不是SQL函数?
& P/ f5 h- L6 |. h
9 ?+ q" ?8 b2 E. |' V6 L; KA.AVG
9 H" Y( f0 Y* n! L# V( ]B.SUM
+ ?6 U8 u& Z1 x: h2 w% jC.MIN4 x) s' R n1 y8 k M P; O; |& g
D.MAX
6 m& \. `, q7 d4 I; _ {, ]$ W( BE.CURRENT_DATE()
2 t! u1 v, n. o+ X" t# P3 z e/ E; o# ?
( ^5 s; k# m- ~! }! R! g n W! L% t+ c2 a: `! S6 _
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
0 a0 [/ f# I5 P7 G; w6 G# C2 [3 \4 L5 Z- _6 @5 d( X& z
A.该字段必须有索引/ K& l2 C& a5 {* t* P, k) w) o
B.该字段必须包括在GROUP BY条件中
8 e, ?7 q. ?3 F* C; ]$ zC.该字段必须包含一个累积值
" X3 g6 Y1 W0 r0 a! nD.该字段必须是主键, ^) r/ f0 {$ h1 K; z
E.该字段必须不能包含NULL值
/ Q( |1 I1 K2 A l+ D1 ]/ c; d7 ?+ y% R$ v+ {$ x
, m, I8 U" C, |* I* w
14.以下查询输出什么?
& |2 m+ z& p- {2 _/ A
+ u3 k; h( c/ a7 C: {" e7 [SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
( l/ H3 B- M. |5 e4 xON TABLE1.ID <> TABLE2.ID. Y; n" a& x; y4 o% }1 u) k9 n
# s' b! t& |: M" \9 d
A.TABLE1和TABLE2不相同的记录9 `: ]- D+ W6 ?
B.两个表中相同的记录$ M' c# p( c0 q0 e1 l$ N/ u" a
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
7 G2 O2 u6 c+ T/ o9 n& y( pD.两表中不同记录的条数4 ?; P7 V' t0 E+ e" ~2 p. R" B1 f
E.数字2# m9 K4 b! P* t I
; z0 U# m9 z+ N6 Q; M
, X O8 C: ^2 M. x1 N1 g" {15.______能保证一组SQL语句不受干扰的运行?; |" }8 `. y5 x$ Y4 I" L, |$ V
; ~* f) w% f# W# a答案:____________
. l7 T6 s; j% w2 I1 ]& A- P9 N8 N# _
% J& G& |( j, P9 s W. n2 w
c+ B5 d7 E3 L0 R
答案速查
! R5 ~- J X: t; _- e+ `1:BC& V/ C% w2 N; }5 D# k2 }8 S1 J4 ^; r
2:WHERE4 w8 X: {. \! K( f' E% L3 n
3:B1 \7 T- t2 Z: q; w
4:E
' b- L |5 _/ s, a# t4 R5 L5:BD
! h( M% n) k J" N& Z6:INSERT9 ]# c; W/ x! L2 ^& r
7:C
& j% R- M0 e0 F4 [) F2 L) ^8:A S, g8 g. m, g
9:C
U) q. F" p0 k) x4 w10:E2 T& H* Q8 d3 d, K" c
11:C
7 Q! j5 B/ D7 N) q o12:E
% y$ L! C, G9 {7 D; r; i ?; G13:BC
" b X A( \2 H/ g. b14:C3 N( V& a( x" R& P5 l1 y
15:事务
# q9 n" B' i8 Q7 t1 E% w' \3 @7 I! s p& A! k7 a
. {! Q6 g1 c6 ~; S' x! R- {
1 M4 j/ J! t1 ` S3 U% ^答案详解1 H Y4 R* K! `! Y& ]: G: w% Z
- M, x5 G- Y" K) E9 I
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。* p: S- ^- O* E3 F0 c! [) V% V* m _, H
: D# F# P! B4 K
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。+ {0 a, H) q# a* j+ l
l& [( b4 i" Q3 K/ O3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。7 T$ g. B; P5 i& ~; [8 ~
M6 ]7 r7 |0 _4 r4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
- ~8 R* d _" Q3 h4 D7 k% p* [1 O W( Q! x
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。. o; v/ n) @% X! @9 U
; U+ P/ x+ v: Y* b6.答案显然是INSERT。# h0 o& w+ [! w" b; R
8 K5 C9 z1 x6 d1 l: d" C; t
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。" {4 t& ?' r, d. n+ E& `
" @9 J; U6 [5 g; \( X1 G
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。0 M9 i7 u3 d, u4 k# N a/ H) ^
0 c" [( p! m- W6 U/ s
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
+ ]. r) J1 ~/ N, ]. D
/ _. w- ^+ `; s3 T s10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
! ?+ u( l# o2 w$ R* @
! I* `+ d: ~# t' j0 e1 x11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。0 S, ^! F0 V5 h. g' X
$ k: M9 F+ J( n. n0 m
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。7 A1 x1 P) G+ l5 q$ R- ]% G
' w2 c7 q E" [) U3 H6 z13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
$ U6 P5 _+ T. e: _! o" g
( G$ {% m, w9 R3 `0 O& `+ q14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。% I& ?0 P- m: `8 i& O' W( Z% b
1 U& m) q$ h$ L: W7 i0 P: S
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|