|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。! `8 v3 D- R2 P
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
4 ~7 n. B3 s2 V9 y, L b5 P; v本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
" l" W# ^, E5 g4 V
' z& l, X5 |4 [- N$ z+ y
" s$ c; } p3 N8 U8 Q问题
1 }9 e' n8 Z# Q4 u6 q9 Q) ~3 F& \/ h
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
- V: F# `5 @* F0 L
% B1 ?# j3 n+ I- I% T- E, eSELECT * FROM MY_TABLE
0 O/ p0 T: H2 H& @4 A$ U. l1 t4 s$ [$ f7 s
A.如果可能,用把查询转换成存储例程
" @; _$ s, Q* y. @7 U5 R) ~B.如果程序允许,给查询指定返回记录的范围$ R8 @4 X3 x9 C. o4 a
C.如果可能,添加where条件: k. J( F" ]6 X. d1 N
D.如果DBMS允许,把查询转换成视图
7 |4 y+ t+ j/ p2 B6 S5 w) eE.如果DBMS允许,使用事先准备好的语句
/ p5 h2 ^# r6 W" t( d: b' K2 j2 X' v, J) w) n
, k8 ~) o# }5 \8 r) C2 H5 l" E2.可以用添加______条件的方式对查询返回的数据集进行过滤?, P5 E; B* c) `" `
/ t: F. ~& ?( H6 }6 z, m答案:____________
$ u5 A0 r9 N& s& e( t$ K* c& v6 p' u* i9 N0 c/ o2 L7 S
. y' c& P1 _/ r! b9 _" B8 h' g* i
3.内关联(inner join)是用来做什么的?
" u" i" `+ I9 b% c8 }2 z2 e) i8 H: X$ h( n
A.把两个表通过相同字段关联入一张持久的表中9 r- T7 G0 x) o0 D- F4 }$ }( e
B.创建基于两个表中相同相同行的结果集
% d3 V: d' c5 J" ?C.创建基于一个表中的记录的数据集- U5 {; }& _ j& M: A# K% u, T
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
" C1 |5 f: ^. W, t- L GE.以上都不对. X: V8 O3 N: p$ G% }0 t
$ s0 p$ M( Z, B; h2 @/ [; T) n* C# K( S; L7 x) J
4.以下哪个DBMS没有PHP扩展库?
0 g0 z3 L( b' B" U) A1 u0 F: d2 n9 k' C# F, _) |) l; x
A.MySQL4 {: j* A, O8 d# L! [+ d, \
B.IBM DB/2
! G, o- o' h+ Y* K! v HC.PostgreSQL
1 o( B5 D9 ~* O8 N/ j0 l* kD.Microsoft SQL Server
" F* x- s5 g# E1 n3 {6 x% q2 l% X1 S& gE.以上都不对; | J) K2 M2 G9 e# H/ `7 j8 R
9 _0 S t7 L4 ?- W
; x+ o. R( Y2 q% A; N5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
& D- k6 X4 k2 J5 g) L5 s" [6 b0 R# P5 J7 N
<?php
% `& Y7 K# q& R5 X$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);' U, r9 \* t. U6 Z+ _% y
?>
% o2 O6 i# k5 ^9 }. _9 |& Z3 U9 x, B; d* ?" T' |+ V9 @
A.MYTABLE表中的记录超过1条. ~3 B" n, u; d1 z# Q8 w) i7 R
B.用户输入的数据需要经过适当的转义和过滤
: v0 w" A& A+ E( X( |1 SC.调用该函数将产生一个包含了其他记录条数的记录
1 E1 ?9 i; n' |6 @( ^D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
) e) t6 T" _1 G6 [' AE.查询语句中应该包含数据库名( {3 k" T& {6 a0 [
+ ?5 } p5 j% I
" I; X% K4 |* u5 @
6.______语句能用来向已存在的表中添加新的记录。
9 H6 Z `4 ]4 m
: A% P9 o# K3 s6 M5 y) t z答案:____________; R" F3 t5 N+ e6 G" V$ d0 k
. o3 |4 l+ v) `! V _' [$ i1 t$ t2 R+ S9 p) r. L" g l
7.以下哪个说法正确?
* P2 Y' Z7 J9 g, Y
$ R, }0 P" w8 hA.使用索引能加快插入数据的速度, E- P3 q7 L; ]# L. ~
B.良好的索引策略有助于防止跨站攻击( f4 w, |+ A3 ~8 j2 I; Z$ V( L
C.应当根据数据库的实际应用按理设计索引
8 d% B! O3 O3 S6 \% n( {D.删除一条记录将导致整个表的索引被破坏) W9 h) j8 ~6 H9 v f
E.只有数字记录行需要索引3 s* q7 S& y; B0 Z! G! t
, M V+ s. G& m- X; N( ~! Q/ K, v* N, p u5 {
8.join能否被嵌套?/ I: w) l; z# E7 z$ h/ L0 U+ p' D
1 j4 r' g# t2 q5 d4 r/ a/ w
A.能
+ R5 y7 Z. u$ F I& D+ o, @B.不能( D( J+ I2 T# \
& J- X# F4 @" w5 ?# ?
, v- ~. k- E) `, p0 a+ z
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
1 W- _0 W3 F! V" s# Z# M, f$ B* z% `+ \
CREATE TABLE MYTABLE (% x% U7 P7 S {2 Z/ h7 f
ID INT,- r; ^8 C a1 B8 l2 S' O% E2 w7 _
NAME VARCHAR (100),- a0 L$ p' k& v6 L; h
ADDRESS1 VARCHAR (100),
+ B; f U3 \' z: f2 b* s; m* H' W7 mADDRESS2 VARCHAR (100),( Z+ X, ~, @9 C" Q' X% K9 F
ZIPCODE VARCHAR (10),( T. W, m# ]: j9 p9 _
CITY VARCHAR (50),6 Z5 l# t% s6 m3 \6 X
PROVINCE VARCHAR (2)
2 Z$ t1 k) B6 `9 e4 a/ |7 ?); b$ X9 f. N7 i+ B( P- ~9 H5 t
SELECT ID, VARCHAR
- ^1 Q& R1 A: U' o4 g: y7 C2 G4 E' gFROM MYTABLE3 b' h3 P& Y, `( K L/ D# f+ u
WHERE ID BETWEEN 0 AND 100
: `" J# l% M/ Z- m; f: gORDER BY NAME, ZIPCODE& U1 C+ A1 _) f* T9 r8 t
1 }; r! y+ Y4 P, q+ k( l# D
A.给ID添加索引6 d$ s4 B# k4 s- J
B.给NAME和ADDRESS1添加索引; }# x0 O1 r5 M% z5 z$ L2 j+ K8 m4 X
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引. Z/ `# i2 K% I" @/ F- ^
D.给ZIPCODE和NAME添加索引
9 n! M7 h2 Y7 u0 ~3 r; b7 o5 HE.给ZIPCODE添加全文检索& N% X2 P0 d$ l3 ?
o' w1 k; \/ N% T( _
- {+ I i( f5 @2 }' }4 d' q- _+ a# G10.执行以下SQL语句后将发生什么?. F& @4 q, `, ~0 o8 d+ A9 C; f
^/ {1 K v4 s; qBEGIN TRANSACTION' q2 P) n0 D" b6 v
DELETE FROM MYTABLE WHERE ID=1+ x& y! c7 p. L6 q, K
DELETE FROM OTHERTABLE4 \4 R6 t6 Y) W+ V* J; B
ROLLBACK TRANSACTION
3 t6 D c. W6 T, }
) S+ \0 y) ]" o. u& n) `7 a* W5 P' rA.OTHERTABLE中的内容将被删除' f9 S+ z7 X" a7 @4 [9 r
B.OTHERTABLE和MYTABLE中的内容都会被删除' X: m ]# p/ z! v
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除; F; m R1 T' p3 L( c a
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
# @: v! k1 C, {* b, \E.数据库没用变化 q* j$ Y8 I9 [8 c' U1 `% Z
h) A( Y$ a4 Q; U
) b$ s1 f' J4 F0 S! e; i+ r6 ?
11.DESC在这个查询中起什么作用?/ a- f9 V! z2 ?6 Q8 M- N
9 l' M" |( f5 g2 K9 _1 t% |SELECT * Q# I' C& {9 ~
FROM MY_TABLE, t* H# c/ @/ M) |( Y b
WHERE ID > 0 V5 x+ c8 P2 R8 C3 ?
ORDER BY ID, NAME DESC
+ r6 B5 I2 l% U! @9 p) r1 `- P3 g# m7 ~1 M3 ^8 F- Y, R1 m, O
A.返回的数据集倒序排列* h7 z7 ^8 `0 M T) {# c0 _
B.ID相同的记录按NAME升序排列
: ^ X" [0 ~, \/ RC.ID相同的记录按NAME倒序排列/ z) W# s# O" `6 w
D.返回的记录先按NAME排序,再安ID排序
6 G# J" I0 e% G; ~: z/ h k2 M9 PE.结果集中包含对NAME字段的描述
3 x5 }2 g) B4 C: `4 Z* m* @% p5 B+ X! \3 p
8 U( k: Q' c4 n! g' {/ q
12.以下哪个不是SQL函数?5 d- S3 @) ]' q. t
) M* v( I* {: q& [, w
A.AVG" k& @4 d4 f+ s H2 u
B.SUM
7 b( m2 ?: l5 T6 x" @- |) _C.MIN
+ P. [) J6 x# @D.MAX
% p h1 V$ D, R" rE.CURRENT_DATE()
5 P X2 ~/ @$ d7 e. z8 D5 O
4 [ E+ L4 m5 ?3 V% f0 S U, {1 R8 i% v# E
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
2 n |" o2 W4 w T) ~5 e( B
+ A8 Q! X2 V/ rA.该字段必须有索引
8 T1 _% X& A. h$ FB.该字段必须包括在GROUP BY条件中; l+ M: P; f2 m G' G# M2 |! q; Z
C.该字段必须包含一个累积值4 _3 H) S1 x: N t! u
D.该字段必须是主键
' ~" k$ Q+ _/ f9 n6 kE.该字段必须不能包含NULL值
4 H. _ k6 a6 j, w& `* e5 U7 t' f1 |* j6 m+ L
* _1 b- E& u$ K( A3 G
14.以下查询输出什么?0 s# {( _( @3 K) A4 c
: z4 Q M/ R0 V# R2 _
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
4 Z& _0 g6 }8 `4 F8 q" MON TABLE1.ID <> TABLE2.ID
% X" ~+ X) P N) s. L P! c; Y8 w# G/ E: Z8 e' I4 r5 \( N
A.TABLE1和TABLE2不相同的记录
; c2 M+ k* W- p1 E. N$ CB.两个表中相同的记录, j" |% ?9 N% I1 Y# ~% s1 l8 I9 ?% G
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数9 G7 M2 V1 G, C: Y) r# L
D.两表中不同记录的条数
; Q6 @2 ]' u- G2 ]0 ^8 m: IE.数字27 x, e" N' {5 C2 X) m! }
& N4 a# x4 ^/ m3 A+ J
( B( ]0 K3 d2 @; N$ l% M3 x1 i
15.______能保证一组SQL语句不受干扰的运行?$ [/ p3 Q" A) C2 L, z
& m7 ~$ J0 H8 \3 y1 x答案:____________
, t+ R8 Y& y7 Y3 U' f4 S# p* D
$ {' a3 ?9 P( y3 y, x6 R$ a- e% |9 Y2 r
) a% k8 z9 U" y4 C
答案速查
, | l; _6 T% W L6 e! j1:BC- A( b7 c# e' |( E
2:WHERE8 G) u, v, h; X- H; L3 c4 X/ M
3:B( d' k/ P8 `# {; B
4:E
# o& Z9 ?, M |; P \- j. W" z5:BD, ?" f% ]; J4 H. h/ {
6:INSERT
X- s5 m5 y7 i& B8 Z" r: K7:C% X2 P8 x$ p8 P' M' P3 d/ A
8:A$ Y: B4 E# D6 i2 Z) ^; I6 ?
9:C
7 Z0 Z1 u% |; s* S k10:E
; k0 O1 g: y& I+ N, D11:C
4 } f: u. R! K) P! p2 r/ `12:E
' x( P8 _4 p, h3 q. o13:BC
) U4 e/ `! D2 l7 d3 Y14:C, x4 n, P7 V/ R% E( \5 o, o
15:事务
S5 x4 A9 i9 M' @, J8 e$ U& _% C4 Q. B+ Q( I4 B* A# q9 P
5 E/ B& j/ u8 o2 z8 S. {
$ v: X7 L, ~8 m: y7 r) B
答案详解
$ n3 ]* m9 t! r, a f
; C' s( Z" B" V; Y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
4 S/ L$ G" Q) y! ]2 f# s
! q/ v+ Y" @( W: a! y* @2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。& C) r! g1 c% \% l7 `
" r( y* c7 U N2 j; C; ^8 ?3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
! `! c0 a* u" x; w
5 D7 F$ `3 O3 F/ ?% R4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
_0 E3 x7 P% b5 i s' a7 l- M+ f. \8 A# p [5 ^& f
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。8 G6 Q( s6 J5 Y6 I8 F- r8 T
0 y; S7 U E+ l0 [ r/ i6.答案显然是INSERT。
' N: n& t9 E+ N* Y+ l
- |1 ]0 W" n/ V9 W' K g5 C7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。. X' _% }! e( g/ p: H, Y9 R0 O- y
8 r, k5 h' F! @5 |0 B$ h6 q: p
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
3 V# e; d; [ t& ] G5 E! ?7 H$ l0 ^7 O% ` @% X$ ~
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。* w; t9 [* I6 @- E
* N7 V% S; H7 g
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
- _, |. H2 N; Q; \" M; U; }& X+ g& U3 q$ A% X! v. v0 z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。" E- W6 A9 @; z
5 h: Z. [' M3 O* ?/ L, k! R- U12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。: U0 `, {, y4 d$ N7 q# [
& ?; ], L i& [2 r5 J13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
& o% @9 {3 W. d: z7 c2 _$ ^& f# Q. K A z8 T4 S
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。* O$ V& d G- R, D; R! Y6 G
4 z4 j% [# ~7 \/ P; m) U15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|