返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
7 H) ~8 ^' Z$ a# xPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
8 h" f: c; q2 Q1 Y' h! j( v9 ]本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。6 j* n6 |' @1 _
. M$ Q* y0 t8 z9 f* M9 g

; U# U" l/ ?) R$ o/ X问题/ O) u2 l% D4 z$ F; F1 ~
) b, }6 S; w3 X8 q% Q
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 n! x$ e( {$ ^4 B$ O

: M8 z& H4 X0 X1 g% {SELECT * FROM MY_TABLE. m- [$ F. d1 Y/ d# k

: f3 o* P5 E1 c7 HA.如果可能,用把查询转换成存储例程
) L1 {8 }$ Q) n/ H; n' zB.如果程序允许,给查询指定返回记录的范围
7 D% W# g; v* g) q# YC.如果可能,添加where条件
- p$ w% U9 o/ ?. k* _8 gD.如果DBMS允许,把查询转换成视图
# V4 r/ q# J- m  VE.如果DBMS允许,使用事先准备好的语句* {% |' F, Y5 ?( N: U0 P. ^
% f8 Q" C4 |: i4 Z& C

8 `, H# i1 q: Y: K5 {; v2.可以用添加______条件的方式对查询返回的数据集进行过滤?
4 T# g6 H" w6 b) V' d0 E3 {. f* F. f* n" N5 M  K3 i- @( ^
答案:____________
; X9 X, E" M5 e; |, A' S* l% Z/ U  l
4 p3 @! M8 |' J, _, e# b- J
& Q& k% ?% p1 a5 ^4 w/ n0 [" b( c6 `3.内关联(inner join)是用来做什么的?# c, s6 _: R5 t

* j" U+ d. k* y4 K/ `A.把两个表通过相同字段关联入一张持久的表中
' I( M4 ]( M- iB.创建基于两个表中相同相同行的结果集
3 W- N! l% j( t9 u0 i7 HC.创建基于一个表中的记录的数据集
+ @3 K* G  A( h, W6 a# oD.创建一个包含两个表中相同记录和一个表中全部记录的结果集! r% m( Y$ L! e; ]8 h  l
E.以上都不对: Z% c$ C9 l3 e9 x) l
3 F0 D# |4 g; P, a

# A8 c3 n5 i, e- J% x! O3 Z4.以下哪个DBMS没有PHP扩展库?
$ ]) z1 X2 H2 E: k6 z. [/ r% }
7 `: ]$ ~9 I, J9 w$ p6 W- rA.MySQL
6 j( F8 J, {  [6 u4 UB.IBM DB/2
1 X% F: }& u2 r) mC.PostgreSQL9 b. d: t! W  B% l( b( U
D.Microsoft SQL Server
* ~) ]# R, k; x' Z5 \- {E.以上都不对" n$ ~. [$ N! [

1 F  c8 v6 t5 U3 l/ v2 \0 J0 r9 U3 o2 M$ q) v) Q, l1 W/ }
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
  R6 s3 u% z# O2 U2 I4 ]5 ~# F. C) n' x+ e
<?php
1 L  u) Z- P2 g& {$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);7 t" D9 v  R! o1 H# y
?>
/ u# ^, X1 \# V1 i: W7 x7 f" q) c3 v3 v
A.MYTABLE表中的记录超过1条5 \: k0 Z( M/ E% S
B.用户输入的数据需要经过适当的转义和过滤8 [' S" H: e! f& e& w  v7 k
C.调用该函数将产生一个包含了其他记录条数的记录
" ^; _" L  R# Y& f% e/ zD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
6 A5 f* y) q4 _E.查询语句中应该包含数据库名5 t) [" U) V. s5 y* ~+ |
7 K$ {) a+ D5 v

. s9 A8 D6 }8 `6 X6.______语句能用来向已存在的表中添加新的记录。* I+ U6 U$ b" B' ]( O
0 |+ u" b! f5 `5 n0 v
答案:____________1 d- g  E6 H* }$ `# D1 l. U, H
# Z& S- p5 a4 s9 \
7 u5 K6 \& V8 T5 n
7.以下哪个说法正确?! ]8 S( r6 F. v3 Q" J

0 D. v, ]+ d- J9 l# o# i) {A.使用索引能加快插入数据的速度
/ a, U; B/ w- A6 d' g5 b0 |8 t+ B$ `B.良好的索引策略有助于防止跨站攻击
8 i1 r, R/ l+ A' RC.应当根据数据库的实际应用按理设计索引. }$ L7 I0 H2 Z0 V5 g9 q" f
D.删除一条记录将导致整个表的索引被破坏3 ^5 S8 \  |$ X4 t, a+ O$ l5 V% y
E.只有数字记录行需要索引" W) @1 \$ g  c4 W

) R0 d1 ^0 i) `- b, ?8 w; ~* |; c' }8 k% L- }- J
8.join能否被嵌套?+ h. d) ?2 R7 B0 ]9 p

- n2 m0 `% Q: C' P- A2 E5 IA.能
; |2 ^6 n/ q/ Q0 y* ?0 wB.不能0 }- ~9 o+ m/ g! w

; W* `3 [" G2 a& W6 k  k+ Q. q: e1 E- m7 [0 `9 X
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% l  d& ?- z# n" w/ a
1 C. _' |% c' J0 A* F9 pCREATE TABLE MYTABLE (
, J( S; {9 ~2 n5 Y: y# _ID INT,
: d* y, g$ N; q. j" m& P; S" WNAME VARCHAR (100),( C  G- T+ S# [2 e8 T
ADDRESS1 VARCHAR (100),  }: L2 ~% H: ?1 i4 E
ADDRESS2 VARCHAR (100),  r; v# S9 n! d. ^% B% ~
ZIPCODE VARCHAR (10),4 b( O& v" `2 c* i
CITY VARCHAR (50),6 i& G- \9 Z4 S! b6 d$ |( w+ d
PROVINCE VARCHAR (2): |, |& D; [0 `# v( s
)8 X2 F5 B% J& u# d+ t1 s* ~
SELECT ID, VARCHAR
8 Z6 H4 w/ u/ A; I5 SFROM MYTABLE3 S9 E1 O% U3 o
WHERE ID BETWEEN 0 AND 1003 Y% ]) L) U) l5 R& \* O' f8 c, R. q
ORDER BY NAME, ZIPCODE* k- G9 q2 k# S' Q: e- ]

, \. R! `2 o* t7 S/ Z  h; H3 {A.给ID添加索引2 q! ]) u7 u* D
B.给NAME和ADDRESS1添加索引
4 i8 ^. L+ J$ E+ q$ y7 `( @C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引1 q7 x# H" f1 P5 v
D.给ZIPCODE和NAME添加索引! J( G2 L7 f1 l6 t9 \
E.给ZIPCODE添加全文检索
! Y3 c4 h/ W! [! x3 e. j+ F
7 _! m! c6 j+ X) [) F4 K' L. J
8 r2 D* `4 R( \: v5 M, D10.执行以下SQL语句后将发生什么?
/ o  g9 t1 a/ j* N# M: [& u
- S7 M& p2 C! W3 |) S5 v5 ]) ~BEGIN TRANSACTION
8 O6 V9 g$ c# D  t/ R. ?6 P4 UDELETE FROM MYTABLE WHERE ID=1
' x3 A  |2 X9 ?+ Q+ z( mDELETE FROM OTHERTABLE! U5 Y3 X3 U+ F$ I9 x
ROLLBACK TRANSACTION
! k3 h( ?% G3 a1 a' ^
1 V0 T+ t5 O& L1 s; q. @8 Z3 OA.OTHERTABLE中的内容将被删除5 I" I3 e4 t" @% P
B.OTHERTABLE和MYTABLE中的内容都会被删除2 \! R' D, r3 ^$ A+ x
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除4 `8 C3 ]( i  ^
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化4 w1 \, q7 l& u+ i
E.数据库没用变化3 y3 F& V+ |8 ~' Z1 t
8 L! A5 `7 G% f

- l% ^, v5 e! L11.DESC在这个查询中起什么作用?& l, b- N1 L: f4 v! u2 Y
* p! {/ a2 e6 T, d) |2 C9 k# x2 W
SELECT *: `$ }1 ^5 M7 i9 J. c* F
FROM MY_TABLE' i5 D- V7 m' H
WHERE ID > 0
; Y4 q. m; f* U+ ?" k+ YORDER BY ID, NAME DESC3 i' ~- ^. L4 c) ~# f/ g" J

  U  W+ v' m' I5 H' e$ E; pA.返回的数据集倒序排列
2 N; Z" M8 y" P% f. lB.ID相同的记录按NAME升序排列: f+ m0 G, _6 S0 M" s
C.ID相同的记录按NAME倒序排列
8 |$ V6 n! e8 A1 p% Y# V; P0 xD.返回的记录先按NAME排序,再安ID排序4 E5 ]) {. Y4 h% x
E.结果集中包含对NAME字段的描述
0 K, k4 D% `% {9 r' @9 L5 z. l0 K. b. v: K) Y

" S+ \& L! F, w7 l8 N( w! f. t12.以下哪个不是SQL函数?& f/ J0 {5 M9 I! U6 g+ e
/ `5 C( j- V* Q3 l. H, I* h
A.AVG. n( B& O+ u# |
B.SUM
" u& s, z0 e6 W& X- x  tC.MIN' f) L! B: d+ b7 W: J" w* h
D.MAX& J/ t# b! D8 D0 b( S
E.CURRENT_DATE()
$ c* z5 t' W# p9 J" {- ]% Z9 q! {
2 z9 t; U$ I! V# i. O( S, r! V1 U- [: \6 {
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
" f1 E& z6 V3 [8 d2 _- V8 f( t" Z0 H2 z4 z* t
A.该字段必须有索引
# h# B1 ~  A" _B.该字段必须包括在GROUP BY条件中
! e! u5 ~6 f1 t" O' |5 w7 u/ V6 kC.该字段必须包含一个累积值* J/ i9 w8 H' x3 x4 N
D.该字段必须是主键
8 J  k, W! j6 N) s  l9 EE.该字段必须不能包含NULL值6 a8 P- @' i8 l1 |" Z1 r
5 Q5 n% T+ b+ s4 Z$ u! I

: n  l, M: V$ J; X/ L14.以下查询输出什么?
) R8 R0 K* p1 e8 U6 i0 k: D3 c) [5 Z  `# }" b
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2( X8 n6 ?) C; o4 B
ON TABLE1.ID <> TABLE2.ID
: E6 r4 _; {+ \7 j3 i4 y8 S/ c6 F5 K7 i
A.TABLE1和TABLE2不相同的记录
, _/ S3 F9 t1 O7 ~* vB.两个表中相同的记录
6 E, r/ t8 R' i' _8 [C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数0 m# p7 G) f1 n  u* o! ^( J  H
D.两表中不同记录的条数3 a8 D4 C2 d) l, B# E; D
E.数字2
% k3 @: J5 D! A4 m' I' P! M! _4 s# M3 L1 c' f6 q, d. U: }3 X

7 v% G9 K8 i: {5 w15.______能保证一组SQL语句不受干扰的运行?
0 X5 d: k. W7 z, A. Z' |: j6 R2 {; \1 Z( F* h. l( j5 o0 ]1 I
答案:____________% O/ C% @: |+ e. p' o  F" K# J

# X. _4 w, e* Q% O' s) y& P- m9 a$ R6 i1 I: {. s4 I" K. e  V

& y$ K+ i7 V$ T0 m答案速查/ i5 r5 K  e  Z. L9 K3 t( E+ W
1:BC2 K; I+ ^* C" `  ^" u$ K( `! V+ _
2:WHERE
5 A3 M5 t1 N3 k2 q- S* ?3:B
6 M0 z; o; j1 k) @" R4 Z4:E& ]) {- u9 @6 W( A3 Y
5:BD
1 D( D! W% ^  A4 ^* L" b7 y4 ^, y6:INSERT+ f3 j5 U6 K' E6 h; M& D+ m
7:C% F; M& K, ?/ o/ Y+ ?- |
8:A
) c% H- f6 ~7 l7 Q; B# i& y9:C
7 t/ |# s5 o* |4 {0 K* @; o10:E
* Z. c1 v4 o, v: \11:C
9 ?" l% n! T* I6 x+ F4 k/ F12:E
, V" z- o% k# J$ [; ]13:BC
5 g; m1 O  g5 T7 V14:C/ M$ K% J7 l% g
15:事务; Y3 E$ L0 a9 W: Y+ M4 l# A

2 e9 |( ]$ f1 b/ C1 M7 e. U  e
9 z# C$ ^$ w- e6 Y% {- h4 u' {
答案详解
: L- X2 m0 I% V/ i& [: H5 e) E; p5 l1 Y* v. P, l( ?5 {8 _: a; x& k5 `- P
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。: I$ n- @( `" N. g. F$ H
( j' m  ^. ^" H! ^
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。( s) \! q8 q2 g8 r' H; K' n. d
; i4 b7 F) }8 d4 C! r2 M
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。' _* p' F1 v4 j% n/ N7 O3 o
3 t4 A( ]1 T1 B' C' ~2 ]2 G% H# O
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。# b6 R# l0 t6 D* I

8 @" l. j/ ?! Y6 l) t5 o2 p5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
: R5 j. _9 O7 G# f) l9 f: t3 ?$ x  C; h8 \" f3 ?( ^7 `/ E
6.答案显然是INSERT。* E& W1 d8 x2 K
, M/ b( w# s( a1 D
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
+ Q4 S4 H9 D* O/ I  e2 l' c. i+ S* o+ @& d& ?6 p0 ^! P
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
  z! v2 P8 k8 V9 R9 g0 R. l* z) `
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
; a9 g0 f7 g% W2 A& W7 s' c0 ]+ C! e3 G1 r7 `& k; y
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
- c: Y8 O# U7 R6 \; B: T, g  X: o% _# k3 A7 I0 I& b% c1 @
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。3 f1 p: B7 Z5 g( B, y
; R' F  t/ w  \7 X& H. X- \: A
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
: _6 Z$ t" ~% P% u
. z5 N9 g* c! y0 u5 @. n13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。7 v9 b8 G# g- a8 W' y" [6 u
+ O$ k. K- l1 g# {
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
9 n! |0 j$ W  R7 t4 m+ I, ]
* l0 ~3 c. c$ E) s5 C4 I5 f15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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