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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。* X2 G% [' I) K) G1 o
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。" G& w" P$ E% U$ \' u" _
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。* w; M' [3 b7 w3 `, e) p3 J
) w3 F; K1 v3 q( X8 E

2 T5 O/ C0 _$ i/ k问题
& ~+ f4 I4 c) P9 X0 n- r8 B$ L& y
* t0 f* {- s" _) _2 X1 q1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
4 ?# o0 ]# ^5 y, R* g* N' T& ?
4 ?; g1 R; u; U- P# ^0 J  SSELECT * FROM MY_TABLE
( N8 M4 V5 H4 B+ E) A+ |9 h% }- e2 Z+ \+ V
A.如果可能,用把查询转换成存储例程" b, s# M, Z0 D* |) g% ?  D5 M. Z
B.如果程序允许,给查询指定返回记录的范围, p& B- ]- U1 E6 w- k! }
C.如果可能,添加where条件
2 k) |0 F/ o) {- V2 g  BD.如果DBMS允许,把查询转换成视图
- z3 A7 n3 f. r* RE.如果DBMS允许,使用事先准备好的语句
. d1 L. J1 L7 Y2 K6 w( n  ?) Q
' e1 z8 D2 G8 m
- A7 Q' y. C, E2.可以用添加______条件的方式对查询返回的数据集进行过滤?6 a# f7 G) l! p8 a" u/ t
% b+ R. N! z& |) t0 f1 O$ R& s2 q
答案:____________
! M- @& C# }& k5 N- k, m' }, p- h% a* G6 Q& E; Z; [; M3 ]

" J4 b( M6 H3 k# p. y. w3.内关联(inner join)是用来做什么的?: a1 ]( C& i$ D, E9 ?
+ s. L  m. i7 U- L  M
A.把两个表通过相同字段关联入一张持久的表中
* V) i+ ^9 J, i$ ^" f, }B.创建基于两个表中相同相同行的结果集; u9 Y# G# [0 }5 ?9 B% B; b) v
C.创建基于一个表中的记录的数据集9 @* G3 m' o1 }2 D( k
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
2 |: k4 ~) R: G8 s# I5 z4 mE.以上都不对
4 T3 g9 h& g8 ]3 g4 n; o) g. X& P* l; r5 C

: W3 E/ b5 I7 I) p8 b! D4.以下哪个DBMS没有PHP扩展库?0 ]) R0 n+ x0 s: o# x( X9 r$ T

; U' D. ~# \. _# WA.MySQL) u  O& p  c$ [9 D
B.IBM DB/2% A' J% S  d. i, s
C.PostgreSQL
1 P: Q% O, p6 u* @) @2 ~- nD.Microsoft SQL Server/ ?4 P  z8 S3 j
E.以上都不对- `/ B7 W, ^; x. C3 j; ~6 z
; ]$ z2 Z6 s* |$ F0 n
; J5 W) S% X; y- Q- [: R5 k
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)! L4 {! y3 G. N  ~+ N
& H: }) V1 }4 I- |+ U( L
<?php
6 ]/ F3 c& v1 [2 y$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);9 N9 K, c( H( s
?>
) C& K" D9 T  T. n* w- f4 X
' ~; [6 }4 @% Z8 f0 V2 H" vA.MYTABLE表中的记录超过1条2 r: b7 K' Y3 Z1 }* d8 ?
B.用户输入的数据需要经过适当的转义和过滤0 i' ^" V8 |2 K( S: b
C.调用该函数将产生一个包含了其他记录条数的记录
$ {, A, O) C& f% G& V0 V1 ID.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
  V* E0 P' C* c) C0 i3 fE.查询语句中应该包含数据库名- @' H8 e1 j9 j7 d& `: _
! K* Z6 O1 x7 S  _) I$ R
0 I0 E' u/ ]6 Q) v
6.______语句能用来向已存在的表中添加新的记录。* X4 v& h8 w' a5 x5 ]
) p9 U9 G' M- \# O# Y6 K
答案:____________- V5 t) \5 G( {+ V+ M3 O

  a" c+ }- A& |# j# y9 p0 [; c3 k% N( |
7.以下哪个说法正确?
4 B! A/ F) q" X7 I- |& F) \1 V0 W/ i, L# I: }0 P! s% V
A.使用索引能加快插入数据的速度
2 y2 G% S# }7 B' l. G& B) PB.良好的索引策略有助于防止跨站攻击
$ l+ R( y9 u) \C.应当根据数据库的实际应用按理设计索引
/ t: @/ o# j( Z3 sD.删除一条记录将导致整个表的索引被破坏5 ^0 ^( R' v2 {) ?- M
E.只有数字记录行需要索引
1 ~& Z% `. |: Z
$ B4 u( G4 Z* }4 s8 |9 H) O6 ?; P8 w0 o( I
8.join能否被嵌套?
! f' p( _5 d) Z! b: m2 P3 x: {. l9 z: N9 W+ P6 B% t9 @
A.能/ e2 I1 D0 t; b; Z! T; u( `
B.不能3 t" b* G9 n6 I1 L) T% Q) C, `) v
" ^+ g- g) U, T( E' }

5 E  Z. ^& k9 G" O- ?  k$ R* _9.考虑如下数据表和查询。如何添加索引能提高查询速度?! w5 ~8 f, D! S& a
1 Q2 _) d& m9 e. m4 k9 `1 h& w
CREATE TABLE MYTABLE (
& \- R; i% E4 t* J$ e. A, JID INT,
8 I2 `& K0 f6 g7 `5 Q. QNAME VARCHAR (100),
7 b5 k0 E1 i7 X' ?' aADDRESS1 VARCHAR (100),. q/ ?2 S" W' w7 Z( W/ ?
ADDRESS2 VARCHAR (100),7 y+ K" ?+ f% J
ZIPCODE VARCHAR (10),. W! h9 E+ E1 f! s5 o  h9 j
CITY VARCHAR (50),7 ^  K! h- x$ ~+ W+ o  z3 i
PROVINCE VARCHAR (2)
: j. L* H5 i9 O. o)
7 a' b9 ^, y; j3 ?( ASELECT ID, VARCHAR' K8 ], s9 ]# R9 }# C) u2 b" K8 E& ^
FROM MYTABLE
& C3 g3 @8 X# w8 ?/ O! tWHERE ID BETWEEN 0 AND 100
( X' x9 e4 F5 F6 Z# L' M0 sORDER BY NAME, ZIPCODE
( b' e8 ?' r8 r. J. [" S6 _; B, y0 i3 n
A.给ID添加索引5 W3 p1 P7 F3 F5 S1 b8 w5 y+ t
B.给NAME和ADDRESS1添加索引
% \) o- l  U$ c9 n& \C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
3 A, H+ \7 A7 ~) o( k7 E, o6 uD.给ZIPCODE和NAME添加索引
- y) I5 w. L. A' ^; K' {E.给ZIPCODE添加全文检索
- \/ y6 Z6 x0 w0 ?$ V6 |( V  z: z5 j
9 r. |* O4 a% D$ {  q% T$ z/ l
10.执行以下SQL语句后将发生什么?
( [- B" Z( s1 Z+ q  j% b- v7 {6 P
5 s, q% o. j' Z' p8 V& gBEGIN TRANSACTION
+ `5 N+ y- w; O9 e: KDELETE FROM MYTABLE WHERE ID=1
7 p6 K6 y0 l0 \DELETE FROM OTHERTABLE. ~: T/ p) r3 p$ ~4 r$ C1 C
ROLLBACK TRANSACTION
5 o7 ~# ?# D; w  S. T  L2 a; C8 S" L5 N# r
A.OTHERTABLE中的内容将被删除$ N4 j, m% A) g  F  I6 Z4 O
B.OTHERTABLE和MYTABLE中的内容都会被删除
! z. U" I( J" R2 r) \  {- Y, MC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
6 S. U/ b/ {9 l( W' c3 [1 bD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化' \9 x9 L/ ~5 z+ l) F4 I
E.数据库没用变化# O, J2 P0 _! w0 z7 K

% z' |/ A3 W! _/ Q; Z! \9 L' H- P& J* s4 h
11.DESC在这个查询中起什么作用?
9 b- t5 s. `7 \! h% R
1 o4 U  G* Q) z8 eSELECT *& M2 a2 z$ }. d: s
FROM MY_TABLE
. B+ v: B7 ?) b5 gWHERE ID > 0
0 M4 m# _7 z5 \1 ]# CORDER BY ID, NAME DESC% F! t% {3 w! t) V' Q( h
5 C. o1 s$ Q; C  j$ k, G7 o% v
A.返回的数据集倒序排列' j3 m5 M$ H! O1 U
B.ID相同的记录按NAME升序排列' w9 P. H) e# h
C.ID相同的记录按NAME倒序排列
9 J' U4 `& z3 XD.返回的记录先按NAME排序,再安ID排序& l8 v' Y$ I/ [; P: Z
E.结果集中包含对NAME字段的描述
4 \3 b/ c  `: {
6 @! W+ K+ Z6 X3 A7 o% ?( \8 r! G$ w& w
12.以下哪个不是SQL函数?# M' q% p' C. C7 o
/ d! o3 d- T& ^/ K4 j
A.AVG0 x9 f" d& r# p. ]) V
B.SUM
( R- z) g' [; q+ S' vC.MIN# J+ P2 |5 {. c3 _/ i3 P
D.MAX' S4 N  ^& ]  l% K' t: U6 M
E.CURRENT_DATE()
- W0 K0 e# F! I& s% D1 L, N9 \" j0 f0 i& b' Y

$ e/ l$ _1 X( X- O2 `) u8 w# x) l13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?5 Q" d1 ?7 ^. r' `+ K2 y) @
2 Y; B7 M. k7 Q9 l) U8 H1 l7 T+ a
A.该字段必须有索引* f9 ~+ ~- Y( e0 O6 T' u
B.该字段必须包括在GROUP BY条件中
4 V! g& }, v7 I6 bC.该字段必须包含一个累积值8 W+ C7 ?) U: P: t& z! |3 L3 ]
D.该字段必须是主键
5 e4 n' i* T# x$ rE.该字段必须不能包含NULL值
  ?" E- `1 ^8 Y. a; }+ o& B! V, k: ~2 i/ f' o

  d! z" Z5 x/ I/ l' n; I" D14.以下查询输出什么?+ Z! u6 E. F* g+ E3 v" R

, B( m( r; X- k% {SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2$ ?4 g2 q; T; X6 r0 S1 }
ON TABLE1.ID <> TABLE2.ID- i# B( ]1 ?; B
+ A; }, j: u+ v+ r. u% |
A.TABLE1和TABLE2不相同的记录
- r/ C! \. ^. ]0 B8 }; c) G% z, wB.两个表中相同的记录. L8 e, s% M. y/ y+ ^8 d6 O+ y: q" h& z
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数/ G, m/ ~8 ~( p$ E
D.两表中不同记录的条数
" K' B8 F$ x7 ~- sE.数字2
5 i# v* m0 P: s( Q7 y6 L+ c2 x
" R, u$ p1 @8 J+ l5 r" \
/ n; \' a3 `& d- a15.______能保证一组SQL语句不受干扰的运行?) _  v; f% K. r1 H( I

. o6 u% b# ]* t- j答案:____________
) s4 N" }6 S  |0 V: \* B5 P
0 b# e8 N2 `  p* h7 D5 t0 U( R+ d0 V8 R' E$ y9 n/ _

' D& h  g, l5 S8 X答案速查9 W6 y6 y6 a7 A/ ]7 h! x" \1 H
1:BC8 f" p/ @6 u, X) u: `
2:WHERE
: S, s3 G6 z- s2 l  ^% o7 i3:B  v; L$ V: @' k
4:E+ d8 A6 P8 P- X* F- {8 }1 k
5:BD
* w  y0 Z5 I1 p# }9 J: c6:INSERT! a/ |. l' o2 v) m+ m! ~; v* k
7:C
$ X) q0 w: S) w  n1 m0 m! N8:A
! N5 C; d6 l- Y% Q. L9:C
# _' r! ]: |% {. \10:E( s& [% A3 J2 e+ f8 L. n" z
11:C+ }5 g% }+ d$ W& r# ^, k% w4 O+ s  u
12:E
% ]. ?& ?6 {& O$ I  O. }8 `13:BC0 W1 ?3 {: k9 c" Y/ i. X
14:C
0 H  \7 u8 O: G. F15:事务5 q3 k! B* A" X/ N( W2 h2 G
9 ^# g: k4 z6 g, m* J# e0 ~
  o3 t% {: q9 K# P/ d7 t9 }" _* t
) k4 O8 V) I( i
答案详解! |' U7 m3 w; C! J4 t$ |

' x6 _# L5 W* i( x6 H! i2 A1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
4 o0 P6 h; H; @: P5 g! a% H. K3 ~3 s0 r# b4 [: p
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
6 s" I4 A9 D2 q9 q
: w3 O* P& K( S6 g1 d3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。0 F. Y/ E1 [9 \7 r( m2 [
# u" n7 p3 [- `9 P
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
7 A; ^. Y: q- [: m, i& b/ ^+ ?9 O* T$ a
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。* b. X# N5 R9 W1 i2 ?% V+ k) @

; d3 _2 @! d  ?! G' q6.答案显然是INSERT。
1 p9 S: q' n3 j5 t: Z2 d
2 O+ W6 t# T/ k7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
) b5 c5 [- U( U0 n2 ]8 X2 _& ?8 S. P/ _6 y% z# l. ]
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。7 k" H' {2 d1 B# O  g5 o
9 r; ~& _% V' ]7 J( W6 k& k% w
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
# M) E1 l3 E* Z
: u7 M2 [+ A( q+ a0 B10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。# y: Y' g3 t# U  B
& }. b) x' M  b; ~$ [
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。0 ?5 G; W/ Q1 c7 J4 F

2 ^7 ]' q# F% ]: o* s# c/ o12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 ]' h! `/ q& w" P# r% _9 a, s; _9 |* F
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
0 T% a7 [7 m" M9 D* w( A; f/ C' a$ Z+ ^! K' x( j! p
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。2 s; G; q0 e; _9 Q9 f
5 A, k8 U* I+ y6 V5 P
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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