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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
5 }* s+ ~% |9 B/ v/ LPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。8 K9 `/ Y& s4 E8 n, t. z4 i
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
: H( m5 p8 N$ z- r3 X" E5 ~+ j1 z$ o8 \  _
0 M4 H2 t& g1 q9 h2 f
问题" |' S6 _3 i. t2 d' E( ?
  v1 T) _1 \# T, n9 q9 k
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
; K( j5 o* ~1 X
, T& ]' U; V4 ASELECT * FROM MY_TABLE
5 v; @5 ~# W. c. j$ e7 m7 a5 R2 ]  _/ O# L! R& W! b" |
A.如果可能,用把查询转换成存储例程
) k; s7 A7 ~/ r% c+ z/ j4 YB.如果程序允许,给查询指定返回记录的范围
3 C: U3 O6 W. t+ u2 GC.如果可能,添加where条件3 c: [- M: P8 R+ r4 {/ Y* X  D. I
D.如果DBMS允许,把查询转换成视图
3 h% R& u7 ]! K- pE.如果DBMS允许,使用事先准备好的语句' k- Y8 ^. B9 B0 S2 B( o8 E

& w2 |* q' z0 ^/ }, y6 ?. T2 p! e2 W2 M6 G
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
0 U& \9 J( }  s' B9 k8 Q1 e' c
% i3 m% y# ~: D1 F答案:____________
, q, S  \5 K* a1 ~9 v2 T% U/ g8 g) n& [

/ h1 W/ U% t/ \- y/ v' U3.内关联(inner join)是用来做什么的?( g3 I1 Z/ p6 F5 g0 G: j2 |

5 C5 q  j7 I( n5 c! ]/ BA.把两个表通过相同字段关联入一张持久的表中) x* s; z* O  T( ^' n+ H
B.创建基于两个表中相同相同行的结果集) j& c* w+ {  l# m- b3 e- g
C.创建基于一个表中的记录的数据集
3 k% Y$ d, [7 m+ m" K# T; JD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
+ n4 Y9 |$ w5 q& @: F- qE.以上都不对' @* i' n  j  \- L
) j6 f8 b  ^+ ?7 j
9 h) D7 Y! ?, J5 _# w" p
4.以下哪个DBMS没有PHP扩展库?3 ]$ [: S! W/ G* E! ?1 `5 v

# `# [5 X, b* B- G, kA.MySQL+ s. `3 T& K' @% o1 K* L
B.IBM DB/2* b# r4 i( k) ~0 K' D
C.PostgreSQL
' L0 Q8 z5 }4 y2 R! HD.Microsoft SQL Server4 y( ?: Q3 X! ^2 S
E.以上都不对1 A, u  x; X. L
+ ^1 Y5 c. K& E8 t. `, |
5 X1 F' s: N. i
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选); p* j6 o8 t1 Z9 f$ `

$ l( S8 Z: k- r& ?9 F5 A# ?/ E<?php
7 G% O, k* I/ z% ^6 x: v3 V$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
$ l: e. [0 f+ H8 z& i?>
1 z8 h+ J  _( i8 t% |" f
0 h# N2 y7 p9 ~A.MYTABLE表中的记录超过1条
, @" ^; ^$ A- a1 V0 s3 v5 MB.用户输入的数据需要经过适当的转义和过滤
! r! h. c+ M2 F7 w2 ^5 r' g" ?1 RC.调用该函数将产生一个包含了其他记录条数的记录
0 e0 r0 d. Y! u3 c- T* j$ A9 GD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除# E9 e5 m' Q* ]$ E- U7 s/ v
E.查询语句中应该包含数据库名
: p. K$ I) ?2 D  Q
, n) z4 `. p( G* u5 e. q( I1 v9 a0 C2 g8 P/ m5 w' Q- \- t
6.______语句能用来向已存在的表中添加新的记录。+ ^7 c% j0 q9 l8 b- d4 c
2 o* E0 Z$ o5 ~* D+ F
答案:____________
' u- u2 F, P# o* j) V
4 r% h: f* ^, |$ j& j- [) p/ q  B. y/ e2 h4 c
7.以下哪个说法正确?
9 p9 o- v7 W. ~5 b( o: t
8 P% }6 G+ s2 c9 K+ T; h* T" mA.使用索引能加快插入数据的速度4 Z; V6 X+ J$ \$ J
B.良好的索引策略有助于防止跨站攻击
5 U+ m3 F  G8 y+ M$ G) KC.应当根据数据库的实际应用按理设计索引
$ @$ o6 p; _' U- cD.删除一条记录将导致整个表的索引被破坏
) M. A5 ^! p5 l4 iE.只有数字记录行需要索引
1 y" I! y& l, y
# W' e8 v4 P" C1 }2 p4 Z: e+ M; n* ?% p4 ^7 h
8.join能否被嵌套?! }7 Y- R( W, {) {+ J

- i, W# L6 r& Z5 ]. }" |: v' mA.能
# ]4 O0 K: w; B+ K; m9 Y  lB.不能7 q9 m) {* ]/ U. I$ p

; Q$ D- Y0 y! p' m+ e
4 c( P  b  f* A0 V% k+ u$ h5 }9.考虑如下数据表和查询。如何添加索引能提高查询速度?
; S6 d: c0 A$ P/ ^7 A0 H, L/ y; u2 p$ m1 ]* Z( R
CREATE TABLE MYTABLE (& O% G  y% q0 x% y
ID INT,
! p& d% p& v9 |1 d! L; tNAME VARCHAR (100),9 z% x: H% Z+ N& X( e& V
ADDRESS1 VARCHAR (100),8 Q7 k- B+ p, @) O. |9 Z% r
ADDRESS2 VARCHAR (100),
( _, g7 u* I) P8 }ZIPCODE VARCHAR (10),
( p" S' A, T7 Q0 D+ ]" ]5 `CITY VARCHAR (50),/ s' h- Y( ]" p3 ^" ~% B8 M
PROVINCE VARCHAR (2); j2 v$ @2 M+ Z  j7 D0 ?: _
)6 X( c% I' _; \
SELECT ID, VARCHAR
. e& \0 ~& d$ ^/ K) AFROM MYTABLE4 B6 H$ v5 B; s) v0 \& |
WHERE ID BETWEEN 0 AND 1008 Z6 C/ p: g  z; A
ORDER BY NAME, ZIPCODE
$ M! i9 }' U& m$ h( e
3 u- r" R, q" V5 X& E  \A.给ID添加索引( a  ~  Q" N- K0 Y) ~0 m; V
B.给NAME和ADDRESS1添加索引
1 p+ l' H& k; J. @C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引% ]* W3 C, r% v% m  J
D.给ZIPCODE和NAME添加索引! q' {4 d+ h! g9 I! T
E.给ZIPCODE添加全文检索
; g: V1 w6 ?% I  ?% ^5 ]) {/ c0 L
' i  ?) G1 |& i; Z- x% v* n" }+ D2 x# Q' b# ?$ Y
10.执行以下SQL语句后将发生什么?, d% M* [* J. \1 T$ O+ g; h
! Y# j3 |4 [4 i5 c& \. N
BEGIN TRANSACTION% O7 \6 `4 K& e- f$ f' ~. v2 j9 X2 i
DELETE FROM MYTABLE WHERE ID=1
& a+ T0 S0 A' x" b- SDELETE FROM OTHERTABLE+ G6 s; T! Z, t1 {! ]
ROLLBACK TRANSACTION
! M( l4 g7 Z( B
7 M: L7 @4 Q8 \' PA.OTHERTABLE中的内容将被删除
. a0 b& G8 x! j8 b4 ~8 SB.OTHERTABLE和MYTABLE中的内容都会被删除) K6 O$ ]2 ]$ n8 t( o$ I
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除, c6 f/ t+ z0 p- L: v' U
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
5 u4 V1 ?3 z9 R4 w8 [, hE.数据库没用变化
) [' J5 k' b7 S) n) `  {* r; x% L" m4 a" }' G2 l

* l" S3 |* }5 i4 A* V) n% S, R11.DESC在这个查询中起什么作用?1 i5 p& P7 b0 z5 y
' x2 T! i! D. r  o
SELECT ** q. Z  M' W- x  o
FROM MY_TABLE+ k8 k/ ], n! w' z# a5 ~
WHERE ID > 0$ X/ E1 R% @8 s8 W" d
ORDER BY ID, NAME DESC3 [" S6 O0 x) X9 m$ P0 i0 u( G4 g3 n

" W& J0 {5 r$ {( B* K- WA.返回的数据集倒序排列0 E+ Q' {6 m7 D' T5 e7 K; n
B.ID相同的记录按NAME升序排列, W" }# j! {6 l3 K# x
C.ID相同的记录按NAME倒序排列! i" L* i8 r7 o, N
D.返回的记录先按NAME排序,再安ID排序, q- [4 F; s! b
E.结果集中包含对NAME字段的描述! z5 K; s, ^' P3 d( X
* J5 ]9 a( s0 _, j" U- |: f, L

* C6 a" p- _; B" P$ I2 ]12.以下哪个不是SQL函数?) n6 H# ~! D" c: Q
6 M& H4 g$ N& G+ V0 a7 \
A.AVG
$ O/ }1 P6 d! M, J8 s5 lB.SUM
7 w! b  k2 i- E; n! f) l# i' SC.MIN, |& G8 F! U, c
D.MAX
1 V( K+ C# _- Y; gE.CURRENT_DATE()8 B: m3 V& M: e

- t0 ^: G: N( b7 n. C( A4 O! f7 ?3 U( \6 A$ u. [* `3 p
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?0 w  P8 m, `  }. V

; s( o1 r& a$ k2 R. A3 uA.该字段必须有索引
7 w2 ~. ?1 z. {. @" C9 l4 _B.该字段必须包括在GROUP BY条件中
3 \/ P7 S2 E7 u; ?C.该字段必须包含一个累积值
# N, j+ I/ Y" X  t6 \  XD.该字段必须是主键
$ d0 G( l% {3 m6 t" ^, }E.该字段必须不能包含NULL值
- `0 g: j0 {4 J2 I+ d5 Y. ^7 V$ \- R& d
" p" F1 m# R+ L# V8 k
14.以下查询输出什么?9 h+ L. d) v9 ~8 C

. n4 K5 g" D6 [. P* a. Y8 MSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2+ p3 `! Y' O: I9 o! Z
ON TABLE1.ID <> TABLE2.ID" t1 b, g7 p$ q! z7 P( X1 p2 f3 ~
$ ~. g  \1 v' T" C! O; C2 \3 c
A.TABLE1和TABLE2不相同的记录9 C4 j# X0 [( \  ^+ Y
B.两个表中相同的记录8 ?" ~' M! ^$ S  U) r& H# o7 Z
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数4 Z5 U0 x; H0 ^
D.两表中不同记录的条数. V. N+ g* b/ z3 q; L& }8 S0 J
E.数字2
# T: n5 R8 b% k& v1 t$ O
1 K$ H4 `- t3 P- Z1 E
, B# h: O0 g: ?9 N15.______能保证一组SQL语句不受干扰的运行?' e  C: {/ n8 L; F* ]

: w+ D5 ]5 C8 G( t  E( `5 ]答案:____________
& n4 i' l9 m% M) w1 \9 t5 h3 f/ k) n  x3 l- `' x' s( H% ~7 I1 V

7 R+ Y/ A1 P# c2 g- [# `( U7 p! V0 n9 O, ?8 q7 w3 S4 D3 ~
答案速查0 d' c8 b" W' ?5 R7 w# p
1:BC8 T* a6 Y3 |8 e( ~* ]
2:WHERE9 u3 s! ~3 T& l8 F- \
3:B
2 \0 H: S4 ?. ^/ E- t! Y4:E" b: \7 ^& ~. X: I7 G
5:BD6 p5 @$ H) k$ N! c
6:INSERT
+ J3 @! }8 m3 |9 m* Z1 D7:C  N+ t9 n4 R2 t1 g. U1 o2 N- [
8:A) s+ @: H3 \2 ?% }8 X7 {+ d6 S
9:C. F& I0 n; i3 F1 G* b/ h& F
10:E
# I' T% p' x) o* t  j, t) O( K11:C6 _+ m* E0 u9 F+ e; R  a  r& ?
12:E
0 [; e) S4 t) M7 d13:BC
9 [5 G6 s9 K; ~& i) v! G& H  t' a14:C9 g) L/ ]# m/ l0 F1 Q
15:事务
2 X1 O( s& a/ ~9 W5 ~) \0 b+ p$ A  c  K% l1 X
4 D; r+ u- H! _4 ~8 l' V' C1 A9 r

2 v1 }7 N' F% {% R: y答案详解
* [2 r7 B. j% G" a  O6 N4 Q/ M9 C: f% K7 k4 x/ p7 p+ ]
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 T; z' a* Z3 I
7 n1 R1 M. E: L4 F2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。; o8 P8 |5 a& Z  x5 W; s

% \6 D5 |; `' O6 r0 b3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
/ v; f2 y$ y) [: D( ?/ V+ z* x: d
0 O0 \  x5 ^; x8 v' W! \" m4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
7 w% A' Q* F/ b1 I0 O1 {) h) J1 U; n" d; G( q
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
" c4 ?" \- k4 {% M0 A" v5 o  E$ j$ ~* b' w( {6 s; f
6.答案显然是INSERT。
" f6 b- S  G2 t; |/ H. ~4 Q9 T$ U  Y  y
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
8 U3 x3 x+ p5 G; m, `
" G) r( T# M5 N; q+ |, s8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
, r  \" `! W0 N- Q5 r4 N9 b+ M  ]* U' o+ b* k( }8 k* T5 ~0 o5 t
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。! I4 C4 ?+ D8 ^! B5 `- u. {

0 I8 c! P) A, w# s: ^6 U10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。* n- b' G+ W8 C4 ~+ |6 _2 A! c
2 c: _+ Z# P" k) K+ k/ N
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
$ H2 |! I3 I# ~* s1 b/ |8 B6 c3 Y2 k
  u) M) [* h) f6 m12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。, L4 w1 w# \* N" w2 I1 V$ t) C

8 C- X- B) x7 s13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
1 x, z# n/ J: e- v0 x( P# k1 `+ N: x$ D) S/ k9 R! ^
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
4 [! k6 F+ _4 t2 ~/ x, g8 I+ e3 J) \$ }
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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