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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ ~6 g1 W) A7 g1 B/ PPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。9 i. U2 Y* c$ m+ \  @' X
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。' ]4 \+ \; ]$ e7 F2 b( i8 \! ?

: p0 T7 Z' n" X' {, l3 ~* M9 @2 D  `2 G% K4 d# ?0 z
问题2 ^9 m6 x5 ~* _+ B

8 y9 z6 \" `* t+ P& a1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)6 @- J4 B* I4 b7 r2 [( U0 ~; K
1 x6 q5 J7 q9 F$ o* C7 [5 R  H
SELECT * FROM MY_TABLE2 a. @/ K- K5 X
1 O  G3 M- r" ^$ [
A.如果可能,用把查询转换成存储例程7 w0 Q. V; L2 y% y
B.如果程序允许,给查询指定返回记录的范围
8 F# |% c" s4 u" f3 @4 f- bC.如果可能,添加where条件7 b0 Q* R; x0 p: t9 `* j
D.如果DBMS允许,把查询转换成视图
* C& e1 E& S" Y* d+ k# ZE.如果DBMS允许,使用事先准备好的语句* v1 {- q, c' ?! {0 X

1 m2 V! v- N7 c/ O+ Q4 z! E* ^
( g( Q0 l6 T- K% f  z2.可以用添加______条件的方式对查询返回的数据集进行过滤?/ w" D1 G3 u; j, `

( z* B# Q( w6 s% G# I; H答案:____________
8 ^/ P0 W' E5 I/ i. P" }; z1 L- t/ ]( e5 L: A3 F, b

, t; {4 t6 i; t1 ^3 t3.内关联(inner join)是用来做什么的?
# g# N- m% t- n& O& F2 x% Y/ D+ p; p, i! E& h
A.把两个表通过相同字段关联入一张持久的表中+ m. M% P9 s2 W  T
B.创建基于两个表中相同相同行的结果集
7 ?. F& H3 L0 b3 sC.创建基于一个表中的记录的数据集
3 |6 T6 X; ?2 S4 i+ N  SD.创建一个包含两个表中相同记录和一个表中全部记录的结果集  @4 y/ e; [" \+ I* @
E.以上都不对- y+ P/ x( X, L! R8 Z) o
' f8 |; u  A( O( u

8 ]( `) ~7 T( F" f/ @& J4.以下哪个DBMS没有PHP扩展库?
3 w. W5 ?8 F& e+ U9 T& _& y+ h& }0 g
A.MySQL1 T. z( D' X1 l9 P% b7 R
B.IBM DB/2
, x% e; R7 W& P$ U( YC.PostgreSQL9 ]& u1 J. p  r$ |2 s1 Y- {2 i
D.Microsoft SQL Server
# U* K/ ^8 P0 XE.以上都不对) E7 G5 a  A  X/ \
  E+ t4 u0 \! l; V- V- M( ]" r- o
5 V, a" e; J1 o& O' R
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选): K: K, x; \+ }! ?" u

7 g7 }& I, [& g" ^<?php  w% N& x0 Q. }: v& A1 r: m
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);4 i5 m& M; q. f) \' Y5 c/ t
?>
% i/ t" J" d- Y9 ]( y  E1 J7 B1 X: r# R1 T; u! b: J
A.MYTABLE表中的记录超过1条
+ Y( l) F( k$ NB.用户输入的数据需要经过适当的转义和过滤
7 {) W5 a) O/ F+ PC.调用该函数将产生一个包含了其他记录条数的记录
: J" N0 ]2 e3 n5 @3 y' ]$ HD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除9 O" F: ]6 V" K3 T; w9 T- I
E.查询语句中应该包含数据库名1 k. m+ o  u% ]+ C6 p# f' O

' e; b7 V8 a- ]1 t8 i( Q. ^5 Z6 D, D9 ]. e/ E" g1 k$ a' y" z
6.______语句能用来向已存在的表中添加新的记录。  h( C  k' r7 z6 V
& o0 u8 k( D+ @5 w: v/ ^0 ?. \, k
答案:____________9 D5 ]& J) D1 z$ w  U
2 }6 ]  P8 F6 Z
9 K5 F3 D% O+ _/ \. ?- i
7.以下哪个说法正确?
7 T; N; p" Y5 U+ `/ Y3 X" w
. q" }; t* a- W3 d, p6 S; WA.使用索引能加快插入数据的速度
! Y/ S) W- E# r+ P7 I* mB.良好的索引策略有助于防止跨站攻击! T) r$ c: C' t/ T/ O, h
C.应当根据数据库的实际应用按理设计索引
6 L# s/ [* E* MD.删除一条记录将导致整个表的索引被破坏3 W  I" X) ]- C, i# s" x
E.只有数字记录行需要索引1 u; _8 J5 _+ p1 A0 }/ Y

& Z* ^3 I% s6 N
( i& u& r" Y1 y4 ]% Z2 e8.join能否被嵌套?
4 g- u# G: w/ r! t7 [% L) |' M: C4 v" b6 L
A.能8 ]$ U% B: L$ l# u' T5 M. b) C
B.不能7 s- U* i1 m6 G1 f! L( N

$ @( D% N6 Y, s/ Z+ V# X. x$ ~  n% H! W4 Y/ F
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
9 h4 F( K6 K0 F
, r  F2 l2 n/ F! _7 qCREATE TABLE MYTABLE (5 d7 j: h) H5 }4 b# a% N
ID INT,$ m" e2 z7 D9 B7 K% d
NAME VARCHAR (100),5 c' J7 }" r% N/ x5 T- d
ADDRESS1 VARCHAR (100),% Y/ ~0 f( a& c+ @9 {
ADDRESS2 VARCHAR (100),* m4 x! K9 o, B* ]2 k! E( U% d& R; v
ZIPCODE VARCHAR (10),. M: G/ \. H/ n) [. }9 R
CITY VARCHAR (50),* J% ?8 R) _2 K. c- k
PROVINCE VARCHAR (2)( Y% S( n1 z' ~( z8 b
)1 m$ k2 l- |8 `: N8 H, p
SELECT ID, VARCHAR
! `' `- \8 h& o5 F2 \FROM MYTABLE
- S2 c4 _! `1 J9 ?3 YWHERE ID BETWEEN 0 AND 100$ _; {+ `4 ~4 x* t& o  ]
ORDER BY NAME, ZIPCODE/ ?2 ]; O# j" y
+ W, R' r9 j9 s/ m
A.给ID添加索引1 S* F1 M4 {8 U3 f
B.给NAME和ADDRESS1添加索引
; w+ I/ j; ?3 S- c. }2 [4 N/ l* rC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引4 X3 w- ]! ^( r& n; R5 c: {) I6 k7 M
D.给ZIPCODE和NAME添加索引
5 @2 k' m0 K0 v: ^E.给ZIPCODE添加全文检索
* j$ z7 P$ I' m' B$ s% W; d. ~% ^" P

4 T0 ?- Y$ k1 ]5 i, U10.执行以下SQL语句后将发生什么?
$ C- S: A# [/ V9 H5 o8 r, J; J# m' p" H- q, n) ^9 A+ C! H* y
BEGIN TRANSACTION
5 h  ^  T6 S* ~2 fDELETE FROM MYTABLE WHERE ID=1! L( l" g$ G. @; r9 J& F
DELETE FROM OTHERTABLE- U2 o+ A" l6 P5 l
ROLLBACK TRANSACTION
% c0 r6 V/ \% R$ D" |5 m5 k) G% ]5 B5 I/ Q8 j& |/ K; E+ f" i
A.OTHERTABLE中的内容将被删除5 ~; ]2 j" w: H* x
B.OTHERTABLE和MYTABLE中的内容都会被删除7 G" Z$ v9 W. a4 g+ Z& d
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除8 f: i8 K5 v. e  G3 e$ V
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化; I* z+ j) Y* J7 W/ i3 m" U" \
E.数据库没用变化: S: ^8 |$ l$ O+ }& j

3 E- s2 q/ h& F/ q! I  K) e9 n$ W4 Y# N5 B7 N! W! W) a  B: j/ A
11.DESC在这个查询中起什么作用?
& ^  i/ u- E+ ^; x9 G+ H, y& }/ W; n2 v
SELECT *
! h( A, h. Z& S0 A5 qFROM MY_TABLE
# a% F6 m' _" B+ tWHERE ID > 0  a  m. _/ h6 b9 K
ORDER BY ID, NAME DESC
, F6 [# X1 I% _& v
. @" F9 g/ g" {$ i' HA.返回的数据集倒序排列
3 o% o# O4 |1 x. p2 wB.ID相同的记录按NAME升序排列; z* C. U" C9 P; R
C.ID相同的记录按NAME倒序排列
/ p9 C2 {- t( f6 FD.返回的记录先按NAME排序,再安ID排序* n% Z+ C3 {: y# l
E.结果集中包含对NAME字段的描述
- U, ~4 ]; u/ F; R9 A6 R- x; M
# {3 M: t% t) d% R3 ^8 J4 a2 K0 Z
& U* P3 N2 G% I4 M12.以下哪个不是SQL函数?4 G3 H8 P, |  f; Z# d4 k; d5 @
2 o+ V! j/ D' I& Z& E  y) w+ O! y
A.AVG5 g0 {0 J8 t5 o
B.SUM% H; L) }% G9 I& E0 W
C.MIN
( x( T4 o/ t$ W& pD.MAX2 L& F; ~7 i) `
E.CURRENT_DATE()
9 P/ f: m" e* d" O+ v4 k6 u0 g0 \4 J, L* D8 t) X
* f) b) c2 s' N7 J0 L
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?5 ]1 d2 M; [6 A! ]- Q

! K, o/ t; K3 t+ ^' `A.该字段必须有索引
4 @7 O& I& e2 @2 ?5 IB.该字段必须包括在GROUP BY条件中
- R( k/ G! x6 M  D2 W# h' _( oC.该字段必须包含一个累积值7 g$ k" v" a- j9 n( v
D.该字段必须是主键, {5 j3 }) L% P% o
E.该字段必须不能包含NULL值
* k' Y- b9 J; G3 c/ v* C
1 B% g& D" l7 U0 A' t  z3 t- F: \- n% Y; M4 q: g1 e
14.以下查询输出什么?
* \5 B' V3 }! c1 {8 v8 z0 P; E/ j
( e6 G% d- s7 KSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
, \, T, f; K$ H, T% SON TABLE1.ID <> TABLE2.ID" @( z' q- d  e- G5 b
8 j- {6 Z1 L+ C5 @9 U+ S2 M+ n
A.TABLE1和TABLE2不相同的记录
7 \  S! c5 ^" B5 D. l4 KB.两个表中相同的记录
9 N7 O: h4 G- h* JC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数0 e- S0 h: [! P& F, c2 p
D.两表中不同记录的条数( v( F1 o8 ^: f! c) w2 x! B
E.数字2
4 L) }- a& J0 p0 Y- |# [' }6 l& [1 o  Y! p* F

$ n, {: g& E$ g3 @$ I15.______能保证一组SQL语句不受干扰的运行?
2 F( {2 ^+ {, T2 l* |% E
8 \8 L' p& ^: k5 [# s答案:____________
( E. j$ M& x- C. P5 n5 E5 r8 w( y. x' h* H) M2 Q

! B2 p  {2 }6 \3 a0 e3 m) j/ a+ g( D0 Y
. ~: f. x- T0 S  h7 O4 t答案速查
$ n& L9 R! v9 I! ?) F- A1:BC" b# f: g9 F! J# w- q: L7 D
2:WHERE* P4 K+ j$ m5 t  ]- J! q
3:B/ Q! M/ J- G. s7 T) M
4:E
0 \8 u! j4 {! m: f, \5:BD
: i. [/ @/ Z2 w  H6 H; \; g6:INSERT
* b5 w8 ^/ X* N0 C& ?7:C- D/ @4 _8 h6 w/ \! I* B
8:A
6 w( B# i8 T" Y" W: ^1 V! z: Y3 U9:C6 P0 I$ A5 Z: J; _- o
10:E* V/ E. r& m9 |( d* j8 B$ F# q% D3 X: d4 ?
11:C8 }- Y9 _7 C7 H, `4 {7 v3 N
12:E
  f/ e0 s2 D( I3 _0 G13:BC1 y1 B2 ~/ A( o8 i2 r# q
14:C
/ ~$ L8 w) K$ j4 f, r# O& G15:事务
$ S; h# k. s3 \+ T6 I& F9 z- ?3 W/ r0 O8 @+ i

7 n* C( ~* ~! B2 h+ a5 d" U& G) d9 ~" v3 ~. k5 E) e. r
答案详解5 j5 p2 f" a, J5 J: E
' T; D- p& y2 E6 H$ b: W
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
  K, W0 P, i, t. o, w) b1 k$ M, I; y& P# n6 _; k6 q8 n3 g- L+ Q
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。9 ?1 k: v! Q) F  L$ y) h- x! R( |

# x- P( ~; Q- @" o- e. k3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。# E2 x" a4 a) t1 w+ C5 r* x: E1 l, z8 X

: r4 g: P9 [; ?" o; |6 g/ Q4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
1 O1 ^! A9 S. l. j2 i; H
* f9 W& _" T% D5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
) @( p7 i% K' S$ Y/ Z* y4 ?
# S4 K. |* Y$ h* F/ `6.答案显然是INSERT。
( O4 l( ]/ ?  H8 J: h0 S! c- G7 |6 p
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
! n) h5 A1 M3 N6 H) s
' p$ P8 J: m! V' O8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
- S, Q7 Y$ ]3 d
; B: R" f' H* h5 ]( Z9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。' M1 J7 v. V6 U# E
; A3 L, [4 |7 e+ s: R
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
/ r! P0 n3 f' H$ R; l) J' V) k; _# U8 q5 o* V3 O
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。: `; Z+ }5 f( \+ \0 E1 i

% O) ?- K6 O- [: B9 s5 F12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。  a9 R& r1 ]7 x) m3 K+ X/ F
: [- S" `# ?$ O: K
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。" j" K  g3 s# j4 a4 S6 f

  b8 J+ w! O" l/ a- G14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。$ X" Y; ?# p1 J4 f

: G: [- `  S& r1 o1 v! ?15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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