返回列表 发帖

[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
( U, \/ A) W( U* E4 B6 S: v9 GPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ d# F6 E0 n: B本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。* `* ~5 l6 P5 ^% Y6 @" `
8 e* G1 R: M" j( m

  d; b# a4 E, t' v, p: ^7 c% u问题
& g+ E& t2 A, z% v, y' r& {8 R0 g. H  y* D5 G
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)- Q( \1 ]1 q+ l
, C9 p+ z# j; P5 Z
SELECT * FROM MY_TABLE- b& ?) p. U0 C* h: B

; H+ E1 A2 Z1 o9 W, l# V$ pA.如果可能,用把查询转换成存储例程
% E5 W1 k  B- o: w; v3 YB.如果程序允许,给查询指定返回记录的范围
  _5 s. D' a, j* {5 ?1 ?4 CC.如果可能,添加where条件; P3 E; p9 _2 Q$ Q
D.如果DBMS允许,把查询转换成视图6 Y7 N$ U) _8 \8 _  ~! R
E.如果DBMS允许,使用事先准备好的语句8 C: ?  P6 H& e! q+ M$ e0 {

" L$ L. {; h  ^; M! Q
4 c! O! {' x- |; c2.可以用添加______条件的方式对查询返回的数据集进行过滤?4 G8 O5 _" ^, ]8 i5 Q8 H

% s/ {1 K# m: E* @, S5 K+ `答案:____________
* d7 h! i4 a: T* W! V2 o. J! _; p

9 G7 l" E. T6 V8 R6 q; M: \3.内关联(inner join)是用来做什么的?
- N) T5 U0 b4 P" I) X  m
" y) R0 U8 |9 y! b: L- qA.把两个表通过相同字段关联入一张持久的表中* O! T) r6 F( D" d! T
B.创建基于两个表中相同相同行的结果集$ \  Q; y! t  a2 Y. R
C.创建基于一个表中的记录的数据集$ N: d: ^4 k  `! C0 L
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
- b2 m" n* `  JE.以上都不对0 [! p, e' f/ ]

4 f$ q; `0 y6 l1 t( d! p' Z; P- @& Y; `/ K$ _6 h0 y
4.以下哪个DBMS没有PHP扩展库?$ Y( _8 b8 X/ q$ R, t
3 ~9 a+ A4 ^% I- l! N/ w
A.MySQL1 H: l5 ?* c. m) u6 ]& N7 @
B.IBM DB/2
) R' C' [# G- ^2 d4 {& q* }& RC.PostgreSQL; q1 a, D9 K5 H: N7 ^, L; m+ o3 N
D.Microsoft SQL Server, k8 B" H( }" [3 s9 m
E.以上都不对
3 v7 v  t1 t9 I
! d) }% c# ~, K% Z% a/ i0 _+ k; z: O% k( l' C
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)1 g$ W. `) |! j/ s+ ^" D0 l
* Y' G, k" R* ^( l
<?php
5 U5 Y) w' K0 h9 c. [$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
* R! L5 A- V! L3 X& H0 A?>
* J9 D6 }# k1 h" C& _2 @* W0 t$ o( p4 |7 N! K
A.MYTABLE表中的记录超过1条3 ^4 }, R1 r1 }, V3 T, `1 r! k
B.用户输入的数据需要经过适当的转义和过滤
& C! R8 X" _  N/ `% y: V7 L: Y$ |C.调用该函数将产生一个包含了其他记录条数的记录
- g2 _$ A$ m) ?8 n& {. A. T7 ~D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除1 l% g2 G6 T* N4 Z& Q. V! I
E.查询语句中应该包含数据库名
0 m; ?) |; [# o( {1 \$ O% K8 m  h9 N+ {! E$ T5 n+ N- [) B* j$ V" z8 s
# c0 ]9 F8 E& d% z& |) g
6.______语句能用来向已存在的表中添加新的记录。
1 i! m. S& B7 G8 {+ ]5 i
# U3 d8 r& f9 l$ A4 h, Z* Z+ V答案:____________9 c0 }5 K& }5 ~0 E2 E
6 B( \6 [$ v/ R$ K3 \
. W& J* _, j9 a' y- Z! R) v
7.以下哪个说法正确?
- i/ l5 `# [& ]9 Q' K4 I# M8 s: L# E
% i, Y& y0 ?' \4 W+ R. w, @8 IA.使用索引能加快插入数据的速度
" B: I" j9 Q* g6 R$ g: FB.良好的索引策略有助于防止跨站攻击
& f* }; ^4 ?" {# GC.应当根据数据库的实际应用按理设计索引' y9 t4 U$ P0 l, a' x1 t2 b
D.删除一条记录将导致整个表的索引被破坏
& A& w8 q6 ?/ e  M. UE.只有数字记录行需要索引, R! v3 F) X4 i% a
4 V; s* s2 T$ Y! @; ~

0 E8 f4 U* P5 [9 g& S: g8.join能否被嵌套?, I! c$ a* ^3 ^3 i, q9 p0 b

* w+ q; U( }& G5 i/ oA.能' x4 [# |9 a. a/ v1 Q# K4 A$ e
B.不能& h1 o2 `  L$ u! B( u3 e7 I4 ?

* g0 b! y. V! C6 F4 s" B$ U3 H) c0 \' K/ P* n
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
( _( T- s! X, v  l& i
% r9 i' O" i8 [1 i- N4 T' {+ t& ?1 L6 oCREATE TABLE MYTABLE (
4 a- S, ?- R  s$ rID INT,
' W5 n5 p, G- Q1 n/ |. I% eNAME VARCHAR (100),
( a' v& o1 @$ ?0 o6 dADDRESS1 VARCHAR (100),$ n/ d4 W9 E4 k: B# b
ADDRESS2 VARCHAR (100),! d  g' P% e* H3 D+ R4 e7 K) ~
ZIPCODE VARCHAR (10),
  {3 J2 K" r9 K1 D8 r* b, P" d% P) [CITY VARCHAR (50),
. T( d  c0 @' k' M6 N  RPROVINCE VARCHAR (2)
% l% P: d( S; I# J# U)
. v& ?% z1 ]1 ^0 @2 ]( lSELECT ID, VARCHAR
0 H, T; i! `  X; C) G% qFROM MYTABLE
$ j: N8 z9 [1 R0 P6 ^7 L5 h7 w2 WWHERE ID BETWEEN 0 AND 100* V0 k9 Z, \' V& ^+ T/ V
ORDER BY NAME, ZIPCODE
" ]: M; ^7 u# I8 y) A9 W+ V
5 ^: ]8 u9 p) ?1 m1 E* FA.给ID添加索引0 R4 J- Q7 V  j+ ~
B.给NAME和ADDRESS1添加索引2 f& i8 |5 Y- Q7 e- L% f
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引9 B- g1 R1 h/ s, l
D.给ZIPCODE和NAME添加索引
/ y* \0 v. P( q/ S7 I6 AE.给ZIPCODE添加全文检索2 \) a' Q0 v4 h! T6 N8 D* b

; t% }$ i; |% P+ [6 U2 {6 Y& G3 \9 z: r9 l
10.执行以下SQL语句后将发生什么?
# {' @" n* a( C) `3 C0 L4 U$ f- n
BEGIN TRANSACTION2 \" k+ D  Q3 X0 T  X2 I/ G
DELETE FROM MYTABLE WHERE ID=12 E* x) ~" f& U3 q$ a# ?
DELETE FROM OTHERTABLE
+ X/ j8 y6 j0 r9 S/ v5 e5 bROLLBACK TRANSACTION
9 Z2 G, x' F+ `3 O/ N8 k" L
$ A7 L1 Z( [& t6 `0 S% O5 H- UA.OTHERTABLE中的内容将被删除
% X9 P. V& `$ a4 t9 T1 n5 SB.OTHERTABLE和MYTABLE中的内容都会被删除, H2 r6 D) i( R
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除7 V$ V& H" L/ p+ d6 H3 G
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化* T+ d3 x( c, F5 }, O- Z8 z, F7 c
E.数据库没用变化7 m/ q; Q* l3 t8 P! _; Y

9 X# n  c' N+ q
/ K: {. ]8 W* \" {11.DESC在这个查询中起什么作用?3 B( t  B1 q5 K8 x  k3 d: E+ p

" ]4 V& |- }0 {6 i( USELECT *- B  R) B! d7 O& G0 Q: Q$ w1 }
FROM MY_TABLE
0 H% Q/ S1 r) J2 q/ Z9 L+ g: u& b$ HWHERE ID > 09 k- N  g7 p8 F% E
ORDER BY ID, NAME DESC
; U- l% p1 {8 ]& Z- f" ]2 Z2 Z+ e9 Z5 V! T; H( M" O& r
A.返回的数据集倒序排列" T+ p$ N: L1 e8 p( {) I
B.ID相同的记录按NAME升序排列1 w- n0 C+ F6 x
C.ID相同的记录按NAME倒序排列
3 @, `# Z! j& q2 s( {) v0 G3 R- `D.返回的记录先按NAME排序,再安ID排序5 N" S5 s+ O: [) g4 y) T7 P0 `7 d3 H3 K+ G
E.结果集中包含对NAME字段的描述$ y- O* ^3 ?5 N. R  z. J9 D- ~
' |2 M" S3 Y: H  |" V

: s9 H+ T$ M. x* C12.以下哪个不是SQL函数?. ~; X8 @) e- N9 D8 ?' G/ q. }* W
/ M, z, P4 e2 b9 N* d+ R  }
A.AVG
) A( D7 h7 l" ?B.SUM- x1 s( i8 P, Z& k
C.MIN
8 y5 I( w! ^( q; J6 V6 {$ [D.MAX
1 d- z  C$ i7 `E.CURRENT_DATE()
' d/ l* C3 j4 q; X* ~/ ^
' N  O4 _! k, A* D9 l8 J
( E$ n) b$ r- [* |# F' u/ ?- h0 b13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?3 H+ G/ o2 I0 A9 R& j  s
$ Q. z8 |" z0 Y
A.该字段必须有索引" N( H2 T; N! Y% F$ m8 V
B.该字段必须包括在GROUP BY条件中$ x' p- C% J) {, f
C.该字段必须包含一个累积值9 ^' J0 B0 e; n$ A
D.该字段必须是主键1 F  ]; v* f/ G8 }. }" G) O
E.该字段必须不能包含NULL值+ D) O, j$ y6 e/ N
3 i; F2 b8 \9 f

4 P, Y9 k6 O% B2 S3 I14.以下查询输出什么?& Q0 q) Z% U& \8 U# d: D1 \

. S. D  H3 S* b0 F% MSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE20 n9 L3 P% d& r- e: N, l9 _
ON TABLE1.ID <> TABLE2.ID& b2 q( D: g8 L1 g, H6 B6 I

- \7 x/ ]. z, `0 ]* [; _A.TABLE1和TABLE2不相同的记录# I! d2 j0 \7 D6 ]" W) Y
B.两个表中相同的记录
9 w) f" J8 q" qC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
3 n* _/ p9 q7 a8 rD.两表中不同记录的条数
6 K9 Y. W# O4 VE.数字2
! d( P; E6 o# G! \8 }! i/ z5 i7 O8 T' }% W
3 @5 y- _9 g# l
15.______能保证一组SQL语句不受干扰的运行?0 y, U9 R4 U7 V% e1 f2 a7 t

, L% _& g: X; S& f答案:____________# l, @2 h  p! J

( v4 N( v1 t3 s9 k# r5 `- w. ~. q& M+ c: `; D5 H
9 b* d. s7 O3 h# K
答案速查
" [8 l3 R4 b2 o  S1:BC& m& s% d2 I  k7 a$ g& {. ?) n: F9 p
2:WHERE
1 N: z3 P; \4 X" z. k  E/ B5 P  @3:B
3 [9 a/ v/ s7 n8 q9 i( Z4:E) D% ~: m$ C3 z# P1 @8 U: Y! R  B1 |
5:BD& `1 L) ~3 y3 a* h0 x# [' A; q
6:INSERT
8 X( Q# E8 J! Y) _7 f8 R4 s7:C4 e% \+ F5 k* T1 y+ f
8:A8 j4 v. c* n3 {! \- C
9:C6 T  k: C& B9 u& r
10:E
& d& {" z0 |; y. r# N, e! h11:C
9 e! K+ [5 [) T+ ?12:E( H  Z6 z1 h. |+ l# k) Z
13:BC
* Z$ U/ [, _; i$ u, }14:C% k" w& a# B9 y. j& e' d
15:事务0 b! @2 U; x" b! ?9 T1 a

- O# d8 y  Y/ Y9 }
& S/ _: I' _& Y( |: m' _5 z; F! \7 `! S3 u8 ?7 r
答案详解
/ B: w# P2 W7 }! d" i& T
' v/ ^; R  o1 b, b) d( K: b6 d6 Y7 w1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
' C2 d0 A" P4 w2 x' T3 |
" |9 A9 o1 }5 L) m! B7 G; u2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。3 ?: A  {0 S! U% _' V
& B, q" A3 w: ^
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。+ l8 i0 K7 R- x. [2 n

% z: L, x0 q4 H& ]+ x6 @7 |4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
) S; }& n5 L3 @; P! g. ]! j, {$ q  c, D( K: K
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。, \9 B( g: C! f! |

5 _% k! `( b* N4 @% B! ~6.答案显然是INSERT。
+ |3 O  F+ S( M" A2 y* \0 g, m- l- M0 W+ }2 W
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
+ E( f1 d1 i, j7 G  x: R5 G8 ?4 ^' U5 v+ r
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
9 E0 D6 H5 _9 y* F' B' B- q
  F- I& {  l* }4 B9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
6 n% w- O1 |4 ], y7 h
$ g5 k+ p# P3 j8 K: e+ O10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。) x6 {# k# z' F5 u" t
& h- R. l0 [" b. Y  D" J- x( Q. X
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。' ^2 U/ L2 u$ l+ {; [
' Y* B5 E8 W3 [1 J
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- H: a  L, H8 [5 @$ M
2 E! }+ m6 G$ b13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' ^( S6 W" l  E  R3 C% \

8 a- u* Z8 O; M14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
" b. j, X% n9 E! k0 N7 P
% v: ?# r. N. a) i( G( J% g9 j15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

返回列表
【捌玖网络】已经运行: