  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14191
- 金币
- 2386
- 威望
- 1647
- 贡献
- 1334
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。4 x$ \9 X+ ]/ U
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
- S' D, v9 V, u7 ^3 ^本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
6 J! K/ ~, f: A4 m" }; w O Y+ }8 D, c) z2 _1 i* J
" g/ ?* o- `- d2 y
问题
3 `" w: j8 y Z: N0 K8 n8 O c# P% R; L* h: x: Z7 @1 E* T
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
- v: E* T9 q7 Y5 g) H8 `/ K: T* a6 q5 z, Z. Q6 L& ~ T! m
SELECT * FROM MY_TABLE
2 K% ^+ G+ K9 p9 @. r4 o. ^0 p4 L$ R/ v- F
A.如果可能,用把查询转换成存储例程
* U. x1 V) O! d3 Z2 W: M* M; bB.如果程序允许,给查询指定返回记录的范围( C9 J! d) c6 j# f# G1 }
C.如果可能,添加where条件, B0 a+ W* l8 U9 x$ _
D.如果DBMS允许,把查询转换成视图
9 s6 r$ g" M/ l3 Y. c. K5 s' ~E.如果DBMS允许,使用事先准备好的语句
- _) ]$ N/ d6 n5 {8 H; |2 z4 n$ f2 K1 n! H# d2 G
+ D! K- z! H+ [4 e
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
& r5 j- i7 b3 M p
& a9 q* s2 l! \5 ^8 q3 L6 \! K& d答案:____________0 [9 U% s) v# W( O3 h+ I) d
$ y" `% A. V* z# j- g4 } W. w& `7 w8 L
3.内关联(inner join)是用来做什么的?& }: i4 l2 Q3 W u& X. ~
! H) i8 J" I9 bA.把两个表通过相同字段关联入一张持久的表中1 c8 e' i) p8 W7 X! ^: E& @: O
B.创建基于两个表中相同相同行的结果集% W7 B5 i0 b! a% M) K4 R# N3 v
C.创建基于一个表中的记录的数据集1 _' h' W/ Y0 v5 W5 n
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集: `7 c7 B* O# w3 [2 r- M5 K
E.以上都不对
) c8 e8 O2 c. x3 x8 L! L8 B. g$ r5 U9 K6 ]
8 K$ f6 n' e- A$ C* l" R
4.以下哪个DBMS没有PHP扩展库?
6 Z J! g9 f) v1 u9 |5 y+ K$ E" \9 P. f, Z- S6 r( Z
A.MySQL
3 c+ D8 Z5 ]2 } q8 h6 }B.IBM DB/2! s* ?0 I; r5 z1 \3 `0 e
C.PostgreSQL# O* Q+ g! ^& l6 f, N& D
D.Microsoft SQL Server7 R4 W) F, B! k6 A9 w+ x! }
E.以上都不对) @4 ?/ \5 m" S1 ~
$ @9 T% s8 w1 `5 X5 r- W: @, k+ i) m; `6 Z! p5 G8 e
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选), t: ?- x; ^8 V
& D4 E' A" I1 g) I<?php
$ _2 z8 K) \0 Q2 q7 G1 D$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
1 p! }9 y3 t" }# y) w?>
; R) d8 K' u- w7 k4 K+ K- w: J+ k8 A4 c" Z5 S' s% O$ t
A.MYTABLE表中的记录超过1条
9 H; ?: @& z* LB.用户输入的数据需要经过适当的转义和过滤
" \1 g8 d0 D/ s4 d$ G CC.调用该函数将产生一个包含了其他记录条数的记录9 B/ Y7 a/ H& C% u& \5 w& e6 t
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
2 o; y+ t v% X3 G( oE.查询语句中应该包含数据库名
4 Y- g: ~7 Z+ B t; n$ W0 i" u5 m3 a0 R5 z* Y2 H
7 g" r: a1 g. n' v1 K6.______语句能用来向已存在的表中添加新的记录。
+ ?) H& S; b1 i' @0 ~2 o, T* e
8 ~: R; t! t$ N. L' K1 j9 ]- k答案:____________8 m5 l! {! V! n* Q
$ m% t8 J/ S# c, |5 D4 R
- O9 p& @7 A3 {1 K4 W
7.以下哪个说法正确?
8 A0 T. p2 T; q' \! y+ X( Z* K4 [& n( \+ ^' [' Q+ U
A.使用索引能加快插入数据的速度( {% a7 G& I+ F! ?2 ]% A* H8 ^
B.良好的索引策略有助于防止跨站攻击
4 O& d) y+ z% G% ]# q% GC.应当根据数据库的实际应用按理设计索引6 P/ J; C$ J; a# O/ z
D.删除一条记录将导致整个表的索引被破坏, N, _2 k' ?- j! e9 u+ ]( W* x) B
E.只有数字记录行需要索引: V4 m9 s9 T% }2 E* @2 ?6 s: }
8 o# c _0 r. @% g3 J
7 v. l5 K! N" L$ P6 P7 N1 Y& D7 K9 g8.join能否被嵌套?
% D! L* I& S% g4 a0 W
. Z" Z0 ?% u R8 m2 O. f. @) kA.能& N) j% c [+ d4 r% t! I
B.不能
: u: f @4 |4 ]6 t! p* b# s2 w+ H- Q$ V. @! @/ `1 ?
+ P! H; ~0 K7 ?( ?9.考虑如下数据表和查询。如何添加索引能提高查询速度?
0 x, V* B) U/ a) ]& D# o+ g) ]5 [1 V9 {2 z, t
CREATE TABLE MYTABLE (! d( R4 |- `* _5 H8 r' R, E
ID INT,
& A( D' x+ y7 O1 y+ r% \NAME VARCHAR (100),
+ s/ @) Z U3 g+ F4 {ADDRESS1 VARCHAR (100),: n2 }+ E; V3 l5 ]; u# [
ADDRESS2 VARCHAR (100),
! h1 V; B; X2 c3 ?: f/ h3 u) Z+ XZIPCODE VARCHAR (10),
5 Z5 K. B1 m0 m% `* V$ \CITY VARCHAR (50),2 n% D* k3 H% S* _
PROVINCE VARCHAR (2). O- H9 _) r1 b; q
)# O; `8 f1 l1 H6 h- a! ^. H
SELECT ID, VARCHAR8 t( B8 F6 u$ R
FROM MYTABLE7 I7 y* C6 m3 d) o% i) t. I9 h
WHERE ID BETWEEN 0 AND 100
3 e* T$ ~$ S# d7 sORDER BY NAME, ZIPCODE
7 g5 U8 o2 J3 n! g- f% a$ v$ f1 l* b5 {2 F( H
A.给ID添加索引
1 b) Y& k* U/ `4 ]: D. J$ lB.给NAME和ADDRESS1添加索引
3 X$ [3 K, R7 o3 z) _ z9 W& b0 lC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引$ s9 T2 \" n9 y' f5 X/ p' ?
D.给ZIPCODE和NAME添加索引) m' Y) }/ T: x
E.给ZIPCODE添加全文检索% Q8 J Z7 u* R8 q S$ l% C7 [
, V6 G% G% ]; N- |# ~* q3 p' T! Q+ ~& z% |
10.执行以下SQL语句后将发生什么?
% R# w" I( m+ `+ x4 C- v2 C3 T
BEGIN TRANSACTION
7 U% _9 `& A6 _. O: @4 pDELETE FROM MYTABLE WHERE ID=1
; Q+ f; W' M7 {8 I2 sDELETE FROM OTHERTABLE, R8 n9 a! p! Y3 |# Q% M$ |
ROLLBACK TRANSACTION1 J5 X( i3 x6 d$ G& X; ]- Q
8 i+ [5 d9 q- \% yA.OTHERTABLE中的内容将被删除
9 |( `" O8 m& s7 z6 L& mB.OTHERTABLE和MYTABLE中的内容都会被删除1 D6 Z2 w3 o: E
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
- J! I& W, I: d" |$ \% t) {+ ED.数据库对于执行这个语句的用户以外的起来用户来说,没有变化. z! O9 H* v4 c, t. h; W
E.数据库没用变化, }6 k# V- L9 E W7 z* A1 d
9 P" V) c V8 s$ g2 W5 t C% e! k
* Q# [5 n: q. f" F6 W6 N1 F+ ~" e11.DESC在这个查询中起什么作用?( z% d0 D8 G X% t+ e" a3 K
4 u7 s2 w7 q! {
SELECT */ D4 z" P% `( R9 b
FROM MY_TABLE& W2 x; C% P+ a( }( }* G
WHERE ID > 0
# s; X8 m6 j9 h7 m7 |8 c7 _' TORDER BY ID, NAME DESC
$ Z: t2 g! N* ?9 v
& P9 U/ T/ i9 Y5 P2 M' I7 FA.返回的数据集倒序排列
6 {7 S0 S' ~9 t7 i8 |2 jB.ID相同的记录按NAME升序排列
6 E! G0 @- {5 D; u- @C.ID相同的记录按NAME倒序排列1 \6 y2 Q/ L: i/ Z, y: p; G) X
D.返回的记录先按NAME排序,再安ID排序" }) v8 @; H0 b: {
E.结果集中包含对NAME字段的描述7 A$ e. e2 t& ^) q
1 `+ N Z4 z( [* P: u. x
) d0 u. R. e) L12.以下哪个不是SQL函数?6 k; f0 T, N( Z6 e+ O4 G( V& d8 J- q
# ~2 C% T k8 t: t6 I
A.AVG. H$ U `! D, u' B3 U* F
B.SUM
! o, x5 ~5 x* U5 ^: n5 h! PC.MIN
& t; d" B; F* T+ @+ M0 VD.MAX
4 w) E+ f" s. Z' b+ EE.CURRENT_DATE()
3 s, G! }, O+ X% m4 C) [2 O# r0 J9 [+ p
" \: s! p5 h/ E& x. U& r G
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?, |. ]6 y) v2 o/ M; k
+ b6 F' |% e" T, X3 `
A.该字段必须有索引2 x* ^6 [% P3 T
B.该字段必须包括在GROUP BY条件中
! U. m$ `9 _' e2 Q0 tC.该字段必须包含一个累积值; V" l% u# M! W! z" d
D.该字段必须是主键
! c5 Y4 o* {( c5 b4 q, R# O4 HE.该字段必须不能包含NULL值' \4 S5 G, A, B6 `( P
2 r p1 A5 T# t6 H* _9 ` A3 ^3 n6 g4 n) P8 V+ \9 t* j4 w/ P( `; W
14.以下查询输出什么?, q$ _7 p* m4 E7 o$ P n
+ T9 P2 j) c: f6 e" u$ a/ aSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
* N: X7 L9 k1 S' H3 T& cON TABLE1.ID <> TABLE2.ID
1 v$ ^* q- I: }
K2 I5 p! h; q2 s* N1 yA.TABLE1和TABLE2不相同的记录% n: A: d. u, L1 B# n' v
B.两个表中相同的记录" }8 v! |' D, L r: Y
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数' S9 Y x- N6 Z- b- a# I' c
D.两表中不同记录的条数
2 p' q% ^4 l% m) _& pE.数字27 O9 C; X# A$ T5 @' Q
' S/ W6 o# I# L; B- c, c2 L
7 N! |. a" {( y" `15.______能保证一组SQL语句不受干扰的运行?
( X0 N4 p5 e+ \/ n: F0 d: i3 L( g: Q& c" ^% h/ _5 k' [
答案:____________
8 ^- H. J2 i/ Q2 ~) @) o: ~6 N3 Q0 e- B& v/ a( |: c) F' G
+ S$ M! L. E0 x# P9 X/ ^! E1 I# v% V$ f" U( G* T
答案速查
% {8 I5 z( h/ [3 v1:BC
% e Z9 N. O* \3 Q0 Z, _2:WHERE7 r9 E4 W8 I( o
3:B
7 H' ]" l( t9 X4:E
9 K0 h& J* M7 C5:BD
|, q( E O' k0 t* f) p k6:INSERT
4 Z {' ]1 I( R* A# P/ d7:C7 Q* I$ t2 Q0 w- ^! i0 X( h
8:A
. A/ Z0 z- ]/ u0 u9:C
# X1 v/ y! b' M Q10:E1 ?! A% K1 P& L' s3 K
11:C
3 w7 U; O3 }6 s& R) y12:E
4 h4 A/ {3 Y2 y- O: R" I13:BC
! f% c j, h! a7 a% _' E. ?14:C* C6 m7 i4 J5 C6 ]! k
15:事务
# t! e- c+ Y: ^4 \
4 e+ p% j: `" ?, i% x' g( v
) ?; X/ l: B. K/ c( o1 A% ]( D1 i8 S
答案详解
V, j" ]& k" ~5 a4 f' m4 P
8 [$ a8 @! I0 ?1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
! r" Y6 j* h# F( A8 q/ w" A
" Z8 u' @5 O: X8 U, Q! N X2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
' i3 T# O6 Q9 q [: S4 a/ G. D/ m% c* o* L7 i5 ^
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
c0 i0 D( @4 w, O
2 M/ k* L* J6 D, j. m& h! `4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
- V+ ?: h, B5 _' }% o% W
* Z' T. ^, f5 }0 ]5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
4 F" g4 p0 Y9 R! ~9 f) F; Q9 k/ {+ E* g9 B; [
6.答案显然是INSERT。
' z( }4 l) O3 k/ O6 V7 L2 z6 P2 v& O
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
}' f0 O+ f$ [6 x# I, K
) z$ J! b$ M) a) k8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
8 S+ a6 C! t! m/ o2 m+ r& Y( x
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
f+ D+ D. Y* H \9 \0 X
- O. u# e" O& o' [& _7 }( v) [10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。6 d" `7 v- b! n
+ I! t3 O5 `7 d+ M
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
2 {& [3 i; ~4 B* ~
% }3 M# `- b- ^0 c0 w0 V' L; |12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- Y, K# [3 K; B. o# n6 ^. M5 K! u
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
& O0 }2 B$ p( v0 }
# i9 f. k$ s9 v; S3 b14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
/ B$ o% ?+ @. l1 ~- E6 m7 b' G+ `) u$ ^) X! }) u
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|