Board logo

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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
  z  S9 _% n( l2 jPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。0 v) i( N! `3 j
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。- ^- @, I4 B1 O5 e: ?9 g2 Z/ R: H
# s: D) H7 L2 [$ T5 t- m

0 L) L( K- s! O9 y问题+ }: V# o+ q8 D1 |5 h9 ?3 V. O7 a: M- c
/ A7 f3 t2 h1 P
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 b$ |; D9 N% ]% E9 X4 _

$ u9 R  n1 \5 ]3 g* D+ s2 l$ L) a9 hSELECT * FROM MY_TABLE
' ?9 J( r8 W, ^! H/ A8 Z4 e' g
* K. \# s- G0 s: @* BA.如果可能,用把查询转换成存储例程
& M/ O" y3 G# y& @B.如果程序允许,给查询指定返回记录的范围
, Z( _/ S% ?+ y+ ]) tC.如果可能,添加where条件
2 Y/ t. v* S8 T! j& ?D.如果DBMS允许,把查询转换成视图
; ~1 u0 |7 y4 z' }. H, vE.如果DBMS允许,使用事先准备好的语句
- s& O# e8 J0 l9 @( ]. q& n0 ^4 m, L9 z, ?) g& y  q3 s* s* e. p
8 g7 n( f1 f3 j' W$ @+ M
2.可以用添加______条件的方式对查询返回的数据集进行过滤?$ n1 t# R' B1 L  l, w

% C( [6 @  Q2 L" I* f% u答案:____________+ @% n9 S' V" s; S0 _+ F% w

. F7 F. k0 k% Q- _3 u1 z
$ U" v1 x/ h# |& Q3 |3.内关联(inner join)是用来做什么的?
) {! c0 n+ z9 g$ ^0 S8 I* T# x
: ]( n5 t- N% Y6 [7 C3 \A.把两个表通过相同字段关联入一张持久的表中
, m: ?2 y( c* i! s" VB.创建基于两个表中相同相同行的结果集
9 L8 t  k- H% B" o8 }  ~5 B# zC.创建基于一个表中的记录的数据集
' \+ [; f/ s0 H# V7 M9 CD.创建一个包含两个表中相同记录和一个表中全部记录的结果集; l& V- {7 |# d! y" d; a
E.以上都不对
9 g- V; G' s7 w5 ^  D8 a9 e) X
% s7 y: `$ S! ~) j: E& K1 k' x* ?) u
) B9 Y! q" N5 `& ~9 e4.以下哪个DBMS没有PHP扩展库?
& r$ a: V9 t9 p" @
2 [6 t% D! j- @1 ?: S" I% kA.MySQL) }' p/ w" n" K) F% Y
B.IBM DB/2
. t* w4 q% F) T$ H/ [7 e" aC.PostgreSQL
' i& G2 d8 z( p+ HD.Microsoft SQL Server
) g0 S4 R+ o! t# h9 lE.以上都不对9 ~( @0 n6 f0 Q; N, P

* K/ R: b4 F. o9 q) M8 l1 x" K5 g
. ^2 |( y0 a$ N" g' |4 [5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)0 Z& ?6 j* r4 Z. `0 J' Y4 D- L0 ]

& F+ [& s, f' C<?php2 J: _7 O0 @8 n+ C# Q
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);1 n: G( B! a" v
?>
; W0 ?% p, k2 P% J+ ?) a1 M) T2 N' q& ?2 M! s" ?+ G
A.MYTABLE表中的记录超过1条
, _8 c7 h% `2 q  R" iB.用户输入的数据需要经过适当的转义和过滤1 m8 ]; J, r! o
C.调用该函数将产生一个包含了其他记录条数的记录
5 n# f  ~. B1 v, \D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除0 T( @( ?& E  q  f
E.查询语句中应该包含数据库名/ q- B! ~8 j; [+ c+ B' N

* w1 H# g; q# n- v  ?& E
& Y  X0 G' P" `1 |) ]6.______语句能用来向已存在的表中添加新的记录。
+ m. _4 B) _; F6 V4 B5 R& ]9 E, P' l" k* @
答案:____________
# n7 Z  n  f& |; ~' f: h
0 r! B, f8 S# P4 I4 s
) I9 z2 H$ G3 \8 |, s0 r$ ^( g) H7.以下哪个说法正确?
9 C; P" h& s! N3 `% N& G
- ?) H0 u0 }5 X: l$ c6 i! vA.使用索引能加快插入数据的速度
3 N9 P' Y) f$ T5 z& Q# hB.良好的索引策略有助于防止跨站攻击
: W- E# _: X0 ?5 Z4 RC.应当根据数据库的实际应用按理设计索引7 d" }" D! ]/ F, \
D.删除一条记录将导致整个表的索引被破坏5 Y, v. a3 F+ @6 `
E.只有数字记录行需要索引
" a. G) d6 c% f/ |( n( f
1 Q- _: F; @+ Q5 n5 P1 h; U2 C' r" N2 x7 F8 |0 j, k' W8 s1 }
8.join能否被嵌套?
) B: b' s/ A$ {7 d1 d: @: c9 f
' ]% Y8 q- L+ e7 n& S" CA.能
9 _; A0 s' P& R( p' }5 IB.不能
. ]1 b/ V% s2 q: M6 h! o5 \) n7 ?2 c" c. N

( O- l' M! ~- x. d9 t( K9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% C6 z/ W* `% x7 A0 F
( L3 O6 h* f# RCREATE TABLE MYTABLE (8 ?7 i4 r: B, Y! _" ?) o: l5 U7 S
ID INT,
/ h  q. b! Q$ @7 ?7 X" qNAME VARCHAR (100),
4 a) t  f4 s7 L& S/ G9 nADDRESS1 VARCHAR (100),  X  j$ z9 A0 s; J% ]) `
ADDRESS2 VARCHAR (100),1 f. }8 u8 J; I. r
ZIPCODE VARCHAR (10),$ W; P6 P( ]2 V* y$ q, z7 X
CITY VARCHAR (50),
, y( @: D4 ]' @PROVINCE VARCHAR (2)
* F2 L5 U" q' o: u& p)
( |9 i) s0 f$ ~, }( ESELECT ID, VARCHAR
. |4 B0 O! \6 f" ]0 |FROM MYTABLE
3 i5 w/ S% y+ V; w6 N* uWHERE ID BETWEEN 0 AND 1007 f2 ^  @9 l: m
ORDER BY NAME, ZIPCODE2 @- ~. X8 u0 A# L

. `1 W8 ]% x$ ^8 c4 \; aA.给ID添加索引: m) t3 y2 a" ^. X! e' i
B.给NAME和ADDRESS1添加索引9 ?* J2 x2 p( `+ g$ O8 t0 n+ E
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
! M" D; D! w* G5 T+ k# O  @7 YD.给ZIPCODE和NAME添加索引! o$ Z0 ]0 B$ k% V1 n
E.给ZIPCODE添加全文检索
9 [1 o  ?% P* A
& U( Z& w9 G+ S' Z: w9 ]; Y6 U2 P8 Y+ P5 W
10.执行以下SQL语句后将发生什么?
4 z: I! N- p# F( l* ~0 d/ v- S- R8 w! ?- T+ \- N8 l$ i9 w' K
BEGIN TRANSACTION) X* w) w' ~( O! s
DELETE FROM MYTABLE WHERE ID=13 G/ R  z" r8 J
DELETE FROM OTHERTABLE9 Q' v# S& n. |1 @, ^6 ~
ROLLBACK TRANSACTION
% j  N8 U! p( e& J6 \8 `" R5 W* @3 H) M
A.OTHERTABLE中的内容将被删除
6 ]# b6 K# z; v/ I; [8 `0 W4 B  nB.OTHERTABLE和MYTABLE中的内容都会被删除
+ p) j" G  l& y* I) V3 O) a) CC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
9 G7 y) s- E+ [. O) c' h/ oD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
! w! l! U1 |0 }& p' Y# OE.数据库没用变化
/ T, B  F6 s1 ^  \- p2 x- ?' O5 M3 Z- r4 {

, f% e. ?0 H- p; Z6 }5 \/ @11.DESC在这个查询中起什么作用?
! i4 R$ S7 B' Y4 M- V
4 j) ^+ |5 k) x1 xSELECT *. b) a2 ?. j9 O+ C1 s: E" |
FROM MY_TABLE, o# I( R" @6 B% C0 \5 f* X* u
WHERE ID > 0
6 a* q2 g5 R/ d( gORDER BY ID, NAME DESC5 q8 }# K, _- |* |- ?% Z' x

2 i" L/ I$ I5 W/ z- b3 h( G. ^A.返回的数据集倒序排列
9 Y1 A$ s" ?2 T: v$ sB.ID相同的记录按NAME升序排列
  W, b- k( s8 n0 i! `C.ID相同的记录按NAME倒序排列
8 A5 N3 F6 z0 u" W5 J+ oD.返回的记录先按NAME排序,再安ID排序) W: P$ o9 m) D- [, O; l
E.结果集中包含对NAME字段的描述: _0 d3 W5 w) N& I' h/ {, |# G
5 w5 A$ W9 _3 a0 J0 R

7 }4 o& F! P4 V; n$ b9 p5 ?. |12.以下哪个不是SQL函数?+ I& k( Y, \9 D( Z4 |

' p2 g+ ]7 d% V2 h* F& o) `# {  |3 c5 BA.AVG
! K1 E* X5 m) h) rB.SUM4 t& Z/ ^# M' `2 I4 a
C.MIN+ d' E4 x& Q' R
D.MAX
; x# k& Y& j( e" S; X0 g9 KE.CURRENT_DATE()
" I. ?. C# W, B
5 M" J. r! R3 ~4 s3 v! M0 S8 i5 t7 `
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
, f; a7 {% p( g7 C5 v% H6 n9 g* [6 [% F
" v* v5 X) k" l& X( c( I( MA.该字段必须有索引
3 G9 Z: L+ G$ E4 M5 w) P* M' p9 ~6 OB.该字段必须包括在GROUP BY条件中, t  H+ ^, [4 B( R- r& X
C.该字段必须包含一个累积值0 q" v7 O. L3 \+ S, `- Y
D.该字段必须是主键. }  u" Y' j7 A, w6 u& e) h
E.该字段必须不能包含NULL值
+ U. g) x8 i6 ^) ~5 C3 y
+ y; e2 n' y: a7 C0 F+ U9 l, y8 R& B4 \( {' f
14.以下查询输出什么?7 W- g* R1 A) ?+ K) {4 D& _" Q- O. H

$ T& [8 h+ _+ g* T$ zSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE22 U5 w. z, p+ s( `' J# e
ON TABLE1.ID <> TABLE2.ID+ G+ h7 ]+ Y1 D6 ?; J+ k7 q

- s& H# n" B1 K# EA.TABLE1和TABLE2不相同的记录' ]$ o- e3 K9 R6 J0 o
B.两个表中相同的记录
0 X* V4 G7 V& m$ M; _2 k, @. }6 g" MC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
/ p' G! ^) @5 g9 n/ K6 {: CD.两表中不同记录的条数/ |4 s0 t# k' [
E.数字26 e; f( S3 }* `3 r3 c  T4 l
# j1 G# G& x& T9 f3 j' p1 X
/ T5 s* e' Z* D7 D
15.______能保证一组SQL语句不受干扰的运行?
& P- u/ i, r5 ^  ?2 ?
2 g% ]$ ]) ?( L1 |" U答案:____________0 s$ t8 {" l1 s( Q) C

& I! @/ H* `! l; T9 l) e: Q  m0 x, [7 S) a6 k7 F( U1 m0 J) V

  `2 m6 Q8 x  F1 v. [答案速查- M! O+ @: E8 ]2 \' n
1:BC& W+ C6 Q2 [7 t3 O+ U+ ?1 ^
2:WHERE
* k2 \$ J/ O, |- W' f3:B1 k8 e+ ^$ s, k7 A2 K3 I! s
4:E
4 f" [$ ?1 E# f# N! l5:BD) f" R! f$ @' z2 m
6:INSERT, g, H. j- i0 z6 D" Q2 s% l
7:C
: p- T8 N* ]9 i- g% T$ u8:A! \/ S: w/ }( V7 \! x
9:C' s  x+ K  r" m9 W
10:E+ ~! b8 X) J+ X9 _- I. H! ?. v
11:C
9 ^: k- S7 k! [) \  R12:E$ Y+ n! l0 F$ ?# P; p
13:BC( h0 ^6 \2 S1 I9 u7 f
14:C
3 Y8 {) l& O" Q# E- z1 A. s( [5 [+ K15:事务
9 r4 `+ D$ l2 L' i. e" @. s
  \7 e  F/ B! B) u: z7 O" P' w' D3 [0 o

. u) x" w0 Z. S. X* V* b* s答案详解
( V. @+ Q! v. t& L
/ q6 u' l+ @0 k/ i( _1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。" w$ {. }) v' |* u& P/ e) F- F

: z" K/ ]' e9 d; f2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
/ G7 A8 o2 w' ^( O, W$ b* j! P4 s* s3 e1 X9 P5 N
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
4 Q) f5 w9 O6 x/ @0 W& r7 b: G( N* p
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。$ R3 j. O8 R) q1 c  |: y
. D1 E/ h$ [! r. R, B! S9 v2 G0 r
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。1 Z7 M+ L" E. c# q
$ n9 M* i8 m7 \2 x/ x( q: d
6.答案显然是INSERT。! o3 }. ~/ ^  z  n0 \1 G; N
& J/ T' P+ F+ o5 H  P4 ]" V5 [
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。% H! W5 A$ w4 I' X; G, f
9 C4 |' E6 p- a1 K3 j5 t$ _
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
& A" Q: h" k/ L$ r: T6 B' K2 O2 W5 i6 m, ]
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
* p( t7 h* D' p, V! L( s% A- L7 ^, m% p* X! O' x
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
( m; `8 ~* t, y* Y/ c+ V# P  r# W$ I) g2 g1 k6 b
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。  y; _) t$ ]& j4 c
+ {8 D/ w9 c5 ~$ d+ a
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。( x% D9 b5 n9 P/ ?7 a4 u& D

3 ^0 E2 C% \( Z, D* o& j$ ?0 p( x6 o13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
) c8 V7 W/ o/ b% E. M! ?
' ]. [  k. O4 h+ ~( f14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
% z0 `0 @$ M  T7 G
) k# b( b, I& V$ W$ e15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。




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