|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14325
- 金币
- 2448
- 威望
- 1647
- 贡献
- 1396
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。8 \+ y7 ~' e( y, N6 ]: Q7 ?
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
( z7 L; I$ a) n, z本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
! E9 m Y2 E9 G* _8 H$ i# i
% j6 ^: h) H3 o& i( U# ~+ w" C4 {; v5 Z& I5 ~ i, v1 I
问题( w) e9 m# a5 o: g
8 c# l8 ^+ \* l0 }1 b$ c1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)5 L' r2 k3 H( b, V) }
3 K: `# X. s9 i, ?( E
SELECT * FROM MY_TABLE( Y' ^" c' `4 b0 \& S
; F* u" \ F& r$ t4 u% Q$ lA.如果可能,用把查询转换成存储例程% {2 e# H O3 n4 P5 @' D2 p3 R) h
B.如果程序允许,给查询指定返回记录的范围
0 @; w& t% h0 RC.如果可能,添加where条件3 S) v7 T7 N9 d/ k+ U% L
D.如果DBMS允许,把查询转换成视图5 V- v6 m! D8 s
E.如果DBMS允许,使用事先准备好的语句/ P U4 l7 ^* v0 }0 \# K) B
' b' k& X$ J* U' Y! J$ m( \+ Z# f7 o1 Z6 e- B: v
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
" R# t( A$ |* C0 p
' N O6 s" u1 X- K8 O5 z# z答案:____________
" L9 |& ?$ e. n% g2 f* O
" @( T/ E6 _3 _! W; L; f
. k7 `+ r2 _ P7 u' b3.内关联(inner join)是用来做什么的?! o$ r/ R: X! ^/ _5 j
' m3 W' v2 j9 Y4 n4 l# r; fA.把两个表通过相同字段关联入一张持久的表中
5 c5 R! z3 U- n1 ~3 u1 H9 o8 xB.创建基于两个表中相同相同行的结果集
; e& v" G0 u2 O/ RC.创建基于一个表中的记录的数据集) D9 U4 k' b+ k9 _
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集9 {. s& e7 N7 Y4 l3 h1 E t
E.以上都不对' F1 z1 F m2 x+ _% c( `: p
d: o3 h5 G& Q/ P0 T7 z
& d( g, l6 `3 {+ j6 A1 C; c6 ?& M4.以下哪个DBMS没有PHP扩展库?
- \9 |# I& I# p" x. E$ G& F
' h+ a2 R+ c6 TA.MySQL
! r7 ?$ [' C3 ZB.IBM DB/23 ~* q' t$ ]2 r& d
C.PostgreSQL
& W k8 F. |- V! D4 XD.Microsoft SQL Server
! s, c |! P! l8 ]1 _7 ]0 `; D/ QE.以上都不对4 B- }9 r3 R0 W7 G- l
2 r6 t; j' L6 {4 |( B- l H9 Q7 d1 Z- W
: r ]) c. [6 h9 V! K1 s" z* f
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)' S* s' I# V ~
; x. P6 H% }! D8 r; p+ G: c
<?php% \2 {9 ]$ W; P, F6 v- x, C
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);% a4 e8 K$ p& D, e6 ~ ?) a6 q
?>; ]2 Y: f R' S O( ^/ c
: D( r# j) G9 }+ a6 t- GA.MYTABLE表中的记录超过1条9 |! z* ? q3 I" |+ R" O* ?
B.用户输入的数据需要经过适当的转义和过滤: s k; n' b, M! U; m7 B
C.调用该函数将产生一个包含了其他记录条数的记录
1 u7 A! R+ _9 S* H6 }- o CD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除) L; q& }9 S9 r$ v9 W$ c- u, g
E.查询语句中应该包含数据库名
7 {2 ~9 G* E6 W9 f% D
; M k, ?1 _/ S1 z6 e# B U
2 x7 I( ^2 k3 {4 [6.______语句能用来向已存在的表中添加新的记录。2 x0 H0 ]8 F$ r$ y, {9 S* b l
1 A X+ P3 P% @
答案:____________
1 B% j* H3 x& s) B) J5 ^6 \$ Q) j
2 X: ^7 d2 N* ]! T
( r, s) g# S6 _* A7.以下哪个说法正确?$ b- Q5 E& c: t Z5 {) [5 K
" }2 ?: M9 @, A7 a! `" Q9 u) C
A.使用索引能加快插入数据的速度
4 i+ X# D1 P0 I, d8 c1 QB.良好的索引策略有助于防止跨站攻击# l* c7 T" j, x* f0 |/ Y
C.应当根据数据库的实际应用按理设计索引
/ ~& m, K- n: P. ZD.删除一条记录将导致整个表的索引被破坏; L; s0 J6 `' B# f; X! C" [
E.只有数字记录行需要索引
9 | d0 r( U3 u5 f: l# c
3 {' t5 \ Y" R/ v6 F" d
& c p# F! d2 F/ d+ ~" I2 Y$ ^8.join能否被嵌套?
, O4 ]3 K6 a+ X5 q \9 c" F
6 U n I8 v: q, z2 {. ]A.能; u. G9 m0 R# v* z( a1 L( ^
B.不能/ r/ @' q) N0 ?" A6 r; W/ d# Y
" V. W; C* D2 y; A( v- U. L* m }
0 z9 n; R8 Q. ~$ M9.考虑如下数据表和查询。如何添加索引能提高查询速度?. j& C4 m5 f, B D: K- d; r; v& N
' z; h' B! b# B8 G' j7 N. c' HCREATE TABLE MYTABLE ( P/ `& y* n+ Y9 z
ID INT,
' k+ v; j4 B. W! ^3 I0 _NAME VARCHAR (100),& u# d7 G9 J! V$ F* |$ M2 r: Y
ADDRESS1 VARCHAR (100),
3 b( Q3 Q2 d. b9 J% P7 p; aADDRESS2 VARCHAR (100),
5 H$ `) G6 {& W9 O0 q: aZIPCODE VARCHAR (10),
2 [7 g0 X0 ?# a% y" _CITY VARCHAR (50),! D2 b( }- D+ m, L
PROVINCE VARCHAR (2)4 E. P0 h4 ]# A
)1 K, A p u3 l2 A( y
SELECT ID, VARCHAR5 L* v0 z7 n9 ]" ?$ z$ U
FROM MYTABLE
8 R7 T1 B" I( r1 |, oWHERE ID BETWEEN 0 AND 100
2 \- _+ l4 ^) Y& C/ n7 xORDER BY NAME, ZIPCODE& Y8 @& v7 j; w+ n; [4 R
; r* y% z; p9 K: jA.给ID添加索引
5 U. T& u3 b5 Y* k# s( ZB.给NAME和ADDRESS1添加索引
# i8 @! T @$ t; M& [2 N& {C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
) q8 U! N. `% O2 j' Y% E* S3 rD.给ZIPCODE和NAME添加索引 r% m. d6 k. s9 ^% ?
E.给ZIPCODE添加全文检索
9 c& i+ h/ n( Y
( _! d: P! L- S' \/ ~4 _
$ W5 ~0 F. ? i' L/ K10.执行以下SQL语句后将发生什么?
8 T+ [# J# ?$ i9 N8 y! z; m& _3 k8 m1 b N) k/ W) w
BEGIN TRANSACTION
3 p' j$ F0 _9 ]4 d' m& R/ KDELETE FROM MYTABLE WHERE ID=17 z; T" X ^0 _6 B4 K5 W
DELETE FROM OTHERTABLE
4 g0 z- i# T, E+ @( UROLLBACK TRANSACTION8 k& Z8 O" a( e N# Q/ ~
- v" k R3 a# Q, |; B: e9 J3 MA.OTHERTABLE中的内容将被删除9 |7 `2 T3 @% g+ C
B.OTHERTABLE和MYTABLE中的内容都会被删除
$ P: t% ]6 b& k* L/ ?8 QC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
7 K9 K1 {+ l) z( ?D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
l$ b: M* l1 E) t6 t+ V/ eE.数据库没用变化
% i# a5 w& c. {0 f# w7 S6 h# P1 z
; \& e2 z i1 f4 l* [9 [/ ]. g; M& l9 `; I' ?: m) z
11.DESC在这个查询中起什么作用?3 M" {1 ?' B0 }/ D, E9 O- w% M
' |; A. N, i% B( G
SELECT *0 {0 v' F8 j+ s4 t
FROM MY_TABLE
2 `7 P* Y9 C4 ~; z2 OWHERE ID > 0$ [8 c G& x; t1 Q4 r6 Q# v
ORDER BY ID, NAME DESC8 T3 s- x. Y- y/ a
$ f' Z1 h" M- j$ K9 J, s+ d' gA.返回的数据集倒序排列( X5 w, E2 o7 @1 n2 x7 g' f
B.ID相同的记录按NAME升序排列
: z+ l# r* G, C( B+ d" T" B# GC.ID相同的记录按NAME倒序排列
, j! k1 |/ O. k j1 M" ~: N7 M# f. eD.返回的记录先按NAME排序,再安ID排序1 j# b: N& c K5 ^/ u3 ~
E.结果集中包含对NAME字段的描述3 S2 h4 ]& v2 m. r
6 a. K7 W# k* w1 K' g' y5 z' g2 q$ u" D
12.以下哪个不是SQL函数?2 }2 ^0 ~% b2 ]& U9 B/ ~" ^
G& L, L4 P) S: i1 L5 x+ P: IA.AVG
% V/ N% Y/ r Y" I/ v% kB.SUM. Q9 s* ]! b- q% ~
C.MIN; p' R! N- X Q/ c5 |
D.MAX/ F4 U* C/ \4 f3 o# q1 V6 u* h9 ^
E.CURRENT_DATE()
) H: a) L; v5 \: }5 Y
) t4 V/ K( u! h }$ R- @) v1 h
- W' j, Q6 }7 K, [. h13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?* x3 |3 R/ Z: T
" L1 O4 D3 N/ B: V# gA.该字段必须有索引5 ]- `5 Y* I5 A( K+ T
B.该字段必须包括在GROUP BY条件中
+ K5 o" Q! o$ A+ U3 `- yC.该字段必须包含一个累积值2 k% g: k% h6 w6 b3 |4 P
D.该字段必须是主键
/ y/ b% w# V# `E.该字段必须不能包含NULL值" E8 J- ?+ _, `: S9 n
/ K: G" w( u- N" O5 Q2 j' ^& z* Q+ U7 G3 O6 _
14.以下查询输出什么?( M5 y/ W, n- @1 x6 h8 u+ [) e( n
1 n2 s6 b; |3 C C* M
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
" n$ p2 s2 J. {. ]$ }% |- tON TABLE1.ID <> TABLE2.ID
|1 x$ Q2 q: Z' Q* | j* b3 m! o2 I; _
A.TABLE1和TABLE2不相同的记录2 X) g8 f; s6 p6 Z$ g# Q
B.两个表中相同的记录
" u9 W7 b, v8 B0 `- {' l5 m0 zC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数: T3 {0 C$ B- @ x' H
D.两表中不同记录的条数
! {$ \. ]* u/ N9 r8 ~E.数字2
" W5 V! t& q/ s, _) N. N( a8 G# ~7 Y, A+ O. C$ Z1 j
7 v/ Y6 j( P% B15.______能保证一组SQL语句不受干扰的运行?2 S" h1 f1 T$ K/ [0 F+ z# c) A
4 V$ C. V- ^9 ~) D# @7 N( ` z答案:____________
7 W% q4 g9 F; w) @3 U! j% D, S; o. @% }/ C" n4 j9 \- n( V& f/ k
# j s: n3 x# e( r m9 R% e3 t7 { A, ~+ [
答案速查- Q; E4 M# ]5 }. k2 a, S
1:BC1 w' r. w \" l w- {1 n
2:WHERE
6 D- z# o) Q' j0 h. C$ h3:B
u0 p; @6 I# L0 [4 R4:E& c5 X/ k I3 a/ w4 K" A6 P0 i
5:BD
: ~4 D {. o: n- ?* m6:INSERT
/ z0 T- ]' `/ L' u, T4 z z7:C
- j X M, C0 E+ w8:A1 e2 J5 G) ?' c' n
9:C
: P9 j( T8 O W6 S10:E
' N% S8 H. Q. o7 I/ Y11:C8 N3 b% w7 a% @( D
12:E/ V1 v5 d8 f$ Z
13:BC
) O; W$ W' X" [% Z+ Y14:C O8 ~, ]- I% G" V4 d% Z: t
15:事务
9 {( q$ d5 k! c; T# x
$ n' ~/ `' D( H9 J) m5 e$ D4 f
9 D. m$ d% ^& g
( s$ m% Y9 s' l* s3 n/ R' Y, R答案详解6 w& Z8 l- j3 ?- `0 f( j: z
, a) P; m: L }- s
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
2 [" l- A/ s5 t9 \" R$ T( q% _/ h+ Y( S3 |! `2 @8 i
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
0 ?5 o$ ~# J$ A) y7 }7 O( D$ E0 @$ I. l5 B+ m. g
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。3 p2 ?' E$ H. `$ }- d
# I$ s* G: ?$ {
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。6 u V7 ^0 G2 v1 p- z7 m
* d$ Z& t0 H( a: l) q* a, ~) V; \
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。+ a1 A ]( Z$ s" w5 h
; a4 r: P: b3 _* M: C, _) P6.答案显然是INSERT。
3 z8 I. u: V3 I& M8 ]! i$ }+ ~5 C3 y B5 i- ]. L
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
% x6 s2 l0 w7 }- o6 o' C3 P
9 s9 s' q1 L( v: G6 N6 |( Z8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。* H2 A9 j4 u) Y; I
7 `3 I8 k& @- ]7 t# {1 u, K9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。4 C% u4 W% o2 A+ f/ A' f/ ?
, u7 V. t4 H% B: G- [) B4 v10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。6 U# O" R4 l! \8 p" ~/ _4 n J
' z" ]/ w, ~9 [9 M7 |11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。; ^4 W4 ^$ u% |# M% |/ m# B
+ D) B0 s( W; r; X M* |' X6 k6 c
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。( Z( V# ^+ ~+ X& Y* j5 i
. S) [' l# R% R U# r, V: n/ t
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。3 Q" u+ j; Z. n& d/ m$ g
- r4 J4 D8 V6 `. J& F' z
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。) _0 v/ y+ p% `( R
+ Z" w6 u4 e( A15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|