返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
  }4 u" h2 f! @; M- b# z( \, t. _5 mPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。* g! W, y/ e0 e" T
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。+ j" p4 c6 t7 b' g

- p2 p; v: S: z8 g3 {. D2 ~" I" F: [8 k% x% f( k4 D: H
问题6 {7 p$ Z  ^- L9 W
( U& U* k' y% ]
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
* }, w; i+ O( m& b3 P* h$ t9 n% @$ U- C! o+ H% q
SELECT * FROM MY_TABLE
" n7 |2 W: a6 ?) K5 D
  l. k  K3 H+ x1 u1 ^A.如果可能,用把查询转换成存储例程
: m* n. _! T& M1 ^7 pB.如果程序允许,给查询指定返回记录的范围
0 o1 m" I6 [) S3 BC.如果可能,添加where条件
& }  b* Q6 k+ A0 f9 i1 ?" @D.如果DBMS允许,把查询转换成视图
4 D1 w& {. C6 x+ iE.如果DBMS允许,使用事先准备好的语句
& A$ V! z& j* I
7 m) K5 r3 a! d- J
1 ]# C5 n. n) K2.可以用添加______条件的方式对查询返回的数据集进行过滤?
! e4 c# `! L: H. L( @
+ l! K- d" e* v! D4 W/ N$ |答案:____________- K3 ]3 m5 v+ l" _% g2 e( p; [
/ H% D& p  h. x7 n. N

. o- S' b7 j) W3.内关联(inner join)是用来做什么的?" ^% b- e! ~3 `2 j2 p( d9 B
5 Q' y+ I! J! v9 b, x: ?( `% ?
A.把两个表通过相同字段关联入一张持久的表中
/ Z; k" o# v8 f" o' N$ u- ?3 e" _# O& qB.创建基于两个表中相同相同行的结果集
2 p3 h4 C, \& v- O$ d) vC.创建基于一个表中的记录的数据集" h% A! L% I& z* g
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
9 ~4 I& E$ H. O. z3 C. G( vE.以上都不对
/ I& U% Z/ S& b) [
. Z; R8 _2 d/ P0 S' Q, q2 M: `: x/ _" `" N' V
4.以下哪个DBMS没有PHP扩展库?2 D4 U& \# V, f; q. W5 \
- A* }% F; |* E3 C1 }$ u6 I; L
A.MySQL
- b" K# r/ p  j% l( h8 j  EB.IBM DB/2
7 P4 O! t% T, _! X5 w8 bC.PostgreSQL
& P1 Q4 x( q% _" H9 ~( SD.Microsoft SQL Server# R$ D/ I" Z4 W) l. ?
E.以上都不对
6 k/ s) J: s" I5 m6 @
9 k: x( Z5 O' p8 _6 d- h' W, i8 I- z. W4 V) E
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)) i5 B% I% ^4 W1 q; y
9 B; U+ q* \4 ]' U- f
<?php% I8 j4 X4 |* R9 o+ u( b( O
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
/ G4 c6 D. d- g) b/ A8 N?>
5 I+ b: G: {0 V" V, u% Y9 ]* ?5 o; e- j' f: k6 G, t
A.MYTABLE表中的记录超过1条- S( J& C: w, b
B.用户输入的数据需要经过适当的转义和过滤
$ P& U8 N# ?$ w6 `+ a2 ~& t4 gC.调用该函数将产生一个包含了其他记录条数的记录
  w  L# a/ B' ]. ~7 I# d. {1 jD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
9 j+ z: k% `* I3 qE.查询语句中应该包含数据库名
8 U  l6 w5 V$ c! t
  s- b% ?' ?- V4 I& \! b2 q0 B% i6 \$ r( h; a
6.______语句能用来向已存在的表中添加新的记录。
/ d- Z5 u. l5 h+ I
% Y7 G# [( B8 R& T( R$ Q答案:____________* U. L" `& ~* \* @/ P  W9 z
; b4 E. ?2 N3 X/ d2 S# v
1 i) _, L" F5 d; R2 p" {
7.以下哪个说法正确?9 u5 ~7 o* ^5 A3 K4 Z: y" w1 ?8 H
  C% S, r/ `' w7 S& C
A.使用索引能加快插入数据的速度
% Z* i6 S3 W7 e" m2 LB.良好的索引策略有助于防止跨站攻击
+ w3 J) j9 V, @* pC.应当根据数据库的实际应用按理设计索引& ~: Q, @" Y! T4 i1 e  J
D.删除一条记录将导致整个表的索引被破坏
+ i! C7 s9 E+ o7 i" e9 `E.只有数字记录行需要索引5 I! k( E% n1 f6 W/ U
: X) o+ P/ Q9 |

9 N* C  Z* C, i+ v& `4 c$ ]8.join能否被嵌套?; z3 N( V# Q9 i

7 L* o4 T. g. pA.能
; |# A4 R2 t1 }( @& z7 P' |B.不能, P& g7 w( j; ]1 v7 S
5 ]6 [0 Y' {' i

( g, A  S* [8 a2 l5 S; C4 x9.考虑如下数据表和查询。如何添加索引能提高查询速度?
5 c/ d' R. E/ ?# E+ k9 h- ?
$ D" G7 D4 h; a4 d3 qCREATE TABLE MYTABLE (
2 f: a) _3 x8 k5 h6 H4 {ID INT,5 y# a: ^0 D7 k* ^+ n
NAME VARCHAR (100),+ V# r* j: y& u+ e7 D0 Z7 R. N
ADDRESS1 VARCHAR (100),
9 }  q: D& ^$ m5 m: F- MADDRESS2 VARCHAR (100),
6 T7 Q6 h; k- V) t; s1 ]( [) o% DZIPCODE VARCHAR (10),
, N+ S. p2 g, _2 v/ Z. VCITY VARCHAR (50),
' j, u7 E( ?, _2 r5 vPROVINCE VARCHAR (2)
& L) W4 c; I% U+ Z+ W. L)  _5 X! [/ b/ k$ K
SELECT ID, VARCHAR
5 ]6 @' I( p  c% Q# |" F/ cFROM MYTABLE
1 r$ J8 f+ F2 Q, z! m& V  Q- TWHERE ID BETWEEN 0 AND 1003 E/ C5 F8 q; u" f9 H
ORDER BY NAME, ZIPCODE, f: D, `) L2 X9 G: g
" B, j5 u& M4 l% t4 H5 z4 c3 S
A.给ID添加索引
# S% e" V, A5 dB.给NAME和ADDRESS1添加索引3 ^% {! P% I$ ~9 ]& j
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
9 r  U2 Y- ^; h- J+ XD.给ZIPCODE和NAME添加索引) F) v/ R, S4 G$ E5 V' j
E.给ZIPCODE添加全文检索
  R6 g9 I3 u6 a9 \& |8 H2 q) M/ u) B5 d) K
2 q' \, p) ^- N" x( K1 W
10.执行以下SQL语句后将发生什么?- ^& l( q! @" n. D- O
% R8 @% Z; s4 a: _. {
BEGIN TRANSACTION; O) K; k$ o6 Q5 U- p, l
DELETE FROM MYTABLE WHERE ID=1
3 N1 Q1 ~: P. u1 s2 TDELETE FROM OTHERTABLE
5 a5 }& y2 W6 dROLLBACK TRANSACTION; P) q+ T1 F; C$ O) w  V) e
& P) J5 |. M: y' ~$ W$ i0 c8 _7 z
A.OTHERTABLE中的内容将被删除9 H7 C* n9 {: ]! x+ `
B.OTHERTABLE和MYTABLE中的内容都会被删除
1 d+ k0 U4 L( q& Y1 ^C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
4 |/ H5 F9 f% X7 {D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
: J" j- t/ u" q9 g3 ZE.数据库没用变化
% J1 w  P9 V0 w  O$ P6 L4 Y! n3 L. ]2 c% P5 N6 b0 x
/ v6 M# A. _! |2 ^) j% q7 z3 U8 m" ?' j
11.DESC在这个查询中起什么作用?
: ^% H5 J% [5 R, L2 ?" Y2 Z* ]
1 Y& @. g- A# c0 o" rSELECT *
+ T4 t+ P( e7 Q) b+ t/ g  EFROM MY_TABLE
2 {1 }% y' u1 cWHERE ID > 09 o' u- u. y2 a; U+ V- D; ?2 {
ORDER BY ID, NAME DESC! N8 [7 s5 y% L9 U! W( s

" Q' V! D! [5 e1 p! hA.返回的数据集倒序排列7 G7 R4 o) e6 Q- S2 I7 u
B.ID相同的记录按NAME升序排列8 J8 t: {! G9 W
C.ID相同的记录按NAME倒序排列: v9 y1 W" E' E1 z/ O: ^/ l3 b4 t/ l
D.返回的记录先按NAME排序,再安ID排序$ V" V( C+ m3 R3 V% k  Q! u7 j& Y
E.结果集中包含对NAME字段的描述
( R9 d9 i7 z7 S" |' v3 o7 {, Q3 D) L3 _
  ]# B" d, P) T( p% w' {6 q0 O
12.以下哪个不是SQL函数?7 t! Y2 X& `# G5 Y& y% v' Z6 W
% }, z+ i. R+ j8 o. ?+ v" c, N! u
A.AVG" H6 i2 M- N+ v! C/ a
B.SUM
- J5 ]& N5 x$ }6 ZC.MIN
& E1 J% L4 A# o# [; n; m" z! vD.MAX
$ v9 x+ v9 A8 c0 }1 ME.CURRENT_DATE()0 I5 k, P1 |; e* Z

* {. l% I; s" t( j0 K' G  ?+ \3 f- i
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?7 O& a$ j% Q# `: b- \
0 ^2 P) T2 U$ @, y" {; R. C6 {
A.该字段必须有索引3 J: y4 Z' Y/ P; ^0 G3 i3 V( {0 _
B.该字段必须包括在GROUP BY条件中. ^3 E8 @% r  R
C.该字段必须包含一个累积值
( |: D- |9 |8 o* @D.该字段必须是主键( H' C) _& h! \/ ?0 O1 Y  C
E.该字段必须不能包含NULL值  i% ]0 P: q7 Y* P& l7 a

0 i! F7 v: [$ C1 T7 G' S) D
  t8 r, x; L" C) u# X. j14.以下查询输出什么?
4 q7 \' {# y- X# h: b2 _
6 E' Z! I  @( _) s7 d2 Q& eSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2  A5 p; N" v: w! ]3 N
ON TABLE1.ID <> TABLE2.ID
9 ]' z' H' C$ b' C0 D$ D
: @% H3 [& s; ZA.TABLE1和TABLE2不相同的记录
7 g* ~. A7 s8 h8 OB.两个表中相同的记录8 W- z2 k; e4 X0 o% q7 Q0 Z
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
& U8 P) O/ w# F" E: @) ID.两表中不同记录的条数
3 }0 m7 S$ j$ w& qE.数字2
# x/ s7 e% x) Q* i( l* `# y2 }( c0 h2 M% D. f
# i+ t; G: o4 k* u
15.______能保证一组SQL语句不受干扰的运行?. }1 z8 S1 E; K5 ?
: }: R1 e5 M0 a( X9 O" f
答案:____________6 i/ K3 C  Q: ]6 E+ d: q5 _2 I
) X3 a7 K! h3 E2 w$ }
6 P0 t* `4 ^8 b& c1 S& Z; Q8 h. H

0 M  \3 m& M; r1 h答案速查* S! t0 U% Q2 i- b  \: |  w3 ]
1:BC/ {) B/ d: f# Y$ F
2:WHERE* A5 t4 c, u0 F% s1 F
3:B. M+ y6 P' Y$ {! ~
4:E
; j: y% B% f% ]  Z" X; G5:BD$ b8 }, r, A( @0 g' O  u
6:INSERT
7 H! Q% c4 @2 r# w/ u( [/ G" V1 u* K7:C3 N, Q. ~; H* n5 ?5 P4 L
8:A
+ `8 O- O# `. s3 [# q9:C0 j: ^- k  M* a5 c* n7 t( v4 G7 X4 Z" M
10:E. q; t: a; n; ]3 k
11:C0 b& f; V3 L- ]4 L# [
12:E6 q. M- p! Y' p# E
13:BC
# I, t) m$ I! w( ?: x2 {14:C
: P$ ?: h' ]! T3 @3 s) M15:事务) `% `) L. N2 G, d; j) y
7 q% w! f9 m1 _" _' _
- v1 a0 f# P( s) P& S

5 B# v( L( f* r7 x1 N) p答案详解
) T1 ]0 _" t5 z* Y0 X6 R/ M; U
1 P0 L+ ]& O+ P+ z' |4 @( ^6 t1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
2 h2 w4 T' {5 N
! {/ ]$ N3 L6 n( p2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。5 X! ^$ N( o) F, E1 a
( u, H  t+ f. e, y9 G
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
& P! y+ ~% o+ X8 X) @2 l1 k3 v8 R& K9 K* N2 _' z2 i0 b
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。# X3 F% @' d3 p. w

# e8 b: m+ p4 F& M6 T5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。+ W( f' f7 K  S3 J2 I$ @% n

7 S0 [  E0 }- c% M7 m6.答案显然是INSERT。
9 M, @  }$ h" i. `  H5 n0 D, g' L9 a! D1 M" s# S; l
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。/ b' b  d/ Y% {  N5 m

/ {& z6 V( H( a2 \; V$ c* ?8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
' [; q+ X" T% I- C% F* {) E
8 \6 b  v$ W$ O3 O+ D7 s/ ~- }8 T9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
5 w  ^" e5 w' O" R
2 F& h& P8 G, P2 Z10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
6 e7 `2 D. \! E# v/ m) q! m/ W+ u3 N
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
: }) j, u2 o. L; Y2 B
* i( v! m9 O$ C2 G12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
. r/ g  c/ I4 P$ c" \/ K5 J* J) z' m0 N
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。( H1 |# s' `% U$ Z+ O  ^' t9 a, o! I

) J7 Q8 j& J" U14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。8 J( c1 _$ m4 ^
8 \+ n! X/ {+ C
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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