  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" R6 N; f) q. y; H" x+ kPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: x3 N3 d# {0 e$ p9 b' U' N! M$ X本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
& ?- [8 V' X. V0 m% R
) b5 _+ r) Z7 u. y$ D( i. q) W% L
% @, [- P4 p. K0 l$ N问题% R: x( U) W+ c; W1 j
, {7 y6 a& l- x9 A# A1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)4 y7 x8 c5 m* J4 o, I7 A
q' t* G: n6 N b/ Y& N% `# k5 RSELECT * FROM MY_TABLE
) _3 x. y6 l8 L& a( ~; K! R+ ]5 G5 Y4 @' A
A.如果可能,用把查询转换成存储例程
- A9 H- }+ O0 w5 Y2 B8 VB.如果程序允许,给查询指定返回记录的范围
0 U u. ~3 s& ~/ G0 z4 U- D! BC.如果可能,添加where条件
3 F) i& Q, Y2 d% O" JD.如果DBMS允许,把查询转换成视图
7 _/ l* M* U% w5 E' M1 K1 F8 y8 EE.如果DBMS允许,使用事先准备好的语句& X9 o0 L* O$ Y, M/ f' \, [
9 e4 k/ | g7 {/ `4 f! h
% g6 m, p+ d, t2.可以用添加______条件的方式对查询返回的数据集进行过滤?
/ D- Q9 H$ x( d- i# O6 n R% Z% H; v* w: \( v5 T9 [8 v
答案:____________! T0 T$ V" G& G6 J
2 ?2 W4 O+ i( G; Y4 H
% K6 ~* C$ Q& N0 V' U3.内关联(inner join)是用来做什么的?
- M* r/ Y1 ~; B6 L
* R9 ^8 n- M7 M/ D9 m' PA.把两个表通过相同字段关联入一张持久的表中( E1 p* ~6 i/ {* [# J
B.创建基于两个表中相同相同行的结果集
5 U, e0 P' }5 S% P- `% t. r/ PC.创建基于一个表中的记录的数据集
: i3 k/ p6 _% S9 o: w( ?8 ~D.创建一个包含两个表中相同记录和一个表中全部记录的结果集7 p) h: n9 S) N# C* N
E.以上都不对( Q k: |: q, J4 J' ?5 h
0 C* R( l5 i6 {$ ^! {
$ f, g7 s" h7 Y3 R! v$ `4.以下哪个DBMS没有PHP扩展库?
N/ x' d1 w3 {) {' f8 B! I$ {% j5 D& _2 W9 ]/ n) B) f
A.MySQL& q6 |* @( L; ^) O
B.IBM DB/2
2 ~" @4 l( A2 b0 ^/ XC.PostgreSQL& o' q- f! j# T
D.Microsoft SQL Server
* R7 Y9 J" K7 ^9 {2 {- Z; eE.以上都不对
) k: z' A$ D0 T* Y& i; c2 a V( f& K. J9 K7 n
0 w$ C$ |: |9 J, g1 K5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)' Y# r8 v& |9 v9 k; _
) V* G6 [. `& Z' F) ]$ K<?php: c4 V& M4 |/ E. |% ^4 S7 n6 k
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
3 }. O$ |( t8 }' T1 r?>0 O2 b! O1 R* n( ]
( L- @* k, S; `! z2 {% ]
A.MYTABLE表中的记录超过1条
* X; k, a0 u" ZB.用户输入的数据需要经过适当的转义和过滤
3 X: c' F+ R" L' T* p) ?; Y1 BC.调用该函数将产生一个包含了其他记录条数的记录
! j0 ` X5 b3 u% }* CD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除+ Y4 S' k( {9 `8 \* V
E.查询语句中应该包含数据库名
5 @* A# X0 u" `% x. ?9 _: W0 i9 g) F% D8 H$ C& h
A! D/ b5 E, o7 X% b8 ]& D" `
6.______语句能用来向已存在的表中添加新的记录。
3 v f/ V" |6 T2 g+ b& Y6 K1 e& N+ Z5 R/ {4 d* n* w
答案:____________
6 g, f, N& a9 y6 [9 [2 J; d/ ^& r+ j
( o8 w+ w( ]" R% r, X" V8 Y' h! g. x4 R8 _0 X/ S
7.以下哪个说法正确?! @+ a6 Q& c3 E. ^6 b$ x
6 j2 E4 M+ i% B& ?* r
A.使用索引能加快插入数据的速度! r. i3 w" t! p6 H9 r/ ]: F) V
B.良好的索引策略有助于防止跨站攻击
- R# j+ a0 w& S% F, n' L; IC.应当根据数据库的实际应用按理设计索引
2 L& `, z- r a/ zD.删除一条记录将导致整个表的索引被破坏8 |1 R0 S; h. ]
E.只有数字记录行需要索引/ p8 m1 @4 r- j% V
9 B" W, l. H8 Q( r$ L9 e7 a. V7 g& [8 t4 i
8.join能否被嵌套?
" Q# w9 ]3 `. p+ {
+ t7 Q2 ]3 c8 B" ]A.能' g l5 e1 x% ^; {4 x
B.不能2 V6 A4 \0 J" J9 M, |+ M
/ O" ^9 X4 z6 X1 T# P3 V7 X
3 Y8 `& S. Q/ V) k: B" D+ ]9.考虑如下数据表和查询。如何添加索引能提高查询速度?
& Z0 u. S9 R4 @: u8 u; ` O z* {7 ? p+ Z3 J5 W. C* P) f
CREATE TABLE MYTABLE (4 i+ `$ Y! r/ B. S( o2 P6 v
ID INT,- w2 c( X* }8 K! n, ]4 k1 M
NAME VARCHAR (100),
* F' W& t& k, ]& ]4 `* ]ADDRESS1 VARCHAR (100),, d+ Y4 }6 \2 X" c/ _5 E
ADDRESS2 VARCHAR (100),3 L1 O* I. S8 r7 l# z# N) M+ J
ZIPCODE VARCHAR (10),
- I2 t3 g- E- B7 {5 L$ q- e% dCITY VARCHAR (50),9 @" o6 a# p# {5 _/ w6 h1 \( \
PROVINCE VARCHAR (2)( Z$ S. Q- H- T* P
)' w3 }2 ^- z6 @3 J7 i1 T2 @( c
SELECT ID, VARCHAR
. y' O; |, r7 j# c; w# ZFROM MYTABLE' e" Q) s( m2 e
WHERE ID BETWEEN 0 AND 100
; W) w6 @; l* s1 KORDER BY NAME, ZIPCODE
7 N _& N( @4 z# s& g% f
" e4 r5 E( O: {# vA.给ID添加索引
: I! A/ C3 o; X% f3 f. gB.给NAME和ADDRESS1添加索引
9 f: r( s' }. s. W& _6 x" zC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
, Y! }# ~. Y. k0 pD.给ZIPCODE和NAME添加索引. E O1 r: k, k, ]3 T
E.给ZIPCODE添加全文检索
! o; q/ H3 D3 A, C* N9 {; u# ~; m& ^- M* x6 q1 e' A
* X; @2 T6 g( }/ m/ o- [/ E2 S; X
10.执行以下SQL语句后将发生什么?( e5 G/ ~! s8 x$ J/ I
1 ^9 i2 p6 X6 v: s( \BEGIN TRANSACTION
% f& v. b- i' `5 |DELETE FROM MYTABLE WHERE ID=1* P3 j; W( d; l
DELETE FROM OTHERTABLE/ Y5 P7 ]: L. x( v
ROLLBACK TRANSACTION
% F4 ?, h7 C: k) g x ]+ S# u
. u ]0 ?+ z1 V$ PA.OTHERTABLE中的内容将被删除5 U- _& G2 Q( i( e, A* [' i0 F
B.OTHERTABLE和MYTABLE中的内容都会被删除2 n6 t. i" Q4 | ?) q
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除# I0 o. i& f) e3 g; x
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
' r) r% |5 B$ O! b; Q1 m6 H" A1 ^E.数据库没用变化1 e6 r/ c) [4 o
: O% K7 m1 z( W1 `0 Q; t+ _9 J: M I) c* B
$ k2 A) a: D" L, n, N x `11.DESC在这个查询中起什么作用?6 Z& r) P! x7 O# ^% ~0 \, |
3 t& m* Q+ y7 n$ a
SELECT *
. G; S# I; ]3 `' m% G$ OFROM MY_TABLE( W l$ ?6 g. E: j+ k/ m" n
WHERE ID > 0
. a4 C4 U* A* O) xORDER BY ID, NAME DESC
9 @7 ` Y( `( h- ^" i5 D
8 N1 U( H+ P) [: n+ ?$ r% qA.返回的数据集倒序排列/ p3 i, P: a" C/ H% m9 A
B.ID相同的记录按NAME升序排列
3 V" \( H( j( @9 G# h. V sC.ID相同的记录按NAME倒序排列& q4 ~ b+ h9 c& C; X$ Q1 l
D.返回的记录先按NAME排序,再安ID排序% Z% y; A& S8 J$ Q8 E
E.结果集中包含对NAME字段的描述
4 T3 j7 R4 K+ O0 u5 i, \% k! E. p% [9 H# Y$ u5 ]
8 P4 J9 n! |- L# y& ?
12.以下哪个不是SQL函数?
3 _6 k/ T9 Y! w) I0 g: h' P4 y3 i+ l
A.AVG/ p6 c6 [" |/ h% \
B.SUM$ S( _* A& H. r& t# ~0 o5 d2 Y
C.MIN
6 n4 n5 @1 U1 h% ]$ M) q5 ND.MAX2 m* Y- m0 ]- b Q$ [3 T
E.CURRENT_DATE() a# [- ?% u4 U8 `7 A$ C
) w% z2 G" o! j. b2 K
3 A% y% Q# S) H, F- P" N13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: E' R) m @8 q$ ^) U5 U" g8 J) Y( T" K; c L
A.该字段必须有索引" N) S y/ }4 ^; b1 `
B.该字段必须包括在GROUP BY条件中; a3 g R& T2 c$ f4 T$ }
C.该字段必须包含一个累积值( m) l% R1 N: \0 s
D.该字段必须是主键
: Y: Q# b0 e4 d4 v7 U6 DE.该字段必须不能包含NULL值
( a" E$ u+ v/ x7 B# L8 l- y. h1 P
; L+ @6 @; W( c$ w: X
14.以下查询输出什么?
& g6 B7 w) X* U
! t7 Z: A" Q: v: |SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
$ c3 ^% L9 ]" v, RON TABLE1.ID <> TABLE2.ID
5 C/ {/ b! M E8 K- n
) Z3 [% |7 Q- Y9 e4 O# R* `8 yA.TABLE1和TABLE2不相同的记录
( q& U: L# W9 NB.两个表中相同的记录/ N. q0 U0 H# i$ f) D4 X! s
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
: T6 Q- O$ x1 p, Z: lD.两表中不同记录的条数# i* N5 B R. C% K% t
E.数字20 U$ [- t. P4 E" {+ M1 @" O5 ^) z
0 g! Y7 w) k5 k {
" A6 b6 y, F r15.______能保证一组SQL语句不受干扰的运行?
# j3 x7 g* n$ x9 {% t, ~7 D9 ^' q0 A0 y
答案:____________
4 v# ^( C0 e% W) j' j% x7 W6 Q, X5 M( T" M2 N+ E7 G8 |
( ? p; P% R5 l7 e5 y! r; b; S
( }6 E, l% A- F _4 o0 p j& q答案速查
& ^# G* m7 V' e' d1:BC7 d' Y$ V/ }; E9 t* w$ T
2:WHERE
- R x4 F1 a: V4 v3:B1 _3 A% _7 d) g; Q. K+ U# f
4:E
# Q1 z( e9 i. q! r, C) ~# P5:BD! u( C& f" j+ }8 ^2 n0 N4 d
6:INSERT
+ S- [. u7 [6 F) g) ?7:C( @' i, I9 C1 T$ R% P: b
8:A! w* s% ]0 o, z; P N1 x
9:C0 Z& a4 v0 Y, E" n% H+ s8 h9 q
10:E
. o, j! D! \: @# m( g, R+ i6 x11:C6 O5 q" T, I$ \5 U. J) H# F
12:E$ g8 P, R% d1 l! j2 l- \
13:BC
$ O0 h% E4 `5 P ?% f9 ^- M. m+ ?+ \" L14:C
7 I: O; r I) s: a& l" Y- Y2 J15:事务- {8 U z/ Z1 I2 i# ^
0 P2 ]$ h% t+ Q& I# e
9 B! j! |6 Y' |# r$ e- ?$ Z$ Y& m+ K- Y
答案详解
$ M2 B! J l5 H8 l9 {5 c5 l* o
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
- y, n$ |2 t9 @0 v R, _( F# {. _- S! v6 w. A
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。" f5 r. V# x4 s8 ~+ \$ A. h' @* P
4 Z0 M' ~/ }4 s' Z$ I8 @" a3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。8 y6 j, X% J+ |4 H) s& j
; R/ G5 ?: @$ }1 ~# e% l4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* }4 Q3 M+ ?4 k C" t2 _ u( |' g
) g3 X8 s+ c2 X/ X9 p1 c7 l5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。6 b- q1 ?; Y! D4 m% W3 I: }/ h
_2 B7 ~, B9 z5 @8 @) }$ J1 e6.答案显然是INSERT。& w% H9 T/ c# m. v7 |7 e) ]& j
$ F% r7 }+ s% s$ X3 y6 w
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。5 w/ i/ G8 P# v: w: F
0 o+ R8 h: R8 ]% P8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
# r( N& L( y ^& E8 A( W8 [
g0 K' {0 j4 j' `9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
/ B- m+ k8 o1 ?- Z. O- ^, \& S6 q) y/ w
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。! D3 I8 K' ^$ _/ Q: F
! H) }# Y+ Q5 L6 J11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
! i% I! C8 w* f' x8 x
+ o1 M; `* ~+ a" D12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。6 M: Z' ~+ v6 x/ x5 l t) i
" o& Y0 l5 ^" A9 t( f13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。0 _9 S. ?/ O2 x. {
4 Z: v5 f$ n9 n14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。$ ?. w- t! X. m
% t' z$ P+ M- m
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|