返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。/ L, ]! {, n, B
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
" q  ]( W7 l  e本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。- Q& X4 z( i/ w4 W
$ t2 a9 {  Y1 W" d- K

, ?. V2 P! ]5 H- y问题
5 T$ D% V6 P) J3 i0 N" T' [( f0 a, ?6 C& O3 P' t0 D+ v& s
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)3 E! \8 N- B0 u! Z* E1 Y, g

& h8 v0 ~7 t  K. D4 ]: `SELECT * FROM MY_TABLE
8 l- X, x% S7 ~$ n$ |. r9 P' _; J( E. E/ F6 Y
A.如果可能,用把查询转换成存储例程
( I# S5 X; R! N5 s: _6 S) jB.如果程序允许,给查询指定返回记录的范围
9 Y* V0 E* J, \! O* m3 v9 uC.如果可能,添加where条件4 e# q1 t, l! n7 g4 q( w1 z; M
D.如果DBMS允许,把查询转换成视图
+ b' w8 ^. F; J2 Z+ vE.如果DBMS允许,使用事先准备好的语句
" Z: W8 u: c* }2 w9 ]$ ?- r
3 w# ]& p  z5 W) g% U: K. W( t) r( Q# L/ J
2.可以用添加______条件的方式对查询返回的数据集进行过滤?3 [' v4 R- F8 G" g: l

4 D7 ~7 o% x. l- r0 M答案:____________  E$ {2 r8 m4 v1 b

( y+ b% [8 D$ m) `, k5 V2 |( ~( Y
7 c: b; P% ?) m# ~% O8 `5 @$ O3.内关联(inner join)是用来做什么的?
& w; c& H/ s4 Z* i/ d+ e: F1 v2 a3 p# `* O& w! P0 I5 b
A.把两个表通过相同字段关联入一张持久的表中8 Y& l, ~) m5 f& c/ ~: E
B.创建基于两个表中相同相同行的结果集
  Y) O9 i5 o, ?C.创建基于一个表中的记录的数据集) F! r4 ^: E% v( [& a6 G9 E3 P
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集) D: }( L0 I1 v
E.以上都不对
6 e8 [) s/ ~! _0 }- v! s
; V! p) j6 L: @( F
1 Y7 Y! {% ^9 @2 q4 q. G4.以下哪个DBMS没有PHP扩展库?# f$ i7 T  m7 r9 }; O/ x3 ]* W

: Y: Z3 z( B$ _' i- YA.MySQL! l% G: t: Z7 h$ x9 C; |
B.IBM DB/2! f0 F8 E% Q% y: s% H& h
C.PostgreSQL
5 W3 [  B* h0 @1 n2 ?% Y9 lD.Microsoft SQL Server7 {. \: _1 B4 x' c
E.以上都不对: L6 c0 @: q2 E( u1 H; A# p3 j) l
* c/ m7 x+ Q4 R+ K0 p' h1 o8 p

# u) P$ O& h4 W8 T5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选). v& ?! w- x4 E0 Q; T) d

- j( ^5 Z1 Z8 t3 I1 Q1 v) E<?php/ Y8 m2 q) @0 Y8 U( x
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);$ k* K; |& ~9 M% m1 l
?>
" m- j. p2 d. p! e* v- D+ _1 z# g9 @) L5 a; c; ~  J
A.MYTABLE表中的记录超过1条4 i. w  Y- d! i, W& e$ I1 g3 `& {
B.用户输入的数据需要经过适当的转义和过滤  \  |  W( X" V4 Z) E+ N
C.调用该函数将产生一个包含了其他记录条数的记录
) F6 X6 h8 h8 C; K4 z- zD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除$ }: u  D  m6 q  m- S  X) Q
E.查询语句中应该包含数据库名& e3 x6 [+ ^# [5 u% p
- H4 p; c; W* S) D$ o
4 T' F+ ~+ x; ?0 T5 R
6.______语句能用来向已存在的表中添加新的记录。
8 H1 Q9 S, j- w; Q3 d7 k
; ~. V6 k0 @1 w7 U答案:____________% z& H" n, J. C1 p& }

& F& r; \0 P' H6 ]4 j' [
  D; Z! G8 Q+ x  b- w2 `" [# O5 C/ c7.以下哪个说法正确?
# a0 M  Y6 q) n% G: r' r' H  ?- `6 L+ l: S+ Q# i& i
A.使用索引能加快插入数据的速度3 G+ [$ _) x0 B5 y2 ]' q8 p. Q8 p' @
B.良好的索引策略有助于防止跨站攻击
" n' E# j0 w% N% @; H! YC.应当根据数据库的实际应用按理设计索引1 t4 w5 P) b6 v* ]0 ^" S. N( E
D.删除一条记录将导致整个表的索引被破坏) Z. p0 |, d8 ]7 _; x- |% E
E.只有数字记录行需要索引' ^  `# t; l0 R$ R" F
; e% a& V& [  l5 I3 r1 e  u

/ h  a" P% m- C5 Y4 B2 k3 I5 a2 r8.join能否被嵌套?' V: k/ c' m. V4 s8 x/ r3 h) O! u
/ j. _: X- I. A3 s6 {& r
A.能
: V' g( y4 ~1 ~; M' w- p! o3 r# mB.不能& a$ a3 |4 x1 r# |6 m+ [
$ N7 U+ d; l; o/ |0 P$ o, X8 k

2 k! M; V. B0 B+ R' F) ]9.考虑如下数据表和查询。如何添加索引能提高查询速度?
( k/ c# g0 {+ }
% Q7 q- D* _3 s+ G. ?* y  aCREATE TABLE MYTABLE (
* f! c2 R/ o" LID INT,% y. |  Y+ M! h
NAME VARCHAR (100),
3 i+ |" v' h' H: T* w1 ~ADDRESS1 VARCHAR (100),
& h) b0 d- s; Z+ gADDRESS2 VARCHAR (100),
8 A1 |5 e0 B5 L8 }ZIPCODE VARCHAR (10),
; [6 d7 R3 R3 |& Z+ M$ Q) B& `' i8 v* fCITY VARCHAR (50),
1 w! t* C: b8 w6 ^: ^PROVINCE VARCHAR (2)
- x7 Y# z2 a2 x* d* G( ?8 i)
0 S! }3 j% E! ESELECT ID, VARCHAR
: k9 z8 y: k/ g- h( ^FROM MYTABLE% f' `+ X0 v1 B1 ~7 b9 k
WHERE ID BETWEEN 0 AND 100
6 U$ I4 J6 V. M0 K+ x( W, T% oORDER BY NAME, ZIPCODE
) @; g# B* P. ]( ]  A' \0 `: ]- _% c& ~, j% h
A.给ID添加索引
3 Q2 k' m$ O' {2 S; \% b( ?B.给NAME和ADDRESS1添加索引$ z  ], _* O. ]- A7 t9 E- [
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
. r  m  `+ L! \3 g* OD.给ZIPCODE和NAME添加索引
. D& S0 Z% a7 ~! Q! JE.给ZIPCODE添加全文检索4 _+ L' {+ j0 V  @

2 S+ o5 Q0 }+ b4 q
0 c/ ], g  p7 s7 [, A10.执行以下SQL语句后将发生什么?) U$ \* o+ n8 {

2 |' E/ c$ j( }. ?2 lBEGIN TRANSACTION1 k% _3 Q1 Z1 A/ Q* {. f5 f
DELETE FROM MYTABLE WHERE ID=1
- G2 K, D1 J  dDELETE FROM OTHERTABLE
# B' G2 V3 o) E9 ^; SROLLBACK TRANSACTION3 J0 d" Y7 q( T6 J( J) a4 F

/ a; ^: s; h/ `A.OTHERTABLE中的内容将被删除1 D! y8 e: r$ R0 T+ r% R% @
B.OTHERTABLE和MYTABLE中的内容都会被删除
6 X0 T% |. a/ I: xC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
8 @, U4 g: w" H$ vD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化$ _" [# a& @7 c5 p, f
E.数据库没用变化
3 j: J* |( E& `5 n( t1 J! E: t) j+ g; v2 h4 q
. R2 G6 |9 F1 r) \- X4 z! W& ^/ h- p
11.DESC在这个查询中起什么作用?+ X' {2 p7 A0 `; f0 Z# m; s0 A

- R6 X0 M* c6 T( `8 WSELECT *, W0 V7 f) j9 C7 v! k
FROM MY_TABLE5 [4 W( O# D8 g- Z8 ~
WHERE ID > 06 v0 {6 U3 J" [9 w( T
ORDER BY ID, NAME DESC
2 _( G4 V" P5 u7 p$ t( U( f" Z- \! J
5 W" K# k2 m: D- WA.返回的数据集倒序排列# w' R8 |! _2 l5 F& u0 I
B.ID相同的记录按NAME升序排列6 H! K& f/ G; s) a, U# I
C.ID相同的记录按NAME倒序排列# |" f! Q, ~1 B& F$ _8 l
D.返回的记录先按NAME排序,再安ID排序6 Z! J( i  ?' M. ~
E.结果集中包含对NAME字段的描述. @& P% N9 ?) R% F/ d* P/ y! k

5 e3 ?' k5 {8 `# w; O
. t3 w9 Z# P2 \12.以下哪个不是SQL函数?
* J; G) C" p8 N- a' z+ |' k* v1 l6 {& ?0 g+ l* z) S
A.AVG# p% L5 M) m# K$ g0 ~) F+ ^: p5 W( R
B.SUM7 n. |5 W4 i# A
C.MIN
. M) e2 r1 u# a* p9 ZD.MAX
$ o) `" v9 `- d6 T( d" z; {: {$ WE.CURRENT_DATE()4 R. w3 I4 Z, O9 Y' O, ~
& z4 \3 [' N/ `' b0 v
0 [% s0 |1 J( l5 J+ W( e' W, z3 P% f
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?1 e$ b& h8 `# q: c' c: e) r8 H2 a

$ {) ]  w: l) w2 J/ ?  eA.该字段必须有索引
  j1 `$ _$ w) ]: q  OB.该字段必须包括在GROUP BY条件中% `# w: Q0 F/ d/ z3 ]0 o
C.该字段必须包含一个累积值( k- L/ O$ t; t1 s2 g" v
D.该字段必须是主键
, s4 y$ {/ B# p6 z% I' wE.该字段必须不能包含NULL值0 L' R; T8 y" i* ^, e' b& W
( [" f2 k3 y4 {. q) o

# Z. _. }2 @; m: F) x+ R1 J14.以下查询输出什么?
1 ^$ t% q( R: _# \2 C, U+ e6 @2 N$ X6 e
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2% _$ Q* b7 M# w4 c) s  C
ON TABLE1.ID <> TABLE2.ID
+ ~, Y# S4 t2 O- X! |8 m
1 W& Y) F) X+ R9 JA.TABLE1和TABLE2不相同的记录
3 ~7 T2 r  G! _& PB.两个表中相同的记录, d  ?; g5 X+ n, _# h
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
3 D: f4 ?; z; SD.两表中不同记录的条数
0 K5 `) B- i" J( kE.数字21 R7 K( [1 h0 n+ j( ^. M7 \6 d
  N  ^6 |7 d! r
+ B) E6 ]  i9 \" Q/ @
15.______能保证一组SQL语句不受干扰的运行?- A# `* N' x: t  I8 @& k+ F9 i, F

5 Y* y5 w+ N5 n7 j: G' r5 [0 B! F答案:____________6 w) s) ^7 u  C+ g$ h

9 C/ H! g; s+ O- j/ R) h
& @: Q  o& |) Z/ K2 w$ e1 w* p& _1 D2 g
答案速查$ ]7 |( V5 x" j1 r" Q# v
1:BC
6 ^" c$ c: e) |2 T: O  h' O2:WHERE
$ d" A! [: S2 `! w3:B9 x3 c, Y% g5 g, w) f
4:E
. N! N" _! Z; N: |5:BD
  a; P. v6 J$ X5 H# c5 K6:INSERT
% u% Q9 D2 P$ ^2 w) x6 f  _' ~- r7:C# J! ?6 g, {  K# @& x4 V
8:A
* ]; t$ U1 p8 i0 f# ]5 z8 }7 w9:C
- a, f5 \2 {$ Z: ~10:E" {1 ~$ f* W3 v9 v
11:C& a, ~% `8 v: Q, X; ?2 ]
12:E
: r/ u4 ^! V1 H* v6 M  m13:BC
) b+ ^" p8 h/ `% l* B. f14:C
3 _- x3 V$ N5 \- j1 {, b, L5 K15:事务
" a7 o9 i/ a. s
+ Z* h0 q5 V5 h$ c
+ J6 X; h( W: E! p$ ?8 E# T# ]5 n
答案详解7 Q/ d$ b4 M0 b+ G  {8 R$ A
' Z/ C# F5 ^) R3 F& j4 E
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
% _# B" U% @1 h. O% R* T
$ ^7 ?  R1 E6 k. n# ^2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。3 A. S2 H- O! b( m  P' b$ Q% v6 r
: x: x9 e- Q* c1 U
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。4 L/ V, I* C% `$ I4 G

5 K8 Q7 o+ k2 o4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
  R+ c5 Y9 {9 l
+ `; O$ _4 Q. g; r0 P0 E' V1 K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
! D/ z' O" U' d5 a, y3 j8 F7 k1 X; c
- ~6 `  D0 y" m( W3 i' b0 ^- s" D0 V7 q6.答案显然是INSERT。
+ Y& y$ P7 v0 \5 [8 J# ~7 ~0 q; |+ Z! Q2 U* S+ y3 z2 S6 {3 [
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。0 q7 j9 p0 {: T- I

# |* k/ z* N8 x8 e( V9 I8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。+ \0 F* T/ V( S* z0 l% L! n
, o: x; @' `# j
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。  |# Q' W0 K! e% `

) I/ P7 p* ^6 T; _# b10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
. f4 D8 V% q* N0 [0 l/ ^% t- _8 N" Z8 e$ {5 W
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。3 Z% V2 V* `% L% Z" x1 [

" L0 A, t9 O' [, v& z12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。: Q, z0 n/ Q+ a6 D" ^* I8 H3 L
6 E( Q: X6 {3 S; a  O# _1 _% _" X
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
5 U; r" j* U" C- h& v1 D, k6 C$ \4 N: E9 m! v% `/ _) w; _6 E
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。7 B" G2 p( Z2 o0 D3 y

- ?; D: `, w* P) G6 o2 e15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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