返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
6 ^3 T9 O9 l7 k) {. X8 @& X1 G# I0 D6 Y( ]PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
) q) l0 r5 ]3 ?( ^$ R2 G本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
) ^: r" m/ B. T& y% a
! L( ~' ?1 X1 {! k5 \( n& W) }6 t" F% o( r; [2 `( H
问题
9 g* A0 G* {2 d. y3 r
* B% v& L$ o/ b+ w1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)/ s) T9 V/ T% n. m

% z  |: k' ~$ C' [# P! c# @3 f6 |SELECT * FROM MY_TABLE
; i$ C+ n" i& j" c: j1 e  Q* Z% [; A, z0 m7 R  a4 E0 Q* b8 U* @* ?6 n
A.如果可能,用把查询转换成存储例程# R- p& R+ O( `0 z6 ^# p" k
B.如果程序允许,给查询指定返回记录的范围/ E, x" l& \7 P& G. X
C.如果可能,添加where条件
! [5 K6 f% N! |4 k# }D.如果DBMS允许,把查询转换成视图
, w# B7 `! S* A, G/ NE.如果DBMS允许,使用事先准备好的语句
. E$ O5 g! a$ {$ ]
: l% [# q7 @; G" \1 \0 E  Q
) c3 A" h9 F- h. i9 j3 ~3 b9 d2.可以用添加______条件的方式对查询返回的数据集进行过滤?, u) M+ N. ]& Z6 L/ V& t+ e. u

. K# f1 T9 o0 S0 P; o: m答案:____________
! o, Z1 f' p0 V. R* D& M8 @! E+ D8 s2 ^! Q8 v

' g- k" {( I, M0 V# s3.内关联(inner join)是用来做什么的?1 j# L6 M- C% x2 y7 R3 N( g
; a1 e5 g! F4 D& ~" }
A.把两个表通过相同字段关联入一张持久的表中
) `: i/ t5 r% oB.创建基于两个表中相同相同行的结果集4 j# ?2 k- B1 s9 X) c& k6 g6 H  f1 q! x
C.创建基于一个表中的记录的数据集' Y) R( Q1 q( h: m3 H
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集0 K7 h. t1 J; I- n5 Q: W
E.以上都不对
* l/ h7 a& w8 Y  @! F7 F; X
" x$ g+ b. O7 A: T7 t
4 A, i2 }# }7 f4 G" G4 C4.以下哪个DBMS没有PHP扩展库?0 `  I! H3 o2 O

7 X  X- e2 y/ Z2 C, b$ g, M8 z1 rA.MySQL, t" C2 J' F7 B$ B/ [6 x
B.IBM DB/2- Q" @& {" `7 x/ K; a% A) G" O
C.PostgreSQL" G8 ~( C2 a/ w0 V! R5 |" M
D.Microsoft SQL Server% h; h; w  {( Q
E.以上都不对$ J' ^" H; M# X/ P

" M8 y9 T; e  T* B
/ \) X1 u" @  ^$ k5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)0 X. }0 i+ w. V  S" A& C% W+ c
6 f; v6 U: N8 ?
<?php$ E$ O( {. i; s' t, j  x* L1 _' j
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
. `7 r0 o! [, r% C) v?>$ I$ z+ X2 J# G- ?: a" v
  q. V% I$ ~$ W5 U; b5 T
A.MYTABLE表中的记录超过1条9 K3 Z/ b' s2 J- l7 s
B.用户输入的数据需要经过适当的转义和过滤+ `% j: k& E% V  C) A
C.调用该函数将产生一个包含了其他记录条数的记录8 S2 p3 P) q3 ]0 z& W
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
4 `2 O; C7 z' l7 H) a# Q3 n: X; D, kE.查询语句中应该包含数据库名% X3 Z  r+ z3 r6 V  z
- J. X, N2 m- p
2 i$ _3 |, q, c- M9 r. d
6.______语句能用来向已存在的表中添加新的记录。
  G0 x: y5 J0 y) u$ G" C$ Q
: `; `/ B4 k. W) }$ Y, f答案:____________& H/ S  m: i7 Z0 ?$ y, e! x
6 Y  h) n. w$ J" }3 a# b

; ?' B9 a! v  [0 b7.以下哪个说法正确?' W5 Z, X2 y6 M' v/ N- C

  c/ G. e$ S: X3 |) aA.使用索引能加快插入数据的速度7 F# R  k; p+ y" r! Q: u4 t8 ]
B.良好的索引策略有助于防止跨站攻击# s/ h& G+ u5 P& I
C.应当根据数据库的实际应用按理设计索引
+ i+ ~" ^" J1 |6 g2 `D.删除一条记录将导致整个表的索引被破坏# }8 h: @; f: l) s
E.只有数字记录行需要索引2 }$ l3 i: j0 U+ a" l+ ]! H

$ Q& X- e7 _2 u9 A- g9 a' P4 G$ `  i% i
8.join能否被嵌套?# c8 Q4 i. p6 V
. ]/ A, [% N: U0 \8 {. {
A.能6 J' h! B  _6 L( g& [3 ~" y0 ?
B.不能
5 t  N$ e! Y$ N
1 T, i1 m: i5 ^3 S* o+ S3 T0 [4 N4 T: E" y" W
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
+ T3 P4 z+ t4 \& d- O) {2 R2 r; h! m! l
CREATE TABLE MYTABLE (
/ ]4 k' V3 [$ B* }/ hID INT,9 o# s6 I4 y$ k( x
NAME VARCHAR (100),6 \& F9 J0 V4 n; M! w# y- v
ADDRESS1 VARCHAR (100),' b( c8 s. `: o
ADDRESS2 VARCHAR (100),
& y* V6 d! y, A; {) u! N  _ZIPCODE VARCHAR (10),
. g1 D$ B/ }0 K- j; V3 F" ZCITY VARCHAR (50),* T( C2 e7 y6 v: A' P) V
PROVINCE VARCHAR (2)9 u( w% T) K  S  q1 o& G7 H  D) o! ^! x
)
+ Z! Y% @! x6 f3 m, M; MSELECT ID, VARCHAR( |9 v2 f! |. [4 \1 R1 V: d$ u
FROM MYTABLE, e) J0 s; d' k7 A
WHERE ID BETWEEN 0 AND 100
# t. z+ _* P  T. S8 R9 X1 x& kORDER BY NAME, ZIPCODE1 D" B" r3 o: a/ }/ {: Z) B

2 h) D2 I' v; T3 r9 H& cA.给ID添加索引
* [+ W; V) W0 CB.给NAME和ADDRESS1添加索引0 Y' Z9 ?8 @  a; M9 o+ O
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引. j. p( \# A1 B' `
D.给ZIPCODE和NAME添加索引
% P; e4 ]  W3 s7 D: vE.给ZIPCODE添加全文检索) B, V- i! i+ P- r! Z8 ^) _
; K' e  t; i4 ^9 z9 r. i
& W2 u( I) B% D. A1 c$ F; e+ r0 Y
10.执行以下SQL语句后将发生什么?* H6 a) I: P. J/ s
6 A2 d+ F+ F* {9 y9 N" T+ R" Y# U; t
BEGIN TRANSACTION
7 M7 Q$ n% B7 M- m! ADELETE FROM MYTABLE WHERE ID=1
" r; {) K( R9 {/ L/ X2 }" NDELETE FROM OTHERTABLE
# ]! }# S8 K$ C: ~9 x" zROLLBACK TRANSACTION+ t  l6 b: n1 Q, v. K& ~# G

+ ]7 G; L9 L  u! @1 h+ i  VA.OTHERTABLE中的内容将被删除' X5 e- Z% F6 g1 B  N: ^' U- t
B.OTHERTABLE和MYTABLE中的内容都会被删除7 n; {. \  s* \% t% U# Z4 I
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
5 [  ?( z1 H* n3 z  XD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
& ?" ?, u6 M8 C  a2 N( w' O5 qE.数据库没用变化# B& ~6 `4 s- ?

7 v& b5 k  j/ q/ U
# {( \( [) @4 m11.DESC在这个查询中起什么作用?4 T0 l8 c5 z8 x( N
. M' F$ C+ s3 p0 W
SELECT *5 q# U) p: B5 U
FROM MY_TABLE7 |2 O' i. f" s: m+ _
WHERE ID > 0% g" N- V5 e* R4 E$ g) ^
ORDER BY ID, NAME DESC
7 t# N  Z) l% ?" @# S" v9 u; q. l+ p
A.返回的数据集倒序排列% m. D2 D5 s! O& J1 U* B# d$ L
B.ID相同的记录按NAME升序排列
0 ]. N% {* d2 ~) J) b0 lC.ID相同的记录按NAME倒序排列
1 y/ m) f& b/ b, a/ dD.返回的记录先按NAME排序,再安ID排序$ f7 |! e" V: x: T& C8 z! E
E.结果集中包含对NAME字段的描述
  S  r: d. O+ a9 W/ }: p9 L$ a* m6 C! s$ a3 a

4 s1 E0 ?  n) C* {& w12.以下哪个不是SQL函数?" A# b/ U6 M- x( C+ K4 w

) c/ ~  q; W  tA.AVG& S8 d9 W- O! D) t: H: V+ H+ L
B.SUM
2 c1 R% ~5 e0 a2 iC.MIN5 w$ p* b) ]+ k& t! s, X, J) W( P/ o/ V
D.MAX" S4 [5 v' j# ?+ t5 M; D0 f
E.CURRENT_DATE()
0 `( C! [& _" H( G1 K% M, x1 g- X) H
- T* \9 R+ ^' m" ~8 M( z: f: y1 t
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?# @* g' }. E; K$ i

" `! q8 k2 D2 F$ H' ~5 [A.该字段必须有索引
) \$ {$ G1 z  `; E; r/ ]4 H+ ]& oB.该字段必须包括在GROUP BY条件中
. V) O) k3 R# R. o7 O6 mC.该字段必须包含一个累积值
0 p8 G0 v/ }* w" F& _  G" [* j, dD.该字段必须是主键
- F0 S; G8 z8 f$ r3 ~( h- UE.该字段必须不能包含NULL值. |9 ?& m  A3 U4 v

6 Z1 J' @. Q, \6 x0 o. x- R
# ~' C6 a* j4 N14.以下查询输出什么?
. i0 z1 T2 A/ j+ k! H- X0 ^5 Q7 J& F/ s* |) r
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
. |5 B. e2 x) V" V/ OON TABLE1.ID <> TABLE2.ID
) E4 J7 B% S4 F: F1 V: k1 L" j7 n- G
. e) b1 B- E8 N- R8 p3 q# bA.TABLE1和TABLE2不相同的记录
( ~' J& \- T4 S3 B( }) J0 qB.两个表中相同的记录) |/ U$ Z! I2 S- h9 {
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数/ E' x, U2 d) }
D.两表中不同记录的条数' c( U2 p8 H5 l. [: I
E.数字29 B1 J) ~4 J: n4 x  q: I, A
6 _! x1 c, h2 W" J6 R* H

& _7 n4 c; s( y4 O15.______能保证一组SQL语句不受干扰的运行?
: Z1 o, x8 S5 l1 A  Y. x% ^
' T# w2 r- l! R; I/ I答案:____________
+ e. R# J  T: k. H
4 J1 f0 r" E+ l$ U3 r- }: x' o# p
- M2 h0 S3 H* |- u' _7 ^" l7 ^* F7 C5 A2 f" \
答案速查2 n# `! R1 @4 `& ?. _
1:BC2 {, k( c! i" m
2:WHERE
- b/ X- K( B$ E7 y8 N2 d3:B
% S3 `+ O" j/ B' O) B4:E
  y. ]% f; ]6 i: x. w1 |5:BD0 r( p% a# i8 d, U- c5 u: D
6:INSERT
* Y) b  s* H6 k. f7:C8 V$ ?, ?1 u' J: d3 ?" e
8:A
: R, A1 @5 z$ J! r. w9:C
! B) G3 e  j( k$ L4 `10:E. [- {/ A+ p0 s: v+ M8 [* q" [
11:C0 S. m7 |" s# J, x, S$ F# F6 _, H
12:E( k5 ]: G. H# H* Z8 n! z
13:BC- D8 w% c3 g. S. d3 n' w( h
14:C
* @$ I0 m# z) B0 X: _15:事务0 `  n3 K; _" b: I/ Y$ ]. _

9 h* G1 X1 e( `3 p
, t$ y9 K. {  F5 D- _  n: K. i5 g
" V! f- l5 u1 Y4 ]" z9 V答案详解2 v, N2 S7 e/ c8 k: Z# w4 U+ M
. }! l+ F  h# x/ W! q
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
( Y7 X, W( h0 Z5 P5 ]2 q% b  W: L/ x$ e, ?' w
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
! S" l1 _. O6 W4 V7 a$ v$ g9 c
7 L! O, E9 a0 z5 c0 O* T! y1 j, Q1 A3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。! o& W9 t. b7 z% Z' z) L
! U; v; \. K/ ?4 e* p& r) [, V: n
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
8 k8 i* s7 K% ]! j! g( j+ u+ H- U9 \7 a
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
: O; B# q( h- U  Y* A
2 o/ F1 C  y6 N0 q) s6.答案显然是INSERT。
' _9 b& s# S" d! u( }3 d- T3 Z0 a0 H5 p7 I4 _4 }
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
" p" C4 v) E$ S: Q% |/ l( b# z# u; q& O9 d1 h  b0 o
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 A0 P$ J* d. b5 w. N. C
  M6 h, K& t. a1 N! b9 W/ Q. M9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。% u" t+ }0 J( Q0 z; S/ M( G

9 @8 }& G8 h' L8 J0 X10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
$ G/ a! ^3 T% T9 Q. |& o# M
+ M$ l3 p# t) E. ?11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。5 _5 O. [3 O7 W  Z! }) D

: s" Q  I, I! ^8 @$ v$ V12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。! {6 i5 N& h/ `  N

+ |6 ?/ {& v9 f5 V# y2 \# ?13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
( i( S) X0 [! c/ `' Z" o/ o( Z9 K+ w; D9 H% \4 V
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。. Y$ t. D3 @( V8 @( `0 X8 X7 [5 S
8 Q. |+ k  D; f; ~6 M3 J0 H
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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