  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。6 X) g* \: o6 l4 A" F
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。8 p) y9 w: @+ `! A
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。 D% u% T' J2 O' Y8 i: h
. u+ Y. |& w* g* E; d/ a4 E" Y% c7 a
问题
2 C5 a: |) G% x1 U' x
' L' s# B1 K! {. t1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)2 x2 l6 ?2 D4 k( m R4 U% i
5 r7 `, g- [8 O ~
SELECT * FROM MY_TABLE" h( n. Z1 W# c4 u
* k+ S8 O; s. B2 wA.如果可能,用把查询转换成存储例程
8 q/ c$ q, q4 K& y- IB.如果程序允许,给查询指定返回记录的范围5 a5 y9 b9 f* H) A# A$ v
C.如果可能,添加where条件
9 ~6 I$ w2 K h5 U6 O3 }4 K( z. PD.如果DBMS允许,把查询转换成视图. W; G2 N9 E$ a
E.如果DBMS允许,使用事先准备好的语句
! B: E% U- v! J% b4 D8 ^8 c, P, r; O5 C: h1 d* L" z* y6 ]& B0 y
, I0 z% M( C, {. ]) h% e! B& Y
2.可以用添加______条件的方式对查询返回的数据集进行过滤?& ?9 R- J$ @, r$ C7 l7 n
1 w4 I% o& P/ r- _; k" B3 Q
答案:____________% j# x4 T- R: |( z
& _ K7 p. o6 b: G3 F
. f' ]# e! u8 C' ?$ x8 z" _3.内关联(inner join)是用来做什么的?
2 _, G$ D$ S3 s: M- v* L1 s4 o5 b0 ~, _' z3 x
A.把两个表通过相同字段关联入一张持久的表中
& i' `8 K) y- p) N- z( ^B.创建基于两个表中相同相同行的结果集$ `" O& V& m: \& v# [; ^9 ^
C.创建基于一个表中的记录的数据集
6 ^5 _. Q2 ~3 y6 B4 D1 q# o& R2 H. MD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
: m, f1 ~+ z+ H# k% zE.以上都不对
* d0 H6 ~, C0 }9 `0 r/ H0 ~2 C: h1 ~' @3 U; L0 D3 J' _
( h+ R6 I: L8 H; U4.以下哪个DBMS没有PHP扩展库?8 p Y% g& @2 K, X
2 t9 ?" z; W3 u4 E1 ?* U$ S* K
A.MySQL
6 A1 R- l w; e, w# i2 OB.IBM DB/2
" r; P) Y4 @% K# c# Z+ PC.PostgreSQL
" ~4 h* `# r4 f% L3 ~' d7 VD.Microsoft SQL Server
0 A% U- N: b( }# ZE.以上都不对; ?. y( ?- C/ B) E6 t8 r1 j
/ } @9 I0 z; [; F6 W
. r' V9 n9 |# @3 ]! ?$ E5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
/ j9 q* ~7 n, N7 v
2 n0 p: i, C- x: e5 T) N V<?php
6 _+ A/ r9 b, x$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
}1 b+ t6 Q8 @7 a; h# `4 J?>4 m' Z8 l6 W8 q6 u% m5 B& b
5 M' _$ C# H" P
A.MYTABLE表中的记录超过1条
. e" Z' q* { D# ]1 c' {! zB.用户输入的数据需要经过适当的转义和过滤* l3 i" f: k0 q2 q* }% q
C.调用该函数将产生一个包含了其他记录条数的记录0 z [0 Y9 ]8 q7 L
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除# a- U9 \3 s; M; Q2 {1 c- F
E.查询语句中应该包含数据库名
$ e% |, B, q6 X! L# w- c6 e4 `8 q' A4 L0 ~' _ v
6 X4 W4 r$ n' k6 l' P
6.______语句能用来向已存在的表中添加新的记录。
* h0 e% j$ g8 h$ t5 ]
9 q w+ z' A. {% Q* e l% T答案:____________, T, g- n0 A, O& ]4 c
! u% q7 Z! S5 v4 T) v+ i" L6 D5 {- x/ T6 B/ I
7.以下哪个说法正确?
: w4 L% W! |3 ~( q' V [0 P8 l. N& U6 r M
A.使用索引能加快插入数据的速度9 b m$ J! |' ]0 S9 Z, m. H3 k
B.良好的索引策略有助于防止跨站攻击( c0 L7 l% ?/ Z" k
C.应当根据数据库的实际应用按理设计索引: I S3 |2 ^# Q& z7 U d1 R
D.删除一条记录将导致整个表的索引被破坏! N5 `5 f' v* N6 m% r$ V
E.只有数字记录行需要索引
' `; g+ }2 Q; s/ m# f+ Y1 r) c6 N; C$ K8 c
( L" e2 q9 b7 O9 z3 D( C- v$ g" v
8.join能否被嵌套?
, {( M: ], U% w5 O# S
- ] T- [7 L. Z) T+ @3 YA.能
9 i' b7 Y) q$ F( C4 U! M) JB.不能' i4 L% c7 @ }+ s1 l3 i
4 z1 P3 \, F, _
# N- O& b3 H2 k# C9.考虑如下数据表和查询。如何添加索引能提高查询速度?
: e2 P6 c) o5 Y8 P% Y3 O1 ]) s2 l1 y+ Q; S3 M% Z
CREATE TABLE MYTABLE (
2 E- V. C @* d: i4 ?ID INT,9 ?4 m4 ], S7 N3 m- Y; }: P! e
NAME VARCHAR (100),
1 A U, ?2 T5 @9 V8 i) aADDRESS1 VARCHAR (100),
$ }+ k6 }, m" Q' G$ lADDRESS2 VARCHAR (100),
- ^! {+ O+ u3 f3 v1 d& _+ v/ ?ZIPCODE VARCHAR (10),
% s* g6 V' o9 L! B, N) RCITY VARCHAR (50),
; e( d* K5 ? X' B# e1 BPROVINCE VARCHAR (2)
6 a/ ^, K8 E o)
, ~+ ~9 r/ _) ESELECT ID, VARCHAR
* a, o; P2 I) TFROM MYTABLE' a' ^6 v! H0 V4 H
WHERE ID BETWEEN 0 AND 1008 i6 n* w( l& H" s
ORDER BY NAME, ZIPCODE1 l( h) K8 R0 C' [
. k8 w0 p" ?' ^) v
A.给ID添加索引
& F9 L8 n0 w9 ?9 X9 l" _: FB.给NAME和ADDRESS1添加索引
# }- s4 Q3 J- W9 r" i, Z7 cC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引/ W; h( l9 U b( |! s
D.给ZIPCODE和NAME添加索引
x) n/ Y' N; S) bE.给ZIPCODE添加全文检索
8 E. `2 o& V) L3 D' X# G
2 v# u" {# j4 g$ ?) S2 Z) h
$ B0 p* Q: _; s: t* `$ u. Y10.执行以下SQL语句后将发生什么?
: y: V( O) a D0 w5 n# `/ b& s% p* B" C6 R% s$ o" p1 j
BEGIN TRANSACTION8 v7 p- G/ Y" W6 c9 }* {
DELETE FROM MYTABLE WHERE ID=1
' U+ F+ S" \$ cDELETE FROM OTHERTABLE& o: o7 h" ^7 w( G
ROLLBACK TRANSACTION" k* I/ G4 [" ^" B. w$ _
7 Y" B8 l; M. S. RA.OTHERTABLE中的内容将被删除
" h o( j( a4 J# H% g) n3 LB.OTHERTABLE和MYTABLE中的内容都会被删除
9 y" h9 _4 ?: N: o1 Q$ sC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除2 q! t* ]" {0 O$ l0 w
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
1 c: ?; G0 t: T' s+ o: ME.数据库没用变化
0 [* h7 w: c) ?. h& k$ T4 P3 R( h* E8 ]( Q3 ]# w
8 @% g5 j" K+ s0 j( T
11.DESC在这个查询中起什么作用?
/ m( @( @+ J! S* n- z: v \2 Z6 f: }2 p% ^# r
SELECT *2 j1 @; X2 Z; ^
FROM MY_TABLE: M% ^1 ?" ^: F3 I' h( }. G
WHERE ID > 0' P3 e: \ O" W) w
ORDER BY ID, NAME DESC' j W2 s! X5 f
! s, b% K. T/ q5 \A.返回的数据集倒序排列$ P' S3 _1 j+ ?. J- X! H
B.ID相同的记录按NAME升序排列
5 s( V$ K0 v! M3 Y- l0 IC.ID相同的记录按NAME倒序排列1 O9 n% O8 K) ^: {. f ^
D.返回的记录先按NAME排序,再安ID排序0 j0 Y7 r/ i% {0 I. i/ J8 U, N- m
E.结果集中包含对NAME字段的描述
4 n; x4 i$ |# f! w7 V% I1 M9 D% \4 e' A: E6 B5 i; i" F
. r3 z& ?; X$ B& W7 Q% p& E6 a" o
12.以下哪个不是SQL函数?5 a# ~ i1 y3 t$ W, Y& G& N. M
G/ B+ Y! D' \! m+ ZA.AVG
& T# \/ t5 s7 ?; S, t( a. sB.SUM: h: X9 D) |1 A7 ~
C.MIN
: l6 Y/ G. Z6 ]5 g$ C3 l% E" N$ sD.MAX j) T8 J0 }3 T6 f0 }
E.CURRENT_DATE()& g5 L! V2 E5 B0 O$ b8 I( F7 G
' ], Y8 j% z* I" [
! v+ v& g7 z0 P1 c2 Q# U' f8 x
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
* ~& f) t& Z" G* _* e/ p+ F+ d4 j' Q( E% E& {5 {
A.该字段必须有索引
6 S# m! Z. }/ q2 @" W! FB.该字段必须包括在GROUP BY条件中& m% Y$ }" C4 ?* A- L
C.该字段必须包含一个累积值7 O' m6 O9 w; A' s* r2 x
D.该字段必须是主键4 \1 I: f5 k& D4 `! i5 |( u, G
E.该字段必须不能包含NULL值
1 v' p; ]: I: [9 t+ q1 t" K, }. r. |2 k! S
- X) o4 J3 C+ Y( J: l2 n4 Z! H6 {% Y! ]
14.以下查询输出什么?$ A6 k" j6 M% O0 w: I" G
3 y6 s b5 J' \' T! c! f0 LSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE25 K8 z& }7 B% h/ c) d
ON TABLE1.ID <> TABLE2.ID
' f% W) [: o1 ]; u7 E3 O: R, m# l& n6 R3 I2 _
A.TABLE1和TABLE2不相同的记录
6 C( {# O* s+ sB.两个表中相同的记录
9 b0 R% {+ |# @! P8 mC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数& z: E& f, T7 h$ m
D.两表中不同记录的条数) V8 g$ r$ r! I: o# H
E.数字2$ Y3 T' ^5 u) e# M
) z: [( H& k+ Z: v: h2 M! a
1 D9 R# b" ~3 W% `6 O! ^15.______能保证一组SQL语句不受干扰的运行?! K, I E9 G! `9 i1 @% d4 I
Q8 Y# \* A2 x答案:____________. d' [" W% l4 w: U% u& m. T( W
7 w! u, a2 g3 @! t( f: H
" [: G4 b7 z% Z# d- i
7 O6 ~$ B ]! Y+ U7 ~' ~1 |& A* d0 |# j答案速查; J( |; m( c$ e1 T( h
1:BC# e) }( j8 I& f6 r- y* E
2:WHERE/ N" D" u1 a$ K% F2 q
3:B
! b5 `7 w& v! f. K( @- M4:E( |$ P7 a, m2 o3 m' r* M, w/ [. c
5:BD
" y! I& Y; w( q% }' n* ^6:INSERT
( X* O1 j. p" @; O7:C2 R( u" L% {" T. ?, Q- ?) f
8:A3 F( f- M1 ~; |5 n1 \9 g
9:C4 M& d+ T, _5 y( @0 B, _( c
10:E
: z) i. l r* f" `11:C
! k; G1 t0 y' I- I7 w12:E
2 \: T% u9 E, b7 J6 x13:BC
& A1 A. N" P4 [3 y. }* E14:C
8 b% T* T! s* C( m15:事务. q' t+ M7 ^" i% g) j
& ]5 y7 [- W! I/ U5 X' h6 R
; O4 a- M5 H1 x: }" \ L5 a( B: k. Q& ^1 P
答案详解) a0 o7 i! ^; l% p* @, |
' f- p5 X. F7 {) A* @% J
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。) Z8 b% e8 P" |( l g3 q. t1 M
2 X$ X4 }4 {* d8 M- p2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。' C9 k: z. U! r# r+ k% T0 Z
# @' D3 Q+ T, |0 v J) \. q
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
?$ `& {, G$ C& S' }" Q6 s. k3 Z6 }- x2 t: _
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
$ {2 W9 P% I1 j( m4 T! c2 a
6 o. {/ J) s# X* @- V9 D5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
" [5 v& |, z2 f/ x9 x K1 O" n) X/ d: r/ I* D' o5 u* j4 f
6.答案显然是INSERT。
* O0 g q& P6 |+ b/ S0 t( k, K6 \8 j, `( `3 |* r
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
' i# p% j, j t' Q$ \, k& z# s& h& B i
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
) l# F& b/ j7 X @! j3 Q* [3 F! W/ {4 O# w& g$ W$ x3 n
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
+ a$ D5 J( G, R
9 d( e' ?/ d. \/ D# z: m" G10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。; `+ ^8 a) I; u. |
% g7 ~ Z$ O0 M# K+ t- i
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。* Z: ?6 c. k$ c# h a, W
- q/ ~' ~1 C: G: ^
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
\+ o; O# d2 O0 K# D7 X: T2 B! |' }& y9 D2 t8 r
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。# J( k6 [' i$ h
" [5 X, U5 _% E' T$ B- D14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
- S8 t# B# C) W& z, I' u8 Q# H
) L: U! y, l7 T/ H+ k& K15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|