标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
z S9 _% n( l2 j
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
0 v) i( N! `3 j
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
- ^- @, I4 B1 O5 e: ?9 g2 Z/ R: H
# s: D) H7 L2 [$ T5 t- m
0 L) L( K- s! O9 y
问题
+ }: V# o+ q8 D1 |5 h9 ?3 V. O7 a: M- c
/ A7 f3 t2 h1 P
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
7 b$ |; D9 N% ]% E9 X4 _
$ u9 R n1 \5 ]3 g* D+ s2 l$ L) a9 h
SELECT * FROM MY_TABLE
' ?9 J( r8 W, ^! H/ A8 Z4 e' g
* K. \# s- G0 s: @* B
A.如果可能,用把查询转换成存储例程
& M/ O" y3 G# y& @
B.如果程序允许,给查询指定返回记录的范围
, Z( _/ S% ?+ y+ ]) t
C.如果可能,添加where条件
2 Y/ t. v* S8 T! j& ?
D.如果DBMS允许,把查询转换成视图
; ~1 u0 |7 y4 z' }. H, v
E.如果DBMS允许,使用事先准备好的语句
- s& O# e8 J0 l9 @( ]. q& n0 ^4 m
, L9 z, ?) g& y q3 s* s* e. p
8 g7 n( f1 f3 j' W$ @+ M
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
$ n1 t# R' B1 L l, w
% C( [6 @ Q2 L" I* f% u
答案:____________
+ @% n9 S' V" s; S0 _+ F% w
. F7 F. k0 k% Q- _3 u1 z
$ U" v1 x/ h# |& Q3 |
3.内关联(inner join)是用来做什么的?
) {! c0 n+ z9 g$ ^0 S8 I* T# x
: ]( n5 t- N% Y6 [7 C3 \
A.把两个表通过相同字段关联入一张持久的表中
, m: ?2 y( c* i! s" V
B.创建基于两个表中相同相同行的结果集
9 L8 t k- H% B" o8 } ~5 B# z
C.创建基于一个表中的记录的数据集
' \+ [; f/ s0 H# V7 M9 C
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
; l& V- {7 |# d! y" d; a
E.以上都不对
9 g- V; G' s7 w5 ^ D8 a9 e) X
% s7 y: `$ S! ~) j: E& K1 k' x* ?) u
) B9 Y! q" N5 `& ~9 e
4.以下哪个DBMS没有PHP扩展库?
& r$ a: V9 t9 p" @
2 [6 t% D! j- @1 ?: S" I% k
A.MySQL
) }' p/ w" n" K) F% Y
B.IBM DB/2
. t* w4 q% F) T$ H/ [7 e" a
C.PostgreSQL
' i& G2 d8 z( p+ H
D.Microsoft SQL Server
) g0 S4 R+ o! t# h9 l
E.以上都不对
9 ~( @0 n6 f0 Q; N, P
* K/ R: b4 F. o9 q) M8 l1 x" K5 g
. ^2 |( y0 a$ N" g' |4 [
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
0 Z& ?6 j* r4 Z. `0 J' Y4 D- L0 ]
& F+ [& s, f' C
<?php
2 J: _7 O0 @8 n+ C# Q
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
1 n: G( B! a" v
?>
; W0 ?% p, k2 P% J+ ?) a1 M) T2 N
' q& ?2 M! s" ?+ G
A.MYTABLE表中的记录超过1条
, _8 c7 h% `2 q R" i
B.用户输入的数据需要经过适当的转义和过滤
1 m8 ]; J, r! o
C.调用该函数将产生一个包含了其他记录条数的记录
5 n# f ~. B1 v, \
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
0 T( @( ?& E q f
E.查询语句中应该包含数据库名
/ q- B! ~8 j; [+ c+ B' N
* w1 H# g; q# n- v ?& E
& Y X0 G' P" `1 |) ]
6.______语句能用来向已存在的表中添加新的记录。
+ m. _4 B) _; F6 V
4 B5 R& ]9 E, P' l" k* @
答案:____________
# n7 Z n f& |; ~' f: h
0 r! B, f8 S# P4 I4 s
) I9 z2 H$ G3 \8 |, s0 r$ ^( g) H
7.以下哪个说法正确?
9 C; P" h& s! N3 `% N& G
- ?) H0 u0 }5 X: l$ c6 i! v
A.使用索引能加快插入数据的速度
3 N9 P' Y) f$ T5 z& Q# h
B.良好的索引策略有助于防止跨站攻击
: W- E# _: X0 ?5 Z4 R
C.应当根据数据库的实际应用按理设计索引
7 d" }" D! ]/ F, \
D.删除一条记录将导致整个表的索引被破坏
5 Y, v. a3 F+ @6 `
E.只有数字记录行需要索引
" a. G) d6 c% f/ |( n( f
1 Q- _: F; @+ Q5 n5 P1 h; U
2 C' r" N2 x7 F8 |0 j, k' W8 s1 }
8.join能否被嵌套?
) B: b' s/ A$ {7 d1 d: @: c9 f
' ]% Y8 q- L+ e7 n& S" C
A.能
9 _; A0 s' P& R( p' }5 I
B.不能
. ]1 b/ V% s2 q: M6 h! o
5 \) n7 ?2 c" c. N
( O- l' M! ~- x. d9 t( K
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% C6 z/ W* `% x7 A0 F
( L3 O6 h* f# R
CREATE TABLE MYTABLE (
8 ?7 i4 r: B, Y! _" ?) o: l5 U7 S
ID INT,
/ h q. b! Q$ @7 ?7 X" q
NAME VARCHAR (100),
4 a) t f4 s7 L& S/ G9 n
ADDRESS1 VARCHAR (100),
X j$ z9 A0 s; J% ]) `
ADDRESS2 VARCHAR (100),
1 f. }8 u8 J; I. r
ZIPCODE VARCHAR (10),
$ W; P6 P( ]2 V* y$ q, z7 X
CITY VARCHAR (50),
, y( @: D4 ]' @
PROVINCE VARCHAR (2)
* F2 L5 U" q' o: u& p
)
( |9 i) s0 f$ ~, }( E
SELECT ID, VARCHAR
. |4 B0 O! \6 f" ]0 |
FROM MYTABLE
3 i5 w/ S% y+ V; w6 N* u
WHERE ID BETWEEN 0 AND 100
7 f2 ^ @9 l: m
ORDER BY NAME, ZIPCODE
2 @- ~. X8 u0 A# L
. `1 W8 ]% x$ ^8 c4 \; a
A.给ID添加索引
: m) t3 y2 a" ^. X! e' i
B.给NAME和ADDRESS1添加索引
9 ?* J2 x2 p( `+ g$ O8 t0 n+ E
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
! M" D; D! w* G5 T+ k# O @7 Y
D.给ZIPCODE和NAME添加索引
! o$ Z0 ]0 B$ k% V1 n
E.给ZIPCODE添加全文检索
9 [1 o ?% P* A
& U( Z& w9 G+ S
' Z: w9 ]; Y6 U2 P8 Y+ P5 W
10.执行以下SQL语句后将发生什么?
4 z: I! N- p# F( l* ~0 d/ v- S- R
8 w! ?- T+ \- N8 l$ i9 w' K
BEGIN TRANSACTION
) X* w) w' ~( O! s
DELETE FROM MYTABLE WHERE ID=1
3 G/ R z" r8 J
DELETE FROM OTHERTABLE
9 Q' v# S& n. |1 @, ^6 ~
ROLLBACK TRANSACTION
% j N8 U! p( e& J
6 \8 `" R5 W* @3 H) M
A.OTHERTABLE中的内容将被删除
6 ]# b6 K# z; v/ I; [8 `0 W4 B n
B.OTHERTABLE和MYTABLE中的内容都会被删除
+ p) j" G l& y* I) V3 O) a) C
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
9 G7 y) s- E+ [. O) c' h/ o
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
! w! l! U1 |0 }& p' Y# O
E.数据库没用变化
/ T, B F6 s1 ^ \
- p2 x- ?' O5 M3 Z- r4 {
, f% e. ?0 H- p; Z6 }5 \/ @
11.DESC在这个查询中起什么作用?
! i4 R$ S7 B' Y4 M- V
4 j) ^+ |5 k) x1 x
SELECT *
. b) a2 ?. j9 O+ C1 s: E" |
FROM MY_TABLE
, o# I( R" @6 B% C0 \5 f* X* u
WHERE ID > 0
6 a* q2 g5 R/ d( g
ORDER BY ID, NAME DESC
5 q8 }# K, _- |* |- ?% Z' x
2 i" L/ I$ I5 W/ z- b3 h( G. ^
A.返回的数据集倒序排列
9 Y1 A$ s" ?2 T: v$ s
B.ID相同的记录按NAME升序排列
W, b- k( s8 n0 i! `
C.ID相同的记录按NAME倒序排列
8 A5 N3 F6 z0 u" W5 J+ o
D.返回的记录先按NAME排序,再安ID排序
) W: P$ o9 m) D- [, O; l
E.结果集中包含对NAME字段的描述
: _0 d3 W5 w) N& I' h/ {, |# G
5 w5 A$ W9 _3 a0 J0 R
7 }4 o& F! P4 V; n$ b9 p5 ?. |
12.以下哪个不是SQL函数?
+ I& k( Y, \9 D( Z4 |
' p2 g+ ]7 d% V2 h* F& o) `# { |3 c5 B
A.AVG
! K1 E* X5 m) h) r
B.SUM
4 t& Z/ ^# M' `2 I4 a
C.MIN
+ d' E4 x& Q' R
D.MAX
; x# k& Y& j( e" S; X0 g9 K
E.CURRENT_DATE()
" I. ?. C# W, B
5 M" J. r! R3 ~
4 s3 v! M0 S8 i5 t7 `
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
, f; a7 {% p( g7 C5 v% H6 n9 g* [6 [% F
" v* v5 X) k" l& X( c( I( M
A.该字段必须有索引
3 G9 Z: L+ G$ E4 M5 w) P* M' p9 ~6 O
B.该字段必须包括在GROUP BY条件中
, t H+ ^, [4 B( R- r& X
C.该字段必须包含一个累积值
0 q" v7 O. L3 \+ S, `- Y
D.该字段必须是主键
. } u" Y' j7 A, w6 u& e) h
E.该字段必须不能包含NULL值
+ U. g) x8 i6 ^) ~5 C3 y
+ y; e2 n' y: a7 C
0 F+ U9 l, y8 R& B4 \( {' f
14.以下查询输出什么?
7 W- g* R1 A) ?+ K) {4 D& _" Q- O. H
$ T& [8 h+ _+ g* T$ z
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
2 U5 w. z, p+ s( `' J# e
ON TABLE1.ID <> TABLE2.ID
+ G+ h7 ]+ Y1 D6 ?; J+ k7 q
- s& H# n" B1 K# E
A.TABLE1和TABLE2不相同的记录
' ]$ o- e3 K9 R6 J0 o
B.两个表中相同的记录
0 X* V4 G7 V& m$ M; _2 k, @. }6 g" M
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
/ p' G! ^) @5 g9 n/ K6 {: C
D.两表中不同记录的条数
/ |4 s0 t# k' [
E.数字2
6 e; f( S3 }* `3 r3 c T4 l
# j1 G# G& x& T9 f3 j' p1 X
/ T5 s* e' Z* D7 D
15.______能保证一组SQL语句不受干扰的运行?
& P- u/ i, r5 ^ ?2 ?
2 g% ]$ ]) ?( L1 |" U
答案:____________
0 s$ t8 {" l1 s( Q) C
& I! @/ H* `! l; T9 l) e: Q m
0 x, [7 S) a6 k7 F( U1 m0 J) V
`2 m6 Q8 x F1 v. [
答案速查
- M! O+ @: E8 ]2 \' n
1:BC
& W+ C6 Q2 [7 t3 O+ U+ ?1 ^
2:WHERE
* k2 \$ J/ O, |- W' f
3:B
1 k8 e+ ^$ s, k7 A2 K3 I! s
4:E
4 f" [$ ?1 E# f# N! l
5:BD
) f" R! f$ @' z2 m
6:INSERT
, g, H. j- i0 z6 D" Q2 s% l
7:C
: p- T8 N* ]9 i- g% T$ u
8:A
! \/ S: w/ }( V7 \! x
9:C
' s x+ K r" m9 W
10:E
+ ~! b8 X) J+ X9 _- I. H! ?. v
11:C
9 ^: k- S7 k! [) \ R
12:E
$ Y+ n! l0 F$ ?# P; p
13:BC
( h0 ^6 \2 S1 I9 u7 f
14:C
3 Y8 {) l& O" Q# E- z1 A. s( [5 [+ K
15:事务
9 r4 `+ D$ l2 L' i. e" @. s
\7 e F/ B! B) u: z
7 O" P' w' D3 [0 o
. u) x" w0 Z. S. X* V* b* s
答案详解
( V. @+ Q! v. t& L
/ q6 u' l+ @0 k/ i( _
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
" w$ {. }) v' |* u& P/ e) F- F
: z" K/ ]' e9 d; f
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
/ G7 A8 o2 w' ^( O, W
$ b* j! P4 s* s3 e1 X9 P5 N
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
4 Q) f5 w9 O6 x
/ @0 W& r7 b: G( N* p
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
$ R3 j. O8 R) q1 c |: y
. D1 E/ h$ [! r. R, B! S9 v2 G0 r
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
1 Z7 M+ L" E. c# q
$ n9 M* i8 m7 \2 x/ x( q: d
6.答案显然是INSERT。
! o3 }. ~/ ^ z n0 \1 G; N
& J/ T' P+ F+ o5 H P4 ]" V5 [
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
% H! W5 A$ w4 I' X; G, f
9 C4 |' E6 p- a1 K3 j5 t$ _
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
& A" Q: h" k/ L$ r: T
6 B' K2 O2 W5 i6 m, ]
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
* p( t7 h* D' p, V! L( s
% A- L7 ^, m% p* X! O' x
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
( m; `8 ~* t, y* Y/ c
+ V# P r# W$ I) g2 g1 k6 b
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
y; _) t$ ]& j4 c
+ {8 D/ w9 c5 ~$ d+ a
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
( x% D9 b5 n9 P/ ?7 a4 u& D
3 ^0 E2 C% \( Z, D* o& j$ ?0 p( x6 o
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
) c8 V7 W/ o/ b% E. M! ?
' ]. [ k. O4 h+ ~( f
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
% z0 `0 @$ M T7 G
) k# b( b, I& V$ W$ e
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2