|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14325
- 金币
- 2448
- 威望
- 1647
- 贡献
- 1396
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
- a# S2 S3 `& a8 T! b% [PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。0 m. }! L+ P! Q/ N7 }, p
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。1 L( s8 d3 c; A; B) o$ i
- K0 g; s% j/ |: r1 K
3 _( P3 I9 e; _问题
: Z" W& m0 ]" Z" F: j% c6 C5 B/ ?+ k3 E
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 [/ d' h+ ]3 p" b" b) ]
T+ I( Q2 Q- b( b0 y
SELECT * FROM MY_TABLE4 W4 V( s/ `4 r' t) w% u6 S8 F2 |
( L4 A7 Q q2 O* k9 v6 R UA.如果可能,用把查询转换成存储例程
* }7 i, n' w, k) H$ @B.如果程序允许,给查询指定返回记录的范围7 C: e6 R2 a4 }* \! J9 L( q% v" o
C.如果可能,添加where条件
! f, E. }3 [' S. UD.如果DBMS允许,把查询转换成视图
4 J) I, [" f: u9 N4 ]E.如果DBMS允许,使用事先准备好的语句
& W! U/ ^4 R& ~) P8 N9 L2 [2 P; Y( u- a! R7 _# r5 V7 b T
" x" u1 A+ E) c- o8 k2 j# j
2.可以用添加______条件的方式对查询返回的数据集进行过滤?" N4 X* C* n3 l8 v$ ^
9 C1 u/ K4 k% c9 h3 y% Q8 v答案:____________' r3 A# V2 e5 \3 B1 C6 t3 [% S
) w9 A7 x9 N' [
& O" m v& _6 c' F' d! N: L
3.内关联(inner join)是用来做什么的?
. K3 P& S B! S
* W; O1 Y& P! `" V( D8 u. uA.把两个表通过相同字段关联入一张持久的表中7 Y2 r. e3 c; r0 U) ]4 E
B.创建基于两个表中相同相同行的结果集
; A B: E3 ?9 ^6 m8 o! ]. s; N/ s& hC.创建基于一个表中的记录的数据集
( q7 c, ~6 |5 L( H ]7 kD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 B1 _% `6 D- J2 u& r- ^( AE.以上都不对9 h# h" \& h4 h( { h% o# d
2 }6 M* B' M; w$ r9 B
) H7 o4 L9 E# Z. D1 k# p
4.以下哪个DBMS没有PHP扩展库?" y( F4 Q: ?2 o0 b3 q$ ~
# d. `# C$ D/ Z. i' QA.MySQL8 d' C& f( d0 d8 X9 j9 t; i
B.IBM DB/2
4 k" ]8 h D8 v; G3 ]C.PostgreSQL
6 f' P' L* C4 o0 W" `D.Microsoft SQL Server* t" b) {- E+ J" H: y
E.以上都不对
, M4 {# O/ W( `" G+ C/ _5 `! P- W2 n# [
" b. m! [* v3 \8 m( ]7 {
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
6 y5 B6 U) N- j; f, |* L$ j1 `4 E, w( g& S5 | F- R
<?php
2 ~, f, |8 v( X3 F" e$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);& j3 |8 e: K3 m: g
?>% w& _5 Y4 e) ?# f7 U$ v5 w
" e7 |2 }8 R1 {6 O# i$ L! ^$ A. _A.MYTABLE表中的记录超过1条. ?/ z' a& G" ^
B.用户输入的数据需要经过适当的转义和过滤" [. \! V! P4 u% I+ i
C.调用该函数将产生一个包含了其他记录条数的记录
7 ]7 J7 S9 D4 l3 q" b. jD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
" E: a: m& W" i. x# H6 p, BE.查询语句中应该包含数据库名1 O1 O4 N& p# e& T' k# O
; \2 M/ N6 w. W+ \: T' `2 A" v: S+ Y4 m% v+ [3 Z! p; x
6.______语句能用来向已存在的表中添加新的记录。2 l# K. u6 Q" C0 s
/ J2 N& H; E- P1 b答案:____________5 R: B5 x- e- l3 h9 |( _
% |* t( J4 k% s) P; V
+ f' I' ~8 O: b% D1 i
7.以下哪个说法正确?
) H5 x1 S1 y1 C5 s; x$ N7 N4 K
4 H/ ^7 @' J. U1 ~8 CA.使用索引能加快插入数据的速度& o: q7 ?4 b8 t
B.良好的索引策略有助于防止跨站攻击8 D6 @ r' o) D& T9 } i8 `, ?
C.应当根据数据库的实际应用按理设计索引
- j0 N# _- K3 S* nD.删除一条记录将导致整个表的索引被破坏
: ]* V: s3 f' s, M* e8 ?/ bE.只有数字记录行需要索引" R8 B* @ y2 U# x7 x
7 @8 L: M) p4 T$ n$ C
$ }+ V' u8 ?( }8 f! g1 ]
8.join能否被嵌套?
' E+ Z1 J" @$ F
* u. B$ H9 b/ i; Y. H" h7 k5 S1 `A.能6 o4 N$ x; |& {# x
B.不能
5 e4 z- B: ]; J( k" L
& a- r) {$ A. V" a$ U* G2 P+ L+ q- ~7 f( O; Y8 `( X+ I o, y
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
$ e: P: {$ O% j2 q$ m* p) h4 d8 {
* s% \5 ~7 H* {4 ~; |CREATE TABLE MYTABLE (9 ]7 h, p. O/ f/ Z, h
ID INT,
+ n# [, L: n: r% y: V% zNAME VARCHAR (100),; t6 y: O+ X; [; d. ~- r+ U/ D
ADDRESS1 VARCHAR (100),
: U+ Z! @2 N T* zADDRESS2 VARCHAR (100),7 q5 t8 O5 k3 {3 |, e4 m" p
ZIPCODE VARCHAR (10),
. V) ]/ B' g$ N( v+ r2 O% [$ F( CCITY VARCHAR (50),/ ^2 l3 `; c6 T9 J0 G
PROVINCE VARCHAR (2)
) l5 [" ~8 }% K5 t)
+ r" W! _' ~* j1 S' }9 v8 v4 E" E1 \SELECT ID, VARCHAR
, K8 a& N! v+ z0 QFROM MYTABLE' A3 a$ V2 `# t1 P }$ T
WHERE ID BETWEEN 0 AND 100
& M+ _0 @( T3 f5 {: c( EORDER BY NAME, ZIPCODE) _5 ]- ?0 w: h5 d5 k* D: F, x# }, n8 j
0 z5 w2 p, Y' ^% Q
A.给ID添加索引
! U( q m0 K. T6 x' Q9 H- PB.给NAME和ADDRESS1添加索引
0 ^5 L8 W7 C# w0 i: P, y% oC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
2 L% [( z# y. g& I" `( R6 LD.给ZIPCODE和NAME添加索引
; L8 V+ R& w8 T: b: m9 p. r4 d. XE.给ZIPCODE添加全文检索& J8 T1 d$ U% T2 I
; N6 q( l; t5 H# \6 j7 v& u# t# [# i7 Y
5 w1 _; X3 U1 Q9 [2 O' b# F/ A10.执行以下SQL语句后将发生什么?2 ^! G+ m3 Z2 u) L5 f+ w
. ^& j* Q0 X. H' X% UBEGIN TRANSACTION
6 e9 b2 m+ o! w9 S, Z5 z4 V) QDELETE FROM MYTABLE WHERE ID=1
7 N* h8 \: A: r" VDELETE FROM OTHERTABLE
( l: S! S8 S5 W6 c+ aROLLBACK TRANSACTION
5 X( o+ l, Y$ u, X* G; e
7 m- S% q7 ] k+ KA.OTHERTABLE中的内容将被删除
% T0 ?9 |3 U8 U } ]1 `B.OTHERTABLE和MYTABLE中的内容都会被删除
" w/ W8 i" x+ I9 C" m5 nC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除+ Y$ `! ?5 e) d) `* ?0 }) D
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
& E% z8 W, y/ OE.数据库没用变化
9 i% Y0 {* k$ T1 D5 d$ n# d) B1 C
& W* \: w" c- ]: f$ g% ?
% S; L- F' c9 `2 {5 L11.DESC在这个查询中起什么作用?
4 X; s* K* o4 c9 b3 v
- ^* r# n! W4 c5 t) N" oSELECT *, R4 E; t, ~6 O/ S; g4 r
FROM MY_TABLE* T- ^1 e2 h; p
WHERE ID > 0: M. W7 ^5 a$ s
ORDER BY ID, NAME DESC p* I2 R3 w8 P7 ^6 E% _' G
+ E8 }8 n+ y( R! {A.返回的数据集倒序排列
; P# V) m9 h( s+ e1 k1 \2 [B.ID相同的记录按NAME升序排列$ y: R* ?% @3 D$ S( c& R
C.ID相同的记录按NAME倒序排列9 s \- t" L6 r0 L+ w7 a- y
D.返回的记录先按NAME排序,再安ID排序
( o6 K) t: ~% J; \6 p. e" lE.结果集中包含对NAME字段的描述+ a, i% ^, \* [
1 L1 ?, E- l9 a2 `4 O1 M
. f/ l% S: ?: R12.以下哪个不是SQL函数?
m2 k c- I8 ~# e8 Q- @+ G
1 E: r9 f( [) z( Y) W$ {0 D2 iA.AVG+ n0 z# M: l5 o9 C, {) y$ R1 I- L
B.SUM
! d$ b H7 \; MC.MIN
' H$ v) f2 _" r' U1 h* W- X) TD.MAX! H; S }1 i4 K3 ~' B
E.CURRENT_DATE()5 N3 z$ j7 O+ G& x) N* u" \6 W
4 p7 R: N* L( y' [6 i/ T0 M7 V* m3 \" _( _( v
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?2 R- M* H% c- J( }
7 S( H( z2 O3 f
A.该字段必须有索引9 ]4 E- z' a: L4 I3 e
B.该字段必须包括在GROUP BY条件中
5 R: ~4 p( \' }( q& }( n2 O$ RC.该字段必须包含一个累积值 y6 o& Q# ^* W0 i3 B6 H
D.该字段必须是主键
, y( _ W1 e; n/ ]E.该字段必须不能包含NULL值
- }1 k3 p: x- J4 W* Q9 b3 u! k
4 ~1 J# ~: E$ s% R* T, \3 x0 A- ?; K) x
14.以下查询输出什么?. I, w9 H3 o- m9 \, [( Q
7 ~2 l' @2 D" {
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
[1 W; |+ ^- HON TABLE1.ID <> TABLE2.ID
. w: ?' m/ b1 g' M/ }3 Z5 P# a$ p3 F$ `! r$ F; o5 N* J' d% ^! j
A.TABLE1和TABLE2不相同的记录5 R0 y; D* W, j2 r, ?
B.两个表中相同的记录$ r: D Y8 u1 U/ Y- B$ D
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数( U8 s% }$ G- D4 k1 v1 z8 L
D.两表中不同记录的条数
! X4 N0 X) x8 L1 \, ZE.数字2
0 y: E' w0 k0 A# C4 t% B: O, j) w
& K- Q0 u+ J- o2 u! v
15.______能保证一组SQL语句不受干扰的运行?2 I" N5 U/ [4 ~: [, l! B5 O5 z. b
+ }5 ]! d$ J/ K+ d( ~答案:____________; O# ]# X( `( R/ b
2 v7 i F1 R% c/ `' ?& a% w
) v; k) X' U6 _) u4 r4 Z2 e' b4 ?% W( j. ~
答案速查
# `& U: ^" Y8 O0 [" k+ c; R2 W1:BC
" o9 X D7 e9 K' G2:WHERE
4 u. Z7 P% ]) s% t6 I/ c9 w3:B4 [6 |% ]8 e3 C+ X4 D
4:E E- q% Y$ S' j$ R+ \# _) ^9 I/ H
5:BD0 ^4 U! S/ {! D6 h" d* R, {
6:INSERT0 L" p# |" R1 y2 ?: ?/ I. @& A
7:C* b* @' f9 A, Z- @
8:A
0 D+ ^% b0 V! Y7 {7 e W* X9:C
5 U% x' K$ D/ @$ ]7 l" O10:E
) m$ W2 |6 i9 |11:C
1 \9 K* i: H. F& L$ n! h6 ]12:E
. } D8 o4 T$ U13:BC, n; j k! M/ x$ M% H" Q& Z
14:C
3 x! |- O, Y f15:事务$ {" A: _1 p5 u$ a2 b' q
& E r8 k! Z! t" u0 H/ M& J6 j6 O. E' M# t1 g1 \
* ?4 L$ A1 d: T$ U% j答案详解
. f, t$ \0 S' y) X. \2 K- d& T* K+ g
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。5 X6 l7 F* Q) V3 S% y/ Y
, E: y& Y( V* W5 C
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。. k' G. B& R# w3 g! v5 Z
, e% _- Z0 r/ _& _3 H1 H3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。; d9 a7 g/ \ u# ^6 k
" Q T7 A- G. v* _
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。5 J2 Y' K. x8 Z% E( r$ d
' f' [# ]% v4 @# G
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
" V( I9 }" Q+ J. d" y0 b
+ c1 U5 P* s: O P' b6.答案显然是INSERT。
" w" o8 _3 h( t4 u: `
0 {4 H. [4 s# [2 w1 Y" e o7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。- Z/ P- |3 T+ L3 ~3 V- J& v
/ o( k2 G$ W7 z3 Q5 D9 S9 q
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。, W3 B) e# ?# B
' b+ i! g8 m0 y5 R, ?; L2 `9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。% a- N$ R3 u& h6 K" R* u
$ G* ]1 F6 A0 d- h7 i6 m
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
( @5 N5 M! |4 Q- s% {
7 ^" G0 Y2 i; b* t3 O W11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
' m- o- H, z( V5 n' T& d6 B
5 b! [) S9 q9 _3 H2 G( R9 _: M12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
" Q- M" y b5 p1 c0 z) D; l2 |4 @8 V8 y9 b& r7 r2 X
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* T' O/ c! c/ A w; |
( s8 a9 w! y' H5 [! ]1 v14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
, Z' V# S: D: A2 k3 e' y# V$ t
, _5 I5 G$ ~6 _$ }15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|