标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
O# Q( T; ^$ Z$ u+ T
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
- Q9 V, d' O5 w1 ]) w0 u
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ E* ^3 d0 E( ?: B* [7 } q
. M3 f5 a. T; ^* `
$ }4 \/ B1 W: ~2 P( G2 j
问题
3 Z L2 w. V. x9 J* ^
& m0 B: E6 r x1 Q8 M& C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
" d5 ]6 A) D# b9 |$ N9 W! m2 |
3 { c' X4 L. F3 |4 @, \
SELECT * FROM MY_TABLE
+ v* x- V4 R' J. E5 c1 _
! P, i% V% {% y# r, p0 }
A.如果可能,用把查询转换成存储例程
! E. r; }, F- q6 t8 a
B.如果程序允许,给查询指定返回记录的范围
. O9 f8 `, T& y7 h
C.如果可能,添加where条件
M) i; p2 C. d) Y6 Z& |- g- t
D.如果DBMS允许,把查询转换成视图
% G/ T& q+ P: b$ v! F" n* U2 D
E.如果DBMS允许,使用事先准备好的语句
8 k5 V! T7 U! T- ^7 |9 L
; H; X, I5 x4 B. H
- a5 y8 Y' Q1 P5 n! h" z* y
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
; J1 d/ L% m) L2 ^. W! @2 u
9 n, K+ |: g1 w3 _8 t" h
答案:____________
0 c/ B3 `& S: r
/ @6 h8 e2 Q7 q6 x& O# |2 U2 e
: P% J% j) m. f4 p' n, m }
3.内关联(inner join)是用来做什么的?
- {/ t ^. r+ z1 O1 [
4 t% z8 n( {) B+ j( p
A.把两个表通过相同字段关联入一张持久的表中
& [; E5 |6 j3 U
B.创建基于两个表中相同相同行的结果集
8 F7 \' T+ f2 s* ]
C.创建基于一个表中的记录的数据集
7 Y9 p4 p: S) e+ }4 {, @
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 H# O/ m+ ^3 v/ g; ~2 \; W9 W
E.以上都不对
8 {& e7 t/ H* K9 C& j4 l
' U8 T' l) P2 |# o4 x$ A. X- f
+ t& z: D* F; u; R% @' G6 W$ W
4.以下哪个DBMS没有PHP扩展库?
9 \: C5 Y ]' ]0 O
9 x2 Y6 I0 L/ f+ l5 q% P
A.MySQL
* X+ q* B: A2 o1 C8 x4 p1 X8 h. T M X
B.IBM DB/2
3 p5 P; \0 B* I7 k5 C$ Y
C.PostgreSQL
/ r! \' |. B( e
D.Microsoft SQL Server
3 X2 I. H5 r& ~% M* ?0 `1 i
E.以上都不对
5 ~* R; }& [. C X3 |) y; y" Q
# n3 G( D! x' O* m8 j7 h
) h, Q1 M, S: r- B$ X
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
- I7 ?/ B* T( H6 m' F( S4 _4 V7 s
1 z2 f# a5 `& C* h
<?php
; s7 L, ~, r& } j
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
# H& o I, h( s$ K
?>
5 |" J+ P) E; x6 e3 i! J% [
0 v2 k& }" b3 `3 S9 M, q
A.MYTABLE表中的记录超过1条
: [* F! A7 |% ~: r$ l7 _
B.用户输入的数据需要经过适当的转义和过滤
3 X' e0 w4 [+ Z- Z5 g5 E% C
C.调用该函数将产生一个包含了其他记录条数的记录
3 y2 R- u. J; |! G" ?8 W8 ~. C
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
$ k; e' }" f9 A# n+ ~8 c
E.查询语句中应该包含数据库名
9 V7 L# e. z3 G; n
& ~: D2 h" q7 {. d% B
( `- ?5 x) h+ M
6.______语句能用来向已存在的表中添加新的记录。
2 x. M; c5 g% E- A2 G- Z& r
$ n, D( z/ U) R& Q$ y
答案:____________
. F/ A& d0 s# ^+ O- B/ v
& x* l5 M8 G' u9 _9 `$ E
# q1 q) F O2 R# J$ @ K
7.以下哪个说法正确?
4 `/ K: T, b$ @% A
* h$ s# ]$ ?, p
A.使用索引能加快插入数据的速度
# ]% U6 i, B, g5 l2 `2 t' n
B.良好的索引策略有助于防止跨站攻击
2 s- g6 }, X3 H: K2 l' X
C.应当根据数据库的实际应用按理设计索引
3 Z1 a" t9 G- P( r& d* h# f
D.删除一条记录将导致整个表的索引被破坏
8 L+ L; k' ]& s$ M' | e$ h2 X% q
E.只有数字记录行需要索引
& U( x3 N( U% K! w! u8 T
: l3 X O3 K: m) t& x8 M
. o: B& o5 C& ]9 x# E8 T2 B
8.join能否被嵌套?
+ m, q9 q% B% i( D$ m
$ C: p$ V- Y; P
A.能
' u2 C' t3 c6 J7 V! W
B.不能
5 g5 x$ D) {6 {: U9 C, j
7 U2 \; N. K2 G4 R
% V* C4 ^* S+ k# Y1 q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
, L- N4 \+ Z1 G( ~* ?
9 n i3 R4 O0 A; ?( x" F
CREATE TABLE MYTABLE (
: @% ?3 ]' D6 T3 Z* D' v
ID INT,
8 e; r, \: }. R" k8 R% g) m
NAME VARCHAR (100),
: V0 K9 a4 L) u5 f6 T3 V$ U
ADDRESS1 VARCHAR (100),
: G, C( i1 C& u) e, O
ADDRESS2 VARCHAR (100),
3 G7 U; O; R) I8 r( l
ZIPCODE VARCHAR (10),
; j2 D. c0 }/ \* A
CITY VARCHAR (50),
! x* C" f! m4 A
PROVINCE VARCHAR (2)
; S" D5 [( F0 ~9 [
)
) T5 d/ t) V% [; j; W) b: P) r) q
SELECT ID, VARCHAR
9 g0 s9 e7 f# C9 }/ r, w3 o; H
FROM MYTABLE
2 d% F# R, m7 n& U
WHERE ID BETWEEN 0 AND 100
/ B' Y: X& A) R3 o( R
ORDER BY NAME, ZIPCODE
6 Y9 R; H4 f, M' z
# ?& p$ x1 Y, b
A.给ID添加索引
% |' _* L* i l+ T3 V
B.给NAME和ADDRESS1添加索引
- r1 T( @/ o9 m4 v$ l( @
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
( d+ j: d6 _! U; {; a n
D.给ZIPCODE和NAME添加索引
% {# l9 `5 P# j9 Z- v9 H
E.给ZIPCODE添加全文检索
* `% x& Q/ W/ D
c/ o* I' \. N2 J Q0 H
0 D1 t# O8 N& V, r* B4 f9 H+ p. u* \& @
10.执行以下SQL语句后将发生什么?
- m; {! G' `! H6 K
$ D" v7 k+ H! z7 Y$ f; |
BEGIN TRANSACTION
* p6 s" y7 b3 _
DELETE FROM MYTABLE WHERE ID=1
) ~$ z% E, O( K. o
DELETE FROM OTHERTABLE
) s8 u! M2 K1 }* h
ROLLBACK TRANSACTION
6 K! W+ P& u+ Z7 c- B) ?
" o: x2 o" A( F6 p% b
A.OTHERTABLE中的内容将被删除
0 i$ {0 x0 u) C1 l% m6 l( V5 C
B.OTHERTABLE和MYTABLE中的内容都会被删除
% {! Y# i$ Q* b) l+ T+ Z
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
) O4 p9 ^5 O5 t) E; G7 z
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
1 W# u; n) N9 K
E.数据库没用变化
& i1 x0 F# y: ~5 W! ^
. S, A& t6 C7 V+ }4 p3 C
* t6 m2 F5 M; Z1 J6 _5 J; l
11.DESC在这个查询中起什么作用?
* Q5 z: g; h0 ~3 Y" \" Q
( Y* I# N) z1 N+ E
SELECT *
( w3 U f- d' t4 K: X! M; z
FROM MY_TABLE
+ ?/ T5 t7 R' `- D5 f
WHERE ID > 0
+ a0 J' h8 |) ?: ?5 }! B
ORDER BY ID, NAME DESC
" E' ^( v% t# Y: i
6 j/ Y6 n U% F) O! y
A.返回的数据集倒序排列
/ X) U- H; g. l/ f. O( }6 N6 X
B.ID相同的记录按NAME升序排列
1 L5 e* J ~9 Z& l
C.ID相同的记录按NAME倒序排列
3 J; i# b( `. q( j
D.返回的记录先按NAME排序,再安ID排序
* ? A0 ?% P7 z. X5 y$ \
E.结果集中包含对NAME字段的描述
& e0 u& b' a+ ^
# A l& J( c/ t
! o- [" V8 e3 `' |4 S, o
12.以下哪个不是SQL函数?
& e. K. [1 d) D% O
! L" q% }& G8 u3 }
A.AVG
- g+ F' f# I( V# y; ]
B.SUM
* e( J3 D5 y. m9 C
C.MIN
. W& }' G: K6 w& o1 |+ C. y
D.MAX
G( N! @4 g. Q! l% @
E.CURRENT_DATE()
+ [4 ]2 @( X/ ^5 ~0 j
5 q* r% T" V) ?& Q4 [
0 G$ C$ O9 o& ^. a
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
3 q. B* ?5 q5 l8 h2 U7 W$ z
" i6 S! |1 v0 z+ F4 R' W5 g) x
A.该字段必须有索引
5 _% P: s* C; R
B.该字段必须包括在GROUP BY条件中
- j* a2 L" g- j. O: u; y D6 Z
C.该字段必须包含一个累积值
/ L* L9 [0 |$ D9 O/ N+ {. P& u
D.该字段必须是主键
% k' q# Z4 J- |( h
E.该字段必须不能包含NULL值
# m+ I, b' C# y7 k
- d. x5 Q: `, R+ L/ }1 A- z# ^2 b
" V4 I, M( V) k( R! K) Z
14.以下查询输出什么?
# g& B# P2 ^7 H& k
7 j/ v7 l2 n4 `9 {( O- Y6 ]- C
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
0 \ w$ j" v' E* y- Q
ON TABLE1.ID <> TABLE2.ID
' h6 k4 z% H! o4 n: D
9 {/ |+ C/ ~3 r& i& H0 }8 s
A.TABLE1和TABLE2不相同的记录
/ k s3 S, ~- S& Y
B.两个表中相同的记录
! x' E/ X1 Q# Y; |
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
" Q$ B" s3 g4 M4 {8 x+ G1 [' U
D.两表中不同记录的条数
s( P0 r! b" i' X/ ], F% E# G
E.数字2
) y" q' K$ |. g8 h2 c
! b7 y2 J# m8 |. W
7 f+ p# d' f o0 A% b7 @
15.______能保证一组SQL语句不受干扰的运行?
7 T- Y$ s( _9 n
; F# a: d k% N9 D4 g( }. y
答案:____________
& t" ~7 ^1 H4 P; N1 [
8 h; |, ?7 A$ o7 h! r0 b/ |0 e
% I, i! k& X0 o2 J+ a
- b: M! B- X! {% t7 E
答案速查
& T$ v. D3 m. y
1:BC
: m3 ^# v/ W k8 k# B+ U0 z
2:WHERE
" M8 e3 W& C! h/ }/ K( H& g/ U
3:B
* _ w: j) }( W
4:E
% u2 J; M0 W8 M: R' l/ e
5:BD
5 a+ Q$ K) Z) S' H* g! v
6:INSERT
- J9 I9 M G; W2 ~. B% r8 v
7:C
" e8 S% z. S$ x. Z
8:A
c& l5 H. V0 v! @, q. D
9:C
, P- f ]: ~6 W/ D. L6 |% E1 i
10:E
9 K4 p' U8 d. C
11:C
$ a+ L( S* M \$ L
12:E
, S9 G% b0 r! B4 G
13:BC
1 f- `. y% U% P+ H g9 R4 S9 y7 t* w2 v' l
14:C
: l; b7 a' A! |9 D/ }% K
15:事务
: k0 p2 L" x2 V4 K u$ j2 E
% T) H- Y& n! {9 w1 o1 n) c9 S" W
- @. t: v/ d- _, N0 N9 @! z
4 E2 I8 J6 C1 L; J4 ?+ J5 z
答案详解
: v* T" u0 u$ A( R" C3 K
/ Q4 _) d6 ~' |
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
$ A% ~& {9 G0 H( k; I& |1 g
7 @# K# ?/ i6 S* D
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
) Z; p' L. o; R0 H9 R5 a
: S" I9 m2 t9 h/ }8 Y% C S# H- A$ S
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
j$ N3 d x R/ L3 ?8 {* u# B
. i/ a7 H9 ?# V1 f- \- L! t2 e( E+ e
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
* U6 E: D& Q5 t/ A5 T+ h6 C0 P
/ H; J9 |/ H7 L/ X
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
" z: L) z* Q3 `( C- |
B% o6 A/ _/ v, D
6.答案显然是INSERT。
9 @! `/ J. p, l
$ o. @& I" p, K' c
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
' k; b; f; X, h/ z9 G
8 \# ^/ `" }3 ]( L& S
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
/ s& c8 S2 L4 Z+ ?# F# }+ l+ m5 a
! c6 l6 J! {9 w) [2 q$ K0 F$ q
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
2 n7 W$ g* r& R
* a( E K" O5 X; D
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& b# U6 e8 D* [; E z, {
) ?/ `$ D2 l% o! g' ~9 O; r
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
+ t& S4 V7 x9 l& W' j1 j' n
- s( i. d1 P1 u1 w9 y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
7 _# H5 i, X3 S) @! r( O
" S# R) |1 l! S9 H$ W
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
- j$ @9 ^9 _$ e, d: F7 ^4 }
- Z, c/ I' Q1 F3 g: w8 ^, n( o
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
! u" k) G) d# _8 w4 N
% {# U K }7 X
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2