  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。4 B* V3 H: e" a. s) u" d, G- N$ J
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
, |8 j. t1 h" U$ z: D本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
+ H* n9 p, d- ?0 @! x1 G: S
5 O8 J, B# Y d; [/ I" v" O8 f+ F1 `. w1 j" x
问题
5 G2 g. C9 b) o1 Z5 ]' L* C7 r& k& }* S$ G9 c
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选). @0 l T& F1 ~2 Q2 h5 x( c
( w' m* l7 C( tSELECT * FROM MY_TABLE! @+ K" E: a2 N d. z% t' [
$ h) ~) N& g0 D: L. ]A.如果可能,用把查询转换成存储例程
, S8 p4 g( Y# C0 NB.如果程序允许,给查询指定返回记录的范围
; v; l& x/ h q RC.如果可能,添加where条件; f% [/ c5 C: t1 ?+ X
D.如果DBMS允许,把查询转换成视图
$ d! r6 v4 O& m l; B5 ME.如果DBMS允许,使用事先准备好的语句 z4 H7 w' g/ ^5 N3 S
, C4 A8 Z. g8 c# g8 s3 c' }
: o3 s% r% [# x2 ]" ~& S
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# K0 Y5 \- D1 l8 {) y/ W
5 b. U2 j& x( Y; h答案:____________2 _& q2 _. V# W6 I3 ?6 _; |
% M' ~5 z& E+ `1 J( v
" i# J6 ] [ T3.内关联(inner join)是用来做什么的?
/ D) g" l; J& o0 K! _- O! g, j
- K6 Q6 c) O: z1 k2 b# ^" iA.把两个表通过相同字段关联入一张持久的表中
9 U P2 z' Q0 Z3 a9 aB.创建基于两个表中相同相同行的结果集# r& d& R4 A) h4 a. Y
C.创建基于一个表中的记录的数据集
( g" P ^( K, }9 n4 ZD.创建一个包含两个表中相同记录和一个表中全部记录的结果集, [+ k! M3 O: e- n3 P7 w
E.以上都不对9 m* N7 O- m; H. U; \- r
1 D4 \! z Q( w1 b1 b; ^, `* @' b6 c, O; x/ w3 k% B7 J) K
4.以下哪个DBMS没有PHP扩展库?
. J3 c9 r4 T2 Q `/ V# E8 v( y2 v+ ?. E2 D$ S& w* ]2 j
A.MySQL
1 g( ~! n- }, w. ~/ [7 |2 ?4 XB.IBM DB/2
% M k k. E1 Z2 o! wC.PostgreSQL* L4 ?) I: Y2 g3 g: F2 p
D.Microsoft SQL Server2 @+ H$ Y0 e z# X$ v5 y- C m+ k
E.以上都不对5 A D. [. x" R, N- Z9 q8 }' Y4 T
- p! q4 m6 r; D4 Z' d
2 z; D9 a- j3 ]' x5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)4 F; s4 ?+ V) }9 s9 }& l
2 C/ i6 f" ~4 o+ L<?php
& c) @! Y! g; u2 l, f. f. z K$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
- k, x! R, f3 \6 t?>0 m5 I5 @0 z2 s% w) v' d
! Q6 c" c2 N! o; h" R, }A.MYTABLE表中的记录超过1条
' x9 p! h% _, I" ~; yB.用户输入的数据需要经过适当的转义和过滤2 ^; F& Q" @6 F
C.调用该函数将产生一个包含了其他记录条数的记录# E1 ?. r9 O) Z# ^4 c
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
9 Q* F' F+ s$ a0 ^! kE.查询语句中应该包含数据库名
$ l0 u& T% |* {
' W$ e2 J9 C& }# R* S4 E9 h# j! T4 W7 I& p3 r- s
6.______语句能用来向已存在的表中添加新的记录。
/ q O: U0 \ D& U* f
: p4 Q3 k2 M( b' [5 b答案:____________% G7 q2 c+ n5 A6 q" n
) i' s4 }0 l n
$ O* c p3 R3 ?9 E5 F7.以下哪个说法正确? I2 [# K$ w$ n7 y* D( p* j
$ N( E( p( q9 m/ n
A.使用索引能加快插入数据的速度
# y/ N: I" p* w( q3 Z2 ], L2 uB.良好的索引策略有助于防止跨站攻击
; ?" O6 y& p! C7 BC.应当根据数据库的实际应用按理设计索引) P+ e! H& N/ D u9 C
D.删除一条记录将导致整个表的索引被破坏& i- |2 L8 Y5 r/ x; {- A7 S4 ]
E.只有数字记录行需要索引
# o: Y7 f5 Y( h @6 N" C9 Z+ a! U0 q2 a" @$ L1 L2 t
: ?- g7 @' T1 L; ~, d. j5 ~8.join能否被嵌套?, a4 {3 Q) n5 T4 K. D
! ~6 x' E9 k" Y3 _. }- B
A.能
; ?7 ~( V9 G2 ^0 L4 X& e5 tB.不能# m+ Q/ i. u" G/ x
8 u" W) g$ a1 D4 i
1 v" x, }, I* X7 V6 o9 d: H/ O' l9.考虑如下数据表和查询。如何添加索引能提高查询速度?
" ]% q' z/ l( \; Z4 |# g. z3 l+ [ _5 Z( v
CREATE TABLE MYTABLE (0 L2 f) A' `0 c5 {5 g
ID INT,7 I* x" V2 a, u) f/ W, i! ^
NAME VARCHAR (100),
/ v5 R6 D z: [: X( `- Z4 {ADDRESS1 VARCHAR (100),
3 b$ D) ?) {8 K3 o; {ADDRESS2 VARCHAR (100),0 |+ ~: x ~" E, |
ZIPCODE VARCHAR (10),
7 r: m) ^# m" t* t* W8 w, N+ j2 {CITY VARCHAR (50),
! p: {0 [& c9 A# q5 fPROVINCE VARCHAR (2)4 r* B0 F4 s; |5 w, m
)/ u3 x0 T! b+ B; _
SELECT ID, VARCHAR
' I7 q1 n- k* i6 T& C. D% BFROM MYTABLE
: w8 t5 T* D" K' ^) B6 HWHERE ID BETWEEN 0 AND 100, f- H: h2 d& U! b i* }7 t) ~3 n# F
ORDER BY NAME, ZIPCODE
; x, _2 f# q& L
; ^2 I! a" V/ L5 A8 Z2 y# bA.给ID添加索引
+ Y/ o( M! a) [; VB.给NAME和ADDRESS1添加索引
, ^, X) Y8 N6 l& r& u9 t7 QC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引3 a; _* ?$ T4 w9 a* [
D.给ZIPCODE和NAME添加索引
! A; e7 o$ j" i/ p5 W+ wE.给ZIPCODE添加全文检索1 A3 t& o, }- I: Y/ y2 \- e
) j0 c' n9 c: X% H2 L! [
/ f* c4 h( z; W$ @& K9 J V10.执行以下SQL语句后将发生什么?+ d E9 O$ t1 Q. h* A
: N( u$ r8 D3 z/ w! r( @. E& }BEGIN TRANSACTION% D, E# A) c3 L2 g$ Z/ t
DELETE FROM MYTABLE WHERE ID=1
3 U* s& w5 h) v6 XDELETE FROM OTHERTABLE
$ |+ L4 Y! a: A; P7 r3 W2 ]ROLLBACK TRANSACTION
) Z1 e# F' U {1 \7 [+ w: s6 C3 m) u+ I8 o0 q# z. m) i7 h
A.OTHERTABLE中的内容将被删除
" c; j" a, H* {B.OTHERTABLE和MYTABLE中的内容都会被删除
; }, J: T7 d3 qC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
0 O7 O5 k% |1 @# B6 J$ ~2 bD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化1 E$ p# `, v) ~$ N# }
E.数据库没用变化
* W# F% e8 b4 @' J( o, y# s6 B3 A
' A5 g) ]! i! Q( r, X1 w11.DESC在这个查询中起什么作用?
- r) I: l4 c! {- P3 n* i# e" j9 ~5 i; P. y- s" e
SELECT *) n6 x" o7 M: t: x2 b
FROM MY_TABLE( H" l: [' o6 `5 A {( U- N1 S
WHERE ID > 0
3 x1 \" x4 x* y3 }$ v9 EORDER BY ID, NAME DESC2 C* C3 s' K8 e1 e" b) @( ?# C7 ]
0 c1 n' k' E/ a* r; }3 GA.返回的数据集倒序排列9 s" z2 ]: H p/ I/ A/ Y
B.ID相同的记录按NAME升序排列* R+ t) Y# n) R" r; Q
C.ID相同的记录按NAME倒序排列
1 G+ r1 q2 q* d( gD.返回的记录先按NAME排序,再安ID排序
7 _/ |4 p# h; ]* q- k. n, N9 vE.结果集中包含对NAME字段的描述
; G+ M" u% K1 p$ e; x# X" ?3 }
- t# e/ o6 ]2 W, v$ J2 d6 U* m: u0 n T% @3 D5 z+ w
12.以下哪个不是SQL函数?
& n' L) O, t( _+ v3 S* t+ c/ F
' o' S! Z. m" T& R8 oA.AVG7 O6 p5 G! o: [" N3 _ e+ k
B.SUM( \. O6 @: R1 B5 @
C.MIN8 ]2 C# v# J5 V Y3 S8 W' G5 Y
D.MAX) B `4 o, D/ l/ u- n" b
E.CURRENT_DATE()* W+ {- X' D. m U
, s' g% L8 D' \, l, ?5 E* I r! y
+ V! ~6 b4 i/ T' }: o13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
! L' [7 c3 [- n1 F' @
2 @+ a7 W) F# q# i0 uA.该字段必须有索引6 r9 t3 t' A @. S4 X/ T, t
B.该字段必须包括在GROUP BY条件中
: w$ `- M6 W, }& KC.该字段必须包含一个累积值
l t, R5 c. D9 h6 f: |7 JD.该字段必须是主键
, ]) X# M& G2 q6 q) FE.该字段必须不能包含NULL值
1 t9 e/ P* A* ~7 d" c( u5 e
" n0 ?+ }2 R1 i, T- y4 d% s% f: P' S! [0 h& h3 f' C, r
14.以下查询输出什么?
8 z6 I% {( s- E; o4 a
% t5 @$ \& Y9 X8 O- q( x/ NSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
; g; n; y+ r$ d! T" o! r9 |ON TABLE1.ID <> TABLE2.ID
2 e% \9 ], ^/ P! u$ Y$ J
7 e1 M' P3 q( ~' \+ H+ }* o! V5 WA.TABLE1和TABLE2不相同的记录8 Z; o) R! b! |3 _, z
B.两个表中相同的记录9 t2 `$ p; u; x1 |- m; L
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
' _2 t# }" W6 tD.两表中不同记录的条数7 I7 f$ x, A( {- ?
E.数字21 x# A% e3 }) x7 A8 l* O. V# C+ C
# u5 I( R! T; M# g6 q3 I1 o5 G
" w& m2 v7 }3 t; `' \4 O6 W& q+ [15.______能保证一组SQL语句不受干扰的运行?. ?. f6 o, ]4 E( V8 ] [4 q9 x
# `- P5 M% O$ |+ I9 K# f
答案:____________: e) V# s3 E- o( Q
7 k5 j3 n% `4 m1 |( ]; |' S' I/ j" v" X
; m6 X: P* \+ I6 }9 N4 b答案速查
. ~* C) I3 E$ u6 y1 W& I1:BC
4 d. n$ [$ R8 ^. X9 j2:WHERE% F+ f! @. E y3 k# d' L: s
3:B4 s9 t) U( ]* ]* v
4:E
' ~, _1 V3 y, R" x/ j5:BD' V, A. j9 w& V! s
6:INSERT, r( Z! V+ `- k4 q1 m/ P j
7:C. v6 I9 d% l y/ U$ u9 O2 B
8:A
9 H, v7 P4 Y+ w* D, Q# `9:C; d1 T% l4 ?! n
10:E3 M0 r3 |! L+ H: I) i; m
11:C, @8 K2 L- ?5 [4 t
12:E: v4 ~0 U( o/ i9 }/ `* W* z
13:BC
7 G8 N5 I( y' C9 _9 c: H6 p14:C$ @' C2 r& C, s, L4 A& f1 N' o4 O
15:事务5 G& U- v5 |1 S, U4 Q! V: a) b: J
: C$ `/ h8 x: }; r' n$ W8 i3 ]2 G, }: h6 W
2 D0 K" E% |) O' f6 M4 P, K4 C
答案详解
+ B& E' X1 I9 m/ J: f | ]- P* E# n3 M% T. s: d
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。0 h" H( Y1 Z* ~8 e( B# ^2 j
2 i: w6 ^) H' U* P9 H, Z! w! ~, O8 N
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
! i( X; B7 j: B3 W1 o0 J8 b5 |4 r0 E0 Q1 K5 O
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
9 x5 z3 O% G- M7 E+ ]$ n
8 Y$ s. j& W9 i! ^5 g$ s; f4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
; a# [! q5 L. k! f( Z2 W" p- w6 U! E, z1 z' H! D9 s; p
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
0 X* J: A; w1 j( y. q' [
+ D' x& H! B' J3 j6.答案显然是INSERT。
# p/ H" @6 \4 V. k' Y) r5 L, _- M# `2 u5 T+ z' z
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 j! y) W8 t/ r
! Y% w" ?2 c0 v8 Z9 @8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。7 [* } _+ d% _, r' m. t! q
/ q1 N+ _* j% F9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。* {; `) T; F0 u9 N+ m
2 v ~5 J0 W/ I( j/ U
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
; P1 }6 ^ f- m$ N& k( m5 G, C/ r
& c8 l7 [! N5 Q11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。8 M& {+ b. J& H
) h {9 J1 V! E12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
& |) ], U) q6 @7 V4 s* |2 _) M* m! P4 g7 B
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
4 ^5 \8 T8 X5 [( C8 s8 x: z6 o" h0 w6 {* y: b8 K
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
) p( @9 S' a, X- w
' R- Y0 D/ E. F; \" ^9 \15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|