  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14159
- 金币
- 2370
- 威望
- 1647
- 贡献
- 1318
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
; E" P/ d2 E) h0 d8 A( ]PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。( w+ X2 a9 x: [3 O
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ C1 f0 a2 ^* O( B
; h9 P$ z/ z0 c' L; x: W* |' g8 K/ y: K# Z2 d
问题2 T, H) A: ~ \# T% R
- q9 }* o M! {% J
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
' @6 o% n, L ~( x
, F9 M, J# I3 ^) c4 }- j6 J3 `SELECT * FROM MY_TABLE
& d% m. o5 t: v1 }/ E! b" W" O
6 t$ m) U' N# O! @/ y; B1 A2 a8 tA.如果可能,用把查询转换成存储例程
% q' K+ F/ a% t% cB.如果程序允许,给查询指定返回记录的范围
# M3 J4 o6 W# NC.如果可能,添加where条件
- n3 V0 i/ }) c T& HD.如果DBMS允许,把查询转换成视图
* D- U# e2 v) {E.如果DBMS允许,使用事先准备好的语句
: W& x8 n; W6 B2 ~6 M- |1 Y1 d& v B0 D$ l
. h# n% ^; T5 {6 Z2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# Y9 j- p. g5 g! b4 w
1 D$ i9 n) j% E* T答案:____________
2 m2 y+ `1 G. s) p! i( ?- O# L8 U7 Z$ _- r: V$ ?' |* K* Q
& N' z9 S. j) q7 O3 S3.内关联(inner join)是用来做什么的?
2 F' l; {+ j5 ^! K
2 C% |4 k/ r/ lA.把两个表通过相同字段关联入一张持久的表中
" J7 T: t j; b- _! \B.创建基于两个表中相同相同行的结果集
( G2 G i0 c4 }$ B6 \4 vC.创建基于一个表中的记录的数据集
6 S; Y- a) H: @. A, S* Z0 a8 V. lD.创建一个包含两个表中相同记录和一个表中全部记录的结果集) _0 {2 ^4 n; L( U* m
E.以上都不对! X/ r `- n% V& K& q8 e ]: M
7 o8 f k+ F. O( _; R1 X5 M
5 c: D; U: B5 |; I# A m
4.以下哪个DBMS没有PHP扩展库?# Z# T. X) K) k; m
+ p9 \6 I# {' \! s7 n) S1 `A.MySQL
9 g4 _4 Q# K& j& FB.IBM DB/23 B, G3 j9 ^, g5 V3 B
C.PostgreSQL
2 a$ g; I2 c6 q8 AD.Microsoft SQL Server
9 D* S6 m3 [% V) T' sE.以上都不对
( e" d, d. f3 r+ q2 @. }/ T) ]& d L, s! x
$ Y- S3 T3 B% r2 p3 _* z2 f5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
2 t3 |0 L# {6 [3 B+ J- z0 T( M% ?5 x& Y. V. X) v+ C
<?php
`. H5 b7 S( [! K$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);8 P, s+ \8 A; d' Y; R2 E K- R
?>- Z9 N: W4 q) O0 N7 g/ i. d1 i, C7 ^4 j
: t& D" S/ W0 y/ H( o: BA.MYTABLE表中的记录超过1条' h9 i, Q6 a* A& T! a: ~' [
B.用户输入的数据需要经过适当的转义和过滤 I2 n- e% T9 |1 ]* R+ c% ~: `4 I$ X
C.调用该函数将产生一个包含了其他记录条数的记录. z0 w9 J0 O$ @3 M
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除% z) l, @) F/ Y6 O
E.查询语句中应该包含数据库名; p X0 R) r( y! q
' }2 @6 S% b' D4 X P; i( @; B- v" w, Q" W- \
6.______语句能用来向已存在的表中添加新的记录。! L5 {$ H1 s; O5 X
0 J" q$ w) d' u" g* l( W答案:____________/ R* B8 T) q# A4 f
: Z) s& @- E, C5 R9 n4 p# ^
- x- q$ N, k7 b( r6 F
7.以下哪个说法正确?
% ]" u0 T& Q$ K4 [
, F: a. T! W1 IA.使用索引能加快插入数据的速度
2 ^- s. P7 G0 ^1 d; v; g" OB.良好的索引策略有助于防止跨站攻击. \$ w* T$ P' u O* n% U3 J
C.应当根据数据库的实际应用按理设计索引
! J: M @$ n; T4 ^0 q& kD.删除一条记录将导致整个表的索引被破坏
( e! c+ P% D% [$ u" m) mE.只有数字记录行需要索引
# l( i/ E. f7 T5 w" V" W
$ S4 x& l: k6 G5 X
: ?; J% \7 u& }6 g7 q) \8.join能否被嵌套?
5 c" Q# N5 R( [6 Z
" z, D6 _: |* {3 \) d3 @" XA.能
5 O: [& y% T! K4 g1 l! `B.不能* r$ J; ?% c w* G K( I* v
, `9 x# }+ R! t6 X# W, l8 a
0 W1 y+ W! R2 u
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% p& m/ [4 R9 n" K& l: C4 o+ v2 I1 p: Y7 G1 K' T0 p9 g
CREATE TABLE MYTABLE (: t- j+ m( Z o$ Q& M9 d0 S
ID INT,; [/ u7 w1 F# q+ c
NAME VARCHAR (100),9 z5 }3 N3 w8 G+ u: J1 f3 e
ADDRESS1 VARCHAR (100),4 x; X+ N$ a- S2 [6 v* | i7 ~ n# _' P
ADDRESS2 VARCHAR (100),
& p8 x9 d1 c" _& F& R( S! R3 IZIPCODE VARCHAR (10),5 s. R4 [# y7 V* n' i4 g
CITY VARCHAR (50),. L& G8 ~0 S0 z/ R+ H& e; f) P8 S
PROVINCE VARCHAR (2)
+ k, s' ]& s% I, e)
: @* V. q8 D3 USELECT ID, VARCHAR+ @$ ~: l, k6 h
FROM MYTABLE2 X% R4 c/ `+ f
WHERE ID BETWEEN 0 AND 100
2 j! Q$ G* R3 YORDER BY NAME, ZIPCODE5 n+ M0 x9 e# z
* C0 N, K0 M9 f! L3 D4 i6 r. SA.给ID添加索引* j' z+ O5 D1 w& D. I; t
B.给NAME和ADDRESS1添加索引
7 t6 s7 J! k. U4 L4 NC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引/ G; C5 m( r& Q' g8 _. H
D.给ZIPCODE和NAME添加索引
" R) [. w/ m1 }+ X8 J. dE.给ZIPCODE添加全文检索5 |. [; e& @9 m7 b
2 s8 w2 B+ R, [* n! b) ~% |& n
; b9 F4 P `* z/ u10.执行以下SQL语句后将发生什么?
6 z6 I: g& p T
3 R: r! u7 v- }; n/ F0 RBEGIN TRANSACTION$ B8 _7 [$ i9 V
DELETE FROM MYTABLE WHERE ID=1( o& Y( Q$ [3 b$ m0 \! W5 K! w) a
DELETE FROM OTHERTABLE8 t( R. ]- @+ e
ROLLBACK TRANSACTION
& H% R" |, _# u: y: D4 I4 B: h3 ?; k2 _, Y9 z1 \# E
A.OTHERTABLE中的内容将被删除
9 W: o/ w6 q7 P5 _B.OTHERTABLE和MYTABLE中的内容都会被删除
9 T/ ]$ O- h) }4 s: Z9 w& xC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除 J }" W" s/ B2 ^: V5 y
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化* z- N, |% m- m+ |
E.数据库没用变化
4 u# [: x# M7 f+ h0 I; F1 b3 o
- }9 T4 z2 l1 V" F8 X
$ R9 U1 {* F* l1 d* U& g" L2 L& o11.DESC在这个查询中起什么作用?* N1 r0 }! L4 r1 [" ^/ O: A
" f6 b8 p2 h/ L. P" hSELECT *) N( \9 i2 X% E6 Q) e: l% Q
FROM MY_TABLE: ? J* k Q2 a7 E$ |' l( t% ?# G
WHERE ID > 00 z& n4 X1 G/ }- Y+ l% {4 _4 M8 o
ORDER BY ID, NAME DESC
0 Q( m; \" L& P; R
# o: Z9 h8 \6 p9 j% sA.返回的数据集倒序排列9 M# I/ z* Z7 g) l& H* T0 u0 E) u
B.ID相同的记录按NAME升序排列# D9 W9 E8 i- J( j8 n$ ?& k
C.ID相同的记录按NAME倒序排列
! J( e; ?, c+ i! ^/ I' rD.返回的记录先按NAME排序,再安ID排序9 D8 J* A+ o1 I2 V
E.结果集中包含对NAME字段的描述
' h, w" e) n2 Z6 \2 a+ U& L! @5 R! G: k
6 V" [' v& I1 r8 w" D12.以下哪个不是SQL函数?7 ]. M% g* E# G; I
* \: T* f% D9 H# w! \" JA.AVG0 ^# k* E, p5 M) ]# @9 f
B.SUM
( S8 Y ~) h' r' n4 {" tC.MIN
* b0 o: I; g$ [& Z' U* M* [9 kD.MAX
0 @2 w1 w8 \* D5 lE.CURRENT_DATE()4 v5 y: p6 V2 A) `& f1 }
' V/ c- F/ ]" [7 Y" s# \& H
! a8 ?; V$ m% J) P5 D# H13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
5 Q0 k1 ^1 d( z$ M0 U" l
2 z& V) w: y4 s. C% j* q/ lA.该字段必须有索引# X2 B, ~) X- ]
B.该字段必须包括在GROUP BY条件中. C7 ?# K# j2 [8 W- m
C.该字段必须包含一个累积值
$ p# ?! O( M: N- | N3 J. uD.该字段必须是主键
. R; K0 H t5 q( U& j" vE.该字段必须不能包含NULL值; I4 ?0 n6 |& t6 n1 ~( g5 w' G
. X3 E5 U& [3 p( n8 E- G8 }
2 [8 v! P y/ t14.以下查询输出什么?. u+ I6 y4 Z( e4 m* L
( \+ @7 i( L) h( fSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2, a4 f% x9 s. l7 o8 D
ON TABLE1.ID <> TABLE2.ID
3 ^& n; o$ h8 ]: `7 J) B0 `- ?2 f+ {4 Y; H. D2 e' J& z7 }
A.TABLE1和TABLE2不相同的记录4 D8 B: d4 T4 \( ?% d* C7 ?7 t% r
B.两个表中相同的记录
) d- ^( p6 _+ h/ k D# I( `0 YC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
0 `8 L8 Z& q [" [7 jD.两表中不同记录的条数
; n) w( J P+ j7 {0 n% M% }E.数字2
' k# j g8 d' [0 L. S3 L# Q) Z" q4 q8 A) i" F" A+ I/ j
& T( A# X; u+ L! {# O* m
15.______能保证一组SQL语句不受干扰的运行?
9 s3 m# o9 r& S. ~) V& B' z4 k/ e- f& L; O
答案:____________
- e3 a6 I5 K/ D# {) i8 x6 U' p' o( K' Q4 l( Z) j' y& S5 V2 M
* x. k! T9 v3 M8 Z! ?
% d8 N: a9 R n& |. ^
答案速查
1 h$ \) o1 c, ~1:BC
8 Y J, A! z1 @% a% M2:WHERE
6 O( N1 u" Y: R7 }9 ~3:B
1 F; M: z! n, G% {7 H4:E
/ J) \: V6 A. T2 I' k$ A5:BD1 Z/ L5 P& |! P/ w
6:INSERT
- @6 Y, J P# @; T, u! E- F4 u7:C
4 w9 w8 r3 @9 s/ B8:A
. \* {# A# G8 E& R/ o0 y1 z X9:C: U& O) \2 y" }" F$ u' K
10:E$ y6 M. A- v$ h" M! o, G
11:C8 r: x$ {' Y7 |
12:E
8 Y; _1 |/ D& e13:BC9 t/ @ O3 t8 `1 e4 a. u" X
14:C& {. V+ v1 D& g' I
15:事务& B$ t% u/ l) w! a
& |# f5 P( D+ X1 f. e' o
9 u E/ R Q! t9 O h
1 R* A( K" A- n" m3 w! X: m, _% b% V答案详解
4 q: D. y8 F5 H3 H0 c c$ z9 n2 P9 n$ z" w3 O1 B* W
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。! s% O7 E* n" }) K9 `. U
! H7 T/ l( {' }; \/ _/ K
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。. L, r7 l5 j _8 B+ {1 n( G
0 }" i( [0 ~1 i- X6 @
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 c* V, b, e) G* R1 J
! i K" e, O- t. l
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
* I$ s$ b+ N4 i
/ N- N' h% g& @+ S1 I3 j5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。4 B H; l. a! C$ ] I
( x1 `6 Z% V; [6 }
6.答案显然是INSERT。
" C# s3 m* U1 G3 S
8 ]6 I; Q j9 F3 G7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
# C/ W$ m4 Q* Q; y. H$ \
& m0 Y7 b- }+ Z- ]' @) `1 a5 x8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
5 ^- Z+ B. X6 S7 l. ]- q5 H4 r/ g5 t" t y1 {' `
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。5 C* x) i8 v7 {
% V0 Z' H, v: w* Q) J10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
/ @% d. [) H7 N- h0 M! B) {
/ M, w% q2 s9 O11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。) ~) K9 n7 k5 B* P1 Z# Y5 X& `
# y n) D4 ~, B) y! d12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
5 q4 N. p1 w' @$ w' y g( k" e; j$ K* K3 l& Z' a0 @
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
+ q3 ^: b; M4 m6 i0 e. i) Y* J8 u9 |+ j7 R! X2 x
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。8 n& ?. U A6 F- m
8 _7 V) a7 P- q' ^* [" u9 F; F, H
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|