返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
  g& h; f& T1 V! LPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
" f( w2 K! s$ d1 V6 X本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。. m) \" T8 C+ R4 n9 L
; z: [  n8 e' |: f0 ]1 L

- u# K. r& G8 u! `问题
# x2 C" e" p, J) x1 y6 h: y. T1 q4 v6 l/ V' S" F
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)& {7 Y# l7 y0 T9 A! d
! i) \& J8 g9 ]2 s9 I5 G
SELECT * FROM MY_TABLE  o% j8 M% `1 X" l- L  V" D

- M6 M1 ^( p- d; ~, s6 N7 tA.如果可能,用把查询转换成存储例程: U3 x  [, B+ r. T* n' w8 ~
B.如果程序允许,给查询指定返回记录的范围
1 O, b# o1 _( A6 IC.如果可能,添加where条件
5 P; ^; D9 n- e/ A" q: R6 k; GD.如果DBMS允许,把查询转换成视图
# y0 i4 y- H0 }3 U3 M, P0 x' c. m$ yE.如果DBMS允许,使用事先准备好的语句
3 s' y" W- s% L8 f0 }
& {) b- c) }$ O& J& y9 R1 a1 g
" q( q: |2 @/ u; A2.可以用添加______条件的方式对查询返回的数据集进行过滤?
. h$ _$ _: h4 R$ |% ]! D( |7 t+ T6 @' n
答案:____________
; }7 Q& @9 u$ @+ t7 b! A% V" @, M7 j# i' P, M  \: C2 c

3 L2 q2 Y/ y5 G8 U2 V3.内关联(inner join)是用来做什么的?8 F( S4 J3 g9 m0 t% \" ^

9 e8 n; ^, F& ], O6 LA.把两个表通过相同字段关联入一张持久的表中
" W5 r: ^+ k" b/ f2 V5 _8 ^B.创建基于两个表中相同相同行的结果集9 N! }. J, H! J# z! w/ n
C.创建基于一个表中的记录的数据集) ^8 ^) [; O5 u! c5 V
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集, w1 l$ i& y4 V
E.以上都不对' z+ H; m& L3 v' o

. [# n/ E' H/ W% c& @$ O
7 F; w7 k# I/ [5 s6 Q, A4.以下哪个DBMS没有PHP扩展库?
. |, o# R' Q( c# ^8 j- I; r3 p
+ s) J' F) s7 X  e' X  {/ gA.MySQL
* Q7 M1 h- f  }B.IBM DB/2
+ e9 P- [" v4 e, S/ U& ^. |C.PostgreSQL
% a/ {' y) D. M/ U" G5 lD.Microsoft SQL Server
( r1 T: D! ]! e" h& [) u3 wE.以上都不对. G+ D* q2 a0 Z" _
3 S" k" F: L/ ]8 x8 ~3 l" X# J
/ o2 H+ `. ^  t4 v* H. H
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
( x/ c! J: \! a2 R% {/ \' Y% d3 G( V- m9 Q* |
<?php
; h9 c8 g5 k( `! Z) z- g4 Z$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);8 e* Z7 X& b, p3 g& K
?>) D; B) |2 L1 ?7 y

: U  n6 a6 S1 Z5 uA.MYTABLE表中的记录超过1条. {& r# R; V$ }/ F
B.用户输入的数据需要经过适当的转义和过滤
& t' O7 K* s: T% e  j8 @4 ]& ]6 FC.调用该函数将产生一个包含了其他记录条数的记录: L! i( Q$ T; _+ T
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除9 P7 s+ a# i0 l8 E8 i' e) T5 o' L
E.查询语句中应该包含数据库名) Y& c) l( M# `" q4 Q' ~" A" X! V4 w

7 t5 R) E4 L9 p8 f1 p5 n$ h6 q- ?- d) f$ ^/ D' m, e& G: R
6.______语句能用来向已存在的表中添加新的记录。
) ]2 _" I) H7 a  ?. [6 l9 a# P6 @9 v% d) }9 e- n4 B" m4 Y
答案:____________
& {1 S4 n4 O. P$ d' H: Y. }( \! B
; X/ r' y" J5 z& k
/ t8 ^; X( e% _  U4 A0 v7.以下哪个说法正确?
% U/ S4 f% G9 X2 K7 j* x
5 A% c1 U0 g  B1 D7 j$ |A.使用索引能加快插入数据的速度
7 Z9 v3 d% z! m( EB.良好的索引策略有助于防止跨站攻击
1 X: R3 x  v  \' b0 {- g/ m+ }C.应当根据数据库的实际应用按理设计索引
2 c( }% p& _2 t- G- f5 e* iD.删除一条记录将导致整个表的索引被破坏
" o5 ?5 q8 U4 w* I' `% f( a* E  ]E.只有数字记录行需要索引
  y, N2 ?4 Z% _, ^: J3 k' F8 }* E- a! b1 U8 H

+ ^# {+ e2 N$ |8.join能否被嵌套?* ~8 l/ V2 \  r5 `5 u
: `3 _0 C6 W. B- `  j: l$ A
A.能
/ J+ D5 ~8 s/ h5 }0 P9 Z8 nB.不能
0 E% e- V# W5 b) i. B$ l5 `9 y; L
, ~) \; T) |2 [$ q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?; i# W. y: s; G/ O3 {0 o
. r2 @" b) j& {' N6 C% N; M' z
CREATE TABLE MYTABLE (
( M9 ^+ ~6 m' z  J/ Z4 e* {3 Q- hID INT,
0 D; L3 c1 u' o  H- ~3 bNAME VARCHAR (100),
+ I3 ^; u7 C; h/ T9 }" Z9 HADDRESS1 VARCHAR (100),; K) d) h. f9 `
ADDRESS2 VARCHAR (100),6 d1 a) b' ]) m8 L. L! _* L
ZIPCODE VARCHAR (10),# [. X9 p) _8 f6 I# k! W
CITY VARCHAR (50),7 T/ F9 E; N& E& h! z
PROVINCE VARCHAR (2)
# v! w$ o+ D/ L)
* w; N9 g: |  S* T, n) [6 BSELECT ID, VARCHAR
$ u: _( c$ T! P! FFROM MYTABLE
7 @: }) q( x# L7 gWHERE ID BETWEEN 0 AND 100  k2 g6 D$ ]" Y; A
ORDER BY NAME, ZIPCODE
3 x" L# c3 X# K- o1 n! m1 }! _4 [+ M- E& M
A.给ID添加索引. }9 g" p0 Z+ o) r8 a) w  _& ~
B.给NAME和ADDRESS1添加索引7 b/ g' ]4 ^8 p; W8 t/ R: k2 \, a
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引( M9 l, s4 k! v! G( c2 J9 G
D.给ZIPCODE和NAME添加索引
& V4 W5 N3 q7 f# ^9 ME.给ZIPCODE添加全文检索8 v' u7 q5 r# W

0 ?0 n8 V; I) \% {9 t8 X, j
/ s4 o* F$ T- u8 L6 T10.执行以下SQL语句后将发生什么?
' a/ I  Z, K) [, u, Y9 B% S0 a9 R! Y7 T/ x# J0 T3 x5 W
BEGIN TRANSACTION
1 O1 w( b& Z7 f7 h3 Q. [DELETE FROM MYTABLE WHERE ID=1) _/ a" w. I+ D3 f
DELETE FROM OTHERTABLE' D# [" [+ z" R9 |
ROLLBACK TRANSACTION) L* D* Z; Y% d# O& ?! E& P# b
" w: p3 T: j2 `! G+ |( w
A.OTHERTABLE中的内容将被删除6 Y; D. F4 m( U' _; ?$ }
B.OTHERTABLE和MYTABLE中的内容都会被删除
$ J8 [( a7 K6 t* i* ]C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
* T" W& g3 d" E  d. K& qD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化5 U7 E  d" L( G" r
E.数据库没用变化) F7 b+ @" V% N: R& E
  E* [) s% J7 _
9 C2 Q" \- [+ D8 Q( Y% [$ r( r6 V
11.DESC在这个查询中起什么作用?: m) U2 o( ?- N$ E5 ]* x6 ]3 v+ @
  v$ D+ p2 M  P4 e# C3 A
SELECT *
  D6 U' O9 D( g. V. Y* l& BFROM MY_TABLE
- e2 t  @+ s8 `WHERE ID > 0" E% y6 _' c. ]
ORDER BY ID, NAME DESC! i6 q( }6 L& u7 u+ K, u
* P9 P, F- ~1 ]$ F9 e& Q
A.返回的数据集倒序排列
( W1 C4 G2 X3 ZB.ID相同的记录按NAME升序排列( a! e( ]0 _7 \# H
C.ID相同的记录按NAME倒序排列2 A3 E# d. T: {  k" o3 e
D.返回的记录先按NAME排序,再安ID排序
# ~/ |3 p+ u" p1 K/ `E.结果集中包含对NAME字段的描述' V; p; s" d$ o3 w4 ]& A! Z0 o
5 Q+ _/ b" e- F. R+ \6 {# l

; P( V/ I- ^2 N8 |4 s- ~12.以下哪个不是SQL函数?
7 H6 n; ^2 h3 w
0 M$ ]& q: g; \4 ^7 g. G1 l) }# x1 zA.AVG+ p- J/ |, I, \" h( L
B.SUM
. R* @5 w+ C# _2 V" eC.MIN
* P; F& L7 w( X: V. u7 x: E' ]D.MAX! K5 D2 A' U, ~3 M
E.CURRENT_DATE()
  ^& H" v; \3 i" `3 a; d1 v( L$ P  P# I# [
& @. J4 _: z, o( i: ^  d" i
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?) U1 V( M) V# i3 U9 P+ y

$ y$ M. r5 m4 N, h3 S- d4 F1 AA.该字段必须有索引7 z- M4 z" R. X% @9 B( z
B.该字段必须包括在GROUP BY条件中
# @# B! W6 q9 s' p; V+ w5 bC.该字段必须包含一个累积值& Z% J9 |1 U4 d6 g
D.该字段必须是主键
, Y8 Q+ y# B7 ]: H7 nE.该字段必须不能包含NULL值
- f+ m  C1 e* J% {4 Z3 I3 s; k# V0 P8 e' w

/ c+ N6 \, _& D" l14.以下查询输出什么?
. Q) @* L, U- C  d0 m+ [* L
6 d: s" C! Y- e2 h: H3 l; q: WSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
  r! F8 m! |0 a( K, N0 ~* N" @ON TABLE1.ID <> TABLE2.ID
# _3 v8 b! A: D/ L: f% j
* q5 M( }/ u4 Y5 U7 M  ?A.TABLE1和TABLE2不相同的记录
# b. {: ?% F! _0 u' o, JB.两个表中相同的记录
# E9 `; _7 d  `C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
% Q2 }" ]$ x* U$ Z- _D.两表中不同记录的条数! G3 ~, d+ u8 ]
E.数字2& @: t2 ^2 |; v  r' d) A8 e; o

2 e! s+ c' V& J# m
2 z3 _+ q: \9 H% S0 g  {15.______能保证一组SQL语句不受干扰的运行?" n6 l* n3 s3 |, B

8 V  @& `: l/ d6 Q' W答案:____________
* G+ H7 L6 W3 k) P- H% Y) a$ \
1 K+ e0 V) G% P! k# D+ v9 b+ G& Y5 K; V, n

1 x6 D, H  u4 o% k答案速查/ @0 f  V. X" l( ]" |% ?  {2 g5 Y( ~
1:BC
& a8 a4 O  j8 W" w2:WHERE
( ~- I) `/ X4 d4 D( Q* k3:B
: K" ~) z0 A  \# P4:E
- `0 C* `, E2 T$ q5:BD. ?5 G+ D- o  p1 b8 q8 m1 }2 `
6:INSERT
3 a1 C) o5 w% u( }7:C) i8 \- h5 g% U# Z3 {/ s% Q1 ]
8:A
! A( L+ f& i- R! p; Q2 q, N8 O9:C9 \4 I" \) j& I2 I9 z) ]' r: Y
10:E
& y6 f5 f2 Z2 {1 W* |6 F8 f11:C# a3 c7 K& @8 l* ~, |
12:E; ]$ S7 P, P" Y2 `' W2 m
13:BC  R, Z# V1 @3 X, q
14:C" ]; k7 m, i/ D" z/ P6 A
15:事务& Y# H6 R0 y. u6 s2 m
# B9 _# w0 @9 p/ ], ~6 X- v

" M! P: w5 }3 m. c3 `" H1 c6 k
答案详解
+ J9 q. @3 m6 e) n/ e+ H( b8 h8 N
! @0 v+ j3 m/ }) j# C% d) t" k1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。# p3 b( e: U7 F. J

  {- d. J% t1 {1 E2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
( L# N: |  O3 m2 ^1 q4 `. p" U$ y- y8 K" f5 p% B
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。2 j( N7 t5 P; G' ]

, s# T$ Q( U3 w' j5 }" [: j$ l3 f4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* s; a4 S5 D, {( Z5 D* d& T

" \, d6 e8 U$ {3 L) I7 i8 [' J. F) g5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。" k0 c# L4 t6 I, w" w
8 q# N% T  f* e. p- {
6.答案显然是INSERT。+ g- y8 J7 ^% J- Q2 c
3 l* W- B0 a% b/ J$ ^
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。5 A( ~5 o5 D9 q; B( Z% w+ {8 M/ z7 P

1 [. V/ k: x( k7 `8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
1 f- W' T- {7 w* l0 ]
% I- W% k. y% m/ m, p9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
, g6 H( W" R; k8 r4 N, |. b
) _% y5 ~. y! c* A10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。7 p, [& L- X8 _' o( q5 `* A& j; O. P
/ h0 J' g1 F) H" F+ |( o' G
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。+ n1 d/ U( L: q# F' J/ A; z
2 Y4 k, V3 S3 w! A7 c
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
' s: Y( q$ e9 ]6 q# T, V1 f6 F. E7 b( U- p" Z! a( l
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
2 `# x/ J6 X' g2 s5 R# A0 i# ]2 ^) a* {; d
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。% b" U; ?* o+ ~1 ]
0 n7 I: ?* u2 `  k. z
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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