标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
% {( ]1 A4 D. X
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ I; L* \7 f7 Q+ V' ~
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
) Z h; f X$ s1 ?1 c4 m) y: G
1 i; s }2 X u7 t6 {; [4 g/ H
* t6 h8 t1 N. u% w5 `* D
问题
7 u1 p9 B& L% G# B
2 e: m) b6 H3 I( T2 _
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
& S+ ~) Y3 l7 _4 i" h6 {7 }$ U5 G
3 R5 f7 r# J7 t, D( D2 y
SELECT * FROM MY_TABLE
" v$ f( x1 D/ K+ x: T, t; G
1 V3 ~7 P" s V9 Y6 F
A.如果可能,用把查询转换成存储例程
% \- f: C' a5 D& _
B.如果程序允许,给查询指定返回记录的范围
* O6 W) I$ @; C- S$ B
C.如果可能,添加where条件
- f6 x# |3 X6 W6 i
D.如果DBMS允许,把查询转换成视图
2 Z, U& |# Z7 G: [4 z
E.如果DBMS允许,使用事先准备好的语句
( Q0 w8 c+ a6 R+ b
2 s/ C$ Q' m% g( `
6 H8 X' ^, x' p* `. k
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
/ ?0 e8 ~3 D- r1 g
5 A- A- m, Y" X4 L5 W$ M; w* c4 Y
答案:____________
2 a: l$ m& k0 z' B# I
! o7 S1 A, x, a% G* G3 \+ ~
}* D# \- C6 |
3.内关联(inner join)是用来做什么的?
# {3 h: R, L: ? D
' l' d1 j% g* K) _
A.把两个表通过相同字段关联入一张持久的表中
7 i A1 x: u& {/ H9 [& o
B.创建基于两个表中相同相同行的结果集
4 `; i5 e0 s/ Q
C.创建基于一个表中的记录的数据集
8 e" Z9 x: o( \% b
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 j( t5 G$ z) E# G
E.以上都不对
. J* G7 C/ m/ j
2 `: g; Y; x% L. [
# U' V' I! N' z& k& p' Z' k5 }
4.以下哪个DBMS没有PHP扩展库?
; W/ f" M: h5 t+ Y X4 U- r
. v* Q* e2 L k" x% d
A.MySQL
0 i+ ^, v& e; f3 w0 y
B.IBM DB/2
, ~+ ?; u, i7 j/ `3 Z" y
C.PostgreSQL
0 o) U! q4 {6 s Q/ F2 Y6 f
D.Microsoft SQL Server
$ p' y! H7 `, E( T
E.以上都不对
, A, s! O" ^8 q$ G9 _ d
# I# @! f/ C, j; o+ E
' ?' {4 N! P- a f( p9 k8 j
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
5 U, i4 m2 X; t* q5 U1 _, X
9 v0 e- p- f9 V" o; }6 e
<?php
! |' {% l3 R, R0 P
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
+ W Y7 @8 S$ ]! ]
?>
. w/ G8 w$ h$ w& }2 T' l, M* \
4 ~* u! G: y- Q" M1 J- H
A.MYTABLE表中的记录超过1条
# Z* r$ A$ N! [$ ~7 F
B.用户输入的数据需要经过适当的转义和过滤
1 `. F3 w, F3 n0 _8 G- b
C.调用该函数将产生一个包含了其他记录条数的记录
0 R7 `3 y3 M, @. v+ f2 D$ r! T
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
8 s$ m% n8 V7 t3 H! O
E.查询语句中应该包含数据库名
6 G" o$ e( M& Q" u( R
& {! S# I& c5 j) C9 Q
# L. j" }' J }/ A, p
6.______语句能用来向已存在的表中添加新的记录。
6 n" \5 p, ^! V% p
2 R- _+ {, F* P3 R6 K2 S
答案:____________
4 i( S U( M' C6 W" j
& | e( Y0 H1 S" C7 S" w6 C
; s2 l8 }. b' |; ?5 a: T8 U
7.以下哪个说法正确?
+ L, F/ G# ]0 p. i) s& ]( g
8 T, [/ f/ \, z" N* j9 R
A.使用索引能加快插入数据的速度
- r5 M2 ?: s7 E# }- f0 c
B.良好的索引策略有助于防止跨站攻击
* Y. }$ E# }6 @6 E
C.应当根据数据库的实际应用按理设计索引
% g1 W; _7 \9 y" ^4 Y" m
D.删除一条记录将导致整个表的索引被破坏
2 }( t4 ]# w$ p/ C9 Q% d: r
E.只有数字记录行需要索引
2 [, U+ I9 }6 \' X$ w( J# f5 Y* w
2 N$ I& r% h% X: W. ~7 U% c" Y
& Y- i- L( o. \ c9 _: M+ @, `& L
8.join能否被嵌套?
& P: |) H- j0 p
( H/ r ~& V/ L
A.能
0 W) X% w/ }/ c. Q' n
B.不能
& n" t8 b) E% ]
! F( u/ I) u) L2 H6 i
1 ^+ l0 ?, H0 K5 Z" z7 E
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
+ v+ v) a7 X; Y' E& |0 h4 {
# {" c) j H' Q' p3 T$ r
CREATE TABLE MYTABLE (
9 l2 `0 k3 j6 j& H1 A! J3 S
ID INT,
/ x7 ?: @2 s) S' J% t
NAME VARCHAR (100),
+ Z9 N/ T; A$ Y/ l. ?( T
ADDRESS1 VARCHAR (100),
* e: ^+ p$ R+ i1 O
ADDRESS2 VARCHAR (100),
# h" _. w6 y! I* y5 e
ZIPCODE VARCHAR (10),
8 F+ [ r+ v7 k \/ L- ?$ k' v
CITY VARCHAR (50),
7 @* c' r/ k( ~ l# i+ r
PROVINCE VARCHAR (2)
2 `7 v+ t" w, d1 C+ x
)
& N+ S% |4 m! w) @
SELECT ID, VARCHAR
+ _- R8 c9 d, x0 s0 \
FROM MYTABLE
* I) F, r9 y0 `. B2 f
WHERE ID BETWEEN 0 AND 100
+ W; T8 y" |$ R5 N0 J
ORDER BY NAME, ZIPCODE
2 k$ ]1 J6 j9 T1 P( c
- m# ~0 K5 Z- I3 w
A.给ID添加索引
7 m6 P: A; W$ ^, r
B.给NAME和ADDRESS1添加索引
! m# p/ o# C, {
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
5 }! k# f, n5 [. A: L' H5 C" B
D.给ZIPCODE和NAME添加索引
$ H: w# n. g$ v% {. R1 P8 [
E.给ZIPCODE添加全文检索
+ o& h# Z: p6 c" u/ ~5 `# R" {- w
( ]7 D' U' M' M, y, ~
- J$ B% Q R( Y) z$ v3 u
10.执行以下SQL语句后将发生什么?
. ?- O4 j$ W) S4 Y _
8 Y% I/ F" t' W. f
BEGIN TRANSACTION
# L1 k* c9 E; v3 B4 [ Y6 w
DELETE FROM MYTABLE WHERE ID=1
d4 Q" w I# _0 S& o
DELETE FROM OTHERTABLE
; p2 F4 q7 }) L9 X$ Z7 X t. d2 i9 b
ROLLBACK TRANSACTION
* z" l8 w1 V" e9 m0 m
% J. d. e" b: r. a: |, i8 f
A.OTHERTABLE中的内容将被删除
/ k$ U) l* ~9 l) G& ~: f5 P2 Y* |
B.OTHERTABLE和MYTABLE中的内容都会被删除
# V# w$ v4 a/ L# {/ p6 c
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
/ D& z/ C7 v, o: x, n! Q$ d* |
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
8 J- c" k( W0 o) Q, E& s$ }& O
E.数据库没用变化
6 t, G1 u) \4 D5 t9 i5 d" r0 g
5 Q" @1 s8 j' j- q( z7 g! m
5 v1 `+ c5 o0 R+ r: x
11.DESC在这个查询中起什么作用?
; H/ e) J8 K" u7 j3 E$ B, j* L
4 p5 N2 J/ D! u+ r, q/ f' n) f" J
SELECT *
$ r& m4 N* ?1 v
FROM MY_TABLE
* I: j. y$ b- _ _7 h# ~. v
WHERE ID > 0
) M1 d6 r9 K6 k
ORDER BY ID, NAME DESC
2 E$ J8 F1 O( P( ]6 U
8 c$ q1 T! O% `) W' S' M
A.返回的数据集倒序排列
# |# S- o) i9 s' E$ w' F
B.ID相同的记录按NAME升序排列
/ f& e8 B3 J' w8 L
C.ID相同的记录按NAME倒序排列
; n6 N5 s3 B8 D2 i& Z, N& X
D.返回的记录先按NAME排序,再安ID排序
; W7 w. Q. p. C. `& m3 S4 @' w
E.结果集中包含对NAME字段的描述
$ O7 ]' ^9 Z1 \7 C+ y, Z6 p' G
& @9 H& z0 \0 Y, v3 R4 g
Q, @1 g# J/ z
12.以下哪个不是SQL函数?
2 t' K; ~( b6 s! R
! i) Y- {- y9 O" |
A.AVG
) |2 b) E0 k. q1 D. N
B.SUM
7 u* p/ F* r5 v8 H; E# E2 w
C.MIN
8 x6 ?/ X5 l1 w* j' f
D.MAX
! M) \' ?3 Y5 |. o# L
E.CURRENT_DATE()
. N5 n+ O% q4 @, J' W
' r) ^3 y( q8 m! V, |2 A
; H1 \& d {0 [! W+ W6 B: A) Q" b
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
3 S% l' f; q9 V6 _
% T+ R% Z; I$ x* N: F
A.该字段必须有索引
0 p1 \: g2 u6 X
B.该字段必须包括在GROUP BY条件中
# G: a4 E$ A! x; ]! Z. {
C.该字段必须包含一个累积值
4 c3 ^3 w$ P, ?4 T2 E- k" ?
D.该字段必须是主键
* `8 I2 c, g3 l* c K7 O( h; d% z
E.该字段必须不能包含NULL值
. [% W+ f: M, A c. h0 K& |- _* f
; s& J6 o4 I0 r5 K
/ Q8 [7 D0 E. j# y! W" `
14.以下查询输出什么?
- ]0 m: e( W) V% {% h/ o! _
) [* L' J# @8 q+ O
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
( U+ ?9 r$ k( p" |& B
ON TABLE1.ID <> TABLE2.ID
' y" |3 S$ j* t6 P1 p6 e
) A5 a5 O4 j, _' v
A.TABLE1和TABLE2不相同的记录
7 N9 Y3 J' B1 S5 u2 m0 P8 K: I
B.两个表中相同的记录
$ `$ }6 ]! m2 t% i" }. u( V$ t
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
0 W- \" C; d+ r8 |
D.两表中不同记录的条数
4 T5 d3 ~, k. h# e! l) u
E.数字2
8 v G! F( i+ x ?" v
- X, V; g& k' H1 h
- Y4 k$ N8 t( ~' S, P H5 s4 I) ?
15.______能保证一组SQL语句不受干扰的运行?
% r- ^. G6 r! Q$ v2 j
* }. p8 S" p, Y. G* L& _
答案:____________
9 @1 b% `& \$ Q' j3 H: n7 g
# B5 ]( Z% Q1 F3 O% a' I
L M& t$ g4 |2 F0 M5 u
0 b- Y) J7 Q ]
答案速查
4 Z. a3 q; Q( J
1:BC
, D( E" W8 Z6 h( h; f$ v+ A
2:WHERE
/ G' W! ?0 n- ^5 @- h7 B
3:B
8 B z) |0 [5 g% j' ~1 G4 `
4:E
. Y" C% [( ]3 L' a& }
5:BD
7 U& @2 w' E4 M5 z( Z. W
6:INSERT
# p0 o! a* W' b8 j! s5 A1 d8 Q
7:C
2 C0 D' _8 D2 [/ T# K9 E6 I
8:A
, `7 d' c/ N6 n$ h1 [- r" r
9:C
. C- R& m) u$ |/ r+ X, j# ^1 a
10:E
7 Y/ a- i( d! @0 N! M
11:C
# S- w& a0 t5 U* W8 c: x3 d
12:E
1 _2 s3 L& o) M3 C- `% q$ L
13:BC
* R* Y8 d5 C2 G# P4 r! `0 V
14:C
: a5 ]+ @/ B# o' G! r; e% R+ R
15:事务
6 F# Y, M/ d t/ G
. X q' L1 v+ K0 }3 m
5 o$ O2 d4 R6 l% [7 M
& ^ K* p$ a& Z
答案详解
, ?3 }: F" `8 s/ Y3 a
4 [( G& k; D- c# g
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
9 y$ y+ r6 H1 g: q8 i
" \& V* i' [. j8 Y) a' e
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ N1 ?0 m$ v* j; @ c
5 T7 n9 ^6 N9 F. Q X6 z
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
$ l6 ?8 p; I5 U4 P
) N$ x* a3 m. X" N) y
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
3 e5 B# t+ C0 }* ]7 e1 L1 t
% O, U! [- V. X# o
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
2 C5 r. J; f3 J' G" o4 j+ s' t H9 Q
$ K) y' h1 |0 X
6.答案显然是INSERT。
. E$ f' q# @* a' C/ D
6 Z' ^. ^, p# w# J/ B. Z }7 g
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
1 | Z0 W, Q9 i. d* D$ _
' h/ h0 D' ~: K/ v: E" e! Z
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
O, x! }1 y' K0 {" Q: U
0 A& F# C' C# q% D7 N6 e3 G
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
! i8 _* ^( L* M
( l: j! q5 N, p. ]
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
* L$ ?" }2 Q& Z4 ~; n9 p( i- _
+ h n4 Z& V7 ~9 @7 L
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
' h& I) C. ~0 G
( ^8 {/ U0 J' U$ w# Q6 U
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
C6 _; Y! G6 d' O4 m1 W0 b
8 z6 R$ B, l- [# ]3 o5 \! O
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
8 V. n! x* e6 Q, O' S
, B; _( y" v' A/ b5 Y3 x2 L
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
3 k% i+ D; J% f7 ?0 U) `
" c, d9 J; q K. v0 ?
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2