Board logo

标题: [Zend权威认证试题讲解]第九章 - PHP与数据库 [打印本页]

作者: admin    时间: 2008-4-17 14:44     标题: [Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。! W) W5 `, u; S9 p0 m- Y4 k
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ k* n4 c$ u( K& b4 j本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
4 l1 {* L0 U& ~9 Y- T6 x
4 p) R0 R9 @7 e  N
% l3 F& J  I1 F( K/ ~$ A# F& Y问题
+ s' f: j3 D9 y; O  d1 g, T1 D& W
0 Z0 ]( u5 ~' F1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
1 e, R+ h9 b5 K0 |
& E/ f+ G' l1 ?( Z. |: N1 |- hSELECT * FROM MY_TABLE
" U! S2 F% Z( k/ _
* D2 ]: H2 \0 e; Y5 dA.如果可能,用把查询转换成存储例程
" Q$ Q' p8 `" m- h/ l% rB.如果程序允许,给查询指定返回记录的范围
7 P& `0 ~0 c+ P# J% a9 f9 f8 j: xC.如果可能,添加where条件
$ s% r& I6 r1 {/ \+ c4 w+ A/ aD.如果DBMS允许,把查询转换成视图$ `8 j. c9 h. L* h9 t
E.如果DBMS允许,使用事先准备好的语句
: W) D  n! ]. I" P- t9 h/ W6 }1 ], \. \& f8 C

1 T* r6 ^5 H/ o9 P2.可以用添加______条件的方式对查询返回的数据集进行过滤?
6 z- O$ G9 V3 s/ X: @6 V
" e4 |& d& f. U" g答案:____________
+ i% K8 f, T4 D& h6 n/ T
+ k; T$ R6 i" }# b
7 L5 [2 ^3 O  ^3 H5 h+ U6 Z; i6 X3.内关联(inner join)是用来做什么的?; K) X1 [& c4 z. R

* J# N. i4 l! f$ yA.把两个表通过相同字段关联入一张持久的表中
0 j; e6 u/ d% mB.创建基于两个表中相同相同行的结果集
3 e8 K- V8 i3 a' u% _C.创建基于一个表中的记录的数据集
1 s7 K4 d$ E( h" y8 o: I$ g# \1 T* eD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
; |! u& c& h# A+ rE.以上都不对
6 s/ x- p- z/ g& q; h& X# q
4 s  U  `0 O* e8 m0 D
) M( C$ Z: D' J; U1 l  f4.以下哪个DBMS没有PHP扩展库?# r- h8 V9 U3 G  I0 b% B. N! @7 {0 E
1 v) Y0 t5 T, ~3 T* Z7 a
A.MySQL7 L6 ^0 k% S9 O8 i
B.IBM DB/2( j3 \; Q' w) W4 f. `3 o
C.PostgreSQL
/ u( E3 a8 k0 p% t1 S1 F8 d; zD.Microsoft SQL Server; p* J! V; d' \, \% W. U
E.以上都不对
! C. e- ?$ w1 L& a6 \# Z! V2 ^7 n3 M7 b6 Z! J2 w8 Q6 c% Z

0 P6 C: T: ?4 M/ J8 J5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
- G$ ~9 m0 B2 \: D6 b! w7 s( c. Y- _- J
<?php
' a1 T1 v1 v( W: Y2 o$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);8 G5 a, c: ]) u# }! a2 W) m2 J
?>
) }) W$ ~9 W, r; a' i# [5 h8 \! s- G
/ ^) t# f# V3 x! P  V& U4 mA.MYTABLE表中的记录超过1条
% w; m* v3 `5 f; b; c+ {B.用户输入的数据需要经过适当的转义和过滤& @1 G0 C4 d  S3 z: O; _+ c. w; K! \
C.调用该函数将产生一个包含了其他记录条数的记录
: B+ t, m  d2 F# xD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除, U& K% i, Q3 n/ y8 h
E.查询语句中应该包含数据库名1 N5 W$ _( j6 V& S; G$ V' s* P
$ U  ~5 k( M8 M8 o

  N" c/ ]) \  }+ Q) G# T* y6.______语句能用来向已存在的表中添加新的记录。
; q( [) q9 X7 X4 ?, _( p- i# h" I: i+ @+ n; l$ b& I8 p( Q. `
答案:____________! t1 r8 x( C3 R* q- h

3 J9 f( o! |+ [9 p  V; W: l+ T8 I  `2 n0 s9 t% r
7.以下哪个说法正确?+ U. S5 H# Z: T  q
9 ]( m# f, p9 C( E( f, t
A.使用索引能加快插入数据的速度! g. J8 q6 a& [: p' Q" w. A
B.良好的索引策略有助于防止跨站攻击
! c+ d+ w9 G$ Z4 `; H) K. w, BC.应当根据数据库的实际应用按理设计索引& [, S9 v, f8 J9 O
D.删除一条记录将导致整个表的索引被破坏7 @" P# E- S9 B7 j
E.只有数字记录行需要索引
8 @' x  b4 G" o/ |5 X! O" _
1 r& Z8 P+ i" Z) ]( i$ z+ ^" v
4 D  H2 A6 I0 v) S* x8.join能否被嵌套?( p" G5 |+ V* `$ e
+ i/ |- T$ b1 C$ p5 E: _9 J
A.能
: |- D$ z* b7 s) bB.不能
7 @' z/ v7 w% D, J5 j4 E. P9 f( ?3 h* O- k( A7 N3 W; b  x

: G, U; {  x/ J- H2 f9.考虑如下数据表和查询。如何添加索引能提高查询速度?$ f5 h. z  G! q! X% I

; Q& q0 J$ y3 q4 ]3 {1 ]CREATE TABLE MYTABLE (* N& @/ q1 F; L9 X* q* l
ID INT,
/ C' A0 W/ g" [$ G# W- GNAME VARCHAR (100),0 |$ c2 d6 V' P: G
ADDRESS1 VARCHAR (100),
" V4 r  u# a2 j/ b- s+ q* X. f0 MADDRESS2 VARCHAR (100),, N0 o, X0 V3 W" l  W, q
ZIPCODE VARCHAR (10),. a% p/ h$ D" t( o3 y( U
CITY VARCHAR (50),8 r+ S# ]  X, H2 d+ y) F) ^  x
PROVINCE VARCHAR (2)8 M; e9 g3 n+ S- v, Y( g3 `  W- U# L4 e
)5 c* d% a8 E+ i5 O; F
SELECT ID, VARCHAR
" g& i; K4 q9 L6 yFROM MYTABLE3 d0 |$ R1 I% [& X2 [8 z2 S
WHERE ID BETWEEN 0 AND 100
$ T) T3 m( P0 |0 z* \5 FORDER BY NAME, ZIPCODE
9 t9 G7 r: z! L+ y: E$ w$ l7 q, r
A.给ID添加索引$ n" v; q7 ]# C, e& I: I
B.给NAME和ADDRESS1添加索引0 J! t9 o3 x8 O6 R* J  V
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
* F1 t7 _; ^: l9 @9 vD.给ZIPCODE和NAME添加索引" |9 v' Z: M( I
E.给ZIPCODE添加全文检索
3 @0 j9 N) A0 i0 T* Z/ w/ O8 H- k6 ~, i8 h6 E

( O/ Q, ^0 i' B1 M( N8 s10.执行以下SQL语句后将发生什么?+ N9 k! q+ v6 G5 C" r* |9 W
% ^( `0 ~) b/ X% K8 P3 a4 ]+ X. c
BEGIN TRANSACTION; v7 h) O; u+ C% V7 u4 B  t8 ^
DELETE FROM MYTABLE WHERE ID=19 _& P9 ]9 R. v, j
DELETE FROM OTHERTABLE9 v" V( g$ D; j2 o- e& c+ G+ R
ROLLBACK TRANSACTION
8 D3 g0 P, x& P- R6 o: m- b) ~4 W2 |' @) s. I5 T! @9 B# S
A.OTHERTABLE中的内容将被删除
1 t& i5 I6 @# L! i" ?7 pB.OTHERTABLE和MYTABLE中的内容都会被删除- j/ N8 Y, r# s* Q
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
( a4 V, ~5 E; z! Z' k7 A% _D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
: s& V9 K% e$ D3 [$ p; ^) wE.数据库没用变化
8 S7 O: f8 i9 ~6 H# C2 ~9 q5 q
# [6 X1 h( p) z% ^3 u7 ^8 s* V# V
11.DESC在这个查询中起什么作用?
; }+ S. k) H; B" l. h3 p, `. C7 N: U5 \
SELECT *9 t* m3 {5 a7 G8 j, U7 w5 r
FROM MY_TABLE4 u2 c; Q0 Z0 m+ N
WHERE ID > 0  Q: O* N5 M" w0 F4 A
ORDER BY ID, NAME DESC
& U7 d* Y9 @4 y: `' f' A/ T. F1 o( C  l0 M% d
A.返回的数据集倒序排列: Y" ~& T6 `$ ~1 e+ w3 M+ E
B.ID相同的记录按NAME升序排列& F. V7 }" t! C1 p
C.ID相同的记录按NAME倒序排列4 r, k( A% ]( r, m8 ?& _! P6 ~1 U
D.返回的记录先按NAME排序,再安ID排序8 V: t: k* }( m1 J8 Q
E.结果集中包含对NAME字段的描述+ e5 V+ S$ }4 b, K! [; N
3 v: J: n/ W+ t
! n$ ]$ d; q+ c% |5 v, Z9 W
12.以下哪个不是SQL函数?2 p: u0 A  L/ G6 T  P/ I

7 X5 E1 n' @' O. L" ~+ j+ MA.AVG9 q; Q7 [# ]. h6 ]8 x% ~
B.SUM
  I9 H% k+ t; N, _6 AC.MIN4 N, \# }* {2 R! l+ C& N0 i* \% O
D.MAX; I' l1 _& x2 }1 _1 L6 X" p8 c8 `
E.CURRENT_DATE()0 S* j/ i3 u4 g* x9 o( l9 B
9 R! M8 ~0 ^! K* d. ]( _

0 C# p4 k3 H* ]+ w5 R; z' s13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?7 B" }* E6 B6 k( n4 U0 U* K

" C6 k5 B$ l% FA.该字段必须有索引
3 @' r! x; b. @! e9 wB.该字段必须包括在GROUP BY条件中
- F2 U9 R( N* G& PC.该字段必须包含一个累积值! O9 P  g2 j/ ]  I) C! X
D.该字段必须是主键3 D$ F# ?3 ~1 W* N0 A
E.该字段必须不能包含NULL值
/ G4 z7 W& y* ^. V+ Y' ^9 f+ Y( y8 W" m; _. z2 |8 z- i8 ?- ?  v) v, Y
5 `+ i# d' V) l' D
14.以下查询输出什么?
- u5 K- j' h2 R8 p
. L1 _  p/ A- u: f1 n  }: wSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2$ l  _+ T1 g9 f: p* [; ]4 T
ON TABLE1.ID <> TABLE2.ID% m+ Z- d6 j: H: n

  m6 c8 m5 @. e+ G  ^5 a7 VA.TABLE1和TABLE2不相同的记录. t4 y) N% r  \: h/ c7 o+ W. k
B.两个表中相同的记录
5 Z, N1 L0 R2 `# j/ TC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
, R( G3 M' k' _% xD.两表中不同记录的条数
3 i. F) o# C  BE.数字2
: T+ ~7 l0 x. t( M7 a# V& ?2 ?. s! F
  F9 F+ L' a6 {/ X4 r5 W. |+ A$ p
1 ]9 o1 r5 d  F15.______能保证一组SQL语句不受干扰的运行?. }, U: L* k+ @! n2 H+ L) G
) B- p9 ?+ ^$ g! t
答案:____________$ |! h, B+ u0 r5 g
  r' h+ D0 b' L$ z  n9 v" q
. T1 X- d+ S- {$ c: u9 j

$ x4 c. r3 l5 W) R  l7 T答案速查
; v, ~  L/ o# G. W5 `1:BC( N& \' u5 g0 r: l( L
2:WHERE
2 u! G1 |: O: Z. Q# k  ~3:B
+ O6 Q- i% h& Z+ H# J8 i4:E* V5 T4 q0 l+ i" ]: D; ^/ N
5:BD; y, A+ D: W& U, F
6:INSERT0 K9 u. I+ c1 l/ [
7:C
  q- ?* l. `9 x4 E% u9 u8:A
9 O7 ~1 f$ e3 C( ?9:C
! a% g, c0 R" [- k1 L7 v10:E
) a+ \8 c2 @" E. j& @6 O+ [: i11:C
7 J- R, P' Q5 ?5 K& j12:E
+ ~5 D& n5 [& J( ~- F( A3 j" v, X13:BC
& ^, q; k4 N6 g, x: c: I# N14:C6 G- _& P# V( u) m
15:事务
2 C( x& V; v4 b7 [' e9 Z$ ?# D1 [% l: ^  E3 P4 ]9 y9 z7 i0 x9 m

9 p& M' C. b( Y6 F  |& R
" a0 c) R! u& z/ P答案详解
! x3 S# l; l- N' U  I' G0 w5 I; y4 o& G' t! Y" R
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。% B( f, b' S3 d% |! t

, S( H- x( k5 l2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
: z9 a' _1 D% L6 [, W2 A
, i: X3 o  n0 J, j4 P+ Q3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
+ v% d6 I( D# ]( h" S
$ P- s' E6 s8 k1 |4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。( W# r  T- U/ v4 x( Q4 w7 j

) m% A' }2 O! ~; v4 K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
5 y! g7 |- b9 u0 q2 t* J# L$ L% R) f6 t' W
6.答案显然是INSERT。& N2 o# p" O2 g6 W( _- ?! s

8 p( j. z& }7 j/ ~" r6 g7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。, o( i8 C3 M2 p7 F

' ?5 {& D6 X0 }8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
9 g( d0 j5 ^% x. S, j1 d* S) P9 h6 ~, ^( ]
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。/ d2 \$ \7 P  Q" d; @7 N* `

; A. m) a3 c3 G6 G10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
' x# x, |* Y* `' R3 s& h, T- A  m5 z1 D
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。5 r4 \8 r/ F+ i$ c2 D
3 K5 z0 [. b% y6 R9 H
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。& _% c  k( m+ n9 E, g5 o

' ~3 X  a. J2 R$ F/ ~13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。, ^& g7 @( G; H8 h

! X- d. a$ G) n8 i6 c14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
2 s/ E$ k! o- |6 T$ N% Y) h) U
1 A! S& Z) @: F8 T% W+ f/ ~( s- Q15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2