  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。9 d+ c3 o1 v' ~6 X
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。1 w# |- u4 T+ G5 F! ~( C& `0 {5 g
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。" S8 L, }. S% |7 l' `- R
4 d, ]) x, ~& \" k7 }3 c' n8 x* X) L# H! t( {% C0 s
问题0 T, ^8 g9 @. n4 }- [
! g( K. [3 b) d- `8 N- y/ f' ]
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
1 _3 R$ M6 a, g o9 I! p* _/ Q' o5 v# q* N
SELECT * FROM MY_TABLE
- ~7 c- V/ ]9 W7 f9 L0 p
, C) ?& Z$ H& k9 u" E$ }" TA.如果可能,用把查询转换成存储例程8 J( C$ C8 {( U1 Y' J" h
B.如果程序允许,给查询指定返回记录的范围% v1 P8 z- o( h+ N+ D1 S
C.如果可能,添加where条件
% F5 B' W9 z+ Q* t4 \D.如果DBMS允许,把查询转换成视图9 ]$ N- c c) o% B4 Z) t
E.如果DBMS允许,使用事先准备好的语句' \7 _/ X7 M4 h5 {
4 {+ T8 F0 d! h# z) \
' P' `- t8 a8 g, e! n2.可以用添加______条件的方式对查询返回的数据集进行过滤?
, X0 k! I+ p4 @/ y
6 M4 o5 j) x; E" B: U' }" U$ f答案:____________
" q+ o2 ]5 i1 V5 n. ~ j# J* A% l4 L% @ \! O$ V$ s t
6 B5 u# G: W. A u
3.内关联(inner join)是用来做什么的?
. d$ J0 R& b% |2 j8 N5 X
2 Q. X/ {" k1 jA.把两个表通过相同字段关联入一张持久的表中( D- G9 u: Z- Y+ z
B.创建基于两个表中相同相同行的结果集: R/ h" c9 C: E6 _% D
C.创建基于一个表中的记录的数据集+ J0 I- A& D# R- G B. a' A4 P0 N
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集% m3 ]2 o" ?4 _' F$ A5 L! r- ^* J: k7 s
E.以上都不对, f& M7 h, V9 E* z S/ v# j
5 S1 S# t8 c2 N2 E# V4 |( a$ K8 r& f& x) _0 H5 D- v
4.以下哪个DBMS没有PHP扩展库?
" h2 ~1 i" [$ D0 ?
7 ^0 Z$ d7 n" fA.MySQL# x0 W0 A* s0 I4 ^" P! \) H
B.IBM DB/2
, h ^' ?8 F: Y; r/ oC.PostgreSQL' |+ {! j2 w9 K
D.Microsoft SQL Server
; p+ A( U$ i) x V" c& gE.以上都不对
6 r. S# ^& F' z* k. q/ q; w) Z! s& x% u) z) Y* \" r
' f+ x8 m% I* H( a. R8 h
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
7 I( G2 q. @* H, A9 l- Y
4 G3 w: I, U* i) D$ @6 ? m<?php! S) Z* h) P ?$ m* Z
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
: U. c3 K) `( J1 b?>6 w8 V# P& H3 o! i6 w. M
6 {$ z u) M1 o3 Y# J5 M
A.MYTABLE表中的记录超过1条; u' {! H, [' K7 M2 N' M/ Y
B.用户输入的数据需要经过适当的转义和过滤( | j0 J( |5 H) R* E
C.调用该函数将产生一个包含了其他记录条数的记录
: ]& J0 e2 L+ F- y* h4 D. Z) w WD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除8 _/ ]. L* a+ i h$ K3 k C |% }
E.查询语句中应该包含数据库名
- V8 O# y: B3 P, G1 j
; ?3 j6 A {8 G3 ~. c2 c8 ~1 d, t5 M; p+ y4 [) Y" g, N: R
6.______语句能用来向已存在的表中添加新的记录。
h- k+ }* ^: j8 c+ m5 O) ^3 o0 Y: D
答案:____________+ x) Y# a9 U) U, g
& ?7 K0 R+ m+ r3 V1 M
- c2 g: @3 i* S, b! j; i6 o# n- s( V
7.以下哪个说法正确?
* Y T* s5 d l9 z, \. q5 H- {0 U6 H" G2 i k
A.使用索引能加快插入数据的速度" o, e0 ` d6 P6 y
B.良好的索引策略有助于防止跨站攻击
7 m2 Q ^, \' p# K" \7 \C.应当根据数据库的实际应用按理设计索引
! ?8 C: i0 |) ?4 x/ h7 mD.删除一条记录将导致整个表的索引被破坏
g9 S, J5 j: qE.只有数字记录行需要索引
5 [: l& L& k8 p0 R9 W( u
( Z( t5 x9 d) j! ]) {! [- R5 G$ I8 j9 p) O) y( J& Z
8.join能否被嵌套?
, q! k; y1 {, @0 N
$ X& G$ ~/ m( k; V* hA.能
4 e, V* n5 X3 t" Y2 ~1 _: S5 t2 s; BB.不能
; _( Y( O/ w* p
5 f8 k5 J. W7 p7 x* y$ p
" ^$ R! S! ]* X* G9.考虑如下数据表和查询。如何添加索引能提高查询速度?
; i# J8 \9 y( `: Q% ]# }. b: E' F" ]' t6 v) |1 q' D# P. U: E
CREATE TABLE MYTABLE (1 M" \* C$ K6 }6 y6 X5 |
ID INT,
' j2 S; v6 _: n; [- t: YNAME VARCHAR (100),9 y5 o1 l7 k2 L! p* j4 j" ~
ADDRESS1 VARCHAR (100),
8 @4 g, k0 e+ Q& m( k& s0 X9 TADDRESS2 VARCHAR (100),+ F$ k, K [% P* C8 {1 I
ZIPCODE VARCHAR (10),$ i. \1 \+ ]0 l, r3 h- C2 u
CITY VARCHAR (50),6 ~. t: I4 A: s
PROVINCE VARCHAR (2): O" I' \' `3 J+ R! u
)
6 h3 z3 [2 [( n& g: ~- R/ M% v. N) sSELECT ID, VARCHAR
8 K3 N( [. ^) w/ n& ^FROM MYTABLE8 `9 r/ w* K, S5 |
WHERE ID BETWEEN 0 AND 1008 n3 B+ u$ @+ m
ORDER BY NAME, ZIPCODE
7 C( I0 Q6 O- q8 S1 ^3 r c
8 a0 R4 c& d% {A.给ID添加索引
: ?% O- v; u- B; T. cB.给NAME和ADDRESS1添加索引! i9 G" Y# `5 C
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
: t- y! P* g5 D9 a& ^D.给ZIPCODE和NAME添加索引
5 m$ ]" `+ x/ k& ^! f' mE.给ZIPCODE添加全文检索7 i) {, e( I6 d9 n' ^$ T
. P* V* A# |( _* s S3 p# l4 S- v3 i$ T, m4 H: ^& [ {+ G
10.执行以下SQL语句后将发生什么?
, v& {! q; R9 N, p6 E$ D8 F3 y% p+ | ]0 o: j/ W8 d/ @1 y) O: r
BEGIN TRANSACTION0 m/ }) K* ^+ Z8 R9 `0 H
DELETE FROM MYTABLE WHERE ID=1
; v8 k) P* e. Z; P8 ^! i( sDELETE FROM OTHERTABLE
% q& F* U7 X" H. Z6 X! ~ROLLBACK TRANSACTION% G4 ^; I2 P, Y' Z! _6 G- s( T
& P1 H( K( k( ~0 ]; z! OA.OTHERTABLE中的内容将被删除
; }' A3 m3 v/ _% mB.OTHERTABLE和MYTABLE中的内容都会被删除
# v0 Z! a" K0 C0 J9 W4 U3 ^' d5 ]C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
5 _ P' v. r4 _) v7 ~% ]D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化9 ]. O) |6 i& [- w
E.数据库没用变化% q9 O; K! U$ C3 o0 P
, \1 ?9 y6 n1 ^2 [
3 h8 S: ?5 K: P: _! U3 w11.DESC在这个查询中起什么作用?1 @' A& I: E* c3 [* O' ]
( d7 y( r0 |! F& GSELECT *
% N, i7 ^% F( ]4 T6 wFROM MY_TABLE% R9 q/ h; Z$ q5 n
WHERE ID > 0
. S7 }$ A: Z( E1 N# T) rORDER BY ID, NAME DESC) y5 s- z# {1 i% L! u
' l: g" J. R) l: g3 K* M
A.返回的数据集倒序排列( w8 h( b9 E0 n& k" h9 L0 I
B.ID相同的记录按NAME升序排列% d3 E! {5 c" R$ q P& P5 C( F
C.ID相同的记录按NAME倒序排列
6 U/ Z* v3 t; u* ^D.返回的记录先按NAME排序,再安ID排序
& G# S$ m D" C* U) F$ |E.结果集中包含对NAME字段的描述
; N$ _) y) S6 m! n/ R9 v5 V' t3 F8 v! u# _& B
) P, T. n8 R. S) k9 i; w! C: V& N4 x12.以下哪个不是SQL函数?+ r: l9 ]7 Q, L/ ~6 @* J
7 H6 Q9 @/ ?9 y+ j8 LA.AVG
' S/ {3 @1 R5 c) ~( o% G7 ~; pB.SUM
+ K- `6 u2 X- gC.MIN
7 ^: A) C6 n, ]" v/ R$ Q) s) c8 @D.MAX8 `" R+ n3 |* D3 u0 C; \! k
E.CURRENT_DATE()
& R n7 D. B$ l- N$ H: } e+ o C
/ n6 }& B6 T1 H6 W: |0 z# B: N+ k* R- O0 J% F
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?& z* v9 L' Z& J2 C+ c7 |0 a6 z
: q# M8 ]: Y! S4 @7 a- ^2 ]
A.该字段必须有索引$ k, T3 J0 E% H# R4 e
B.该字段必须包括在GROUP BY条件中8 X) t% A! [. O" V! |1 S$ R
C.该字段必须包含一个累积值
7 s& |7 K1 M( i. N H+ h) z qD.该字段必须是主键1 y: q. w0 Y/ x
E.该字段必须不能包含NULL值
' X+ ?, D& _6 X% E
- {$ u; D z) U$ Q: {' G i: O7 x! x( n
14.以下查询输出什么?5 z& e+ l, E% r b) n
. E0 O) E; I# P& g: ^' @
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE22 M3 b; Y1 A' j6 |7 R
ON TABLE1.ID <> TABLE2.ID
( ~$ m7 R6 ?, C; {4 U# `- x2 F# t+ j
A.TABLE1和TABLE2不相同的记录
# L5 V3 C3 L9 X$ V# `2 n+ U- S( JB.两个表中相同的记录' c0 V+ n. Y: A$ w3 z
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
t# Z2 z: ~, `* i$ SD.两表中不同记录的条数
: P J" o( O) I$ a, w7 z8 @E.数字2: ~. Y. L0 m5 J, N5 y
8 J3 c( ?; f6 \) K) ~, i! @' k/ ~# C- }5 B3 G/ ~1 P3 ]* {# d
15.______能保证一组SQL语句不受干扰的运行?9 F5 m6 Y" ? m1 F/ r3 ^: S
6 L* y. a/ L! u( A2 K9 p8 B# X& c4 ]
答案:____________ w& U! ?$ k/ n, ] t
- ^9 J+ ?& s8 p l! q: n4 y
6 W9 v2 i3 [9 J( n5 a( D
0 q8 M* e* ?, y" V0 v3 p5 ?答案速查2 }' `5 j8 S& Q, v3 z
1:BC
! f; J4 D8 q. x. Q6 H$ @; t2 k% {2:WHERE
2 C4 a0 x4 V3 g2 L0 u3:B. }1 L2 U1 F, s
4:E
m% Y7 d, _8 y0 ?9 {: P$ x5:BD" H' x* v- Z }$ R) U
6:INSERT% ]/ L, a! O: ?9 |% K$ t1 ^- G
7:C5 |$ Q7 d! X N6 B! O2 |+ z! R
8:A
2 k1 c! V9 W0 y Q1 R1 H+ d9 z9:C
' i+ I1 Q; ~0 W; L10:E0 A' D4 D% n/ y0 T" b4 q$ ?& f3 T1 t
11:C
9 Q" v. K k2 d5 i- m: ^5 H+ ]4 C12:E% O) n) |. C' R* j* c
13:BC
' z3 ~- s' A& L; V4 u14:C- _ V! Y, k0 w+ v
15:事务
8 d! P, I( T2 C3 q6 v# K5 M
) v8 ]7 B: q& P6 g
3 a9 J' h+ r0 M
( N0 F6 m1 v' a答案详解
& R' h) L% j9 K# q! I/ r2 s
3 P& {5 Y" u3 _5 |3 J1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 T% G8 J9 r/ K3 M% X! y% l5 l% r! z) J8 R
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。$ e. {& K7 X- [6 x7 B
4 B6 K. ?( P' p" _ b
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。9 o+ M$ O" N2 @! s3 p& L
$ |2 X8 _3 L3 ]4 Q8 ~6 p; E9 i
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
( j j( f( C n6 C y2 i+ U7 P! L# o! ^3 H- f& \, }
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。 C; L9 h; U% \
6 [' \' P6 S% h4 j' ?0 r6.答案显然是INSERT。0 I8 \! w3 L; z
+ j2 ~1 s3 H2 J' _6 Y. j
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
( p2 Z" E& r) G. L& v+ y* m( S" K/ _; }: m, F% j" y
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
* ^* W5 i5 c. r+ A; d. d# l9 C. F/ Z9 `- k0 d
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。; g7 [5 M5 {) y: g; Y1 C4 {2 D& G
* t+ n Y# q- |
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
4 K: c# |* {& ^4 j# X* g$ |9 u9 R2 c% n0 M
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。9 O8 M A3 ^2 u
+ T9 X6 W3 S4 X12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。9 B( y/ x" x/ E6 J" u& p
9 W' w9 b2 b/ X6 Z13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' x6 P) b, W2 h* Q" W* U
1 t: e% w1 E3 x
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。, d( ]+ R9 U% X3 E% i9 Y5 C8 x7 }8 H
3 e8 A; ]8 c! |4 R6 G
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|