|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。3 Z+ {+ @2 B4 j0 H4 a, s
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
% [$ c0 @( |, y- V本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。# z- x7 {0 q/ c& d n1 Q
2 }& p( m, w/ L3 J* T% \8 @0 _/ h+ p
问题2 D. v, q9 g4 Q5 p
! A$ h+ o- L" N+ E5 b1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)' {/ Z: \7 }5 i4 a; R2 _
) C, B5 ]: R/ H1 V& I0 \: H" I0 OSELECT * FROM MY_TABLE
0 L6 g9 w1 x w0 E( @' _# Y$ s( x6 u$ k; I/ X. h& S2 E8 Y
A.如果可能,用把查询转换成存储例程& S( j4 W7 m7 V& a; e5 L
B.如果程序允许,给查询指定返回记录的范围$ q g m! Q9 Z. T
C.如果可能,添加where条件
: q9 E5 Z' i/ xD.如果DBMS允许,把查询转换成视图 H f5 u' d8 X7 }4 ~8 L6 F
E.如果DBMS允许,使用事先准备好的语句) K. u& O5 ^! c' N5 G( K2 {5 A
0 A# J* C& a$ y8 z& y, r, j: R' c7 T N
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
7 }" q( a+ W5 z
3 z$ X6 p. C5 P4 k$ O答案:____________% [% F( `# U1 w* P8 T# e N
+ L; N/ J1 B) `; ~$ |- Z$ |% Y
: R3 k* H( H4 U- h3.内关联(inner join)是用来做什么的?
' A8 ~. J9 T; `/ ~" @1 `! H& k. U4 b& K8 a( P0 Y
A.把两个表通过相同字段关联入一张持久的表中
- F: X X9 {* w* d0 t: h' }+ ?/ E! SB.创建基于两个表中相同相同行的结果集
0 b0 [2 f2 j- R( [C.创建基于一个表中的记录的数据集
, x8 Y/ t# E% F( V6 Q3 BD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
7 f' [7 e. s ]' C" HE.以上都不对
0 [- e& M$ ^6 G( C- B% U1 B6 d+ W
' L. C& r3 I* J, E% [0 A* o
4.以下哪个DBMS没有PHP扩展库?
& M; ?( ~/ X5 l3 {2 ^2 R
* P4 o$ l( O2 O" }6 z/ wA.MySQL1 J: i0 ~! U0 T0 f
B.IBM DB/2! R1 K* i7 f O4 i- c0 k. c
C.PostgreSQL
% l9 Q0 e) O0 R, @8 X# P# H2 ND.Microsoft SQL Server
5 z/ [ _- q- m5 k BE.以上都不对
: i3 l! f' k/ ]. l
: n, |' N2 {4 C5 @
$ M) G" @+ h' ~2 b/ E; m5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)& J4 E- y2 ]; b0 @/ x
. ~) ?; ]; ~0 p8 q$ `! C7 M: x<?php3 i% i# E9 y7 y
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
. _' R$ X2 k" U, a" x7 h5 n?>& C5 N3 P# |4 P
; ]& {7 |, i! ~( \5 M3 yA.MYTABLE表中的记录超过1条
) Q- M5 K9 I" x' p8 }B.用户输入的数据需要经过适当的转义和过滤
$ U% J3 R1 u/ x' L/ ZC.调用该函数将产生一个包含了其他记录条数的记录
2 s1 y5 v( x$ ND.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
. H) {" q7 k, uE.查询语句中应该包含数据库名" R/ R0 B3 _# o- R( x
7 m: G; @ y% t$ a# W8 H6 G: i" ?) G8 K% c# A
6.______语句能用来向已存在的表中添加新的记录。# ?2 F. S7 g2 v$ {% ?
& }- f+ O, p0 d. I
答案:____________9 d# M' E% J% n, _ R2 p
' v* ~! J. a, Y3 e( P
Q. b; |1 @% L$ S8 R$ |7.以下哪个说法正确?
3 b" _, F0 _% x( i3 M
9 { i/ G$ n5 D) w0 bA.使用索引能加快插入数据的速度
2 v7 c' C* L( ~ J$ B+ e, A9 MB.良好的索引策略有助于防止跨站攻击
# h4 i) ]$ x) s! Q8 BC.应当根据数据库的实际应用按理设计索引 P* s3 L \( B3 ]) c* ]
D.删除一条记录将导致整个表的索引被破坏
! m$ Q: G, q3 ]" H$ m6 f% Y* ?E.只有数字记录行需要索引
6 ^' y6 K' G, W' B
+ N3 K1 G2 M8 n& z7 U7 P) q U- b3 a2 b+ c$ Y8 o8 ~
8.join能否被嵌套?
6 ?! S; v- p5 J: j9 V" E9 R0 e% ^1 v) y& E
A.能* R+ f* r$ w& [2 y
B.不能
; G# m& a& } q l- {* {
$ {4 x9 V7 o% A, p W0 b! W7 T: v# Y# }0 U; T/ H2 ^
9.考虑如下数据表和查询。如何添加索引能提高查询速度?* W: {8 _- b. A ]
; Z# W: @2 z! H8 O2 r; s/ X% OCREATE TABLE MYTABLE (
1 v$ |1 t1 \, w$ gID INT,
4 W; [; w$ R! t' Q( d" WNAME VARCHAR (100),
5 ^ I% p9 A! ?" G: D \; {, DADDRESS1 VARCHAR (100),
2 e6 z; d: D$ e4 }1 e, f% LADDRESS2 VARCHAR (100),
9 f" M( V* M1 w/ g! v/ m rZIPCODE VARCHAR (10),
4 v: ~+ t" X+ M6 E& a- d0 B* ?CITY VARCHAR (50),7 h( \ |. C9 ~3 `/ v
PROVINCE VARCHAR (2)
$ y3 n1 H9 q2 Z" X- J% g# p- Q)
7 \) a2 B2 G* y2 y( hSELECT ID, VARCHAR& Y) h- H/ m/ p( G l: a
FROM MYTABLE. f: r: _1 [4 l/ v. E
WHERE ID BETWEEN 0 AND 100) F5 ^- B0 h/ v
ORDER BY NAME, ZIPCODE
/ V+ N* x$ `+ _3 M; \( j( V1 X: x4 I" ?/ [8 ]
A.给ID添加索引
: Z D3 p9 v- g% [" ?+ FB.给NAME和ADDRESS1添加索引
8 i' n9 @# F# i+ r A: A: uC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
+ O3 ^/ c0 ]. O! LD.给ZIPCODE和NAME添加索引
7 m' L9 a" C. ]; e4 m- ?1 oE.给ZIPCODE添加全文检索
; e( }2 K# g: ~# g
; R' P. u- _/ R
, @8 c) z& b4 t! Y+ P s* a10.执行以下SQL语句后将发生什么?8 P" a+ q/ N. _6 [ l4 c* M7 o
- Q% Z' X# \, O2 ~, \+ D e6 F& tBEGIN TRANSACTION8 @: ^9 D2 Q3 M3 V; f
DELETE FROM MYTABLE WHERE ID=1
0 h! G1 s7 I! k( @3 r' zDELETE FROM OTHERTABLE
6 H, U* ?$ N5 P( _4 E+ O# lROLLBACK TRANSACTION
) n8 ~+ n2 F8 g7 S7 c0 C7 y: W0 i/ O3 R: D z1 ^
A.OTHERTABLE中的内容将被删除7 K$ z4 O9 T, w$ N1 c6 H# s2 h
B.OTHERTABLE和MYTABLE中的内容都会被删除
$ b% J3 [- h& O) h9 zC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
/ I: x: ?8 n) jD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
& G9 M; y, B2 `0 V" j4 N, HE.数据库没用变化
1 G/ H, U4 \5 A* N8 \
% _3 P0 U) J0 y5 t! ^" K( @8 D! I: |; H6 E/ u
11.DESC在这个查询中起什么作用?: R8 T4 h3 m9 I7 s2 Y: O) @
3 {' U: k( R) E. V8 u* c8 I
SELECT *- }" b) \; Q1 Z' Q
FROM MY_TABLE& @" H) O( e6 [ s, \8 o2 x% _
WHERE ID > 0
1 Q7 H1 O) U9 M/ n) z/ ]7 UORDER BY ID, NAME DESC
6 P H1 U+ Z9 _9 w- t4 { z$ k. h; ^, x" G0 }
A.返回的数据集倒序排列
# O! d: |( J' y& o3 y4 K: |4 K9 g! CB.ID相同的记录按NAME升序排列* h% j4 ]1 s0 W) V& Z: G
C.ID相同的记录按NAME倒序排列6 D u' }/ f- g2 x: O! _5 @
D.返回的记录先按NAME排序,再安ID排序
; U8 z7 C( b' J7 SE.结果集中包含对NAME字段的描述
" [7 Y x9 h' w# F
" _- k' j& n& g5 Z+ H0 r. g/ G1 T6 B% v& o6 ^$ s
12.以下哪个不是SQL函数?
4 ?$ b( q5 y0 b7 h9 ]7 V
3 V! ~7 M; O ]8 IA.AVG* U2 c# Q6 F/ J# E3 z) V
B.SUM7 }1 c: D: ]! d: r( w. O
C.MIN
& M( a& c# U2 L$ l) M8 j2 WD.MAX
& ~& B. w: |" T" n4 {! i5 V; qE.CURRENT_DATE()
" y2 `1 Z1 T7 r7 F) ~; J5 B- F) w' S
& B# }* ]& ~: @8 {8 B* n
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
3 D2 r" j# ?# c& \% N) z" |- @& O) D- B$ N
A.该字段必须有索引! ^: m1 q6 T% h* h9 h
B.该字段必须包括在GROUP BY条件中
6 j8 d* T, }3 T4 e3 {C.该字段必须包含一个累积值
5 f% w5 z( b/ [4 J7 WD.该字段必须是主键
I, A7 c7 f) m9 iE.该字段必须不能包含NULL值
& ~# p+ H! O" b
+ s9 c! ?3 W9 H g; q; ?$ H% _& s& Q8 Z0 \: U" |3 c( c
14.以下查询输出什么?
7 u! m0 o1 H4 k' d+ S: M$ E# f2 p- K$ I" i
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2: i1 l. e3 J# u+ t
ON TABLE1.ID <> TABLE2.ID- X8 X% {' C2 E8 |4 { k
2 [" l- E6 K' FA.TABLE1和TABLE2不相同的记录- ]# ^9 D7 C/ O2 S% V- _' ^' b
B.两个表中相同的记录
; Z/ i4 A7 K7 D3 k1 bC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
. i# ` m; d3 R: X" I( `7 ~D.两表中不同记录的条数
0 j1 | L, Q @5 M" G% i5 c# D- F* x8 S5 RE.数字2; b; u1 R% H+ H/ d
. I8 L3 x1 C* }$ e: X2 K/ ~! ]
9 `# _& {+ H: F( O
15.______能保证一组SQL语句不受干扰的运行?) ?2 A" m, `5 g1 e: Y
4 { j! b4 ~+ c% C. ^
答案:____________( l6 T( U* s( l* t3 Z8 V) H3 K1 A
5 t1 ?: k8 i' q n3 p
9 D- I: a1 H# l) `0 P
. R, _: |, r! \& |, `$ a答案速查) o/ \5 w8 W- w: g8 S0 U* E% R
1:BC
$ }# F/ l; k! h' o- p2:WHERE1 X; T8 c8 ~2 z$ Q" s
3:B
$ i2 O$ k: X4 O l4:E' E5 ]$ ~. d7 g9 m
5:BD
6 D' |# k( }) f' G- R/ d$ m6:INSERT8 D2 z$ u% ]) E+ D* h8 l( K
7:C
a& Q/ [+ }3 l$ I" p8:A
; K1 }$ F! _2 ^+ N" _3 V9:C' E. W" n( G5 o B n4 g
10:E
! V5 K: A( a F/ d4 Y11:C/ q3 j3 N; c) _5 y. e
12:E
, C8 w3 P* X/ W8 P0 @0 A7 b13:BC
9 X- }% T; t" j14:C
% {- |: S! F+ W, S9 Y! V15:事务
! K! F; {& X3 b- c. y: ^, s' ]
$ X4 d& V9 Z4 |0 }. w1 t2 E' b0 G/ B
/ v6 |+ W7 ~+ W" Z# u# @7 t# e
答案详解+ [, S2 F+ K7 Y' x! D
2 T X# y& {% F! ]4 v9 E
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。% I; E4 d( Z8 B7 }' H( K! s L
: h& J+ s' M6 J) G& o7 q7 x
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! I+ P, v; y/ H
& ~, X2 ]) D2 @% `+ Y$ g$ p
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
1 P+ U( ?0 k, ^6 N- e. v2 @9 i: {) ~& p" Y! v; i& B: J
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。7 q1 w0 G7 k; }* d% O. Z" N& i
% T/ K8 D5 a+ r. x) \7 c
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。+ V4 V) D7 }: t/ ?2 U
' ~- E3 I. u( @6 S% B4 X# I6 B6.答案显然是INSERT。
/ ]4 o& }, `6 h* i/ p6 i
* n( r7 O4 H* K7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。& h) T) ] z: B& d! ` E: R
( T- I) J" b% T$ i$ D8 Y
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。0 K) v2 u* \$ d
. D C7 ]9 f' W- Z9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。8 H G6 p! I" V( K* W5 j3 B; }/ d
% p) H+ E0 q2 i7 Q: q10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。2 P! o/ h" z2 Y' z& H* x
. H) s! B4 |! b7 s5 A11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
" \ _) E" w$ h5 Q+ S2 `* `1 g- V2 U) S: O8 _+ G
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。: J) A, b# i4 r x- ]/ w9 r
7 c1 k3 A4 N7 _0 i! C
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
4 h5 [6 b$ D* ]( U+ n, d6 C& b9 a) X3 z3 S
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
2 b5 r: C& F5 w7 C% b
4 S: f2 H/ @" ]! X" O' ?15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|