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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ O) @; A' s) g6 {$ {4 T* ?; WPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。) R0 k) Q  B: L
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。$ u5 {- _6 t6 {4 J  r! S
1 n% d1 f9 F3 z+ Y: C8 v' t+ c) I

! K; N& q' O; r问题
0 j2 s: [' Z% x# k# P$ G5 b5 A3 [9 i+ E! b3 w) }
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)' u% h3 q  Q3 L
3 J7 Y0 w" h6 g0 _! F# H
SELECT * FROM MY_TABLE
: w+ U& s( b7 @$ n- e1 c+ x4 i, g5 g8 n3 ?3 L9 j% u' j4 B0 ]5 T
A.如果可能,用把查询转换成存储例程9 y6 n2 q6 H* o! ~
B.如果程序允许,给查询指定返回记录的范围4 F# y$ V9 j) m' G5 |. q, \
C.如果可能,添加where条件, c' V6 ~  j( |1 ~+ h* V( T! }' U9 z
D.如果DBMS允许,把查询转换成视图' w. n$ c$ L+ x$ ^$ `; L+ [4 r
E.如果DBMS允许,使用事先准备好的语句
' \$ ^% o2 x7 I* H
; {% p3 @2 G" z8 o$ ]" s' R" F$ N, Z/ t: Y: f4 B
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
- O- W- K8 I- V1 {, X5 I
1 N6 ~- o9 h8 k0 f答案:____________: @1 |8 l8 p- [& b
) u0 _; A1 A- t2 E

" g% R4 R" g' o, a3.内关联(inner join)是用来做什么的?
2 b% t1 p/ n+ o! c" m9 X+ f3 t& n  c* N, J' |* o/ k! \  Q  f3 o$ R
A.把两个表通过相同字段关联入一张持久的表中6 b# w$ A2 o, P" L7 k$ `
B.创建基于两个表中相同相同行的结果集. X' T  i4 L4 v! P$ n/ Z( g
C.创建基于一个表中的记录的数据集& D1 g) m, W! A3 C% d$ w9 p1 [
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
, k( K4 R& O. M+ b! U4 v# E0 LE.以上都不对, B5 g( D* m: i2 o
# |! {8 L* _2 y9 D( _: {% J

1 P; g9 ~& X" _4.以下哪个DBMS没有PHP扩展库?
/ K; q- ^1 e4 E# c1 X! J) n; p9 R! l7 k7 W
A.MySQL
- ^/ V+ v. q0 S; W5 f/ r2 ~* PB.IBM DB/25 L' _8 F3 a- S( k
C.PostgreSQL- J$ G" j- K+ H9 i! y
D.Microsoft SQL Server3 t5 h7 D, c: m2 W' Z
E.以上都不对6 _/ b. G+ ^. j  y
1 S; N- |8 u4 [+ \$ ~0 H7 S( W2 o0 E

  V- s6 y' i! `9 E7 i% z! z$ E" K5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选). Z* h) [* ^$ ~) X5 h- D
3 N9 J( G/ k* E; L! X% J
<?php
  @4 v% x" F% I2 |$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);. f) C6 z' H  o. E$ R* Q( `7 U
?>
" u, M: X/ G3 ]$ B4 C
7 b9 j: r+ G9 Y% }& iA.MYTABLE表中的记录超过1条
. K% q* {, U6 c* `$ NB.用户输入的数据需要经过适当的转义和过滤2 s! F  e2 @9 P
C.调用该函数将产生一个包含了其他记录条数的记录
. D, H, L4 A$ O* y3 vD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除! Q( |/ }; T: U9 k" Z) {, n" f# J
E.查询语句中应该包含数据库名0 a* }# x  J  c- u- ]: s
; W- h& ~( ~, ^

; R: ~# p. }# ^% K6.______语句能用来向已存在的表中添加新的记录。8 [. l- v: m, U* s+ v) U; w( L# g
) ?" G5 u7 x* b% h2 \+ a1 X5 h
答案:____________( v3 B5 y. W' @& O2 t$ V
6 ^. c' n9 I* O+ o7 s% }

% b% i1 H, L" g' V* C, y% U* V7.以下哪个说法正确?
3 [. |7 E& |  m, ]9 N: j% p( l' m4 F/ S# e
A.使用索引能加快插入数据的速度+ n. k% H/ V8 M2 F8 |4 |: t+ v
B.良好的索引策略有助于防止跨站攻击
$ _6 ~* h# `0 P/ yC.应当根据数据库的实际应用按理设计索引
" j9 R, G# z) {- R( mD.删除一条记录将导致整个表的索引被破坏
0 p' K6 V4 J( T4 V+ sE.只有数字记录行需要索引9 u1 J0 P, V' ]6 B% a0 U: O9 G+ T- Q

8 \  _$ O$ t" d' I+ w5 @/ s2 R/ n# Y
8.join能否被嵌套?3 [; K$ i+ w/ o& U. `

' z. W5 M7 J$ I* t" EA.能# P% I, v! b8 R3 m
B.不能
2 Z6 e. Q% F$ f
) p) J+ p) l) g1 t
4 r$ l/ U' g8 J. D8 v7 @  j9.考虑如下数据表和查询。如何添加索引能提高查询速度?# T! B4 w# g6 ]% [2 S" [
0 ~& f& [4 @) K7 {- j& A
CREATE TABLE MYTABLE (
  q5 ~3 t) r4 Y7 g+ A* Y, x% oID INT,& S- M1 W( ]" y+ Z; G. U
NAME VARCHAR (100),
# k7 Z. o3 d; Q5 aADDRESS1 VARCHAR (100),
+ B7 n6 \) s. M' f" a6 c1 ]/ wADDRESS2 VARCHAR (100),
8 t+ i+ K  ?7 e3 {. lZIPCODE VARCHAR (10),
* k9 F* I2 q  V, ~CITY VARCHAR (50),
1 U9 I6 o' O) l, R% O' wPROVINCE VARCHAR (2)
: Z" S! L. h; ]$ E5 i* Q6 {)" J) F: q, _. k: `4 s& b. z
SELECT ID, VARCHAR
9 r2 u1 E5 g; \/ FFROM MYTABLE5 N8 l( \) d, k3 L
WHERE ID BETWEEN 0 AND 100' c0 z- n2 Y3 t1 ~/ b0 r
ORDER BY NAME, ZIPCODE. V4 w" ?, E( N, U5 w& g. `2 Y4 `

$ b4 J/ h9 G$ v) ?' j9 ?" S* v5 A5 QA.给ID添加索引) p: s& s! G9 t6 d
B.给NAME和ADDRESS1添加索引3 q6 Z8 i% P! z8 A
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引6 M5 j) @# n6 c+ q
D.给ZIPCODE和NAME添加索引" [: T. P6 C$ b, j2 v9 b
E.给ZIPCODE添加全文检索
: H3 r$ s: W- B! _3 D: R+ V! K! U- _9 S) v
  Y  J9 g9 Q$ Z) W$ M
10.执行以下SQL语句后将发生什么?% E5 F& ~) {9 E% J+ H. [* j; I, Q

0 z4 r( }/ K" K9 zBEGIN TRANSACTION
1 M) f5 }$ X' rDELETE FROM MYTABLE WHERE ID=1& L, H- s$ e6 ], v+ t% V$ s9 g' @
DELETE FROM OTHERTABLE
, h, {2 d2 Q# T4 q2 ~! l1 oROLLBACK TRANSACTION+ G) f" x) Y- t! p, q( N3 x" A

6 Y3 T7 h( ~5 N; {A.OTHERTABLE中的内容将被删除
) p+ Y! P( O6 J7 }+ {! c9 sB.OTHERTABLE和MYTABLE中的内容都会被删除
4 z  k5 t3 H6 I6 E+ A) z' `C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除( K* L( O; A7 A" ~2 p; ^2 {
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化$ u) Z* a& I& t7 \. y) k
E.数据库没用变化
3 B6 n, Z' |+ b& ?5 D7 ^
; i; o$ M. e# h% q' Y3 ?: T
2 i4 T: g5 e1 a% y* i11.DESC在这个查询中起什么作用?3 v- v/ d2 \: _( h$ p9 f
9 ~$ g! m( N  R# S, R6 d: D& }
SELECT *5 x& F& W, M& q# l
FROM MY_TABLE
: T8 e; q( r; `" |, tWHERE ID > 04 v+ k9 h/ n% h! r+ }8 W% [
ORDER BY ID, NAME DESC
4 C$ n/ E1 p7 `1 A* |# g
! y6 D6 f% `( Z# M- S+ }A.返回的数据集倒序排列
. a8 K) U1 D, _B.ID相同的记录按NAME升序排列* k9 _+ h: q0 I" J1 A' y
C.ID相同的记录按NAME倒序排列) A. ?9 n( v$ Y3 r& z( [. h
D.返回的记录先按NAME排序,再安ID排序) V: r1 ?* x( j# C
E.结果集中包含对NAME字段的描述- `% K/ M& P) ]. C; q: g! O
4 n& G1 {; ^# r! E" O6 T2 ]& J

5 Y1 a6 g; [" t# W5 H  ~. n12.以下哪个不是SQL函数?9 g5 a$ m, Z( l3 y
# h* G% {8 O) y6 L
A.AVG- |6 t" z0 M2 Y5 x
B.SUM& y2 D; ]" `* d5 G" K
C.MIN: V9 h9 S# E+ m6 @! {7 p( D
D.MAX
& S6 V5 H* L5 o5 _- pE.CURRENT_DATE()3 A7 P  u) w% e# z

9 }) S+ `4 a) P0 k% k7 Z3 Y) c. {( v% Z1 _+ P
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?( h1 B' Q" T* a
7 U5 o- \4 y7 @3 O1 s, `
A.该字段必须有索引2 [- V6 G* M5 ]- N6 N
B.该字段必须包括在GROUP BY条件中
, O7 V) K4 `: d4 k  rC.该字段必须包含一个累积值2 S; H* ~; s1 V
D.该字段必须是主键
0 _* j7 G& X, W$ Z, X2 sE.该字段必须不能包含NULL值: d( R* s: e* P  u5 G+ y

. f- F& f- i2 S3 [9 N' m
; L0 h; }! I5 t14.以下查询输出什么?! T* v0 P: ~* U3 Y1 }
! ^6 t. u7 T0 b2 y2 I# U7 t9 m$ G
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE29 m& B/ v4 l) s. Y4 R& |4 x# S* T
ON TABLE1.ID <> TABLE2.ID
' j" R( v+ D7 ^4 P
2 L$ `, F0 r8 Q* y1 c* ?" V$ v' fA.TABLE1和TABLE2不相同的记录
( ?# u( N" r, d. aB.两个表中相同的记录6 t& s  {7 b: u; a
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数' |- [0 x, n- u* h: k7 D5 ^
D.两表中不同记录的条数2 c. L! e$ G* {2 x. J# _
E.数字2
5 D# ^) [2 F) R. M! J* ]4 E& {. j. [; O2 P
/ N7 D8 s! ^) l" q6 w3 q
15.______能保证一组SQL语句不受干扰的运行?
$ a' B$ g+ k8 F- [* T& ]; d
; I" n' `* Q! t6 M' o; o答案:____________, e% x' E+ {( F9 t9 H* j
9 N9 W4 f, O8 k/ Q* w* q1 q

9 K0 }. Q0 h; f7 p5 k
8 }- U9 m- Y/ t6 v6 @答案速查
! Z% L- G8 e! _# O' c4 X; V1:BC+ y) G- f0 t! C, x9 A2 m1 r
2:WHERE. V- M  F9 S& \) P* q: Z
3:B
/ B# a' }. p' l3 L  |( a7 _4:E6 b+ }" f. D" Q9 V, s) b' ]$ z
5:BD
; Q4 m  N8 `) @. W5 K/ D8 c6:INSERT
! M7 y( Y8 X$ {, H7:C, ]' Q  g) e% L% d0 c& G% I$ C; a' q
8:A
0 h  b4 z) J; |6 ]7 |4 K9:C) l% }& P  y+ x' I3 V+ C$ H0 a
10:E; m4 H+ K4 W& n: Q: O7 X2 ~9 R
11:C- S6 W( s1 f: N
12:E
1 l6 k" v6 [( C1 y13:BC0 J, Y% H0 ]) z
14:C
7 b; @0 ^9 X# f6 p15:事务
0 o2 D4 u  b$ J- d
& D0 a2 c% E( P2 Y" n' [
+ L! e" q. u8 N! ]7 j6 q: k* Z, t$ a3 A4 a6 U2 m5 [
答案详解7 j, M, ?$ W) C' `( n) z3 ]

1 [, {$ {( g& J% O1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
8 U- L4 g0 V- x* `  V. Z/ l1 R4 e1 s' e
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
# N; C2 g0 ~. U, G5 I; L+ |# _  O# A  T, @" g. u1 x
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。. G& H' y! F" P: o0 w0 X
  K& x& C, t, I
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。4 W" i3 d. o3 }8 t- r5 f

, I0 |' Q+ W# _4 i- r  _2 p5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
; d2 e+ D/ h; u
& s: ]& ]# k8 ]  S) Z0 C6.答案显然是INSERT。! @  V: I: h# z7 q( [
$ K, V( d8 J1 b( P4 X8 I
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。3 ?; l% {; f( Z2 {7 C
" k0 T! q8 Y1 O$ a# t7 g
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。; |( U* }9 A5 W7 J5 O
# g- {' B! F+ l$ P# f
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。" ^5 l0 S7 c  f' n& E; m
: Y5 k: S! y7 F5 ]2 q
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
$ v0 p3 R0 g- L- X- A7 ^( m: A9 ?# i
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
5 t% ]" {5 s6 u3 k) V+ W
: z' G! l3 ^5 U4 z6 F! V12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。6 x+ g& m% O9 e3 m9 L, T

7 _" ~% W# k& z' h13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。- e" X3 t! {, O; k, Y7 s

3 O( K6 c* [9 }14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
, {! d( }/ D( E2 n7 n: t* X1 w
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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