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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
6 T; z' [% W: d; h# |PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
. _' W: g- a; a9 V& k本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。8 Y7 X! b: E$ m2 G* Z6 }7 O9 J) P3 F% |
4 R% F' q# C2 B8 t

9 o: n/ j2 Z' r# [/ N2 N问题, A; k3 A3 _+ M& V& c8 e, o- i
1 k4 L- \* @3 Z3 j# ^
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
" Z5 ]- ?! ]/ y, A( Z; s3 m. F9 M: u, h
SELECT * FROM MY_TABLE. `" I* _' ?+ ]$ V5 S' b1 M

9 z3 r8 t/ D1 G2 `1 c: S+ YA.如果可能,用把查询转换成存储例程
* m2 G0 ?. h$ R: M7 MB.如果程序允许,给查询指定返回记录的范围+ c8 I# X6 l) R2 W6 J7 d
C.如果可能,添加where条件
. E, _: _. ^& n% B& nD.如果DBMS允许,把查询转换成视图+ t3 X6 f6 _) L  J
E.如果DBMS允许,使用事先准备好的语句' W4 c" q: h" P+ C
- u, ~6 \, m% H/ _
! W3 `% f( D% O' h! z' e0 ~
2.可以用添加______条件的方式对查询返回的数据集进行过滤?0 O, v) V+ `8 w  e6 }0 F
9 S4 c+ U* L$ A4 }  D( S( H+ h# x
答案:____________
0 n; _0 T* x) B4 i# \  q
" ]# }; n) ?1 I. m. n% s! O! q4 Z% f+ k
3.内关联(inner join)是用来做什么的?# g. `7 C7 ~% g1 u; e
! k- S" N: G' x, o/ k
A.把两个表通过相同字段关联入一张持久的表中
- u  p  D* d" GB.创建基于两个表中相同相同行的结果集) {3 o" t/ n% a- O# m# O: t6 E
C.创建基于一个表中的记录的数据集
" Q$ N, p' G: n+ L0 jD.创建一个包含两个表中相同记录和一个表中全部记录的结果集* h- d% N4 P7 R& N
E.以上都不对
  j0 {7 e" A4 S) ?3 d/ {' |& a/ @! h7 E) I5 Y

' u) w+ i  o* i0 a* B4.以下哪个DBMS没有PHP扩展库?! z. E# Q& A5 k! L( z8 _" Z
+ e) p) ?* Y7 }% C. J3 h
A.MySQL
: Z. Z  v$ F7 Y) F1 g) _$ ]B.IBM DB/2# b" L4 e- ~0 i
C.PostgreSQL" t6 f: G; e8 O" T0 z9 p
D.Microsoft SQL Server: U1 o- }6 B! a
E.以上都不对
* z) L8 o4 T! ~, _$ P- R4 ~' D3 y& Y. U8 M, ~1 ~

8 @& ?; O- d/ Q1 v! b5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
' L# |( a2 `0 q$ u5 z* D: a+ s5 F8 b4 M+ M/ I" m1 H
<?php6 m& D& ?$ W" I, ]9 _6 `, }9 b4 i. ?
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
( u( o* v5 s* v, ~?>3 |0 A4 j# c& j; A8 H' V
/ G) \- ^& s+ [- R- t2 f
A.MYTABLE表中的记录超过1条1 Y# ]0 T& a+ C, C
B.用户输入的数据需要经过适当的转义和过滤
$ q7 w# p& X; ^4 t: QC.调用该函数将产生一个包含了其他记录条数的记录# D2 l$ o' N9 p5 T3 o6 i
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除* l4 f+ k/ c, U1 d" z) d; B
E.查询语句中应该包含数据库名: ]/ X8 d2 N4 R: d3 S
3 G3 u1 g$ p' Y* {# X5 _

& j' B+ H& f  D% Y1 |9 i9 Y0 F6.______语句能用来向已存在的表中添加新的记录。
+ n0 [, @7 e! s, \+ @# A1 ~8 f6 N! L$ M5 q6 H+ m# A, e$ T* l
答案:____________
- o( `" N, L/ k  x
2 `% `7 H1 |4 s4 g, ^" T
4 j" H1 D5 J6 I7.以下哪个说法正确?
5 T( N  C+ u) E7 h
7 K/ D5 m" S# v3 FA.使用索引能加快插入数据的速度
0 Q6 G9 i8 {; SB.良好的索引策略有助于防止跨站攻击
$ f3 G9 Y- e  T$ k8 {C.应当根据数据库的实际应用按理设计索引
. e7 J5 n; @3 S+ f5 gD.删除一条记录将导致整个表的索引被破坏
8 j1 H9 Z5 C2 V5 s, E9 WE.只有数字记录行需要索引3 c; [, N) E* Z3 _. V) r, y

! D  x2 Y+ A% f) v% V  u, |9 e. ~
/ f, F- [0 ]+ \& s( _! y3 z( y8.join能否被嵌套?7 g! C# o! W+ }$ s' R
7 N$ I  f0 D" Y5 \- v+ Y: x
A.能7 S7 R8 N& d( ?* {
B.不能
" t" F: ~, i( o  U2 e. v' r' X) ]4 u5 @3 W0 M) R0 \
0 P3 }& {4 ^4 b: \: q, j* @
9.考虑如下数据表和查询。如何添加索引能提高查询速度?# i- q) n, S6 H

2 j6 G7 }+ `  Z( xCREATE TABLE MYTABLE (3 J3 [6 S8 x& \
ID INT,
; L- j9 }. f( bNAME VARCHAR (100),: ?& T* r. b. t$ H
ADDRESS1 VARCHAR (100),+ Z: @0 O# e  j% N
ADDRESS2 VARCHAR (100),
3 J' p* g9 r$ W3 {5 j" a* {ZIPCODE VARCHAR (10),4 h6 G# b8 I4 B5 j  l! O! H
CITY VARCHAR (50),
" ^* |8 D/ J( p) M) KPROVINCE VARCHAR (2)
! ~& P  t+ X% ^0 O1 o# ~, r. d)
- h' r8 [# f3 {6 F! uSELECT ID, VARCHAR
0 f( a! a' }# y2 X7 D. l, ~FROM MYTABLE
8 v$ L/ I4 I6 A: E$ WWHERE ID BETWEEN 0 AND 100
  `% s+ [1 s) v/ e- K3 {ORDER BY NAME, ZIPCODE. `2 [7 S( K9 M' l  J& v

3 p( e2 J0 f6 Z9 X: t9 D6 Q) \' i3 S. y) VA.给ID添加索引
" h, ~- N. K/ M" s, z6 z! `- u% VB.给NAME和ADDRESS1添加索引
: a; [7 i: @; B! I. s  t5 jC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引. V9 y8 g4 d% c% g  ^- X& m. E4 v0 n
D.给ZIPCODE和NAME添加索引9 [" ^% n3 a! o
E.给ZIPCODE添加全文检索1 H0 n# ^. N8 Q+ H

- I, K, g' \* v  D
; C( ^2 Q6 O. S1 I10.执行以下SQL语句后将发生什么?
" e" |# x+ s: A5 W" b
, W, z7 H8 |# t, q0 J5 h3 YBEGIN TRANSACTION  f1 W. X3 s3 f" Z3 F2 U$ ]
DELETE FROM MYTABLE WHERE ID=1' ^& g! Y! G0 e- J( P
DELETE FROM OTHERTABLE
1 ], ?1 i  [  E. `2 r9 x# c0 @ROLLBACK TRANSACTION
( |/ j/ t/ m0 V4 P" X# G! J5 S) C6 t0 C% ~5 d: J
A.OTHERTABLE中的内容将被删除
3 C: ^1 j# ]. I2 Z& GB.OTHERTABLE和MYTABLE中的内容都会被删除
% {' a$ L* g5 R4 D) [C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
2 r' E1 }/ _$ t$ B4 K/ fD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化# R7 D" K8 q, Y2 D' t/ L# |
E.数据库没用变化, t5 v0 \* K: a) k: C

/ m& G! c$ ^& t+ a* H$ H; f8 T, \  D5 q( v
11.DESC在这个查询中起什么作用?2 j4 K7 \. m. ]4 g" Q+ s0 E# P" b; u
3 d5 Q+ T1 V; p$ Q+ N
SELECT *: q9 E- n& Y( v. \$ ?0 b
FROM MY_TABLE$ i6 y1 {' V3 f' V; K6 G
WHERE ID > 0' `9 V  }& R* D, x& O
ORDER BY ID, NAME DESC
+ E9 R5 |0 b' C. b% K' V3 x' |
) @8 Q- J& D" \+ o0 F; o0 xA.返回的数据集倒序排列# a% C% n6 X) G. }# @* J
B.ID相同的记录按NAME升序排列8 h2 }& U, w9 P& g/ l
C.ID相同的记录按NAME倒序排列
- L. Q+ a0 U* U; H" {3 X. h8 f9 kD.返回的记录先按NAME排序,再安ID排序
  L7 C. }: G4 P, D" l: LE.结果集中包含对NAME字段的描述
; P( ?' Y" }6 \1 B6 f  [
1 X4 R. c, X2 z; F: K% m( I
) o6 q9 L. S2 J! H  n& H' t12.以下哪个不是SQL函数?: v5 Y1 g" o1 U
. H1 h, ]1 f- m3 E1 V  X
A.AVG9 E+ d+ K' i$ l9 Y" U
B.SUM& h" ^6 n  ~: i4 x! Q2 `- Z
C.MIN+ i* a0 V5 [) h6 c6 w& i
D.MAX; g( ?* I  s& l" }1 l' _
E.CURRENT_DATE()
' g1 G" y6 _$ F, Y# w; A, ^; g; S3 Z5 y1 t1 U( M# _$ G
. c' x" h1 v+ x  @
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?3 Q& C  U3 c: \: m. s& k

9 I$ D0 N$ W( v/ D; \- y9 I3 qA.该字段必须有索引6 u6 C) M- Y3 b) h4 Z" e
B.该字段必须包括在GROUP BY条件中
+ ]7 Y- t$ R5 p" @' J, IC.该字段必须包含一个累积值% o/ r  E3 ]+ m9 c3 O/ d
D.该字段必须是主键
) n5 ]: |" {2 e/ {/ LE.该字段必须不能包含NULL值
5 y. ]5 P& p7 K* x  S- `2 P) \2 e  \3 ]+ |& V% M

. F* D6 o) n& C) G$ H" X14.以下查询输出什么?
4 X& M7 @+ k1 d# g! O" k) i
6 c) X8 R! i/ ?$ z& d7 W5 MSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE26 v7 Q7 Q( s- ?$ n5 z0 j6 ~
ON TABLE1.ID <> TABLE2.ID
8 z( n5 q5 v' H+ e) Y* J$ d+ [
0 W0 o( ~* ]) A) lA.TABLE1和TABLE2不相同的记录7 c8 ?! U1 U0 H" m5 `, V" r) ]
B.两个表中相同的记录
. Y7 c( R4 l& {1 D3 z% IC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数. J9 Z$ g7 x1 T( D5 m0 Z
D.两表中不同记录的条数
- p5 Z4 T0 E- L# l5 k1 KE.数字23 R5 x' \5 R' b/ ~1 j6 ^4 l) D& w
+ P8 w5 ~, h! y

7 H9 U7 B' l* k9 Q15.______能保证一组SQL语句不受干扰的运行?
  [, @8 a$ \* C2 E% f6 f8 @* C% \' D- `- K% ~  w1 R
答案:____________
0 P' \+ b4 Z9 N# E6 U( y& A, Y/ ^6 x  k6 I4 M: Q2 r, L  [

- l' r0 h: W* l4 m: n# _4 W- B& \
答案速查& F; F& h9 y4 i% L5 L9 M
1:BC* F5 a- L* q! z. ~/ w5 Q! m
2:WHERE
$ P- Z* ~# m/ u' U3:B2 k/ a/ B/ J4 ^
4:E4 o3 g1 @% ]) n! O8 N7 `" C7 Y
5:BD/ @6 v' h6 Q8 \8 K! O- g/ z1 ?
6:INSERT  O  q9 O2 g8 A1 p! y0 |" f. K
7:C
8 W$ S1 g0 X% z: ]8:A( f9 m# x1 z% [: r6 s4 k* B/ m
9:C
- L) E, f0 G7 b+ C6 E# R$ c5 A8 R! H10:E8 k6 x3 t6 C  V5 ^
11:C& q6 X5 S4 r- c  Y" ]) N/ A- l, V
12:E
7 X' Y% G* o; u# b6 ]13:BC; X4 C8 x% \/ S8 W$ v8 A
14:C
: K7 y& i. p+ H. a4 h: d15:事务# n/ W) v+ i$ T0 m, s

9 t. |  y2 i6 ?3 Q' h8 p  T5 M% U" I) G2 I. R4 T- Q

1 n) w- j0 [( l2 {答案详解4 ^3 G1 C8 O' S0 a, n
+ h8 X* [9 k! r9 ]
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
: }6 H9 ]; Y5 I* e! }$ n) s# N; d) x. Y! }
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
) l; W, S3 t: A7 i- s9 I
( |/ @+ U+ p% Z2 y; P3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
7 X5 ~7 u( F" }1 Y: g2 v$ A* Z2 {1 a; i  N5 z" K# `
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。1 W) T- k# }1 s/ B3 c2 j

% g! S2 {* J1 j  ^1 X9 h) f7 Y5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。4 x" @# B0 w$ L
% \) d; P  E; ^* E
6.答案显然是INSERT。* z# A6 C+ T( z7 }: B! s7 V# p9 Q
- |" B4 K; ~# R  ^& i/ w1 [: r
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。, i. T6 [$ F% a* v: h2 y4 U1 ^; d
3 s2 y% w1 |% C
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
! D. a3 E7 [7 f8 t0 M3 \# W; b& |- g3 p7 H0 f2 q/ l
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。% R! {& Z) Y& P1 q
! O, [6 l/ D8 P: b
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
1 P7 K$ o( ~$ _) |/ N+ F
( l! i+ v) M+ S3 S- N! Q11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。! ^9 ?/ ^$ w  K. u) c
6 r+ I6 z8 `$ Q  J9 d
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
# T% [5 J& l  B6 a% E7 b
5 e; e9 C0 r' j13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
2 M# A9 ^, P4 B& k$ l8 a, J5 h/ O2 k" W6 g$ x- F( ?7 R9 g
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
$ s- y3 B9 c/ ?8 n' W8 v
& F/ P7 h% Z( F/ |2 Y15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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