  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。1 M& [6 I$ A" i$ E& s* |
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。1 ^0 A* J9 V7 @: [+ w9 |: `0 }
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。% ~4 m( |* G* _& u6 C
: F2 ^% Q+ B: {8 o
7 S1 t) j* `: T问题
2 ^( U# ]. |$ q3 V7 k# A
3 N# v' [# J- ^1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)) b+ F" H& n7 q3 I2 C- R: w
2 t/ s H6 l* F" s/ z. @# {. eSELECT * FROM MY_TABLE# S+ A7 v& O* ~/ R$ ~; U
% E; k5 k' n' V4 n& ^0 B" o: eA.如果可能,用把查询转换成存储例程
5 y: ~% A( ?% K: n4 aB.如果程序允许,给查询指定返回记录的范围# W& m0 J% p! f3 S/ m( J# e
C.如果可能,添加where条件
3 ]7 n7 ]8 s2 ]8 n0 l6 H* K+ OD.如果DBMS允许,把查询转换成视图
" u2 ?% G% {" G7 V" x- B) ?5 zE.如果DBMS允许,使用事先准备好的语句
2 ^, R& B7 e' M$ N% y8 v7 P8 v& H, q7 b: {; @ |( o$ ~2 e
7 C7 j' i4 Q$ o8 _ T$ p! y& A2.可以用添加______条件的方式对查询返回的数据集进行过滤?6 L2 b5 L- w, v' u1 w
+ g- w9 g3 H7 Y答案:____________
' U, |; T$ y _) N, I2 b4 C8 \9 M. O2 Z. ^' H) s, \ Z6 ?; w
1 F) }6 n' R9 J2 K7 E( [' { |
3.内关联(inner join)是用来做什么的?
, R7 t: C. k' U, j: Z6 z; t: D( U5 c# p9 @% ^
A.把两个表通过相同字段关联入一张持久的表中, D1 G# m6 I/ k/ H. |
B.创建基于两个表中相同相同行的结果集' J2 t! m _& j9 r" @2 h* x
C.创建基于一个表中的记录的数据集4 d9 ?+ H% c/ L' ^) T" B- \
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
9 @, X; f0 h4 d1 S' M- o7 i. x$ a! t5 TE.以上都不对2 z4 i/ d1 e+ P: G- ~- t
* I) F' e9 `" b. J4 s
; p/ B( n5 M! l& ]5 U4.以下哪个DBMS没有PHP扩展库?3 w1 P8 D) _$ D
! }( b% ^5 C( s3 s9 D' Q/ R
A.MySQL
) _/ `& B# o7 {) mB.IBM DB/2( b2 W9 ?2 x) s
C.PostgreSQL
, g" x5 [# A9 s& X7 JD.Microsoft SQL Server
. F& K( L+ ^/ n+ T/ o' JE.以上都不对" I* R6 V& d, l+ {% T4 v7 D. g3 p- H
! {& S# Z0 y. y( k3 Q8 j! s( l& T& L
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选). i( n: C" Y' u7 C9 P
% ?) D. |5 C. A. p( f8 W! J! j<?php
, l0 g3 F& y. i" q$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
: j) f; a$ P. J' U% L?>4 c3 s/ E5 ]0 b
; c2 s* F7 d0 d: ?A.MYTABLE表中的记录超过1条1 l! f1 g. ? x! T* ]) t* n* p% P% _
B.用户输入的数据需要经过适当的转义和过滤 A' ^5 I( L" \" |7 Z0 \8 S
C.调用该函数将产生一个包含了其他记录条数的记录
) R' F( H8 n9 t- hD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除/ n5 R$ A; ~' {, O( A4 U" {. j" s
E.查询语句中应该包含数据库名
. ^7 a$ `! Z% V7 K0 `3 ?# V$ d# Z) {" T, b. O3 T
: M: ]5 ~9 U0 ^6 T9 r6.______语句能用来向已存在的表中添加新的记录。' Y) o( ?( }1 S0 B4 E) D
6 O2 v2 X* g) g8 x+ p
答案:____________0 V5 [" z, Y Z; a) q. V7 I
- g6 Y8 c- `, S4 f
) V' a% a2 D ]9 l5 T3 u7 f7.以下哪个说法正确?2 E( B, }# D' O( ?
4 K7 N7 b( h: M9 B; N# O3 ^+ n2 {; z
A.使用索引能加快插入数据的速度% i# A0 {+ T# U+ ?
B.良好的索引策略有助于防止跨站攻击$ F; h# E; l: V" z: L* J! G1 v
C.应当根据数据库的实际应用按理设计索引5 i0 L" `$ W* _/ Z
D.删除一条记录将导致整个表的索引被破坏
8 H0 F$ E) [! T$ |4 IE.只有数字记录行需要索引
. z# x7 O! q# f9 E" I$ I x
# b: v5 d, y# ~2 {( i3 j
/ L, F' d- I& a* i$ W' ~' S8.join能否被嵌套?" {( ?9 h/ Z- d* n" R
7 c: S% k- P1 d3 P4 ~2 vA.能' l7 T4 h1 H. s# Z- V
B.不能
' i1 K) X4 {$ `. [8 N( T5 w
7 d v A# N& l( ~7 i/ K
0 Q/ X8 G0 Q4 U. C% x9 T% W/ ^: h9.考虑如下数据表和查询。如何添加索引能提高查询速度?
) ?: x. X, r; e" [1 c
& X; U8 F) y I8 vCREATE TABLE MYTABLE (' ?6 D( ^2 b7 i/ P" L$ ?# ?
ID INT,
1 P6 p! N$ H9 o* i+ aNAME VARCHAR (100),
- _' q8 a4 x; e; |ADDRESS1 VARCHAR (100),
; j) \! g5 d5 Y8 W; i- xADDRESS2 VARCHAR (100),
8 V$ M J1 \( D" ]ZIPCODE VARCHAR (10),
4 x. g+ |( W$ _5 _4 {: G$ p8 JCITY VARCHAR (50),
- G) o$ Y. S% G8 C1 yPROVINCE VARCHAR (2)3 h( c! n/ S! Y( ~% V
)6 c2 `+ s$ f5 @% ~6 `# m! ^8 y8 E# l
SELECT ID, VARCHAR1 M! a" F# q$ }/ J% w9 T
FROM MYTABLE! }7 y, R7 Q: |& L
WHERE ID BETWEEN 0 AND 1006 j* w7 N* \% b! k( C
ORDER BY NAME, ZIPCODE3 r$ s+ E& k$ b; } n# [
5 r7 Y; n8 G& x" @8 [3 h, k
A.给ID添加索引
2 @' k% Z% B8 D. M/ x8 o( D+ JB.给NAME和ADDRESS1添加索引& ?0 T( o% S! C+ ]: i2 @1 W
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
: R5 E# V# M7 n8 j, W4 xD.给ZIPCODE和NAME添加索引/ h" O# r6 a" b! x$ ~
E.给ZIPCODE添加全文检索
. T: S/ @5 c* t6 u0 }
+ A7 ~" A% |$ ~# ^2 X
- b7 K. ]. Q1 Z6 T: Z# f. Q10.执行以下SQL语句后将发生什么?1 B) M) R& B4 s& o. n
: L) {3 v5 `7 y3 b- N3 O
BEGIN TRANSACTION$ }& i5 N' e7 S7 w$ |. q. s
DELETE FROM MYTABLE WHERE ID=1
+ I, Z3 Y/ v0 V% c5 b9 jDELETE FROM OTHERTABLE
: J8 I8 s7 b' P8 Q' C; NROLLBACK TRANSACTION3 v. s0 c/ g7 f8 h' _
% P$ k) ]1 C d; ^* T- L- @A.OTHERTABLE中的内容将被删除2 w# Z4 H5 l; V' F+ N& m4 {
B.OTHERTABLE和MYTABLE中的内容都会被删除1 O' B1 G5 |! `
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
0 T$ |& t% n* c: i y5 {9 a4 K3 rD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化6 g& {4 l8 G9 j" q) Z; f6 h
E.数据库没用变化" K) c+ z6 Z H& N
! j2 E0 [; S9 n# z5 M- q
6 X: j7 k m. u2 B$ v1 K11.DESC在这个查询中起什么作用?3 N- t \. I/ M9 j* m
+ l3 I! S- z: B! L0 W
SELECT *
s# D, T; o, ^FROM MY_TABLE2 x h5 n+ \* r4 k, `
WHERE ID > 00 T; X9 b$ v5 W1 M
ORDER BY ID, NAME DESC
o6 K3 _7 T7 D. s1 {& l2 V
- ?" m/ A" U0 E) V+ w @- M7 iA.返回的数据集倒序排列! T: A9 L, \/ ]- ]. t: f0 [4 {
B.ID相同的记录按NAME升序排列/ K7 c" `4 w) \9 H# b
C.ID相同的记录按NAME倒序排列! ^1 h" M; h( m+ ?1 u. Y. K& Q+ c$ a0 h
D.返回的记录先按NAME排序,再安ID排序
: N8 [8 v* t @( `2 RE.结果集中包含对NAME字段的描述; b) Q6 x9 G7 h9 O
2 `) O3 o9 d5 Z# ]; E8 k1 K$ H' I: ]2 r* i9 p, y" c! v5 [- A) Q
12.以下哪个不是SQL函数?. [8 c W- d% p3 e
3 ]1 @% o: x! L0 ` P+ |A.AVG$ g3 Q. Z5 _+ \1 e1 L% O* t
B.SUM- }" A. r% { a9 E% k3 X& x# {$ D
C.MIN" e" B; z2 i' p7 v/ r
D.MAX6 B2 g8 E: y5 ^
E.CURRENT_DATE()/ J. j3 o- O( w2 B5 `
& k: W" F8 X9 H! ?$ I8 s( M) z5 h' Y
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
. [' X8 u9 w6 m( k* ^- F
1 g% {( l8 R, z H5 OA.该字段必须有索引& P8 n/ n: P! A$ M( d! q
B.该字段必须包括在GROUP BY条件中
7 g2 a7 [7 C! n* LC.该字段必须包含一个累积值 d! k; p) ]9 g1 ^
D.该字段必须是主键
7 c% n2 E/ d0 P, s9 e0 UE.该字段必须不能包含NULL值
) V2 {7 }4 M* \7 y) K; Q N% H
i; W$ n& _" {! ~! ~1 I+ S5 k4 L, N
4 a, U: d. ]8 k& {6 W7 a14.以下查询输出什么?
- X9 u* A. s E X/ E# F
/ O2 ~. P5 q" TSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2% F3 L9 D, Z; o
ON TABLE1.ID <> TABLE2.ID
3 i# X; x( t: _! D7 M# |, q8 T, Y( B
9 s+ i) ?) z, @4 _% X- CA.TABLE1和TABLE2不相同的记录. K2 Q/ A. M/ J- g9 t# I
B.两个表中相同的记录
; b! f+ i% |( X9 h: cC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数 ]* Y( \% o- I& i* s9 @2 e8 k
D.两表中不同记录的条数
2 i# `4 S: D) k6 l$ L% ?E.数字2
% G* f2 c0 K% u! w0 c3 j
3 }0 q# W2 C& K' z
8 i% h0 L- S+ `7 r0 G15.______能保证一组SQL语句不受干扰的运行?7 i0 k5 O3 e5 Z
1 B3 D3 e5 e+ f0 ]答案:____________$ f! u' _) r q" x; N
7 _' B( I: d7 d7 T. w! a$ X% }4 b% |$ g3 D/ q4 L$ c! E% O
" e* D& w" K* x: j答案速查2 J# a& r; g% f2 n( n
1:BC
* N) q0 ~1 ^4 C, v2:WHERE% I9 P& I1 w/ ^1 U& ^8 P
3:B
7 K+ Z/ g y; j. W8 l( N% ~- r" t4:E& |, y: Y; E: K8 B7 @ u7 z/ j
5:BD9 [0 N( t& _" b1 Z3 u' }8 N+ d
6:INSERT( h1 v9 u% Q( }
7:C
/ f2 j9 [ P1 p0 y+ r+ p) I4 ^8:A1 c& a. g9 r8 h
9:C& {0 @! p9 h* ?* E/ q3 n" M
10:E' H7 J$ {. e- |8 A) I" x
11:C
5 ?; v' g. u6 r: H12:E
Y# r& e( H# A: ]5 `9 ]13:BC; o. {/ M s% ~; T4 x
14:C2 ?1 X X: ], R9 Z
15:事务! h4 [/ P) p+ u/ w4 W% [
7 r5 b1 q2 W1 O: M: i" h9 i6 n* d# q, k0 l. n
3 _7 _2 q- f" }0 T" @- g答案详解1 p/ [/ W+ b) `- ~4 K* c. d$ y
( _+ V6 k# g4 O- B6 q
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。' _5 C( C6 e7 e& P# Y- ~. ^
0 j7 i7 j# s4 ]6 G3 n) e2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。7 r; ~* T2 c K
& _+ y0 \* A; z) k3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。/ P) h1 [2 z& t9 }3 i
9 }- d1 d" w. w
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 |/ U7 |5 p! q
( ~. M7 ^9 Q) S- `+ {5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。: y% G" A- `0 u t1 U
/ i4 J; ?4 Y0 W* G6 h/ a2 O
6.答案显然是INSERT。
, ]9 O/ ]3 B# c; ^
& g3 D4 ^7 y1 l3 v7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
) y: _$ y I% [7 W4 j9 v4 F
3 r- E# [2 a/ I0 g0 j' [8 e* k0 j! S8 L8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。: @/ }* m) K; l3 p; X+ F2 Q
- U3 O2 I# Z9 E. P3 b l
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
* X, ?" z5 ^3 S% j, t# ]' u6 M H8 h9 y. B
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。7 ~8 F; l/ c4 ~: g
`5 R: i" [' e
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。7 I; V5 V) p9 Z& j% G" v) Y. C
9 |9 Z% S+ P( ^. u9 }+ H o k# b
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。; o% Z5 I5 U G
+ D, z1 q' M- A3 s# r& J( L
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
( K7 `) n" O0 ^ \
( F# f, e# _* F" A1 R14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
; I5 f) f" M. G0 y$ e
; E" l2 ?5 J# g; `/ @8 n# u15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|