  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14189
- 金币
- 2385
- 威望
- 1647
- 贡献
- 1333
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。8 o3 h- d6 x8 G# }) ^
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。; ^0 }% k, k6 c4 d/ ^; I7 C
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。' G+ b8 g, Y* P# x+ B a
' L) W7 x/ b0 ~) J
. f' L a+ F- p# f, j
问题
, t7 u$ v3 u" o/ x" ]5 G
! Z2 Z1 t0 L/ q1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
% ?3 ~8 q: W' t; p2 ]! K7 C! @* v9 X; S& K4 E" H, ~& |5 Y8 c& J
SELECT * FROM MY_TABLE
# J# w1 i2 r# }! M0 d' Z) J# k# h
A.如果可能,用把查询转换成存储例程
( f+ ^' ^+ T) G6 y8 h8 O* uB.如果程序允许,给查询指定返回记录的范围8 e7 [" Q% A8 |3 y+ A+ R1 S/ J
C.如果可能,添加where条件
' g- k, |" I2 I4 ^+ s1 XD.如果DBMS允许,把查询转换成视图+ N! H" P% L7 ~3 I J. l
E.如果DBMS允许,使用事先准备好的语句
7 V$ ^! S" C4 x: W4 M1 G
* A: R8 p0 N( r& p
* Z' m8 I: S- k8 e5 M [/ O2.可以用添加______条件的方式对查询返回的数据集进行过滤?$ {0 u$ n/ N. Y! o
z) Z+ a% \+ m' v& x R- Y6 I1 U答案:____________! r f6 e: c. f4 n% o k# s
K8 k$ ~# \4 ?' J# J9 q. T
* V9 ~1 v1 \! ^& V: F3.内关联(inner join)是用来做什么的?- z2 t0 i9 H$ N% y8 W
8 d/ C* c4 R8 A( K1 N$ A/ @A.把两个表通过相同字段关联入一张持久的表中; v0 q* q* K. r1 ~5 A
B.创建基于两个表中相同相同行的结果集0 I# M# ~/ `, ?9 u! v# x
C.创建基于一个表中的记录的数据集
& q8 Z8 P0 g/ _0 K# ?6 sD.创建一个包含两个表中相同记录和一个表中全部记录的结果集7 ` ~; z7 g# H C- S/ \! }5 r
E.以上都不对! R. I8 x1 J+ G
6 ]8 j1 Q) E/ k( _( [
) ?3 u5 j: |4 N/ \9 E4.以下哪个DBMS没有PHP扩展库?
7 `) E3 z6 z6 A* s
, L- F' G$ Q: V* \/ i+ J" C1 [% vA.MySQL; s$ P( {2 p ~4 s
B.IBM DB/27 H5 u7 ~7 d* |$ s
C.PostgreSQL ]: q- H, {+ f# A/ E v
D.Microsoft SQL Server7 l2 n f3 k: u& O
E.以上都不对, M) N/ @1 R/ o/ u, z3 B$ G
1 c. b; [$ V1 E3 j9 ~8 i2 j
5 X6 e' Y% H8 s; @% u) Q: W8 X1 ?5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)8 o9 r8 Q4 F7 j* Z I9 @1 }
n3 V8 Y x0 ?) v+ L/ K
<?php
& t5 n7 b) z. c: {$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
# Q& W) V6 N f6 M7 ~2 {# P# _?>
& N9 w- P1 p5 q& P. z, i2 N3 Q4 u; \) m; C( x: p' S
A.MYTABLE表中的记录超过1条* g6 t; L2 J: i* Z3 u" m
B.用户输入的数据需要经过适当的转义和过滤$ Q5 C' C- o' X8 O5 U$ e) l
C.调用该函数将产生一个包含了其他记录条数的记录
6 ~' n; |$ P8 Y0 i& O2 f. JD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
Y0 h: B( o5 |8 }$ S8 ME.查询语句中应该包含数据库名1 b( E5 N) f& O2 B, X8 |5 h V
3 [$ `7 L) A4 j
$ [6 k* z& P. ~- q' G6.______语句能用来向已存在的表中添加新的记录。
' ~' R& A. p( [: B: ^5 o* N
" \2 }' f( V P3 a答案:____________
6 d {9 V' J% f" x& R9 T* D) h2 s
t% E( N0 T& N4 S3 b' N- E
. C# ^" K6 ~- y8 P: E7.以下哪个说法正确?% f/ F0 k' F3 A+ ^2 W. @. }
4 ^8 r" A0 l0 kA.使用索引能加快插入数据的速度
0 x; {3 j; c, I- v4 J) [B.良好的索引策略有助于防止跨站攻击
/ ~3 H0 X G/ F& P# G, dC.应当根据数据库的实际应用按理设计索引
2 c+ L! M( @" SD.删除一条记录将导致整个表的索引被破坏" T( X- R* p5 s0 E, E9 S
E.只有数字记录行需要索引3 p& s- D5 V. o* m8 u+ f3 k' R
% H# T8 F. s+ @/ w8 N8 v
( G+ y: x8 v3 P: K8 a0 H2 E8.join能否被嵌套?
" {3 d# ~) G# g# e
' t, n# O+ [7 K6 nA.能
7 M, Z$ O( }4 |" y. q+ \B.不能
. k6 V) k, w+ E9 H, m# C5 f1 @( S7 P; q/ q
% Q& }$ Y2 N" W/ q9.考虑如下数据表和查询。如何添加索引能提高查询速度?
/ I& y. q1 ]2 d& e$ J+ q5 r- ~$ g0 u. u+ V$ P
CREATE TABLE MYTABLE (! y3 Y( K) v% z7 ~) A
ID INT,
+ \+ d% s, A' Y% S. F6 h; S4 oNAME VARCHAR (100),
# K( D1 e+ C3 v; [; NADDRESS1 VARCHAR (100),
; ^) P1 C) ]" XADDRESS2 VARCHAR (100),
) w; y3 i, F. U# ]5 pZIPCODE VARCHAR (10),
% W& E. L7 l& D8 X: ]) [CITY VARCHAR (50),8 b% ~% ?5 f: U. ?
PROVINCE VARCHAR (2)
0 K6 e! Q6 ^' j7 k H& t). C+ w* ^' U/ {, |# d
SELECT ID, VARCHAR* q' U; m9 z& ~: X5 @3 g" v
FROM MYTABLE5 A' Q4 W! _% v! k: S" W# z, X2 o o
WHERE ID BETWEEN 0 AND 1009 \: T h* y3 k0 C1 b, R
ORDER BY NAME, ZIPCODE: l. ?5 j, B6 |/ u6 G( n6 q
5 |& S0 i7 l8 b+ X" [A.给ID添加索引6 N! ^( O4 B! g* `+ R5 ~! Y
B.给NAME和ADDRESS1添加索引3 s6 F+ v( A/ ?) R/ s% M H
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
- V- ?5 H% o1 p5 f3 n( I) d; G2 AD.给ZIPCODE和NAME添加索引7 I1 h5 `+ @3 r
E.给ZIPCODE添加全文检索. l3 H' I( D, I2 V
( _7 D; }$ O: U+ u8 I5 X, n+ K( [- E) M" G; S
10.执行以下SQL语句后将发生什么?7 l& S3 b& j8 M( J
+ A, n) F. a& C& n3 \- w' z2 x, NBEGIN TRANSACTION
: E1 I' }! L& r( g- dDELETE FROM MYTABLE WHERE ID=1
, _! g3 e) J0 W4 f+ r+ W gDELETE FROM OTHERTABLE
$ }8 ^5 p5 n& l$ X; |+ oROLLBACK TRANSACTION$ v. \+ w, Q. V3 D1 F: d3 D0 V
$ \/ Z0 a/ z8 X% g2 X' d
A.OTHERTABLE中的内容将被删除
5 O1 E# Z. C: ~7 T: z! H! ]5 \B.OTHERTABLE和MYTABLE中的内容都会被删除$ q. o9 ?+ u. D6 o1 i7 C
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除0 ?6 P) O$ x8 Z8 ~7 z- M
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化6 Q7 T7 j+ ?9 u: a/ [1 q% W3 ~
E.数据库没用变化
& M; U! L/ p, J& P' Z* [" j) i# q/ o
. d9 n4 m ^& t" w
3 P% t/ c8 i" m& F11.DESC在这个查询中起什么作用?+ y S: r- q% W/ T" D/ W
& t' s9 e$ H% V0 j' N+ c! {: }+ Y
SELECT *6 B2 g; f8 H) j d0 R
FROM MY_TABLE
/ [* v1 _ S" ?" d" _8 ` c7 s* bWHERE ID > 0
; f( r2 }& I0 oORDER BY ID, NAME DESC( d- J q& R$ ]8 S9 P
( |$ I9 [9 p7 Q j6 }1 {6 `5 H4 ^A.返回的数据集倒序排列
% S# V$ L4 |/ ^0 L+ [B.ID相同的记录按NAME升序排列' k: g9 L; {. \
C.ID相同的记录按NAME倒序排列/ ?. e+ W: s/ X' i7 T* \+ N, h# F
D.返回的记录先按NAME排序,再安ID排序+ p* ?* B* u6 S+ E P# ]
E.结果集中包含对NAME字段的描述, r1 V5 W6 ?8 u/ }- S1 i
. G6 X% |4 ~! z! g5 q; _/ d
$ N; @1 s: w7 O$ M12.以下哪个不是SQL函数?
% S3 _' C- B3 \( K! {( y. \
8 L8 z/ ]$ a/ V: lA.AVG
" F+ J( y$ | D+ dB.SUM
+ I! R& g* ^6 i' O% yC.MIN
/ i% p; E1 j6 p( o. UD.MAX' G# c" j0 R2 V2 v+ k" y
E.CURRENT_DATE()8 I6 y! v# t2 e! e+ s: U
4 q- ]. p1 M2 e" Y
' k1 x1 u( u8 W13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
/ p, ~# y* v4 a6 p
# ~. K) A3 `2 c8 w' D& Q8 RA.该字段必须有索引' I5 Z4 |8 H l3 s; W
B.该字段必须包括在GROUP BY条件中
1 d8 r1 V8 \! E RC.该字段必须包含一个累积值: p8 C* c- N5 a) `! m: S, ]$ z
D.该字段必须是主键
2 l' n2 d0 T' k* h! h8 \E.该字段必须不能包含NULL值
2 [$ c9 o2 W1 y* j" s+ Z9 X
8 `' p* i8 @! d' R% D8 g
7 i6 n+ G; L( h* l6 |, ~14.以下查询输出什么?
+ A8 E. j4 p$ v9 N
3 _$ ]; k; H! @2 x) B9 R$ _- RSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE25 Z# f |8 j% s* }
ON TABLE1.ID <> TABLE2.ID% Q: F( Y$ c# ^
" s( V& B: H, ]) r
A.TABLE1和TABLE2不相同的记录
, L0 n2 v- L$ ?9 U9 ^B.两个表中相同的记录7 F2 {6 S/ A, }- F" M$ O! e
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
6 h2 i G( x( u0 b/ O- C8 i5 r& ^D.两表中不同记录的条数
, D: W( w% T4 PE.数字2* A+ g F$ O* f8 A; W2 }
. V6 F# h3 v* j5 N7 a% Z4 k K0 J! E$ F5 |4 A/ K6 ?% A/ }. }8 k, T
15.______能保证一组SQL语句不受干扰的运行?
5 [+ y* ]) t3 a- \) u
, y( z/ z) `7 D( l答案:____________# `6 `% }4 k, K& j
: r0 r% s1 f- A$ _- N( q5 ?& z
/ ?! G& N4 a# p+ F: a
- ]/ V% B+ {+ Q- }! ?" H2 p答案速查, Y& ^5 @9 M5 R' x
1:BC' Z, o O. q4 @( h# M: ^
2:WHERE
2 x; X: @ w( K; H1 ^# d% b3:B+ t: Z6 ]/ H& I0 ~
4:E. [6 C* m3 N. f/ U t+ s: U$ U& X% U
5:BD
$ P" Y2 C! d. J2 Q2 K5 r6:INSERT
3 g3 H1 ~1 n/ `% @3 _7:C9 c" Q* t0 }" N2 f5 g
8:A
, E& b/ O" S7 i% W5 i9:C$ a6 }5 g+ q8 x9 N
10:E4 F" z d6 w) \
11:C' H$ p: F2 D1 A% E i: e. a6 u
12:E
3 t+ j) W" r2 k. T0 p ^: r% s' z13:BC
/ M) p; B s Y7 Z! o14:C6 s2 P4 }1 V Q7 U2 B9 t
15:事务/ C' v) r! N% k4 I( Q
o+ q) a$ S z. ?# _6 C% _
" v& | z, V% s( ~
3 _/ ]7 M" p0 I/ h, ^6 ]
答案详解
, h# b) a0 r5 d
+ w- [# E, O+ J6 R+ Z& M1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。- m, ?% k6 Y7 k0 p& c
4 y4 Z0 U# f4 L4 C' G7 X! r0 L2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。# Z5 O/ c# J9 B& T8 v+ E. {
5 R1 o0 M4 w: m4 V9 S7 w
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
3 j" ^% Y. T. C
0 j' A- I# e0 {6 D" M$ V4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
. }; M* s) [# G2 P; e, P* V
: x# F! I Z/ I. q5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。" U' F2 V+ V( b$ y3 N% I
! s4 H7 X$ s% X) Q9 m4 U! k4 J6.答案显然是INSERT。, c. F% P. R8 q' d% ^* O3 D4 H% A! q! @
- ]* C( N5 E0 Y7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
% U$ q. l" z" i+ g+ t/ U. L6 v4 k! ?1 Y$ Z2 i$ v2 x# M
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
+ n2 W& B# E* e# M, Y+ Q
8 s& o6 o, [! C9 p9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
' J. r9 R9 I7 E& v9 v+ I) C- l3 n0 s% J [; g b* F6 T9 ^
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。3 p8 a v+ O% d" u
& N5 m5 c5 @ ]6 U11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。7 O( `& S) R7 y4 c9 `* K) g
: W. e- V6 H7 D' ]
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
. ~& L9 R( D u# F, s' X! m! q% m8 |* |% l6 C, u* }( e- i
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。6 H# z+ U! }1 ^1 D' u. s2 ^$ N
& U" Y, G- A- k
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
" M' T$ J, O" ^- B8 `. Z* u8 d. L% J4 E# R9 F8 j3 n2 s
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|