返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。$ Y$ V+ ~& ?& }  A5 y
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。! [8 f3 O1 ?% ?1 C3 Y" u) j1 X8 f
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。1 M9 V9 C9 g7 b, Y) ~

. M5 j* j# I$ k  M. }7 [- M8 n/ G' E9 Z
问题
; u5 I! @3 j7 R1 s) d) x& \4 g, |0 d1 {/ [0 Q- A3 _4 L( o( K
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)9 ]* g" ]+ k2 I+ W9 X& a
3 h/ r* U# E! o! p: F4 @
SELECT * FROM MY_TABLE
0 M* h' v- ~4 _! i: A
! M$ E7 l1 O  d; \' uA.如果可能,用把查询转换成存储例程: }  _- a6 `- r
B.如果程序允许,给查询指定返回记录的范围+ {  s( Q5 ~2 F; D0 m  l; i9 ~
C.如果可能,添加where条件3 j9 _. U8 @* i) C( o1 L' r
D.如果DBMS允许,把查询转换成视图
" P* Y3 d: m9 j# P$ `% u& f' z! sE.如果DBMS允许,使用事先准备好的语句- D: [2 `/ \6 z) v$ ~: n

, F6 Q* s. ~3 E/ j
) j+ O( E/ v+ Q6 F+ v8 R2.可以用添加______条件的方式对查询返回的数据集进行过滤?
* u* Q% `6 h" D, c
$ Q- y7 e& i; H6 o0 A7 o4 S5 f答案:____________
, R- o/ Y  Q/ a. P/ V( I( T/ H' `7 ?! ~$ S
, G4 n2 k4 v/ x; C5 Y- m$ w
3.内关联(inner join)是用来做什么的?$ _' |. ]( I7 \

2 U5 }" T1 a+ ~/ p8 uA.把两个表通过相同字段关联入一张持久的表中3 d1 @/ M; P- m+ M5 v
B.创建基于两个表中相同相同行的结果集" ^- \5 Y# E) P9 Z, W; g
C.创建基于一个表中的记录的数据集
% m2 m& I1 T$ r* f: vD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
! \4 W, b( a, hE.以上都不对4 s- K8 G0 [8 w' n; K

6 U% i4 v9 P5 _
- [9 J" Z. Y) l4 p4.以下哪个DBMS没有PHP扩展库?* q5 x/ k3 W: K9 C; M$ c
- @8 {" e% s1 u9 L
A.MySQL
! T' P5 ~2 M- C5 WB.IBM DB/2
: c, R6 L+ E1 L/ j! \C.PostgreSQL
+ X$ B( o! f( ]- C; FD.Microsoft SQL Server9 X! u8 o+ J- e  F
E.以上都不对6 w1 L1 `8 ]* b/ C0 N: s2 G
) u' z) \1 x- p( F7 z! I5 P
# j; B3 V& ?! v) _) Z
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
$ Z2 v3 ^) Y# p
8 I* J! x" O8 a( x4 E<?php
  w2 I0 x7 i. ?1 H8 D% w$ T5 O' H$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);" W1 H0 q: M3 Z- d. M, t4 t! e
?>
' q; f+ z% D6 M' c1 ^1 \; e/ t3 U! A: y6 K# L$ n( t
A.MYTABLE表中的记录超过1条) Q& ]: A2 v* j
B.用户输入的数据需要经过适当的转义和过滤# C: f4 Q0 v7 ^8 ]# b
C.调用该函数将产生一个包含了其他记录条数的记录
. ?2 e: B, G% OD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
) H# y- f4 s- O# sE.查询语句中应该包含数据库名
* M- S. [" T  e6 X+ J% y
8 H" l4 @* D& Q; N2 h& n
0 Y/ ]2 Q2 n; t& o' e" ?  f" S6.______语句能用来向已存在的表中添加新的记录。1 r9 r/ P/ u/ [

8 |6 F- x" n) w答案:____________
3 H5 V4 x8 [0 K* i4 h9 M# p) }; l7 T

0 _8 T4 s! Y$ ]1 Y7.以下哪个说法正确?7 r0 w4 W, f( X6 F7 _0 j
$ G$ p# `) {" G3 D" r: u
A.使用索引能加快插入数据的速度( L  h; {. I! v, y& L5 i
B.良好的索引策略有助于防止跨站攻击  B2 L! O2 q  [1 ?( e% P3 ]
C.应当根据数据库的实际应用按理设计索引
9 a$ \6 |& z. p% ^0 MD.删除一条记录将导致整个表的索引被破坏
4 {. I' I  F( g  {$ E+ n7 Q% Q- w( cE.只有数字记录行需要索引
8 v( i0 m3 c" }9 y8 r8 {5 v& Y& ]5 x8 @) K) ^( M

' P. e/ q) \# {5 m2 d8.join能否被嵌套?8 U6 b3 J( p: z, \' F

6 E! a. Q. J$ y4 ?A.能: @- {  _+ G' @5 Z& \& \2 {
B.不能3 e  q3 M5 h5 s4 E/ g# x

1 M( q7 X4 C0 e4 u  o* F8 R9 N6 I4 O5 W. X
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
; b. b- s; B, H0 _5 G( D  I
1 C) y; S1 g9 v. E. y% G% |CREATE TABLE MYTABLE (& W( I) Z. {, q; B$ \) [
ID INT,
5 ]) R% m) ^+ F( vNAME VARCHAR (100),3 M% Z) X9 ^! W" K. V
ADDRESS1 VARCHAR (100),
8 K" M0 _) ?2 y- ^& OADDRESS2 VARCHAR (100),
/ [9 v% V9 _% f+ R+ _ZIPCODE VARCHAR (10),) T/ s7 r# Q/ e6 ~$ ?7 N0 [4 E/ N3 c
CITY VARCHAR (50),6 _4 w- s/ K* N7 J
PROVINCE VARCHAR (2)$ I5 k' d% O) G
)
* j9 d; b: g/ f+ JSELECT ID, VARCHAR
8 Z' ~' `5 q, \# N  i- m" j% OFROM MYTABLE
: u" P; Z- R  X) r  UWHERE ID BETWEEN 0 AND 100- m- m: t6 r3 P! }  P- }2 H  E
ORDER BY NAME, ZIPCODE! W# v! h# f) [6 \" C: u
7 c0 g* H7 F3 N
A.给ID添加索引; |6 A4 z. ?/ U6 ?( }9 a/ i( c
B.给NAME和ADDRESS1添加索引& Q( n5 u! h2 T. }  V
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引3 M8 v! _3 V3 o# Q+ k+ W2 u
D.给ZIPCODE和NAME添加索引
: h" F8 g; l% dE.给ZIPCODE添加全文检索
3 j1 V8 S2 H, H: _5 X$ N0 g+ ~; d0 F) w5 b) r4 q9 }: A; @
$ I$ s* ?1 J' v% Y, i& c+ K( o0 F, G
10.执行以下SQL语句后将发生什么?
7 ?( H) H, q( {) L/ X$ ]# [$ |% D2 M8 U: L+ p5 W. U0 B
BEGIN TRANSACTION
% {. B4 K/ [3 F( k. ~DELETE FROM MYTABLE WHERE ID=1
3 Z1 {/ V2 i3 a; Z7 R! fDELETE FROM OTHERTABLE
" x* R1 F* m* a- n  e* NROLLBACK TRANSACTION
# L' M# Z; m/ X9 v1 A
8 |7 k# T3 F# f# G* A- ?A.OTHERTABLE中的内容将被删除
  _4 E& k: m% D+ TB.OTHERTABLE和MYTABLE中的内容都会被删除
- A& ~' h  |! b8 F" |C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
& T% p' U+ k8 A% @$ fD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
) ?, ~3 L0 d' X4 U' A, V& LE.数据库没用变化
' {! ]) e; E: M6 O
/ Z, G  l4 z- v; _  P% s
' t, W$ c: q2 ?1 O# P11.DESC在这个查询中起什么作用?; r# h# l9 A/ l) A
. k" g1 P8 P( d+ A) H
SELECT *( b( N8 e9 Y2 O: p4 n: c
FROM MY_TABLE: R, e$ R+ u- m: `( \
WHERE ID > 0' ~* ~+ p$ c0 p$ x( q! ], y
ORDER BY ID, NAME DESC( H2 k7 s' a! k; o$ c
# ^/ s+ V0 a* Z. B4 v# B
A.返回的数据集倒序排列6 L6 C" M6 Q: @
B.ID相同的记录按NAME升序排列: A  N6 K% x) i7 X
C.ID相同的记录按NAME倒序排列
% [0 _- D5 [( SD.返回的记录先按NAME排序,再安ID排序
6 J# |1 X2 Y: L( \7 q4 gE.结果集中包含对NAME字段的描述
- `- o* R0 e. |3 e# i# A& Z9 E' M( K. K2 r
! G/ D8 ?3 l3 y. E* g8 T
12.以下哪个不是SQL函数?
, \7 n) M2 j2 X. |9 F
, ]; y3 P2 F3 z5 Q' xA.AVG
( z4 ]% Q6 E; \/ ?B.SUM
# F9 K7 E8 Z7 `& f2 r, M% OC.MIN
5 H3 T- a3 v& d; \7 @" SD.MAX9 z) D5 a& P; {7 C4 t" i
E.CURRENT_DATE()0 l  _' H8 M: a0 ^

$ l" C. @9 X* o. J8 J5 c$ [% A  a9 p( x9 o) _$ P. x* z
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
# s# g  Y6 k6 `5 o3 c3 i* w9 P! S, s+ P2 s4 G: Q( t
A.该字段必须有索引
" N$ k6 }$ N# ?- c( ?' iB.该字段必须包括在GROUP BY条件中
5 d$ C  h: {  n/ ^9 p) QC.该字段必须包含一个累积值! R% q+ b/ t  V) {3 }, n
D.该字段必须是主键& Y3 n8 {# `4 ~+ M  h* [" Z
E.该字段必须不能包含NULL值
( F4 D7 m0 x# }+ @6 N3 E5 a; M
. \6 _+ D$ B( T' s+ J4 J9 u9 e$ |$ P) o% t: G
14.以下查询输出什么?2 ?, u7 ~. |" P% y; {: z' p6 N8 C

0 B* g  J! a+ z" Q0 g( pSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
! U: Q7 U5 W/ x* \, o( jON TABLE1.ID <> TABLE2.ID' G% i  ~( n3 P0 E! y
. u. ~. s) f9 {0 a
A.TABLE1和TABLE2不相同的记录3 s/ e. z+ C8 }# v; E# T. S2 w# T
B.两个表中相同的记录
1 x$ `; q% Q* S4 v- IC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数, a% k1 i, d/ l1 K/ A7 Y' _2 ~
D.两表中不同记录的条数7 a, g! [& a9 `4 n' f2 ^
E.数字2
8 c+ k: @8 K" V; P2 C% }0 G% Y9 k* w, m  s

/ g5 a) k/ _6 `& f$ y15.______能保证一组SQL语句不受干扰的运行?
" n$ b" V+ a" q; g( s. F
) U0 w  E/ M# ^4 T答案:____________
9 t6 C, @* w( Q) l& v; U# y' d5 _" Z8 Y3 Z1 |* G6 V
. s! w) [; h. q

. ?' T) J% q# D" I答案速查
' y, f2 u( V/ l# j1:BC3 }( @! _; ]/ I# i0 u) s4 X- S3 `2 @
2:WHERE
% o. }: k4 e0 J1 }, F4 W3:B
0 k: x! c! r7 S' ?4:E# u; A, L- X, [
5:BD
% ^8 u  n4 r; e& ?8 w/ c6:INSERT: \3 m6 E# x4 Y0 L
7:C
6 m8 {+ z/ O; M( ?5 \1 v8:A
( g% j: ~3 E) m. A# z! @0 m/ F9:C1 h- ~! N0 x$ L6 D2 V3 d0 C9 a' b
10:E
& Y4 p) y; c+ o- J0 Q& E# g" ~/ S0 I11:C
4 w& l. s% g1 l3 N% Z4 J12:E, p( ~3 G; k2 ]3 o
13:BC% T- M  a# v. L# R0 h, h2 l
14:C
3 g+ n+ \  W4 r; `2 H15:事务9 f" V: Q' i: i$ U/ t" k

4 ?/ Y( |. J* i: |8 P
: O# n4 R7 V) x0 G  Z5 i( V' b+ u, |2 _& s
答案详解+ O) t) d6 S. S

3 q: j6 p3 v3 y3 o, M& B' L1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。. }4 W: s3 Z; |8 k( a* b8 y3 W

/ \; i: t$ i/ W2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。7 u% u9 O0 f+ B: @
6 Z7 Z7 c9 T& J
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
* G! o# t* ~7 E: m! O* ]" q" Y6 i
/ C, P7 F$ I) Q9 I) s4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。2 m; S& V8 {' x/ Z. N2 |8 p5 p

! t) Y4 Y- w! O9 p! I) B5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
4 y2 d% x( s+ J: k/ H2 J" _! }/ L: j$ ?. X8 k) d$ }( w* e( ~2 U. g( I3 V
6.答案显然是INSERT。2 H6 h6 ?* e; l" U

; W. q1 m6 m' C7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
8 c. Y* U- o9 F4 f& W2 V0 l
$ ?' D2 @- b1 `4 u6 E8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。, O5 h; ?! U9 Y) g  ]" `: C6 _
) }' J+ L+ k3 s8 j; Y' a8 i
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
" o+ p9 N% f8 O! F! b9 c  b' e' g
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
+ r: u  M3 D6 v- }) l" v/ ]
* n7 M* k$ g% O2 {- k! v( L' M11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。& C+ \& m$ j4 Y- z1 R
8 R6 {9 o/ u/ L: E( t, M5 @
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
, G7 Z  x  B9 R- Q& u6 Y' [" x1 q! W% W3 ]. J5 t) w2 e
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。& a* [0 E# e# S- }$ P/ e& `
! k/ g( [" K0 y5 ~5 p: ~4 |
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
- E/ z* H+ d5 S; E2 f; ]" L0 D) K' }9 M0 U: j
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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