  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" C* z' b2 X! w' r" d# \PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。! D4 c5 T: e* {8 @+ ^
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
) G" D' _+ r$ W1 F5 m' h: e" N$ D) l
% x+ k+ ]# |" j0 Y+ r$ K" q
问题, B/ E. x) a( \- ?
, n4 ?1 a: Z% m
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)' H. J9 `- a z# r& V' P+ |0 U- `
9 w0 d' [! ^& u# k4 BSELECT * FROM MY_TABLE
6 W9 A+ l# h# {) n q8 E& }1 T9 d* n. a7 n7 L4 C$ W0 I' N
A.如果可能,用把查询转换成存储例程
" B/ v! o! f7 ~7 u: H4 w2 \B.如果程序允许,给查询指定返回记录的范围- L6 s* a% J( k7 N
C.如果可能,添加where条件) ]+ f5 m1 h. L
D.如果DBMS允许,把查询转换成视图
. e/ L5 f' C; G; `( c* }0 LE.如果DBMS允许,使用事先准备好的语句
1 h7 y4 v6 q' d2 b
( n; F" f' D0 r7 B
# E# e/ Q1 R! m3 w Q2.可以用添加______条件的方式对查询返回的数据集进行过滤?8 R) {" S) f. x* Q
5 @. q# W% y8 X* O答案:____________
3 m# B( e/ O3 J4 m0 W. r1 V. @5 B% P
! D4 i: f" C# o$ P- r w
3.内关联(inner join)是用来做什么的?( [# O: {, P8 S) ~5 |
) l! }" {; J4 uA.把两个表通过相同字段关联入一张持久的表中# p) p1 O, P( H8 z9 e
B.创建基于两个表中相同相同行的结果集$ O) _3 g% S& n: \3 i
C.创建基于一个表中的记录的数据集
* C/ b2 z2 ?% [/ v6 {D.创建一个包含两个表中相同记录和一个表中全部记录的结果集- H9 p. N9 Y( z, n6 [: g3 _- y
E.以上都不对& Z/ Z4 D: ~3 X+ B' g! }
0 [9 o N y0 H( Y
; J& M+ ^: O0 |6 | L' ?4.以下哪个DBMS没有PHP扩展库?: Y" v! n; E8 n2 a- f$ d
* C8 T1 x( L/ F L3 o. D
A.MySQL" [ H/ e) @& ~. _" B; S, f" B
B.IBM DB/2+ p) y2 b8 D- E; Q8 c5 j" l
C.PostgreSQL7 Y; m, t3 }( D4 t
D.Microsoft SQL Server
$ h2 R* k. w( u) q* B4 ^9 @E.以上都不对0 K9 N* |; W. c' [
1 _! g- F1 k, S, P1 k+ f7 x
' C |; z/ ]# `8 v1 [0 }
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)8 a B$ A9 d# [+ J9 G: M8 v
1 m6 H% i. ^& J7 |. K5 D+ W<?php
2 Q P( t) z5 z$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);8 f9 q" e0 J8 X& k# C8 W' e
?>
8 e$ P' b% e( e% ~ B+ V. d, a1 O8 \% Z( s/ i3 G
A.MYTABLE表中的记录超过1条$ {& V1 O: ?3 ?* f2 F' U5 S9 B5 B m- {
B.用户输入的数据需要经过适当的转义和过滤8 ]* @6 Y G7 ]9 w! G4 ~
C.调用该函数将产生一个包含了其他记录条数的记录
q$ I; \ v' j; E* MD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
2 I' H/ G- g, T [6 yE.查询语句中应该包含数据库名
! y! v- W [( O8 b; X% {0 `* W: G1 O8 h; j _! D) {
/ d$ N1 P ?: a) ?7 V6.______语句能用来向已存在的表中添加新的记录。
( F! p1 K' _+ c% P, T5 Y2 N+ \# O8 T V8 [' O( L$ A, W6 r9 @& u* b
答案:____________
) P% P& t* C3 o- m% W$ C
% a. T. B* p- ^5 q
" m7 |6 o3 ~" t/ E6 K/ E7.以下哪个说法正确?
% M" K% |' y! M) v5 d o
4 K/ E6 m+ Q, p% f' nA.使用索引能加快插入数据的速度
. p* [' S6 R' q" a" {0 ^( SB.良好的索引策略有助于防止跨站攻击
) A% Z" _& A" o7 cC.应当根据数据库的实际应用按理设计索引+ z# a4 o: S4 e# u7 ^6 N
D.删除一条记录将导致整个表的索引被破坏& {9 w) ` e/ j. ]+ w, r6 g" K
E.只有数字记录行需要索引5 i+ a; O) a- R0 G' S. h* c" O
$ w. u2 d2 e+ p) V/ I; }% E. ]& |& \( r3 h$ w7 s/ K
8.join能否被嵌套?
0 q5 B* g% g8 J& E8 ^) d- }
7 p: y* j1 g! X9 D4 kA.能& J! y( f8 _! p& w
B.不能 Y, N5 A6 s% B [5 ]2 r0 J+ @
3 ?7 M1 K% F5 M* r& h" h' q
) i( }% v3 B7 V! |) W
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
6 @6 m7 S" f" n) B8 q
0 y$ x# i& w1 U& uCREATE TABLE MYTABLE (
5 G, Z, F. {" S, q; S: TID INT,5 R( c- W, o- ]* P
NAME VARCHAR (100),
) a5 s% T% Y+ p2 kADDRESS1 VARCHAR (100),
9 K. ?( W( H4 H* M; `ADDRESS2 VARCHAR (100),
+ X1 `; I! ]" n6 M GZIPCODE VARCHAR (10),
! }2 e: U- Z/ c5 u2 \0 }CITY VARCHAR (50)," o, A. h1 O2 B! J
PROVINCE VARCHAR (2)
7 P. ~2 B# ]8 {$ })1 _4 L7 c( { }+ A: @+ O
SELECT ID, VARCHAR
3 [' o' E& ?. `4 }) {1 @FROM MYTABLE6 y) K' [. @. _2 K+ f# _
WHERE ID BETWEEN 0 AND 100/ k9 G2 ?& Y L0 k$ t
ORDER BY NAME, ZIPCODE
0 Y, E% L- t3 X f. n3 R) `6 Q: C
8 ?: ^) L# h2 Q: t8 KA.给ID添加索引1 \$ z2 ]" y( N, l& k' Z% M
B.给NAME和ADDRESS1添加索引, U b. l! U0 _+ {$ P
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
8 T* m B! a3 B2 W/ G3 a; ~; {D.给ZIPCODE和NAME添加索引
: H2 Y& o3 e6 S+ _E.给ZIPCODE添加全文检索3 K% L4 }! k i
1 d' j" z4 y4 W( ]+ }% |7 p- [$ d6 n, W' Q3 v9 Z5 ~0 v$ W
10.执行以下SQL语句后将发生什么?) Q+ k2 s) h8 T% X9 G- X+ O
9 [5 x2 d7 @4 z+ B9 Q Q. d
BEGIN TRANSACTION
1 ^) B2 P B4 L: jDELETE FROM MYTABLE WHERE ID=1
+ `2 u. q# T, I6 Z' l( y8 b! ~DELETE FROM OTHERTABLE
$ b: g9 L4 p' m' R! U) c$ FROLLBACK TRANSACTION' i- l+ t5 Q( J7 O& A; m
- t6 t# y1 B$ n# zA.OTHERTABLE中的内容将被删除
9 p, o2 s" h$ ?& ^" C9 l- uB.OTHERTABLE和MYTABLE中的内容都会被删除- r7 |$ V" \' f' j6 i" o
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
* @& I! l! H# s8 F/ l- vD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
8 v' g( ~/ q( p; N) EE.数据库没用变化
0 M/ @1 |3 v" q# y4 y1 q- G8 P6 Y; F/ s, P
! ?+ V4 ?( L" s0 s9 x11.DESC在这个查询中起什么作用?
* t2 s" G! N0 Y) A
9 c7 L7 C. j3 a2 u7 ZSELECT *. Z& [8 Y G& M/ m) v4 y
FROM MY_TABLE
/ D$ A) n; c( A% j, U% k! I' GWHERE ID > 0' [6 C! @# Z5 A e1 l1 `, Q
ORDER BY ID, NAME DESC
/ P' Y3 I* t# @& {% A: D6 ~$ Y4 L9 l
2 p/ ]6 F. M' F+ y* R% KA.返回的数据集倒序排列( J I4 B% m- w2 o. Z+ _* |
B.ID相同的记录按NAME升序排列
. @9 v$ q& v$ PC.ID相同的记录按NAME倒序排列
( H) }. f1 B( ]; e" b" {" R5 nD.返回的记录先按NAME排序,再安ID排序3 C5 z4 [. ]# G% H/ Y
E.结果集中包含对NAME字段的描述# J% E( q2 Y2 Q0 B4 G
9 K9 }- W, ?! K0 y, P; T8 o
: Z! X9 B5 B% G# k# Y$ o, N12.以下哪个不是SQL函数?' `+ u# w" m- d+ \& r* C9 |
3 f( N; f# {0 u7 I: R/ Y8 P
A.AVG
; o: p3 g2 f* Z" M& J2 d& S0 KB.SUM S4 ]8 G( }1 N1 j$ a0 ~8 d
C.MIN j, [4 H) p0 z/ M5 Q+ U Y
D.MAX
1 f( U" ?2 K1 j- o/ W& i' p6 |E.CURRENT_DATE() _% |6 z' g% [! n
& U4 h* @; x9 d
) J' h: n9 }: j) E6 Z13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?. ~- H7 v! K2 I9 e) M5 L- [# w' f
5 g+ Y! v7 Z0 }
A.该字段必须有索引
! e! F" w) {2 E' B: t( fB.该字段必须包括在GROUP BY条件中8 k2 r$ {6 ] b' P- d" \# `. w
C.该字段必须包含一个累积值/ T2 i/ Z( M1 H7 o. X2 {
D.该字段必须是主键
5 c0 k* F8 H- t+ _E.该字段必须不能包含NULL值
+ Y3 Z$ K* M: C7 K0 v3 h/ S' P4 C
# J/ S O1 T6 |. z9 Q- y" m- O! C. ]1 ^5 I9 r/ O- |) A
14.以下查询输出什么?$ ?/ W* m+ N, s* C$ A% @$ i# ~
4 n" ^) T* e% p; R8 \* \+ H
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
* d6 A) m' _. q: fON TABLE1.ID <> TABLE2.ID
2 B: [8 k8 O) P- j+ o z# ~5 X# P; ~3 y. S' I0 ^9 E
A.TABLE1和TABLE2不相同的记录 h. T# W; @1 F) A, V% H* ^6 u% v
B.两个表中相同的记录% H8 i N. O! _: t8 g
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
. I. ?4 e) f4 s5 h. N; H% [8 FD.两表中不同记录的条数 V8 S8 g8 Z1 e6 G/ M' f
E.数字23 j: n5 L+ e# d9 N$ l
I# p# {/ T, @) P3 K. T1 Z$ R
" ]2 h! r( {2 A+ w
15.______能保证一组SQL语句不受干扰的运行?
% V- \( E& s# [$ y
+ s% C$ G* a( }2 v答案:____________
1 f/ p' a' |5 i4 _
4 f0 D2 u5 t: X! N3 V
, G% _0 W' \- Y% Y' K3 m
9 ^- L2 k9 U1 R: {答案速查
7 T' U/ p1 x1 q2 t1:BC
' R4 y% I4 Q" ]9 G, Y7 }+ Y H+ D2:WHERE# C# C% U* J. w, t
3:B
+ u3 i, Q! W+ j8 A4:E
9 d6 D v+ f, K% u$ X: g3 Y9 P# H5:BD! c/ J3 V3 X( o+ F$ W- |9 i% U1 ^
6:INSERT+ m0 E4 b+ e" |$ B7 c( P
7:C+ g H" |- a; L" _/ ^
8:A
' p" ^$ [! j5 S: m3 z: ^- K0 ^9:C
4 N: {, S: B9 e2 `" o$ W( ]- w V( i10:E4 F; W9 H5 Q& K# w0 ~1 N0 l
11:C
4 Q6 T$ _" p3 j# Y12:E
/ J- K8 k5 p) a( ]2 X* D13:BC1 s; S. @9 s7 v" Z, T- {" s
14:C5 a- M: q) \+ P2 A0 `: X4 }8 Z
15:事务, ^; M9 Z+ C9 e5 A
! ~8 T' }' E1 _- }4 g y
( X4 a* Z: e) C! W
4 A7 i; R/ v ~8 n9 p答案详解
) ?- M* T: `& _6 N' A h! `* |/ @* G( u0 ~4 s! G* q* W9 q
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。, V; a' f8 V' Q6 J' S( f4 v
* U6 [3 H4 L9 H6 b( C
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ U% l2 ]. a8 s2 |! V% ]6 O
& Z4 f- U9 P7 b4 v5 _' p/ Q! M3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
9 c/ z% r8 H/ l% y/ L$ u9 S i2 R% z* M
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。! W8 ^, s7 G( l9 k) Z; ?* A
9 F' m( S" j# Q. e4 L5 @; p5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。: A' p; v& S4 B! P; l1 @" P0 m/ ?
, l- r& C6 u. j& l9 ?7 |9 p$ H
6.答案显然是INSERT。
$ U- y/ v& J" U5 G7 @5 U
d/ k. Y5 \8 }4 T& E6 e7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。. F/ n. H+ S" H$ q( E% A! I
. x8 ~$ q/ f& b0 q2 B( t' ]/ H8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。/ v5 m4 V: ~+ M
3 [+ o. X& D; _- Z, K+ [9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
) Z4 Y3 b9 W. E$ k( j+ o: G% A+ m# h- w7 F% S+ \ ^
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
r4 A" P4 a1 o4 S. }9 D# K0 u* m2 W+ `( J3 i/ B! h3 E
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
* Y9 w8 x, T7 t7 x( s8 _" O
* Z3 ~* X* t' t V6 U) @12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
6 M- }4 i/ W8 m4 E( b
0 z1 |# r/ c. a5 `/ o2 z13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
3 `$ t* I: t P: Q/ t% w1 |! V
& y! P0 v7 X+ r) e% O$ N2 k& b14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
6 a2 E4 @" \( j, Y \
3 C+ J% H! Z; a4 n( [9 J2 Y15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|