|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14387
- 金币
- 2479
- 威望
- 1647
- 贡献
- 1427
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。0 }! @" O4 W: i" V8 {4 X- X
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ d' Y1 Y( C2 t2 U本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。8 N$ {( x1 U7 ^: E8 e3 f2 J
' i3 c: _/ ~! c- U2 [# `
7 z; N, D% F# J% E9 ^问题2 n9 k t* s) f' B3 I8 S ~$ J9 n
( q' o r% A! J1 a. v1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)" f& Y7 ?0 x# S( [7 e2 T) S
5 C2 d: c+ Z- lSELECT * FROM MY_TABLE
9 Q' X: q7 K# o/ o0 ?' W0 P7 e! j
' b3 \2 u# v& D/ }$ R. AA.如果可能,用把查询转换成存储例程
3 M2 O- T6 G3 l% l& VB.如果程序允许,给查询指定返回记录的范围
/ A1 x% |/ s1 S( d. v( D4 G& h }C.如果可能,添加where条件8 M: L& c/ f5 Q% E! d
D.如果DBMS允许,把查询转换成视图% X S5 _3 R2 c( ]7 E
E.如果DBMS允许,使用事先准备好的语句2 O& m( c/ V) q* B7 I* u$ H0 g
9 F$ L" O# @4 z
# O8 T7 i% S8 D+ F5 m' N
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
) ?) A6 Z" T9 x! j" E! D: B: n2 x4 T7 F; C [+ g
答案:____________
6 `& t) `% W3 {4 S7 I! W* b* J- p, |
# z3 J) o) a4 z& W8 {% T
: T7 Q0 j$ R5 ]4 j7 ^. J3.内关联(inner join)是用来做什么的?
8 R Y( L& _# \
2 a9 }: V0 o* @2 _: n8 J/ J) J, fA.把两个表通过相同字段关联入一张持久的表中8 }' ?9 M8 o3 N+ t4 s
B.创建基于两个表中相同相同行的结果集6 a& z6 A; D7 }; h
C.创建基于一个表中的记录的数据集" b4 t8 m g' _2 ]2 N ?4 D
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集0 ^$ S, i. w' ], `
E.以上都不对
K- D( _6 k2 D2 ~( H! U3 o
2 m/ R% x5 F! i |3 T2 V2 Z2 S( u% V! B: y6 D
4.以下哪个DBMS没有PHP扩展库?
) Q, [' S; x" z8 P" a6 h& ?0 e3 y h! I' I9 B
A.MySQL, l; s- k& ~2 a9 |: Q" L
B.IBM DB/2
% ^1 m$ r- R: O+ R' `& yC.PostgreSQL
1 B5 H- U- g8 _6 s4 m7 Z; C4 I% C8 X( iD.Microsoft SQL Server
" a5 L1 d x4 c) `E.以上都不对; m+ D: B% S( O
2 e/ y5 p1 q' P9 m: }
' J/ Z* m3 Q- T9 v3 D0 o) t5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)4 x0 D6 G1 L- U* w! R( a; x9 G D
V0 s4 W$ {# [( w/ P
<?php
8 ]0 G' T# {) p9 q, l( q8 R$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);' Z9 {! R6 ]. D7 W& b/ h7 K+ T6 T, r
?>8 h) [7 V# k- _& v/ u5 r/ r
& f; E' T5 f9 k- qA.MYTABLE表中的记录超过1条 ~ g: c* W& w" b* O. P
B.用户输入的数据需要经过适当的转义和过滤
# L) F; D3 x6 _- I/ J" E2 {2 hC.调用该函数将产生一个包含了其他记录条数的记录& a# e: E0 o, g
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
0 a6 M5 d- Q- Y0 K: t, DE.查询语句中应该包含数据库名
5 C$ R3 n' C4 `" N5 ~3 R' S9 Q" \& N0 j
5 ]# g h/ \7 Q. }- V- u$ x; C/ ^
6.______语句能用来向已存在的表中添加新的记录。
% B6 V) H- q8 W, @# t# }) N; S/ J3 }$ V
答案:____________
/ s- t# k9 t0 k" \* D
* r o/ T, \, y! ?. n6 z2 L# S0 g0 T) J2 v8 S
7.以下哪个说法正确?
5 a& B" u+ f1 j/ S$ @( c/ H# K6 ]2 _! x+ p! v5 G
A.使用索引能加快插入数据的速度
$ h1 A& \9 V$ J2 P. e/ f% H Y. fB.良好的索引策略有助于防止跨站攻击* z i, V$ n: e5 N5 r
C.应当根据数据库的实际应用按理设计索引
2 r6 j: X9 A! i+ `# VD.删除一条记录将导致整个表的索引被破坏& |, w; q/ J4 R% |( E1 g
E.只有数字记录行需要索引- i& z8 o! x4 a5 L% j; O2 p* U2 F( G
6 i: S l+ W' ?2 o d0 q7 j; I: k( l+ Q) ?+ b
8.join能否被嵌套?
7 S9 Y$ L2 c. i/ P1 G. S5 n3 s( o
3 L# d0 Y" j3 C' Z7 T$ a" YA.能7 M8 V7 w/ c* i2 K' F4 w" P+ W$ r
B.不能/ X( r/ p" Y) I8 A% b
# ~9 a1 Y2 P' I( \! \
( b/ M# B* l! V, L' L# U+ W8 t: C
9.考虑如下数据表和查询。如何添加索引能提高查询速度?: Q, u# u, B' g# o) U5 Y
* E7 e# ?% l+ q5 ^% O+ L) u
CREATE TABLE MYTABLE (
: l3 L/ K3 x8 M9 M* O! Q" i" sID INT,
2 n5 b* J; H& U- X3 [" n, DNAME VARCHAR (100),
: W$ q3 v; X! R( Q9 G8 U6 \ADDRESS1 VARCHAR (100),0 ^3 p7 R! F" n" j7 `' l
ADDRESS2 VARCHAR (100),
4 [' {# Y1 T0 v- n* P/ R! ?+ g- m3 I) yZIPCODE VARCHAR (10),# r; j9 Y' C! Z5 u% r
CITY VARCHAR (50),9 C, v$ _+ A/ `# ~* a% L& z7 g$ b
PROVINCE VARCHAR (2)
: N. A4 d2 H! J- q4 J)
1 G( \ j1 k1 x. wSELECT ID, VARCHAR5 X% l5 N' n* P" Z# F
FROM MYTABLE& H! J! p( D1 D" y4 Z; W5 K+ p
WHERE ID BETWEEN 0 AND 100; M# @7 B9 v8 P
ORDER BY NAME, ZIPCODE+ q9 z3 s4 f, A; O
9 U3 H0 S- d( x% r8 \A.给ID添加索引
, X. H& d% g; w' N! ~B.给NAME和ADDRESS1添加索引/ [/ {0 l6 M6 F6 X
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引! O- i; t: k, T) ?: E: H) ^: g5 R
D.给ZIPCODE和NAME添加索引
9 L' o! p5 f; U! W; nE.给ZIPCODE添加全文检索) m, G- X$ Z7 h: L+ J7 G7 a* w
8 d) g! \% }9 x( o/ }/ P
. l" J U3 }$ g2 ?# b/ ~$ r: R10.执行以下SQL语句后将发生什么?# y4 P8 H3 N- f3 m j+ s/ R7 ?
8 G' S' S! U$ G: m0 D
BEGIN TRANSACTION
! K5 a" Y! j# q! W* q$ [DELETE FROM MYTABLE WHERE ID=1
. n1 w! r$ Q' }' a! dDELETE FROM OTHERTABLE( u% ]/ L- I5 l
ROLLBACK TRANSACTION5 o# |0 N2 i7 X0 ^! M. g Y
6 S9 \3 Y8 F$ kA.OTHERTABLE中的内容将被删除# a0 h, h2 N% ?( g' W! H+ i
B.OTHERTABLE和MYTABLE中的内容都会被删除( f5 S$ @1 O3 b3 q9 }4 D% |& d
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
! r/ h3 T5 R, AD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化3 j' ~$ i! P. \; B& M0 S/ b* y9 |
E.数据库没用变化4 m! G) v9 O% W1 T$ i- U( i
/ ~ g2 M6 G6 J! s ~$ G: s9 ^7 P' x9 E$ S
11.DESC在这个查询中起什么作用?6 o. B3 {; D5 r# ]2 U$ p( V# P. ~
3 q9 m8 F: }0 u: v$ i
SELECT *
6 R. h+ u8 | OFROM MY_TABLE
; s0 i0 s |; H* P# x1 \' |' f2 dWHERE ID > 0, m+ o$ B4 J* O+ W
ORDER BY ID, NAME DESC
; ]* U0 w( g1 {* i6 | s4 e% Q
& E% J* |+ p0 a% BA.返回的数据集倒序排列# J: o. m- J+ a
B.ID相同的记录按NAME升序排列 M- [3 p9 d6 B5 j' M* P
C.ID相同的记录按NAME倒序排列
. U4 T1 I4 w$ L7 KD.返回的记录先按NAME排序,再安ID排序3 L( N5 Y5 Q& b6 @
E.结果集中包含对NAME字段的描述
5 X( q% \/ y7 ^0 H8 F; s- j/ j$ e3 B; l; x ]( F+ }
2 [. x7 `6 L" \* O12.以下哪个不是SQL函数?
) }- c1 |* L8 ~# A! o+ s8 f$ v1 z k+ O. _; R g2 f# W) ? ^
A.AVG
0 Q- S O( Z( L7 P" fB.SUM/ S0 y% h; C% o6 H
C.MIN9 u4 t, y7 [/ e6 `
D.MAX
) V) ~6 j% c% N+ XE.CURRENT_DATE()- @7 F/ \" F! z# G9 M5 D5 N3 {4 s
/ u2 k2 Z: q+ `" F6 b& y& w: E' x+ C- [
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
$ V1 v7 j3 k5 ]' L7 U
4 v2 x; e+ r) O4 Z) DA.该字段必须有索引- Q! o2 H" ~: p5 \) z
B.该字段必须包括在GROUP BY条件中9 ^! M: l7 G' @3 W" r
C.该字段必须包含一个累积值# {& G7 D& n. o% P5 d) `- ~
D.该字段必须是主键# v8 K" B1 t- [& K$ p2 J
E.该字段必须不能包含NULL值
7 f/ c5 W2 s5 ~: Q0 J/ u" G- i5 i
' m/ u w* P! e: |- y. }% p) b14.以下查询输出什么?5 ?) w) l$ V2 ?! R! L% S: c
! t5 {% w" ~, M1 xSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2* I: g. S/ _3 A$ n+ g( U. U/ z
ON TABLE1.ID <> TABLE2.ID
7 _, _' k. Z1 O, C
I! ?! s6 e- S9 cA.TABLE1和TABLE2不相同的记录
! y3 ^8 `$ I5 G7 r9 H) qB.两个表中相同的记录: k& }" A0 {4 R
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
1 a: ^, q r* B: p7 c& V9 JD.两表中不同记录的条数
8 X+ a. R2 I! B0 Q5 s# YE.数字2: V" I) J6 l* x5 F$ x1 e2 m/ M
( B. L1 }" I1 U* T4 ?8 S) a
. k# r$ r5 j. a3 ]7 [' b0 {15.______能保证一组SQL语句不受干扰的运行?
% ^/ j5 I4 w6 N1 g0 F4 H9 q% a d+ q: a2 b% l6 Y8 h3 o. i" r' L
答案:____________
, C: G2 l3 V6 K0 S$ I7 E4 u1 d) v m
1 c5 D8 {- ?* _/ h& W+ J
4 c+ R x0 S6 W! n+ Q% W V5 H
答案速查$ V+ C% F# H2 r% ~' S) r& z
1:BC) P- a" Q6 U2 M: n9 U8 Y5 C8 n
2:WHERE+ d2 M5 ^5 n7 o7 f0 m' A, `6 t
3:B0 T, G; i8 U) g% w
4:E
' t7 d o* k' L! W- i& @& U5:BD
" N2 D6 C. `1 }5 q" p6 g6:INSERT+ q' ]' z! l4 n3 B8 N7 `
7:C& N9 [% w% @- b
8:A
0 G R [( h, M" ]% E& Y: n9:C/ S& |4 x" S4 ^0 I K
10:E
6 c3 S2 J6 ^0 u; o3 Y11:C4 f: N8 n# X8 n6 H$ {# U
12:E
) H Y6 g1 J9 }( ^ d13:BC# S2 E) J$ B0 z
14:C
/ c6 J" ?1 g) h7 R: X4 p15:事务
/ m! L X& z m" s# U+ Z: H& U0 ~$ b. }) c
% D4 p5 R; _, @- b7 t9 _: C, ~/ I) U; \, T; \7 u O$ A( h
答案详解
; z9 L( a6 Z1 y4 \' s. f* O2 R1 G" n8 `2 h
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
: z% @$ u. g/ j c$ {5 v: D8 E" n, t' e q; k
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。% c/ N: R0 m; v6 [, [" D6 x
! s# E% Z+ g" l4 M- c1 K( h
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。: x! U' ?3 n7 _$ C1 k% b
) I) _' X! u0 a- U4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。3 k$ {! ~" l9 f
: }6 Z9 e9 `3 F' [7 |5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
# R$ b/ {- H0 a: m- N/ E
( g0 v( ^' G) d: C( w% M3 E' i R# K6.答案显然是INSERT。8 Y- I5 f: Z$ B2 N8 R! w5 v6 ?
. x6 S( U2 |, I0 l: e7 }$ n
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。5 F7 d' X; k+ d
. D w2 J' g, e% _4 m4 `
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。3 X2 ^$ ^& G1 C- m8 q8 o+ z
; r5 I: b6 i8 L& d8 t# Q$ [
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。, N L+ e( M. R6 B/ O9 l- B
# U) O$ X+ U. ~% [- T) A( n10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
2 W, B" L) s" C
! X! A6 y- v/ b11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。6 M$ r5 ?( i: }/ I& x
* J8 S7 ^& ?- Y0 s
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。( E! X9 w# L' T: } y
2 t0 j$ V# o% l: Z8 P9 z+ ^
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* F& U( N$ w; y' `. O0 f* Z8 E# z7 O0 U( Q* P; B1 D: Q
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。1 h) I% n8 Q$ d
+ F; z9 d- h7 ~" U! r* k! }% N
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|