获得本站免费赞助空间请点这里
返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
) s( h6 P1 Q$ b) P7 F! L2 GPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
% E) s$ {! f& `# f5 y( I6 Q本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。6 P4 \" y4 A% P* j( c

5 Q" Z6 o5 {7 t! @& H" p- V: A8 V8 j& p$ {6 N# ?+ Z1 ?3 g& D' q+ e
问题
2 G/ m4 P* |; b) j! @  |5 [+ o! Z: z1 M+ h  \& u; n* c  m6 w
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
- j" R& A% |5 h5 l& _6 ^" w7 }4 L5 F
SELECT * FROM MY_TABLE
+ J# [9 W6 n& E4 X: K5 U0 X, W
( u- V* l6 p0 V0 QA.如果可能,用把查询转换成存储例程
! E6 N3 s) e; m* A! p- \0 [B.如果程序允许,给查询指定返回记录的范围
$ B7 f# U+ a6 {9 X+ p# {C.如果可能,添加where条件$ o0 V. ~$ B" T. F- k$ o: {0 f
D.如果DBMS允许,把查询转换成视图
. t  A+ f4 a' E5 K& e' h1 NE.如果DBMS允许,使用事先准备好的语句( A5 k  B+ A. w
0 Z3 f7 g& T5 R# Q1 f- a

6 F4 u0 _9 I0 P2 T% E) h2.可以用添加______条件的方式对查询返回的数据集进行过滤?
+ t* S! A& _% `
+ q# G8 \# f3 \1 `5 |答案:____________3 m  z; ]! d" l/ \- l" i6 o
! {( q. o4 k. ?

  Z; y( |$ \& f/ F- A2 D3.内关联(inner join)是用来做什么的?
' M1 K- [- a5 Q
) i' Z% ^) f8 C% ]) p  tA.把两个表通过相同字段关联入一张持久的表中
' k: s$ ^; ]9 h) _# U0 T- n2 UB.创建基于两个表中相同相同行的结果集* I9 I  v) }3 j& h5 t
C.创建基于一个表中的记录的数据集, @  u& S" n  l. L& W
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集# _4 I/ {9 T/ o) J
E.以上都不对
: R  z4 {$ g* T& ^' y4 I: }7 }6 ^& }- o% X/ u+ m7 M

+ [% I4 f2 I& ]) I+ Q7 |% R) ?" V* k; e4.以下哪个DBMS没有PHP扩展库?1 @' T$ F% U6 y2 F2 `
8 m4 A! i- V7 I8 P9 k4 ]0 F9 g/ i
A.MySQL0 E" J. V7 w7 g9 W  u4 |, j' a# n
B.IBM DB/2, c2 j* T3 s9 e" @( n
C.PostgreSQL
7 q( a. S* j6 P2 f& wD.Microsoft SQL Server
; |+ R6 ?+ W- y2 r+ {# C0 }E.以上都不对
, Y7 Z4 V+ ~3 f/ @" j; v' U+ X# l5 p
1 w) l5 y& K, @* d9 c
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)+ |: |/ o3 R5 x! I. y3 K: N6 ]+ D

7 ~. \: M. r. w0 }<?php  r0 {4 Y- O; I; G8 B
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
3 m& H) A- x' ?8 f- r7 O# n6 b?>  \* ?/ f7 l8 v. _" @

( _4 ^( P8 z! [! @( WA.MYTABLE表中的记录超过1条
0 a+ p4 X% i6 F) Q+ xB.用户输入的数据需要经过适当的转义和过滤
$ ^- b) W& X( C# R9 M5 e# R  YC.调用该函数将产生一个包含了其他记录条数的记录! |& E9 J, I9 W9 V
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
1 K/ W: j0 c9 S9 CE.查询语句中应该包含数据库名8 o! Y$ c+ e+ C+ n  q
; S) F" {' m2 e) F6 z

/ |( i& k- z7 v# r( p% m6.______语句能用来向已存在的表中添加新的记录。3 E7 S6 z7 L! G3 E7 p5 z! Q9 h

% o) K9 J( p- g- p) j  J答案:____________- _! r% d8 P$ Q& _! n! g7 y

/ K; H" z! n% D: [: p
0 ?7 V4 M& w* d0 U# x0 h7.以下哪个说法正确?
' z6 Y3 J/ `; {2 F
1 ^3 ?6 d( \; X* m# DA.使用索引能加快插入数据的速度
- M: S  R# c" V' dB.良好的索引策略有助于防止跨站攻击  m& l- x1 q2 @4 u% M  g
C.应当根据数据库的实际应用按理设计索引
! z) x) v* F  v: `$ [' ^, f" xD.删除一条记录将导致整个表的索引被破坏# q7 j- S9 H* k
E.只有数字记录行需要索引
2 R) ?# c# e$ T; M- C6 @# ]" H2 f- J  s. t8 k, P/ ]# e

' o2 @. w7 T& Y+ p" I' v8 A4 e8.join能否被嵌套?1 q2 V; \. c7 @; ^5 q  l
) ^0 F  D, h$ V. A
A.能
5 \1 Y7 g1 ^9 e% w; l" V+ Y" g1 HB.不能
8 I% _4 `2 e( l+ H+ o3 r6 p9 l! \, \1 b/ ~+ T: G# r
1 t9 b( O+ j8 {# F% u: L* F8 l
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% C. l0 Q; m. D7 N2 O7 \! a, K/ u" Z( a; ]* D2 v6 x' d
CREATE TABLE MYTABLE (' H& m& D2 E9 _7 L% Y' c( c
ID INT,: q2 V8 ?; {; t
NAME VARCHAR (100),. f% t$ \; S6 j  V; {
ADDRESS1 VARCHAR (100),
- B6 t) c- q: e8 {ADDRESS2 VARCHAR (100),
- q3 k6 r% q( j* E, |+ \  `ZIPCODE VARCHAR (10),0 t; K; r0 I8 @. b$ _
CITY VARCHAR (50),6 o1 b2 F# H) o; N* Y1 s
PROVINCE VARCHAR (2)
. }: l# [' ^9 \1 G6 L$ M9 s)- [$ S" m% D7 X: @2 j
SELECT ID, VARCHAR  u6 K1 h: Z- ?1 }
FROM MYTABLE5 y2 Y# F* w" r% o3 {- H0 p
WHERE ID BETWEEN 0 AND 1009 g. D# W- x# y& d
ORDER BY NAME, ZIPCODE
  p7 n( q/ N) s& u$ t( ~# q. N6 [
A.给ID添加索引
7 f0 u6 ]3 T1 t' xB.给NAME和ADDRESS1添加索引
( u1 _- P3 n! ^/ ^7 @C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
1 a) C# \2 Z$ T4 v) Z  N! lD.给ZIPCODE和NAME添加索引6 }' H8 f& d9 X9 S
E.给ZIPCODE添加全文检索4 _! R  i) \" O. W. G/ H0 C" `
& H  m/ c! e/ I# T3 m' ~, o

, V9 e* v- f2 P) x, k) b10.执行以下SQL语句后将发生什么?. @% o2 u: R1 k+ f, r) E
0 L0 v5 o" J3 E8 ]; S7 A$ _1 A2 Q3 Z
BEGIN TRANSACTION5 s, M3 a  n5 x& @4 X# i" g
DELETE FROM MYTABLE WHERE ID=1
' S' T: B1 g- j3 q  s9 d4 E# l3 wDELETE FROM OTHERTABLE
1 {' j& F$ Z9 S% i) ?ROLLBACK TRANSACTION
5 E( C# }# [  X6 n. Z
% T9 a! S$ z* y0 W! q& K. sA.OTHERTABLE中的内容将被删除6 m" i$ p: U6 `, N
B.OTHERTABLE和MYTABLE中的内容都会被删除' Z4 }5 @  @$ x' d0 z2 N1 \: L# m
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
2 e1 X2 d3 b% _4 w; ~5 Y  ]' nD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化: h' C( z& B" @. R
E.数据库没用变化' T. O1 ^4 P4 e$ _$ h; I+ t) y
" Q+ p$ W% X# b
) ^& m  k! S$ T2 [3 L
11.DESC在这个查询中起什么作用?
; B' ~  \8 Y7 @0 h0 b+ u) T! E2 r4 \
SELECT *
$ r7 x$ W2 C+ ]+ h- M" [% e- MFROM MY_TABLE
& O7 M' i7 H+ K/ |9 O4 Y$ MWHERE ID > 0
7 m6 w; K' R9 C1 }- MORDER BY ID, NAME DESC
1 ?: U) n, l' w8 h4 o
6 {  m; m' j+ KA.返回的数据集倒序排列4 {9 `- w" k6 J& m) M' c
B.ID相同的记录按NAME升序排列0 X2 m8 D/ m7 U1 L) N: o
C.ID相同的记录按NAME倒序排列% i" @" e; Y) T1 Z
D.返回的记录先按NAME排序,再安ID排序5 F9 ?  ?0 }0 I& i2 c
E.结果集中包含对NAME字段的描述% r$ f3 t) S/ [" g- ]
. ]4 z) U3 v4 r. c2 x& A& m
) c3 G/ Q+ P9 Y' x) v2 \$ b
12.以下哪个不是SQL函数?
( e3 Q2 v6 o( Q' Y) l" `" x7 d
, D- ^8 a# F# ~; }) s" r* kA.AVG
0 L0 J" H. {9 m' iB.SUM
) S5 X6 ]* F+ n2 y/ w) W! ]4 KC.MIN( c$ c% \) ^3 P; |9 X$ U! t
D.MAX8 E9 [6 e2 f9 a8 r) w
E.CURRENT_DATE()3 m: U! G+ K& H; e! {

! k: H+ f: s& a+ m! ?% m
& I2 K* }4 V; U  a$ C13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?+ @- Y8 N/ K$ x; ]# A
) u1 R# |6 ~7 e% I/ v
A.该字段必须有索引  y$ [8 a: f  D' [
B.该字段必须包括在GROUP BY条件中' ^" N; e  `- L$ P' C6 S- q
C.该字段必须包含一个累积值
5 N0 F3 L0 E. v8 G4 L3 T; l1 {( h# _D.该字段必须是主键: a; |9 S, y5 |6 T4 {) T; R
E.该字段必须不能包含NULL值
! o/ m$ C1 m- M' Q. e/ D$ V" @: C$ K+ k; R* D4 ]. S% x" i
* Y: s) Q9 B1 y9 X# T# D2 J6 o
14.以下查询输出什么?
- X6 O% N* w, Y3 ^, a; _* E( M3 X1 X9 z1 l
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2% s# D' b3 Q* ^5 F2 k/ y
ON TABLE1.ID <> TABLE2.ID
# K7 D/ d$ n& d$ Q6 p
- \" T. T% v: z  w0 L: @A.TABLE1和TABLE2不相同的记录% N; F! d% S/ |4 T7 V3 u  L4 b
B.两个表中相同的记录
+ x3 U, X+ u/ o6 o9 h3 C1 UC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数8 c' b6 y' @7 S/ g2 H
D.两表中不同记录的条数
& h0 |& c  E9 h, s$ p% q6 d, m1 UE.数字2  O' \  |6 g1 ^
+ s! U) j# w4 R( ?
. z) U' K: x# x# v6 x
15.______能保证一组SQL语句不受干扰的运行?
7 ?( T. h6 {& _; l% F) g) \
% k2 S3 J8 \8 X+ Q8 h6 I4 @, R# m% A答案:____________9 e% b! q$ c  N! O" T1 I/ u% i* a

% Q. c5 ^  l3 E, y4 _
+ v6 f0 ^# I! A% U, F: C8 h" Y! b
$ k% U6 r! R  u$ f+ C: ?* q, o答案速查% b; B1 o7 I' g0 C; r7 }+ Z
1:BC
! i6 a+ J  o& H6 e. L2:WHERE
5 E/ n0 m3 _9 f/ ?4 E7 p2 F3:B: S+ w+ f+ B( f
4:E
1 f1 v! g% d, e7 S6 C5:BD* _/ M5 I8 d# n2 E
6:INSERT* p2 b5 P* z& H$ J1 k# e) P
7:C
- z5 }" B$ ?) ~' _6 ~8:A
( w( I* X  E1 j* N6 O& \9:C
0 J" C0 R. V4 P/ h6 m) Y10:E4 D; m2 p2 F/ {3 N7 x
11:C8 V/ W" f. e* v; O9 A1 [  i
12:E5 Q, @# z1 X7 [. [
13:BC
6 x0 l3 D2 k: p- j14:C
/ M+ h. m; N. f* W! v15:事务
4 c+ k; }3 T. B( O) Y, k; h% ^/ ?
- O; O4 }% t9 S* v. H, q# e8 ]# e! F0 p
( z, X+ U8 q4 D$ U' n! c& E
答案详解8 P. i: ^" x8 b

# q6 s4 Y7 t+ [7 G8 ^4 C4 ^1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。5 F' S( s! D; `, ^& ~* ^" A7 ]
3 b2 z% n% _' {) B% _
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。$ _3 K( V; q6 ]  I/ R2 N+ W7 ]

9 G2 z3 K) {0 P7 I  j3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。% l) P! x% O0 q3 q* R& g
# z' e% a2 p* O/ J2 U
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。/ ~# ]; Y- ]$ r/ R

* K0 H, L- I: p3 Q0 {5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
/ K% W2 k9 v+ D+ R& m, M( k0 i. ~+ ?6 _
6.答案显然是INSERT。
" d; q) {) T- V5 N7 {1 _/ K* v+ E6 p2 I+ ~4 B
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
9 P+ b0 M4 N6 ^+ |
, t9 r3 q% b( @/ H5 v, Y8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。4 |: @. O1 G- g) o" X

/ w0 m% V" h* r( e0 B7 ]9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。4 e: n6 {( V+ y9 b- `. f9 y9 I

, @) Y* u6 E0 Y! j4 Z* P* K! h10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。; f  \; ~! f7 w5 f1 t% A( P' Y

+ l, e  a! P  c1 o2 f7 j11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
3 S# R7 r6 F) V! K/ q5 t* f$ U  n; u2 h
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。( a! H9 h; B+ Q. J  `
1 C) ]  i" [! ^8 j5 n6 |0 V+ y, O
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。+ g& U: _7 L2 s" D
* _* B6 V* P) p7 P8 ^
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
8 I6 U) ~2 f5 i) C
" ~* w; r' j8 C; P15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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