获得本站免费赞助空间请点这里
返回列表 发帖

[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
* U6 e! m0 P9 Q5 g4 r& o1 E8 e, [PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
0 b3 n; P, [4 P) x' `+ Q9 }0 y) V本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
4 \2 l# E; ^! l6 V
# W2 V/ h" X) D1 Z& P# A8 o2 Z- t# t* i3 j' \3 z2 l( G
问题
: ?8 g! M  E2 N: n$ y$ p8 u  T+ o" G! K; Q# P
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
, E- X4 d; e! d' Y9 I% u* `5 F4 q
1 L% z0 V- N+ E8 {6 hSELECT * FROM MY_TABLE
+ m! C! H4 q8 u: z6 e, [* F! @/ A/ K
A.如果可能,用把查询转换成存储例程0 M3 K; s2 m- @
B.如果程序允许,给查询指定返回记录的范围' G* ?- E; G8 d5 y5 ^4 {
C.如果可能,添加where条件! N9 h/ Q2 G# v3 W: y
D.如果DBMS允许,把查询转换成视图' C. M, N/ V/ y1 X
E.如果DBMS允许,使用事先准备好的语句4 m% R/ b" d6 V" y+ v8 t

2 t( d8 @2 X; o3 F" s
) M- [3 m* `0 {) \/ f* c2.可以用添加______条件的方式对查询返回的数据集进行过滤?
9 J* C( b7 K! B
7 i2 w1 B. C3 S3 O) j答案:____________
  ?$ J8 {* n( D2 c4 J1 c
8 ^2 n& j5 ~) ~, G: y+ a/ D1 }3 D9 u" S+ Y, f$ Z
3.内关联(inner join)是用来做什么的?
# O0 X0 A$ z% P/ e
% q* N0 D/ [: s& X& Z4 lA.把两个表通过相同字段关联入一张持久的表中
/ J9 K6 v5 ]& K. N0 _$ lB.创建基于两个表中相同相同行的结果集4 L: ]4 [1 P7 A. v  [2 g
C.创建基于一个表中的记录的数据集
) M1 {7 W! R& q8 o. }D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
8 x6 B, m% V9 _3 C( ^E.以上都不对
3 J3 n6 U, q% B: f* ^3 a( E+ L1 L& y- @1 h' C" M+ v  q" i

8 m& C% w( l" x0 G  a; ?4.以下哪个DBMS没有PHP扩展库?
% H" ^& o4 u  z* y) x( w9 S2 ~5 o
, M* [* T1 O0 C8 n: BA.MySQL9 Q- j  S3 [9 x5 C$ R
B.IBM DB/2& W( Q: [. Z1 ^' Q( r
C.PostgreSQL
! ~( ~; [' C4 FD.Microsoft SQL Server* f& G3 e- \* F
E.以上都不对
" a& }1 U+ r  L2 a. J* c9 T1 d4 s1 F8 }
+ Y+ e3 l9 R1 @( r  h+ m
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
4 G( t0 l( R" n+ ?, w* a3 T' r1 K! J  U9 r; m' @
<?php
, ^8 g7 |( t1 K. Q) p7 V2 }4 s$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);. }1 k* R; x; E4 K
?>
9 \! @+ z, z2 l4 v3 T0 w+ c  L' d6 Z0 o3 |; c4 W. n* n6 J
A.MYTABLE表中的记录超过1条/ J5 c; s* }5 H) Y! R+ u) s1 x
B.用户输入的数据需要经过适当的转义和过滤
2 u9 h2 s- x& S" O) m# B: iC.调用该函数将产生一个包含了其他记录条数的记录
% W- g, ~! m6 C5 m  x& B- qD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
( T5 m) Z& ]) r3 H  TE.查询语句中应该包含数据库名
9 c5 J% o" L0 f9 J# P4 e2 w( x. H2 ~. w. @" M: M( {  f

* j# d& m7 H6 `0 N  ?# Q6.______语句能用来向已存在的表中添加新的记录。$ H+ }/ \2 C( a8 T& e
9 e+ V5 Q+ s. E, _
答案:____________  i3 y) S+ y( S1 g. G' g; w

$ _% [8 @0 [* f9 R
. Y: b; n* x7 N9 b3 q7 |7.以下哪个说法正确?# q& Z9 S( E7 z  Q3 |0 h! i( I

1 t  n6 p, {& M2 U; y$ @" y  S3 F( kA.使用索引能加快插入数据的速度
: }- Y9 ~3 p' R! \$ ~B.良好的索引策略有助于防止跨站攻击! B: t' m3 m0 W' l
C.应当根据数据库的实际应用按理设计索引
9 c7 Z& q+ q3 _6 O+ RD.删除一条记录将导致整个表的索引被破坏9 O  t1 b4 C# d) B; Z2 @
E.只有数字记录行需要索引/ X& E1 D1 l+ P, `0 b) P

( O; Q. s7 r. B0 F8 L- a' i" E  l8 ]. E6 ?
8.join能否被嵌套?" a* H+ t8 Q8 h9 S
, L# M8 x. P) b7 d
A.能1 ?) B9 {$ o5 g; Q. u
B.不能
4 U4 A% ?1 r: Y
: d0 N3 v- }  m' c9 g6 f
& Q  Y; H$ p; \( v% m# t9.考虑如下数据表和查询。如何添加索引能提高查询速度?
8 n: ~3 m+ ~" V5 ~9 y4 u1 B" t
. H1 V  S" g# @, C6 K& sCREATE TABLE MYTABLE (
$ N$ p! T& J+ \, L. {! q* FID INT,
* {; P: w8 \# r* ^NAME VARCHAR (100),2 f: t7 O, O" V' d1 P: b5 Q
ADDRESS1 VARCHAR (100),
/ |! S  j# N% \3 O$ eADDRESS2 VARCHAR (100),) ~0 C: a0 ~2 N
ZIPCODE VARCHAR (10),
( J4 Z0 _% k7 T- V" O; NCITY VARCHAR (50),
% [) _# ^$ U3 N: NPROVINCE VARCHAR (2)! Y1 P0 j8 {8 o" ]5 Y# T' }
)2 N! e7 F) s  g3 \  b  J. D. n* x) N- {
SELECT ID, VARCHAR" D; u  V/ J% b  Y
FROM MYTABLE
6 s% ]5 `& c# G; h$ L% P: C0 ]) ZWHERE ID BETWEEN 0 AND 100
1 f9 \$ }; M; Y, eORDER BY NAME, ZIPCODE
* q# z+ n" \7 R! a& ^
) u. r2 L5 A* m- Q& n2 [A.给ID添加索引. k( x, [3 _7 G5 n7 d$ L9 ]
B.给NAME和ADDRESS1添加索引
. e; i  U6 E( H- {' [C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引( X- E5 ?5 ]8 b# k
D.给ZIPCODE和NAME添加索引
$ O! T( G  r. P* jE.给ZIPCODE添加全文检索
4 S% S' e9 O* \2 N7 T
% g5 _* O/ x( p  \$ O9 ^1 R/ D" {" S0 s
10.执行以下SQL语句后将发生什么?
) }! j# R; l( K: ~9 X0 m* d) k: P( `6 f
; Z* z4 Q2 k2 K3 QBEGIN TRANSACTION
. b2 J6 g8 r" E, E8 CDELETE FROM MYTABLE WHERE ID=1& h$ N" q0 S4 B3 |) w
DELETE FROM OTHERTABLE/ R) p8 w2 c# D/ b" U% y
ROLLBACK TRANSACTION5 F! A- v' L! L! R; ]% M

- T4 k) ]: M- P. s9 N( F3 QA.OTHERTABLE中的内容将被删除5 E! k! D4 y  `6 K2 w
B.OTHERTABLE和MYTABLE中的内容都会被删除# \6 F& G& Z) a% o% g) n, W+ D
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
: }7 k' K5 r' dD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化( H2 _; d3 ^& e5 H3 I- p
E.数据库没用变化
5 N0 {0 g- k7 ~% i$ o$ S, H/ E# d4 L6 J$ Q: }/ W

6 z# S3 X: C/ O' C, n& k% i11.DESC在这个查询中起什么作用?$ N8 o$ }, g5 Q# ^6 V, U% l; S
- K! @3 l) k2 E2 x
SELECT *
5 W( u) B8 b) S7 a" p+ W9 QFROM MY_TABLE
& j6 [/ `1 E6 n6 I1 k0 |+ s; h8 PWHERE ID > 0# D7 ?6 E8 \( q) l8 l8 r
ORDER BY ID, NAME DESC
9 l" e5 E  e( L+ E7 |& j& i7 X+ G7 C* H, l2 F3 E
A.返回的数据集倒序排列
) e/ z2 E! l3 ]$ D" D# JB.ID相同的记录按NAME升序排列+ |$ w0 y. q" K& U9 Z! l9 G
C.ID相同的记录按NAME倒序排列
) [6 [0 f  `+ A9 Q& q. E4 n* n: \D.返回的记录先按NAME排序,再安ID排序
' r( z7 G- w) O% C  d. QE.结果集中包含对NAME字段的描述
/ e$ v+ ?; n3 X, B- l2 j4 Q3 Q' F; K2 b' A7 Z: e; e. m2 j

( V6 k. p& l2 L5 A3 B# [  V! h12.以下哪个不是SQL函数?3 V+ C- Q/ o( q' j2 [; @* m1 \
8 z4 H4 C+ ?  A8 w: z2 D
A.AVG, x$ ?! n2 J4 e$ ]7 \; x* S
B.SUM
) e& e% f2 w- nC.MIN
* v+ m$ @# {8 ~: ]& ]' N% L7 u; VD.MAX
! S9 b8 J) a2 ~% j& pE.CURRENT_DATE()) ~4 e! {& R+ G. d

1 o2 l6 X7 y* y% j2 i6 S
: p8 U, M, j( O4 Q13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?3 q- D7 A, J; V0 ~0 O/ ^$ h9 T, c

* e5 c6 X2 k8 }+ [A.该字段必须有索引: r' `. \% H  y6 y" a, l/ Q' |
B.该字段必须包括在GROUP BY条件中
( B' J) I+ e. B3 |: QC.该字段必须包含一个累积值, m1 Z- X: ^: }3 U3 p; @: R+ }6 u
D.该字段必须是主键
0 C. W* V4 I; _2 _0 X! kE.该字段必须不能包含NULL值/ E& K1 F  x) P4 e
% j4 e: v3 ^2 ~8 x
+ n( O* u" o7 B& ]( Q- B
14.以下查询输出什么?, ~# y! V" e7 f$ @0 k5 d
7 x( `, z1 h( i0 b' x. q8 b
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2: Z5 @5 c: r5 u7 N" C8 A5 x5 n
ON TABLE1.ID <> TABLE2.ID; N8 A) x; ]. ^( A' w

& y* H; Q/ t) L9 LA.TABLE1和TABLE2不相同的记录
$ B& T. ~$ M+ o; x$ P7 E- \! yB.两个表中相同的记录
5 g( V3 r. u8 d2 O, y8 T# K& `C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数3 S. n2 H; e; }
D.两表中不同记录的条数
2 k. Q8 @1 x. c# D* EE.数字2# x3 m+ F* W) k0 P9 h# O5 ~+ G: {
' r0 O+ U$ G# p5 L0 z8 N1 ~
4 o4 q$ i- K; F
15.______能保证一组SQL语句不受干扰的运行?
$ L+ r2 o9 \' R' g, X. H0 N" k3 D6 P3 v5 S( g: ]+ c# P
答案:____________
7 ~5 x& S3 ~. {9 {: u7 {- j( g4 W( N3 M. }" T
1 e/ q& u5 _% ~# \- `* m& X
" J% z. I/ ~. a+ ]5 {
答案速查. @$ \! {2 \9 F1 s( R2 b
1:BC3 X! e3 R* X9 a: D4 P+ u
2:WHERE" z+ Q& z1 ]% @% H: _8 j
3:B, m$ |' X* c6 N0 [
4:E
! V8 a. V$ N5 Y/ i) W" V/ Y# i5:BD
1 D0 [7 u3 ^! l# K9 {! I- g7 H& W+ G8 x6:INSERT  f6 |& P) i$ T' C* F( d
7:C8 b7 H' J& e; G) e( l# J
8:A6 T) F. U/ o+ G
9:C
$ F6 V5 G8 f. M: d10:E
* c  \# Q7 a& |' n11:C; V6 j0 i: I! D2 X: C4 L
12:E
+ y1 x4 Z2 {+ u# y- r- I1 z7 C13:BC
6 l6 y4 A* L, w14:C
) t* q$ H7 p0 _% z/ O" S) s5 E15:事务
& |9 ~/ K' _2 {& E' g
+ J2 t- T1 d1 T* _. E' [2 b
$ D8 O2 S+ c& q# i% i) [& I
0 j$ E) a% t  b8 h答案详解$ k3 |$ E& Z5 T( s8 g* l2 Q. r

8 m" B& U2 X* [5 s( s8 x: A2 Y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
) `, Y1 \; q+ h5 N
- [% Y0 q* q# X/ v. F1 c2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。; O# H" I. E2 ]0 p, n

  C5 e4 ~7 C( ~& N! ?2 ~3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。- L& W& `# ?1 ?- I; ^) Q
" U5 [& V7 P3 d+ k6 ]# ^
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。) ]3 |4 @3 l5 W4 A& s) S% ~6 t
! `. H7 r0 @" n3 a" {# N8 z* W
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
$ t: r1 ^& ?5 W1 J7 h* @
+ s% u& s# A6 u- [6.答案显然是INSERT。0 S3 [' d' j# q
" e$ e) \6 q- K- ~3 E
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
) f4 S: ?+ y' R) q; l7 ^5 Y' E3 r4 H
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。  J0 z; i  S2 u: _) K
; a& ]3 t+ ]( Y  S5 x( D" V
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
  q8 z, D. ]# [) I' R1 e. S3 n2 S. g7 e% R4 a; d( F; V& Z% q
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。/ K$ ?) |* f. O: L, O
& m3 }6 W* p2 @: C
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。9 T) ~! I' Z7 {5 Q1 J+ y) K
9 ?" k- t6 P% B0 Q) @( G
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
; m: G+ @2 h% H% y: [# I; g7 D- A& C* V- w
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
, ?: ]& r' T. t6 R2 S" D* [6 b3 q7 ]+ b( _# {3 ]- g% G
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
- Z- e! ?- }+ }9 z0 g4 p. c- c
0 Z7 B5 @7 Y- |# U15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

返回列表
【捌玖网络】已经运行: