返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。( ?* w4 V: X5 W" c7 ^# F
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ ~! z5 ^& ]6 Q3 ]本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。6 ~3 t' J3 n9 G5 i$ h, I

" ?" A8 k7 v; d% w
  i2 B9 W8 I4 z* h问题
+ [5 v4 X3 T1 F, n0 K& @3 _: A3 [3 G6 ^- }) L  r# w' M
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
4 g* n( j. H+ q& H* m
7 i! B2 P/ x+ j3 y4 V8 I% rSELECT * FROM MY_TABLE
4 F  e4 z! M- ^, j+ u2 w+ g8 e+ X
A.如果可能,用把查询转换成存储例程) i* `& k$ x1 r" H
B.如果程序允许,给查询指定返回记录的范围7 P7 m( Q: h: C% J
C.如果可能,添加where条件/ y7 w1 t! C  L* u; B0 x
D.如果DBMS允许,把查询转换成视图% x6 a" J8 \, c9 }2 U  `3 x
E.如果DBMS允许,使用事先准备好的语句& J  W9 ~' n8 r; |# N

) `; m: [% }: {+ b0 m4 |7 ]" X# k" ^3 [
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
* I# ^& y4 A1 w' H& s7 ^+ b3 Q7 P7 g' `
答案:____________
5 G3 J- B1 O2 W) f  {" ~0 S7 T9 i, B/ Z# U
( b  P9 h9 @1 u3 w  O. g2 b3 U
3.内关联(inner join)是用来做什么的?8 D; i) T! q5 G1 J: i1 ]/ q' s5 G
; n9 X' k% v  C9 M3 z; U5 t+ [
A.把两个表通过相同字段关联入一张持久的表中3 \! I( r( w8 K8 ], f
B.创建基于两个表中相同相同行的结果集3 r0 `) s$ _# J4 w/ d( B
C.创建基于一个表中的记录的数据集% @$ P' w, }& ]; A9 X
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
3 v! D' ?' x6 `E.以上都不对; _5 c2 I' |0 E6 s
& V- U5 H/ Y. m  }( M
$ b: |: l2 G' C' g
4.以下哪个DBMS没有PHP扩展库?
, y7 {) m: s3 J( i& N1 v3 a% E2 k' D) s) @3 S
A.MySQL
* l+ E9 G2 h/ y7 y2 d1 X+ aB.IBM DB/2% ~1 T. C2 b/ [/ s5 Y
C.PostgreSQL4 A* Z& f& q  h; Q5 ]- F
D.Microsoft SQL Server
, t- i/ F! q9 o! CE.以上都不对
3 k" N% j! u1 k/ A' M) |* M  |; p( Z; |  e9 P1 s' S

: A3 p" N! S& i3 }  q! G5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
& s0 V% U& V2 K# G
& Q- ~* Y5 x2 p9 c+ n<?php/ \. I" L) |( b$ _$ a( i
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
6 y2 p6 z: y1 z: n# \' @3 m?>
3 T4 H# N+ G! @, D$ R& Q
" X3 S* U1 P( Y+ Z' xA.MYTABLE表中的记录超过1条
! C( e! L$ d& D: E3 {. G8 cB.用户输入的数据需要经过适当的转义和过滤! d( T5 _" e/ }: H/ F$ c
C.调用该函数将产生一个包含了其他记录条数的记录
& q9 n3 P' ^1 |) X: N! \D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除3 U' x0 [1 |. ]/ C3 _$ ]
E.查询语句中应该包含数据库名
0 q' ?( k4 S* s) I8 u0 V! i4 o. o) g9 S  a* B& c9 b# A
7 U8 {. c$ @, N& Y) V9 `% q
6.______语句能用来向已存在的表中添加新的记录。
0 p  Z+ ?* j. [
$ J! Y$ F6 O. V0 w答案:____________0 d, o- P$ B8 _- k6 [( Z# t
* E* C/ p+ e2 `
3 Y% {( c! b' B/ T
7.以下哪个说法正确?$ z" K) \8 j! H7 i% Z

  A6 F1 u9 m- B) ]* b3 IA.使用索引能加快插入数据的速度
1 t% p9 `8 F0 g; W: u- SB.良好的索引策略有助于防止跨站攻击8 K0 Z) {; e. s: z1 F; y
C.应当根据数据库的实际应用按理设计索引5 k( {" S1 `5 {) E0 B$ K* r
D.删除一条记录将导致整个表的索引被破坏
, @5 v3 v3 @' z( I& r" `+ \& VE.只有数字记录行需要索引
2 ~( `$ A3 e; v% s+ d2 B: l6 h6 c/ w& G
& V9 }/ v9 N- N+ v% b  d/ k5 k
8.join能否被嵌套?6 b9 @3 Y' n) V7 ~+ l3 Y
1 S  K; x( m; X; P0 \- y
A.能( q& o. s2 h6 t. c# F
B.不能
7 l" \' y: H9 [. C2 D; l9 X' J
* e# o' P* X! \2 m$ k  f0 _
% }6 L/ [( M9 c9 k% _1 F9.考虑如下数据表和查询。如何添加索引能提高查询速度?! G2 s. W7 {- [$ J5 T1 {4 Z( [
! w7 u0 L% U0 y) ?; F
CREATE TABLE MYTABLE (7 J, U- G4 g! a; W  M
ID INT,+ D; a7 P$ l& V) |5 b
NAME VARCHAR (100),# o( s/ _4 d/ h: U' n1 Y
ADDRESS1 VARCHAR (100),
* t# O5 v) d! H0 g& n0 F* f+ VADDRESS2 VARCHAR (100),+ G( N5 ~" A  m! l. A
ZIPCODE VARCHAR (10),
! y$ ~- ~& E; QCITY VARCHAR (50),
9 `( j4 K) N$ z0 v$ ?" lPROVINCE VARCHAR (2)) W, X! j6 v6 C7 O. d+ N
)2 T# H& M, ?* k3 r
SELECT ID, VARCHAR
& ?( J8 o7 I9 L2 q* ZFROM MYTABLE; F. v1 {! T3 r# z
WHERE ID BETWEEN 0 AND 1009 E1 Y& m8 ?9 a
ORDER BY NAME, ZIPCODE, Y+ ~7 W* d2 d0 l7 ^' h9 V1 x9 U4 X
2 }& i7 z8 ]# L1 i6 j
A.给ID添加索引( I) `% ~0 a/ b7 z
B.给NAME和ADDRESS1添加索引
5 C- L7 |! {0 [* ]  y* H) HC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引9 N3 m  s+ W& y" }6 u
D.给ZIPCODE和NAME添加索引
/ B/ D( C! A. i8 A. C  y8 N4 JE.给ZIPCODE添加全文检索+ v6 P! x, _2 x- Q( h
$ N2 Y8 s# p( y/ S( Q
7 W+ t# h' B4 F. j+ z* L! W3 D, Q2 k
10.执行以下SQL语句后将发生什么?, t  n8 [3 K! r+ j" u

7 t+ m1 l$ f7 a3 L; yBEGIN TRANSACTION
- q4 z/ ]1 _& \/ f& u  Q, ^* W2 u0 BDELETE FROM MYTABLE WHERE ID=1% u- Y" I' K) R# y' h) S8 G8 Y$ f
DELETE FROM OTHERTABLE* J3 X2 c0 x0 H$ }# H% x, R
ROLLBACK TRANSACTION
- _& u$ F* H5 p7 q+ [, O0 _
! t8 r9 }& s- N+ |- GA.OTHERTABLE中的内容将被删除
" n" f* P( v  T& z6 ^1 OB.OTHERTABLE和MYTABLE中的内容都会被删除; |' t! X( B  b( ?4 g) [) s
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除+ [' ~, t( t+ V% C2 V$ k, d* N
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
4 R6 v, N5 F$ C( S3 eE.数据库没用变化# w* j# H: i* {! c* D$ f" n

3 c" @7 D& }; D. M
8 a5 S% V( f$ ^6 {( o4 K2 b0 w11.DESC在这个查询中起什么作用?9 u7 j# e2 G" z! O, C; E: m
+ j' `. c8 ~; o
SELECT *" P: n1 K9 w$ d
FROM MY_TABLE
4 H6 D- n6 I2 [0 H: V7 D5 _1 r6 ^$ oWHERE ID > 0- }( F( a# `3 W
ORDER BY ID, NAME DESC
( i( w3 Z9 u' {1 t8 x8 l$ S2 n" @) f1 x2 a, e' S) w4 U& x
A.返回的数据集倒序排列+ @7 }+ G5 k5 B7 A5 V
B.ID相同的记录按NAME升序排列5 d/ }  `  C1 {
C.ID相同的记录按NAME倒序排列* P. u+ g- M8 W) c  R; ]2 P
D.返回的记录先按NAME排序,再安ID排序
* _3 z' D: P* e) ^E.结果集中包含对NAME字段的描述) `3 f1 p/ \, }' |
' _# h6 Y5 w0 K) T8 G
, ~- c& X( q# f# i" j% T5 N$ M
12.以下哪个不是SQL函数?9 ^! u5 q8 K) b4 ~/ c

0 J7 Z& Y  q! f& l' OA.AVG
, u; w) B  H; ^7 E5 n4 UB.SUM
: Y8 O9 y% D; }, A/ AC.MIN" d: j) M% i! U. X1 h: K! @
D.MAX) p3 K! k2 F$ d
E.CURRENT_DATE()1 C% }; b0 k& U" g1 k) n6 ^

- f$ [! F+ i8 e0 H& ~, g
* }8 u, c% T0 _13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?+ X/ E1 H; ?0 x; Z
* q, T6 K3 R1 b5 g7 O8 J
A.该字段必须有索引7 U0 _3 k  S2 O8 s7 D9 v! J6 g
B.该字段必须包括在GROUP BY条件中
* T& l3 a& |; g' x  FC.该字段必须包含一个累积值1 b, U) P8 Z1 @! ^/ B' L- T7 {8 p# X
D.该字段必须是主键3 Q4 A% ?1 [; X; |! |
E.该字段必须不能包含NULL值( E% G" m: s8 [& o

8 _6 ]. ]: U7 E+ M- M- v
. v2 k  n& t+ G' j14.以下查询输出什么?
5 s, x) t. J& ^7 r% d& Q) \
5 i3 F# R  k0 M* @) S  YSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
9 o4 {5 t5 {" D# @ON TABLE1.ID <> TABLE2.ID9 ^5 Q5 {* [3 t/ Z4 I0 u( M
2 V9 h4 q* `0 H' F8 D
A.TABLE1和TABLE2不相同的记录
1 B& S* [0 W6 ?+ Q7 vB.两个表中相同的记录4 d5 w8 R  c1 O# X. D+ X4 \0 m
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数5 c% ]3 J/ f+ \7 Q6 l+ Y* p% L
D.两表中不同记录的条数
* s; g$ [. k/ N+ p0 |E.数字2
7 N; D) F) E# M) \
- `$ U* K: {) B% @! J/ D, a2 J7 ?* s9 M' {0 e
15.______能保证一组SQL语句不受干扰的运行?7 ?1 W9 g+ r) r; t0 @, S

& u* E' u( j. z' H, O" {9 e答案:____________
- W1 y/ [8 v( h- W# O* V2 L4 G, Q9 p( b1 p2 U  t
- o( G, A- V2 v2 Z1 D
5 x. V* M& L% V, I- ^7 ~
答案速查4 h8 I# n7 X& V; D# s
1:BC8 b6 J+ z4 R2 Y( E
2:WHERE
" s" `) S5 G- j& Y* K3:B
5 f6 m$ h  F* g4:E
: `9 Y' g% ^- K" c4 }3 J1 b4 @! L5:BD9 k& `7 G7 Q1 P2 r0 d/ Q, B
6:INSERT
. ]1 ?% L! r+ D7:C
! X2 W/ ^1 L8 |8:A! u, T$ T; Y2 w6 M6 {0 U8 ]1 F
9:C
) A! U6 h* a5 }10:E
9 \2 S+ M+ u* ~9 E5 I: f$ I6 n11:C9 X: M# z' ~. w3 [
12:E
$ I6 W. b* |  k13:BC- Q! y, h, ~; k4 F
14:C
" I( `: N9 I, B6 }+ r" f, g# `15:事务+ r: Z: E  V1 ?" _

. ^; ?0 ^8 a; X; p; ?  L4 ?! w7 }# l7 I  s; i) ?; B* R; f
" s! Z, [% D2 L) A$ V/ V
答案详解6 p( X4 j3 _: r% L
6 A+ c& l. H7 d. O# |. v$ k( |
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
( F: g8 b+ x6 \1 S( t8 ?9 y  N
$ [& b& H- M6 {+ [( _2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。7 z& K6 W! [; z6 i
& ?5 y4 A3 Z9 h) C& [9 \# `4 w
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。$ n- X( g# \8 W( o) |

( r+ U/ B" o& m6 E. @& g4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。( K( [2 z* q3 [6 e1 o5 ]  h
, u8 L6 H5 r) M) [! a& l: g
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
) w- \/ G; C! a- w$ s
* ^9 p; w7 A# |6.答案显然是INSERT。9 Q- ]. F& n! _- t) @0 v

+ [+ \8 J- T8 c6 o% V7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。, i# N! V4 ?" F; e4 U! x, I
4 G: u9 i9 E' y0 S, p) A( a
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
$ }" x. O, }  w% t- p6 C: w' k* z. e7 z* n
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
0 x+ [3 r) g( j1 G7 X6 ^8 |5 z
6 K6 _" {2 U1 t, i1 _10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
' d; V- n4 P! L7 ~  A) a( B. t) Z) c
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。% z7 h2 ^  i" Y+ r4 o) H3 }8 s" n

! B. p. P* v4 b7 W" V12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。) m) e9 P. ~  ?: F. P; w

& B: ~) `' X" t7 q6 G% Q& s; V13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
, ]7 k, W$ I1 v6 Z( t7 K+ w; T8 {' f
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
' l& K( }9 ?& z9 Y4 }5 K$ z3 M, [7 D4 F1 `
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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