  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。8 n0 m8 R% `9 j
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
& i/ j, l8 E: m; W- G本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
, Y$ o6 b! L% T' A/ ?' u( n* Q. I
2 `" v& ^& n, x
问题
* O+ W \" D' a- P7 @4 {1 W- ~
% ]" W1 v: |' |% d. @1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
1 `6 T/ ^# w! W5 p/ \' F; o
9 z- w0 g$ o, ESELECT * FROM MY_TABLE1 b2 a0 l: U$ C$ k; }
# O- l# `0 |$ WA.如果可能,用把查询转换成存储例程: B* p) W; X# Y: _6 Y5 C
B.如果程序允许,给查询指定返回记录的范围; C; g4 f) v9 o- O5 R d
C.如果可能,添加where条件
. l/ k$ h5 n8 r" d# {( \/ Q% zD.如果DBMS允许,把查询转换成视图
+ d# g4 p8 u9 }: J5 ]E.如果DBMS允许,使用事先准备好的语句+ E) u- @# T* R! r0 p
6 d4 T3 N1 _- q' F
' n: S) k" o0 j8 H8 C& ` F2.可以用添加______条件的方式对查询返回的数据集进行过滤?
4 N' f2 I; Z r1 Z3 X1 m% U0 S, j j4 y- x
答案:____________
t: n) i+ f/ P* C1 w- r/ n6 i W) U: W3 K
, H5 V" P* y7 Z' z3 D
3.内关联(inner join)是用来做什么的?
1 X' b, e% ^) T0 K4 T- w
& o0 i6 w% F! R& n& d) xA.把两个表通过相同字段关联入一张持久的表中5 X0 i# d" U! T# ~3 N5 S$ k
B.创建基于两个表中相同相同行的结果集: P7 d, ~9 z/ k9 K
C.创建基于一个表中的记录的数据集
3 f5 q$ \; c. wD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
7 ?2 B& k* L1 b! t5 JE.以上都不对
: A5 T; O% O$ y3 f8 h& F" _( ~2 H4 G1 k. v/ R. U
9 ~+ d+ k9 d& E0 k6 f+ V4.以下哪个DBMS没有PHP扩展库?
. P( ?; F# n' c7 n& {! ?2 P" D8 G3 B
A.MySQL6 o) r; [% Q: D5 E
B.IBM DB/2
* j, v5 y0 J: n4 {C.PostgreSQL
( l$ k1 e- k( K* dD.Microsoft SQL Server
% r! z! _& D* [* F6 mE.以上都不对
+ I' s$ f7 ^! [% ~ L. S% _; ?( x4 [" {) I: P! e
9 e* u4 a" i7 ^9 f' i+ E5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选) y, f7 s) \. c) b0 a
, @: s& `) C5 B7 z% U4 ~* H<?php' q, X3 n0 Y' x; T
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
% B5 L1 b9 }- D- p$ T4 _?> n7 B. m: \$ d6 U
) h: h& m, ]+ C+ MA.MYTABLE表中的记录超过1条
$ p1 p) B# ^. K9 T# C) pB.用户输入的数据需要经过适当的转义和过滤
; Q( @" ?1 x& V3 jC.调用该函数将产生一个包含了其他记录条数的记录
`! O0 w/ i/ F0 W# l; W& B1 [* i" JD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
7 L; h6 \9 N! p/ W$ l* d7 E% iE.查询语句中应该包含数据库名
; ?' e% f5 @$ C9 P; Y9 f" n1 z0 f" N2 P# h
3 U' j$ F. X* R) S
6.______语句能用来向已存在的表中添加新的记录。# ~7 _! L( O9 g- K: \
% r, Y# q/ L7 E: I {答案:____________+ @& b+ {2 m6 o. C; l+ h1 @
+ d' N6 V3 o1 v) ]
0 D( ]! M g3 {5 S- z- A7.以下哪个说法正确?4 ?% y% L8 \. ^0 t) h7 m, {3 O
8 ]& c4 [# w ]7 V4 j: D+ p8 [
A.使用索引能加快插入数据的速度% t \8 F+ h2 q1 Y
B.良好的索引策略有助于防止跨站攻击( } R E: E2 t' \
C.应当根据数据库的实际应用按理设计索引8 S2 f( ~ d& [: P
D.删除一条记录将导致整个表的索引被破坏
: j$ C) ]$ g1 J! XE.只有数字记录行需要索引
, a+ s- Z, E O; \
! R& m* P* {- t3 ?! c
. |& b/ U! T. R2 y) p/ e* S8.join能否被嵌套?! F% D4 c2 u3 r" _& P6 R5 I- G
5 M( | Y' U: w$ _; I% ^- g
A.能9 c& h/ ^) x, I- l% ~+ P4 i( N
B.不能
. O2 G; u9 ?3 j+ n7 W$ x7 G5 \) X* B+ t. ^
: L1 a% L7 `- \# X3 M1 C
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
' r3 b% H% O" R$ \1 r: o" G# X; |# [) A* \2 z% X* q% W3 F
CREATE TABLE MYTABLE (2 Y2 G% c' X- {$ [" K5 c
ID INT, k& ^5 ]+ k7 G4 K
NAME VARCHAR (100),4 E& b8 t+ W) m# k/ V; i
ADDRESS1 VARCHAR (100),
$ g1 Y9 x7 `9 Q! D" M {ADDRESS2 VARCHAR (100),
2 _8 R7 o$ }, k/ NZIPCODE VARCHAR (10),
; g( g: @) v3 S) w, M& NCITY VARCHAR (50),) {7 a! u- T6 `5 L4 U$ j/ N# |, a
PROVINCE VARCHAR (2)
8 Z" O% Q* @$ u" y. a)
7 z9 e) B/ ?3 [6 jSELECT ID, VARCHAR
; }/ \% R0 o8 t( yFROM MYTABLE
( X$ d9 F2 O4 o* k4 H6 iWHERE ID BETWEEN 0 AND 1008 y% i( T9 |, V4 L. `
ORDER BY NAME, ZIPCODE4 m" `/ ~/ Z( v1 ?
# t2 E; A5 F! X3 @2 a
A.给ID添加索引
; x* w, c' A6 oB.给NAME和ADDRESS1添加索引
* ~4 T; t& n+ `5 P) aC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
. @6 t5 ?, n! TD.给ZIPCODE和NAME添加索引9 z+ L- S- l4 g4 m+ o
E.给ZIPCODE添加全文检索
5 G& m F$ l! }: S6 o
# v- j' G: _9 L: }& u
: U+ a, a+ X1 W/ P h10.执行以下SQL语句后将发生什么?" r* L e* ^; t* N. M: T+ F
; @% ?% y* I* G1 y2 EBEGIN TRANSACTION+ e. a: d4 n# ]: |
DELETE FROM MYTABLE WHERE ID=1# P I, M' E! Z( P
DELETE FROM OTHERTABLE5 W( i, ~' C) \, n6 B3 T1 X3 y2 p
ROLLBACK TRANSACTION
% u5 H2 ?& @ Z4 {- @' o. B' B" ?" R
A.OTHERTABLE中的内容将被删除
- v( D0 V5 [+ U3 a4 W1 _8 `& |B.OTHERTABLE和MYTABLE中的内容都会被删除% G/ \% `" h4 ~9 ^6 h8 v. z
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除& g- t% R3 D W2 r& g
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
% Y7 B/ {9 f2 K2 {7 q4 ^E.数据库没用变化1 g8 i* A3 t: a1 P+ ?) R7 L: J/ U
! ^. z7 ]9 d0 `# q* {/ x
1 t" W! J) ?; {/ d11.DESC在这个查询中起什么作用?7 q) i# ]4 ?4 E) U" \
2 Z/ k2 A3 @+ N' P1 S
SELECT *4 ^ Z7 a! q) Z, c8 r' Q% }
FROM MY_TABLE5 G/ R0 ]0 u S7 ~, n
WHERE ID > 0# ^; N$ j4 T( ?# @* j) i4 R: X
ORDER BY ID, NAME DESC
, _, U* ^$ U0 d' ]3 ?# Q
' w/ D# M/ r) {, J/ y3 bA.返回的数据集倒序排列+ w% O6 _; L; g' o }5 _1 R7 y
B.ID相同的记录按NAME升序排列$ A, n& J% \" l8 J$ _9 B
C.ID相同的记录按NAME倒序排列8 @% b9 A% L L8 o7 G) m. K. W
D.返回的记录先按NAME排序,再安ID排序7 C* z; {( u; v4 c( N
E.结果集中包含对NAME字段的描述# d2 i) ]* T( }; A0 t
8 s: w* N8 ^1 _- T! P6 ^& J X% @( c7 u) C8 v' r+ s. T2 G
12.以下哪个不是SQL函数?6 v) P5 g) D+ ?7 `' A7 b% h
3 e2 ^. K( y2 {
A.AVG; b" x, Q, a0 c. T
B.SUM
3 M' M/ q4 C5 s; S {4 [$ ~7 PC.MIN4 q6 x# u6 D, v
D.MAX
) _- n. A) P6 h# fE.CURRENT_DATE()4 D+ P. l% e. S( S$ m
& r6 u r- z5 B6 D: g% Y
$ [8 l: Q e3 Z( _6 A1 ^
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& |) b8 [0 o0 @* `2 ~& w J, a# N; `* h/ |8 K' r7 q4 [5 w" s8 r
A.该字段必须有索引5 c! q6 ^. T5 ]
B.该字段必须包括在GROUP BY条件中
) \; r* a; U( x+ i- eC.该字段必须包含一个累积值
5 u5 c V2 e2 E1 u: \& O. b7 P5 bD.该字段必须是主键# U' i; c( }1 a) M; X* u
E.该字段必须不能包含NULL值
+ j; g" y3 H& ~
' i* p) t/ {& B5 y6 r% S5 _& A# {7 R! j! ~ O0 Z4 G
14.以下查询输出什么?4 H, L# ?! I9 y( \) I6 Y$ e
, e( ~: q7 o8 r' j9 s
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
9 {* G w! J, s6 M9 aON TABLE1.ID <> TABLE2.ID. A5 d, `& a3 j. s
7 z9 _, Y1 j* e8 ^6 i
A.TABLE1和TABLE2不相同的记录
1 j( ?" X/ {' X/ u( R# [: {B.两个表中相同的记录
9 `5 ^/ N4 R$ f# K9 u( W. ZC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数 l/ I: [: I/ n
D.两表中不同记录的条数6 z# I5 w8 V" O
E.数字2$ n7 S' _7 r* B9 |% @! D+ g
1 O0 J# H6 M; {. P6 l8 B- u; ?0 |4 \+ j; r7 b
15.______能保证一组SQL语句不受干扰的运行?
9 x- b w0 I! d
( W$ y4 H* c: ~! p% Q& v答案:____________) U2 u5 K- \ }8 t9 n! S2 d$ `+ ~. R
8 f8 p( K" Q0 L
- Z: D( ^8 _6 ^: r# z) M( r8 C- k' _
1 \) X# F3 H( y+ B2 ^5 a7 U7 W4 @. X
答案速查" {* G+ C7 ^1 j& x5 Q
1:BC
# Z4 P, g2 ^, S. ^5 z8 i. I2:WHERE8 M2 f6 z5 |" c" }+ Q. a8 y
3:B* X. l5 [ r+ @; n6 M. X. R
4:E. L% B- b- u6 Q5 L
5:BD( c# G0 H) o/ M
6:INSERT& J ?* H% |- w' c! m0 I
7:C, N2 _* ?6 a! w1 D9 L; Q2 d& L) g
8:A
+ }3 G7 Y _6 W w9:C
% V+ H. o+ N, r2 p7 k10:E
6 _+ ]$ M" f# w- Y" c11:C
+ t! I5 p( _* Q/ @12:E% d: J+ U5 M/ X' b3 Q
13:BC
3 H9 D# S' @7 ^* K- e" E0 {14:C
" n+ e( V3 ?$ `( f" `8 x15:事务
% O6 i, _4 F- x) Z* G# c, K) p; B/ e. g# K& Z0 X
& d# r8 ?) z5 f) d$ R% m; w2 P0 t# ]: ~; j6 X( {/ D
答案详解
K+ X _' _- z$ z( O
6 `- ]: o) X) t9 _' n1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
" P) S0 e5 e. p8 ^* G0 Q0 T( P7 \, C% [4 J
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ A# v x1 v- X0 c$ U1 a5 {4 w9 \, b; _3 W
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
' P, f4 y' D% {' u; B+ v3 c0 w. e$ [7 d* w. ^2 `/ V
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
# K" `5 }) N/ @6 L' ?) a
/ e+ ^% F- e- a- ^5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
1 w! V' y/ e5 F" i# z$ v- |& Y2 p' I% f0 |9 d( C8 k
6.答案显然是INSERT。
8 i& R! g: H: o; [$ O4 R; @0 j
& U$ y- t# |& ^3 m: a5 S" G7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。2 ?# I4 l' i! p: Y, c& U
n5 H& {+ Q! |) h: ]
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。' ]0 u7 n' c4 {5 j
$ s# r2 T* G; S, }* b. y
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。: m) @4 V6 f& x* G, P( p
, S! H) g& Z' L$ g+ g, h6 p8 N
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
/ H( N A7 b9 n L8 N; r9 E, Q; W& Q% U- C
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。2 ~" p& v% s$ t/ C I o5 Z
- V W: N8 w) G' b
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- W' n; d* t p3 d+ _5 M1 K. f
3 f% w2 m$ E5 ?& v13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。; O) z1 A6 o& y8 V6 ?0 F3 `
# R% M; f3 ^* \. O14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。6 e) G8 N y) Y3 J! n \
* H% n( P* t$ q, C, w+ e15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|