  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14159
- 金币
- 2370
- 威望
- 1647
- 贡献
- 1318
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。% O) r- c8 M, ^ F( j5 q% u2 v- p
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。* [1 n$ X o! C7 J. g0 `, ^
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。' g Q# l+ a6 A5 N/ w
2 }5 W5 n0 S; K9 A' t6 j
" O+ `+ X& Z0 q' }# P, G4 K: c问题
0 q' K" t" r( @( n) [, r0 s: l$ }% N2 o+ P, D* ^
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
8 J& Y1 o3 G; P# F& h6 k( v6 N& k- r! C8 `
SELECT * FROM MY_TABLE* {# v+ ^$ U( j' `7 e1 H" ^7 D# }
% U6 I7 I2 X6 k& D# }/ T7 BA.如果可能,用把查询转换成存储例程
& s/ r1 ?. J1 u% d9 ^: PB.如果程序允许,给查询指定返回记录的范围
: o8 B9 J' }9 {- x$ K1 kC.如果可能,添加where条件
; S( o) ^ w. m+ L8 c8 h" p! ^# BD.如果DBMS允许,把查询转换成视图8 r9 A" c& e( V' T+ q) o8 g4 ~# I
E.如果DBMS允许,使用事先准备好的语句
5 Y1 z0 c9 g' d. m8 s7 ]* j/ d
w# P' M5 M9 p* Z9 G6 R3 }) {! d( E: g/ v V- w R8 N$ s
2.可以用添加______条件的方式对查询返回的数据集进行过滤?& o- Z0 G# D, `3 W5 ?& n
7 n" V: F! v; x: M/ |" w, K# o
答案:____________
/ a+ [7 C7 Q; n. } E- u" ~* b9 h7 Z0 [2 g. `
4 H+ k1 ^/ s3 [0 U
3.内关联(inner join)是用来做什么的?$ l) }$ [: [7 H3 c
" Q7 P5 r- { w3 {: Z
A.把两个表通过相同字段关联入一张持久的表中* {: n# q& h" [+ v5 G
B.创建基于两个表中相同相同行的结果集
0 U. m6 D' M5 t0 s$ h8 r [C.创建基于一个表中的记录的数据集
+ Q- S: ~( w* n1 o8 q" [: I9 wD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
5 ~% x# L) y; l/ r1 _. l" g6 TE.以上都不对; l9 \7 F2 X& W& m* `- A0 e B: s
& D6 _/ _. p0 a
/ q, h; o: ~% ^. u' D4.以下哪个DBMS没有PHP扩展库?
3 P" W! V3 y3 e& I4 [. Q8 N
& |5 H4 [9 C: l' K7 f' nA.MySQL
* k; X* P' N* K E1 _B.IBM DB/2
4 f. M8 m s7 \( b ]; SC.PostgreSQL
- K3 y3 j7 h0 Z/ i' [0 UD.Microsoft SQL Server/ r+ i& r+ N# X& Z
E.以上都不对 z: `6 F) @/ t- C$ M: i
U/ e* \# R$ [- H8 ^& O
9 o2 E" l/ K# [" Z
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
6 R- }7 y) J9 |; H, T$ Z
2 v) }7 K, j/ t# [1 B5 c<?php* @; F) F# u% s5 C2 ]
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
1 e9 i; W# K0 J, D4 |?>& I4 m: k4 X) L! D9 }
* _. c) x9 U1 C; NA.MYTABLE表中的记录超过1条0 I1 ~6 C7 ?! c: k8 @* w$ H8 @" N
B.用户输入的数据需要经过适当的转义和过滤0 z \( R5 |" @/ C% y. ^
C.调用该函数将产生一个包含了其他记录条数的记录
2 l0 N" G# K: |D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除2 {% S: |' M' r. G# N
E.查询语句中应该包含数据库名
$ z9 ~0 V6 ^: X3 S, P
( k) q1 U, Y8 n- _* K0 T6 I9 ]+ d1 [, O
2 j( A0 `3 F* ~: f" l6.______语句能用来向已存在的表中添加新的记录。8 X! ~3 V7 E& o5 D
* }4 `+ u9 f" E: t# ^5 [# U
答案:____________4 ], |0 W$ P. `4 ?
( i0 `+ g' W; ?: L
- l) J% w# Z# C
7.以下哪个说法正确?
1 r- [7 D# U% i# ^) d6 F" l4 ?0 j' n( I1 g' n
A.使用索引能加快插入数据的速度
' @& _/ p; Q, e# YB.良好的索引策略有助于防止跨站攻击, W- Z- t! v9 x4 f( v% {, C
C.应当根据数据库的实际应用按理设计索引# k/ X" h- F% r) K9 F
D.删除一条记录将导致整个表的索引被破坏
: X5 p! l( [. v' rE.只有数字记录行需要索引
. v4 D2 ]2 `3 R4 {' v& m4 z6 [5 A/ a; m0 b! F4 N2 @* \7 w' d4 W
$ k. V% w( x$ F8.join能否被嵌套?5 A! ]) ]7 ]$ m. P Y, V8 f6 n* ~
: _! H' _+ U% J& B
A.能- g$ Y9 V2 _' `3 k
B.不能
/ A2 K- H0 h; ~$ h; E$ u3 P
6 \$ C: a I) Z1 f( ~0 {+ }* g% h$ o
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
0 C2 ~; w; L: [" g% Z& @
1 M# i; K) F# VCREATE TABLE MYTABLE (4 d$ i/ m. ^. n1 k( E
ID INT,
' z4 k; p9 L* B2 ENAME VARCHAR (100),
! P2 v& N4 l7 a; |ADDRESS1 VARCHAR (100),
! j n2 I* \& r4 \4 J/ m: CADDRESS2 VARCHAR (100),
+ U& l9 r/ A1 y- A$ W' }; Z# fZIPCODE VARCHAR (10),) J( d7 q% d d* i9 f
CITY VARCHAR (50),
* T/ v$ u o# w4 wPROVINCE VARCHAR (2)
! P% p* g: ?- j1 })
: C8 G5 L$ v( b# m7 R9 `& n; dSELECT ID, VARCHAR
: S& T/ V6 B x- q* dFROM MYTABLE9 p0 F" ]: i" o, S* ^
WHERE ID BETWEEN 0 AND 100& _% N6 p0 [, ~6 M3 \; s7 q
ORDER BY NAME, ZIPCODE& B" B" E, Y1 {
$ S f+ e9 H9 g
A.给ID添加索引
$ @0 y( w k& ^0 `' Z8 j" \B.给NAME和ADDRESS1添加索引
( \( T% g1 n6 pC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
5 U* ?) b2 M5 f; ED.给ZIPCODE和NAME添加索引& Y2 n5 c- p& [1 k
E.给ZIPCODE添加全文检索% Q+ U; a: ^0 v1 `
( ?" ?) _$ C0 U3 R6 p
4 l, u, g: j9 ~& @: @
10.执行以下SQL语句后将发生什么?
3 f8 p e; x; F9 u9 \0 T
; x' ?- v7 ?0 B+ e8 yBEGIN TRANSACTION- L2 @- G/ w" }- F y
DELETE FROM MYTABLE WHERE ID=1
2 x: ]" z0 c! ]DELETE FROM OTHERTABLE0 l) P& @0 n! k# w2 Z( F
ROLLBACK TRANSACTION' e% Y9 \9 G. W6 ]6 t# D/ i" G
+ E/ L8 Y+ B* J7 K k
A.OTHERTABLE中的内容将被删除; _) n$ }5 e% C: E j' c
B.OTHERTABLE和MYTABLE中的内容都会被删除
0 h5 ~7 q2 m+ K" m7 _C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
; j4 Y$ d. D4 @0 }D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化$ v! g+ B7 f/ m1 k$ ~9 k6 t$ n+ v0 u
E.数据库没用变化
$ }- p& w8 z4 Z# K' q0 O4 K& V/ z! E% ~+ q' n$ o! p
: O4 ~' u. |. N. Y. m5 ]! R# `11.DESC在这个查询中起什么作用?, O n4 U1 o4 g. v
$ H2 N5 ^+ K: Z) V6 b* ^
SELECT *9 k9 q V1 r U7 r* |) F- `7 v( \8 w
FROM MY_TABLE
' K6 C5 o+ P; }% `WHERE ID > 0& w( e2 R! e8 g( e, T9 i9 f/ U
ORDER BY ID, NAME DESC1 [* ]% ]* ^' x- |! p% k2 T
3 r9 k2 G; i% K' j
A.返回的数据集倒序排列
+ h' r( @* v) K( j3 }- R1 hB.ID相同的记录按NAME升序排列
# o: Q# c. I/ T! J' |2 b% \$ xC.ID相同的记录按NAME倒序排列
" d) m# `* C! U+ MD.返回的记录先按NAME排序,再安ID排序 H% B# x$ V# e8 B0 I0 j0 V
E.结果集中包含对NAME字段的描述
0 X) @. t( ~2 x: R# d8 D# x% ^# p' N/ f4 f9 ~" V8 [
6 i9 a2 F9 L5 Q; l( K0 R5 u" d0 Q12.以下哪个不是SQL函数?
$ z) u$ o. [$ O" M- P1 Q& L' P2 F- N0 a
A.AVG
' w" H7 x% D0 R* H. }- EB.SUM
2 A+ ]* Q3 [; V: HC.MIN
( ]+ i- F6 v3 K/ ?8 V2 Q& KD.MAX
O/ Z& y J* [5 Y" ]% W6 sE.CURRENT_DATE()# h. I( Q" H- L8 v! a) q; W, k
1 K1 _# i& L" B( i
$ Q' l4 f- K* t; l0 h13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
4 Z2 J$ I4 b' U3 h$ }* i" a
; {, h1 S$ x9 s3 ^: t& U. iA.该字段必须有索引: U8 b7 e% u/ @' Y; F
B.该字段必须包括在GROUP BY条件中0 X u$ V) i6 J/ X' l# @ p
C.该字段必须包含一个累积值
1 e) B, t; O' c' [D.该字段必须是主键
6 k, ?& D$ b `1 A# y AE.该字段必须不能包含NULL值
1 ?- D/ @! `) A
. t7 N# Q; |% ]8 I. v( c" A) c! q! R1 N
) _" }2 c# F' J' u5 s8 S$ X14.以下查询输出什么?
* \" @: Y6 s2 F
7 ^( G0 x' I- [; V) V6 nSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE27 R& s" J# }! x6 j
ON TABLE1.ID <> TABLE2.ID/ D0 T* p9 h- D, f* Y1 J N
: S( n+ ~5 P( Y) H& E" S
A.TABLE1和TABLE2不相同的记录
" h; w8 R3 V8 j LB.两个表中相同的记录. Y, V9 [2 c4 l3 S0 A
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数& P# f, `( P& c, A4 F2 P3 H
D.两表中不同记录的条数
# x8 }# D- ?# }/ m; J+ PE.数字2 o3 d; [7 e' ?3 B p% b3 }$ R( U
5 J: L3 x; d* o! _" A' J1 G2 v; ~5 M! N8 e8 @- @
15.______能保证一组SQL语句不受干扰的运行?/ K1 S9 Z. n `, W) v' P0 t2 ^
" q2 W! _6 a+ B O) Q
答案:____________
9 f9 S8 O' [+ p$ [9 r
5 C) j) _2 c2 q0 |$ u- U7 A
+ g. _, E5 m% Y# W( p, {
% Z/ ], E( `$ i答案速查% T" A( X$ N2 }8 A0 Y
1:BC* X+ ~" @; D4 k( H5 |5 x) [
2:WHERE
' r6 ?2 N/ f; w. [% _! S0 f" I/ L x3:B: [7 {6 Q1 ^: w1 X+ `% ?9 J$ r
4:E
' i% ]9 B4 z) v5:BD
' S0 J4 K& {/ |& ]! L$ ?& ^6:INSERT8 ]0 D* C: ^' h8 s5 y$ C( `
7:C# `+ O+ Y" w( ], y; I: d
8:A! H5 F# @6 D3 Y; M3 w) a2 p
9:C+ X5 q8 Q9 I) F# x- _" Z
10:E
# [+ [% |) E; k9 e0 S" m0 p) i- A11:C }) h7 @5 }$ G. ?
12:E+ m3 f' ?& g) q, r! p9 r9 |8 f
13:BC
" i" y3 o7 e' |/ r14:C5 e4 V' W) X+ n8 H! d) T/ _6 l
15:事务& z$ c) l) c( f U' G/ {% Y
v6 Y1 Y) e6 L% [, u" U4 G3 h* @) s* _9 y* A {, k
- y# t0 d' e: w+ P# P答案详解% J9 e% @: v1 E8 j1 y: _
1 T( f$ g, C0 Z3 P" Z" C1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
- U9 P$ U/ K/ T
n+ M2 X1 ?: Q1 _* Y2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。% _1 j. J' N& \- @: Y1 J
. N, _& p" R+ \9 T, A+ {$ ` W: r3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。# j/ H% I# H% U: \0 `
. i& Z/ o7 U: N) }4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。& W4 Y' a. x) Z1 R% f8 x
0 F( K( i, a$ m5 w- b# [" a3 I
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。" ~. H: P: A$ q: U( g' K @
* z1 j+ T: @- G9 y" n
6.答案显然是INSERT。, ]* y! i( Q1 F4 e6 Y8 f
3 F w* Q, n& {' a
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。* P3 E8 G/ e; t! N
/ k& w* j5 V9 ^5 _9 i! P8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。+ Y9 X3 `3 O- t3 J9 U: F$ {, l$ \
& G5 H' D8 K/ l9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。; @* C- v% s& f& j
# x: @* J, n J2 g0 H2 L! D' k10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。0 S/ W: b3 m$ C
q8 n% H2 n6 l/ b+ \, Z6 s/ C
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
2 @. E9 G3 b4 B7 [; H8 @
# ^' O- d) h; Q# ]' e0 @) n12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。) w% v' M/ ]/ q: Q: V
- l5 g1 I8 y ^. w7 v0 H, R8 t7 P
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。$ T6 N& M4 _5 g1 o: x
. K4 w4 H( T& Y1 d3 u
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。$ G+ b- Q& G+ C5 d" n
: b+ U7 I5 c( i3 s, c15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|