标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
+ V G- G8 w* D, J
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
/ i" X0 y6 g0 C5 R7 u8 z8 h
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
# G8 d: s- A" z% F: ^( |% d! x
2 i" t- L$ d( u# k: u
& h0 p! N1 @ \& s! U. E+ }
问题
* j! p, G! f- }2 N
7 j" g8 V- ~/ R' \+ c6 g
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
8 B* u( l. P; l( Z4 v
9 a1 J8 z7 ~# x' c. C6 s
SELECT * FROM MY_TABLE
4 x, s) m1 j; {( q0 x0 X. L5 H
- Y5 O9 w( ^# L$ G9 M8 m
A.如果可能,用把查询转换成存储例程
* p1 Z5 ` _8 Z) V9 V4 ]$ T
B.如果程序允许,给查询指定返回记录的范围
- O) u3 V" F5 o: W, R S: i% G2 F
C.如果可能,添加where条件
/ ?/ ?6 K* R8 E
D.如果DBMS允许,把查询转换成视图
9 {/ o2 G" c" N% I
E.如果DBMS允许,使用事先准备好的语句
* H0 z; G' J, P+ o& S4 s
1 m8 L( R) W3 c( z
+ _" \9 f1 J B9 `+ M0 o
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
8 h) q4 |- h! t' H# o9 D6 K
) f. f+ F* a0 E& P+ i
答案:____________
5 h0 o N( d7 U# a$ m" w
# ^! x$ e$ D @
/ S! H3 t p A7 C
3.内关联(inner join)是用来做什么的?
# K* U9 `6 i& L7 j# ?3 L' o$ V
* t0 q9 A2 K9 g4 a) }, y5 X
A.把两个表通过相同字段关联入一张持久的表中
8 W$ t% j* @/ E6 N7 H. j# y! f: K* o
B.创建基于两个表中相同相同行的结果集
, {7 E- [* _5 `/ H& l# y2 [
C.创建基于一个表中的记录的数据集
5 u* r7 H- B i0 @9 g7 V
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
- I% @- a3 x. L# R$ A) o; `2 Y
E.以上都不对
# ?# |' k% ]7 X
% r8 }- ]4 j% {# C$ `
9 i `6 [" K; r) e. V8 I
4.以下哪个DBMS没有PHP扩展库?
% z" a+ o) k: z1 U, V
! m7 Y9 L: L- p$ x% c6 M P
A.MySQL
, y+ L% T& l. R/ {
B.IBM DB/2
# q# L2 l7 X0 z( w9 g; Z. t
C.PostgreSQL
3 [8 c- e2 K, f7 J8 K- g0 C
D.Microsoft SQL Server
7 C- C7 O3 k8 q) P
E.以上都不对
! s( l0 |8 j, D0 K7 Q
. q5 M/ d: M& F) i$ r) v$ f( ?
! v1 N! b. [ B7 Y- U! x/ ^
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
& u7 o! ~4 G9 C# c) m) I0 g$ |
: c7 i0 R2 L& b z# `+ b
<?php
% c; ]% J" ?5 ]7 e0 E7 B0 K0 s/ {
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
u; u% V7 G9 k6 \
?>
s6 [0 E$ p% e$ q
- z: q" W U, x& K
A.MYTABLE表中的记录超过1条
]5 c. `4 \; B4 K2 G. n
B.用户输入的数据需要经过适当的转义和过滤
+ Y7 L7 K# I4 k# T. a
C.调用该函数将产生一个包含了其他记录条数的记录
' I( B/ }0 B; T& t
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
! B: G, k6 y& Y5 c
E.查询语句中应该包含数据库名
; F5 z" _5 t2 j* a% ?3 C1 `) f. F
& |. { u# r7 b Y8 V- g* D
/ y' i( f+ Z9 h }3 s% S F
6.______语句能用来向已存在的表中添加新的记录。
1 L+ h" s9 d; k4 l, w
/ J( v7 |# {4 j" S/ Q" s; O. j
答案:____________
, x1 z- `$ `4 p! }
! _( _# q0 n6 x* r1 n
5 _5 n% T2 b4 ]0 R6 U; P
7.以下哪个说法正确?
! X) n+ i6 M+ J9 x# f
' I9 h x$ p( Q* N
A.使用索引能加快插入数据的速度
" k! G4 B, r9 h* E. [: v
B.良好的索引策略有助于防止跨站攻击
3 F" l$ T1 y8 A$ H2 X* ~
C.应当根据数据库的实际应用按理设计索引
- v! Z2 Z4 C2 h; a# f% w
D.删除一条记录将导致整个表的索引被破坏
r5 U) w) t" U" c+ b3 Z+ D7 |
E.只有数字记录行需要索引
/ C( T# j6 v3 k, p3 ^+ ~. `
0 I7 B e7 q) N7 ~
& \6 Y! H5 R! Q1 `/ V6 c; C
8.join能否被嵌套?
1 K1 k9 L7 P" I$ [
0 b9 F/ w; B( t5 u# ?
A.能
7 h3 I; d1 p9 o8 Z
B.不能
; C$ L2 e* {& U5 Y! E
' T1 [2 s3 l! v9 I5 U5 s( [9 f$ Q$ i
/ u5 d% t& [0 H' k" c
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
8 R% t% M3 C- T4 c- [+ E- ?+ o
( ?; H9 m* p4 w3 E2 y! Y2 {
CREATE TABLE MYTABLE (
; {! Y% }9 s! g7 z5 k* D
ID INT,
; G8 \9 {1 i' e& B
NAME VARCHAR (100),
+ O( z" t9 _! z! O
ADDRESS1 VARCHAR (100),
0 t5 s& y+ y% ^1 b
ADDRESS2 VARCHAR (100),
3 W! ~( O O4 h. z7 b* K
ZIPCODE VARCHAR (10),
& @+ Y+ L) M# Y
CITY VARCHAR (50),
# Y8 M, F/ p0 F& F
PROVINCE VARCHAR (2)
; q, D- i* V; H8 }% M/ D) Z- \
)
" Z( }9 M, s: A" |4 X, c
SELECT ID, VARCHAR
9 W( P g8 ^. @ A' h' p. E
FROM MYTABLE
% e0 Z D- y; {
WHERE ID BETWEEN 0 AND 100
( |$ H( x$ I# g+ `# F
ORDER BY NAME, ZIPCODE
2 D& t7 r @: k
* S5 J' t- @& N, C
A.给ID添加索引
6 o! ]. j# a- R) r1 H
B.给NAME和ADDRESS1添加索引
6 g8 D5 @& J0 c9 \/ x: n3 ?
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
6 k* e& s3 n2 S5 S, q8 s" P- U" i
D.给ZIPCODE和NAME添加索引
: ^9 o F% {7 f* N" [% W# x. k
E.给ZIPCODE添加全文检索
& b/ l9 I1 T0 u' o m9 z. X. Q
' k# h% `8 L5 @
. `' E B; e0 x$ \
10.执行以下SQL语句后将发生什么?
6 c2 ~- Z; K. N$ ]' N8 p6 I
3 l8 q/ g/ m/ L) c# u& }) x5 z/ m8 B$ ~
BEGIN TRANSACTION
+ |* o4 z ~% t4 [- Z8 K
DELETE FROM MYTABLE WHERE ID=1
0 |4 K; U4 A3 Z$ s1 V
DELETE FROM OTHERTABLE
( w0 O p$ `, t5 v! l1 m2 D L- W9 x
ROLLBACK TRANSACTION
% j j& W3 i) B/ O& z) ~
4 q* L* B2 @1 I1 C$ t$ t
A.OTHERTABLE中的内容将被删除
& s6 i* e( J- _; I- U
B.OTHERTABLE和MYTABLE中的内容都会被删除
, x' p! m1 X! H3 f9 v, C9 _- j
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
- D9 C8 T0 Z1 Q; @1 J
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
- x$ h( r |/ ]
E.数据库没用变化
- X0 V8 v% X; n' S+ B" H$ h
6 t6 Y7 \3 n: U9 f
, p% N( c$ h# d7 y( v; n* f
11.DESC在这个查询中起什么作用?
: B, k: Q% W; c3 X9 y; ^
. h+ {' z7 ~% ]! e; d) y, t
SELECT *
* s6 w O. ` t' K+ k- f
FROM MY_TABLE
4 p# K0 v/ o: |$ t
WHERE ID > 0
5 a9 c3 _/ _/ U" f3 X' c! {' `& N
ORDER BY ID, NAME DESC
, ]) b% C- z5 \
" G! w5 h' e# x
A.返回的数据集倒序排列
& b7 k& i- ]& f% F5 g( L
B.ID相同的记录按NAME升序排列
& I/ k9 l+ n- d, `2 U' _
C.ID相同的记录按NAME倒序排列
. a! r& V8 ~5 Z B0 A. e
D.返回的记录先按NAME排序,再安ID排序
" v0 V6 i6 Z" X# ]- g5 [ U5 |
E.结果集中包含对NAME字段的描述
. M J5 t' C/ @, p6 ?* M9 P
6 V# D% `$ ?) j7 a/ ^5 y
( ]+ r$ U/ Z Y @4 {
12.以下哪个不是SQL函数?
7 d9 I" o- L: B2 F# s6 i. T
/ A) Q- _6 s9 ~
A.AVG
# ^, h. o3 J( f. `
B.SUM
" _4 ]9 q2 k( G2 l
C.MIN
- Y) }- D, n" e) A# B! f
D.MAX
5 H0 T4 D' i& A$ _, @. u
E.CURRENT_DATE()
* f' e. i- F2 q# q+ I+ o
8 m4 y( u5 a; r: d
( f# e- x# Q! o; O: d9 T; S
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& y* L* H: a, k! x) w# [4 ]" [0 A' A
% ~( W2 v/ u! e; }9 R, t% F6 f
A.该字段必须有索引
* A `( K9 r0 I2 k9 `8 y: a: Y5 v
B.该字段必须包括在GROUP BY条件中
' |1 A8 s# c5 @+ R2 p2 D& D
C.该字段必须包含一个累积值
8 l2 e, T- `5 E6 { H
D.该字段必须是主键
" A8 I# e0 F A/ c$ }- c
E.该字段必须不能包含NULL值
) u8 P; B7 Y2 X( N. D
2 k+ ^( C# n* c
2 c: A, o( r: b4 z" \& a& V
14.以下查询输出什么?
, Y" A/ Q H- x+ \1 }
# ` b( Y8 e, U$ G; L
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
- L2 {$ T# `9 @0 y$ F- ]9 \
ON TABLE1.ID <> TABLE2.ID
* F) ~. w9 Z+ d. R; o9 w6 Y9 Y
- |- I; X' T+ o, o
A.TABLE1和TABLE2不相同的记录
! G; l$ z9 l' U6 r" s
B.两个表中相同的记录
. @" e7 m8 _" b) r
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
) M& l! x; `) |. Z5 B4 K0 e
D.两表中不同记录的条数
: ~8 T3 l! [& n u( m5 }
E.数字2
[1 P( V n" M6 o
/ ] {, B" J% v! G6 Z7 X
7 A# \* j& F6 u B
15.______能保证一组SQL语句不受干扰的运行?
1 ~7 A! [; `- S( }9 t3 f+ Y. [# a
( m- t9 v% i( ^
答案:____________
4 Y9 f# o" v K. S9 m* w9 _2 G5 y
' y" ~" ]" W; I8 R
0 o2 L8 [5 v/ J& O- E/ A% h
: G8 C# Q8 f) L) D; `% ^* S1 z
答案速查
W, S! v+ R* c( g
1:BC
: H) i/ i1 E% d9 d6 F
2:WHERE
$ O9 n* X/ u1 ~3 I3 q6 m6 H
3:B
- m; O# N6 [) I+ i3 h7 A
4:E
+ |, c& }0 [* R3 s$ z7 J
5:BD
8 \' c+ b0 h" ^% J
6:INSERT
: I1 |5 S$ X; s# a6 d/ F
7:C
3 A- Y- K& J0 u3 s5 M
8:A
) Q/ b: A. p/ O" k, d, j
9:C
6 q1 j" [! X" p' p$ L3 T
10:E
5 x* p2 L& m& S2 j' ]9 W
11:C
. Y* B; u) D, P+ E
12:E
* r0 [9 K! F" P# e/ A5 [; A
13:BC
, b4 Q/ j+ ` b; z! S- `* x' D" \
14:C
1 Y8 F3 N3 m0 h
15:事务
3 Z$ n; i! I- S1 D* T- l
* }8 Q$ j6 i5 D$ X! \
* k) P6 `, ^9 c7 @2 @. E: ]( P5 C
8 J$ o( n1 Y* }3 L0 R; n! J% Q. |
答案详解
8 x5 w/ c. T) Z) `
8 W' X; b+ X+ A7 x
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! g ?0 l) @# o
" c g ~" q% M0 H
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
" p1 M- t) @# ^: @( E2 {
3 P% C; @; f, @6 {9 I) q
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
0 S8 I }# ^- N' \0 ~
0 y( F; a* V. {& N+ i
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
. {/ j. P, H6 \: y
8 b! A) J+ a+ S( a! S/ L( W
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
c2 }/ R. ?8 v( Q: e) \
0 E5 c% ~( Y7 z0 v1 a/ A
6.答案显然是INSERT。
g, R+ q' t" N9 _
% j3 W- r* B% p6 o. H- f
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
& w: |0 i5 x5 y# L I) d/ z9 H
8 q" ~, w6 o: y1 K% d/ {# w
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
, L4 ~& O& e- k8 V( B
7 C2 x1 Q: f9 d0 J
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
* K6 V- l4 Y! @" b: z
) ]3 h( a4 [& q. G h
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
; t7 F, p1 \! I/ y$ ]$ d+ T6 E, n
; J3 E! E5 d% b8 q- i+ f
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
( @0 c. \% C& K' K" }0 Y2 y3 ?9 l
0 p; Y* E9 @+ [3 u0 J
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
+ d4 ?; H' h- q1 n) ]' u: L" P5 Y
9 b: E. B4 l# D, j
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
8 Z+ i7 P3 D3 [% S% e; J: S
* }* S8 V. ^/ Q" H
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
8 f& H/ z! ?, l
/ t: v. ?9 g# `4 w$ u% R% `
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2