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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
! c/ z" E! Q+ R. y. DPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。6 b- k6 V: E7 m  _5 C
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。9 V% o* ^" R6 k8 }; H. P' A
  {" _7 _& M3 J+ P

* R, s) b5 G+ E$ E问题8 b0 _; I7 z( n8 X8 }/ W# r! R6 K& G6 n4 }
5 b# A3 v8 v9 n( h& F2 s: {
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 S7 c3 {4 j0 q. R1 X
: X9 E/ w  Z5 V8 ~) ?
SELECT * FROM MY_TABLE" {# g: t% k! X+ T# ]

4 T( v8 k& ?& s# h+ i, w% {5 r' \* n# YA.如果可能,用把查询转换成存储例程* v: }3 @* t! L/ N
B.如果程序允许,给查询指定返回记录的范围
, a' r, [/ D2 IC.如果可能,添加where条件
, {# l' y4 O# {( L9 O! M+ w  ^6 _& \D.如果DBMS允许,把查询转换成视图
$ q. W1 b9 \) b4 U/ K" H! cE.如果DBMS允许,使用事先准备好的语句5 t7 j* F7 g8 H  @! O
. g1 j" Y4 @0 M

- W: `3 V% G& k2.可以用添加______条件的方式对查询返回的数据集进行过滤?
4 i" p+ l; P- o3 U; ]3 [7 T9 X8 n% k/ U9 T6 X; H* y' d0 [5 Y" I
答案:____________
8 A0 ]% \* ]: H/ H" a$ ~8 ^$ _. }4 c0 k* w) q$ \2 X9 e4 x

/ k2 E; S2 Q3 ?! I: V; R3.内关联(inner join)是用来做什么的?
/ d' m4 Q7 A# R# H( v: r. I# \) D! I8 h; I/ b% Y
A.把两个表通过相同字段关联入一张持久的表中
9 l. E+ Y5 Q0 f" @% B* s' K) UB.创建基于两个表中相同相同行的结果集& ?: C* |+ s; S% `; z# {" L" D- C
C.创建基于一个表中的记录的数据集
$ H5 N6 p2 N/ Q9 {9 V! yD.创建一个包含两个表中相同记录和一个表中全部记录的结果集0 |- N% x# |! t4 s& `
E.以上都不对3 r* U7 ?7 f5 P- J( B. J/ v; Q: W

6 v; V4 U$ p2 T+ J* \3 Z$ _) L1 ~1 C9 g5 X! J8 D1 o
4.以下哪个DBMS没有PHP扩展库?2 x, B- G; m6 @) L+ r7 H3 c% t! T

4 M+ ~; H) o# _$ QA.MySQL
# u' K6 c4 r$ o5 k/ q6 M! dB.IBM DB/2
/ P& X% b: Q6 O) [2 Q7 P# r# ~C.PostgreSQL2 C1 o" h0 d; [2 v: z& ^( _* q8 P
D.Microsoft SQL Server5 b7 G* s$ j2 `: {- f5 d3 d
E.以上都不对
8 P6 v' ?1 B$ E+ R1 q$ K5 f- }9 C' E1 o- ]

7 w8 g$ W- q; t9 r" f5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选), I+ c3 X  s- a7 [. N# M
/ j) _5 G8 P' _+ N* ]5 ]
<?php
  S  P) Z& y7 ~8 J; k. c% N$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);; i0 Z' W, C1 I3 V' Y- p( M
?>! p* q, J& D' r' W
) K! V# Q/ t+ ]+ m* ~* C0 w7 X
A.MYTABLE表中的记录超过1条
! ?9 h8 F, [5 d# bB.用户输入的数据需要经过适当的转义和过滤
) M# x9 W9 N4 ~; s* J+ i- ~C.调用该函数将产生一个包含了其他记录条数的记录
8 M' u3 j; X% X0 GD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
& y1 c  o& L- aE.查询语句中应该包含数据库名4 W* N" Z: e/ e3 c' b- y

/ C8 P; N$ {2 j( a+ \% L  P+ J1 Q; f' R, C
6.______语句能用来向已存在的表中添加新的记录。
7 y9 r5 B+ Q. m
+ z) o; x2 m0 U8 s! d答案:____________
9 j& J; X& }2 Y5 z# K% [! R- D: a
. Z, h: M' _; c
7.以下哪个说法正确?3 _* Z" r6 r) @

) @, k! g% x% x+ A/ M) J/ RA.使用索引能加快插入数据的速度
3 p* K; T/ @% \0 e: KB.良好的索引策略有助于防止跨站攻击
" C, w8 \+ R7 T1 NC.应当根据数据库的实际应用按理设计索引: \3 X- h# `+ T5 i: Z/ `( y' ~
D.删除一条记录将导致整个表的索引被破坏
# c0 Q$ J7 T! ]" WE.只有数字记录行需要索引
6 a6 y% O2 W, a9 b7 K2 p
8 Y8 d  w  w8 T  j$ N
) q' i' D" H2 S( z' Z+ u  H8.join能否被嵌套?# B5 ^6 m( h4 F' b; @7 o; e$ M

8 |# U7 C  X- e# sA.能! w; _/ ?; j3 S& E5 I- w/ y3 `
B.不能
6 b3 \2 H- ~- t. x( _$ s# H( ?& f. h: i. _; X4 k% _5 X
- K8 |) l- n7 e
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
7 W$ w% ]& W8 A; q9 A
- L) G1 c3 v* |! CCREATE TABLE MYTABLE (; w7 C2 z' w; e) g% b
ID INT,) i- N. h6 J! F# T+ K
NAME VARCHAR (100),( I! G% {" m9 M0 C. u+ u1 w2 V
ADDRESS1 VARCHAR (100),
3 M% Q, Q5 ?" pADDRESS2 VARCHAR (100),
7 _* A" O8 A9 X6 o' r/ PZIPCODE VARCHAR (10),! R% y) s9 e: w& G
CITY VARCHAR (50),- c( v9 ]+ I( O. f& X
PROVINCE VARCHAR (2)7 j' ^3 K! Q' J
)2 Z2 p. T% i4 k, J4 m# u% B
SELECT ID, VARCHAR/ Y5 o( e* O; K; \& S/ X
FROM MYTABLE" v) a! P# c+ @' E- {; t+ P8 {8 Q  J
WHERE ID BETWEEN 0 AND 100) K2 P/ d+ Z  C+ {$ F6 J" r$ I6 d
ORDER BY NAME, ZIPCODE
5 p& A' V; D: C9 \* _( Q% r5 K4 D2 s
& g& u2 T6 x  x' \A.给ID添加索引
( P9 A7 o& ], n3 I9 @( d' TB.给NAME和ADDRESS1添加索引! y+ }" Z0 o4 U5 A# \
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
, A  P+ k4 M, P- nD.给ZIPCODE和NAME添加索引4 A+ Y. o6 ?3 t! J( _4 F
E.给ZIPCODE添加全文检索. U+ Y) ?0 N6 b) D# ^
- g$ @/ [. r9 \7 i

, y, ]% P8 Q$ j5 u10.执行以下SQL语句后将发生什么?
& U  t9 U7 W$ [2 y
% ]0 x) |4 w% |- X3 w% E+ s' IBEGIN TRANSACTION
9 J9 k- N. i! p$ Q5 DDELETE FROM MYTABLE WHERE ID=1* d1 q7 b6 K% q! \- `4 Q
DELETE FROM OTHERTABLE
2 h7 \, C9 G/ o2 ?ROLLBACK TRANSACTION
# S- X' B% S  T6 m% @  l/ `0 u2 s2 b- I  P: {8 l! y
A.OTHERTABLE中的内容将被删除
- E. A, ~4 [  Q0 \# R/ _( oB.OTHERTABLE和MYTABLE中的内容都会被删除
, d7 }2 w  r4 RC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除' g; h3 T1 L; ]. Q* C- f" l3 b1 O$ ^
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化& H" k" o4 j0 R1 A
E.数据库没用变化
7 X3 h9 a! w6 Y& [: ^! f. t" |4 y, \4 r2 X& ~1 `6 f
. f3 u- D# u: u! N) Y5 B
11.DESC在这个查询中起什么作用?
# V, S) u/ G& u3 H& s9 v; U& H- q5 V! Z
SELECT *  R) C! Q* ]8 a( M$ `" r" v
FROM MY_TABLE9 Q% j/ k+ C. J( F
WHERE ID > 0
) x5 l7 g- x( A( h, h( fORDER BY ID, NAME DESC' T6 ~; E/ X7 B  O/ F( U

. R2 C1 e6 B( gA.返回的数据集倒序排列; |' ^0 P' z2 Z, I. D
B.ID相同的记录按NAME升序排列8 @; e# x, K; R7 i$ S( [
C.ID相同的记录按NAME倒序排列- h3 o8 v: \  V( h
D.返回的记录先按NAME排序,再安ID排序5 U7 q/ U: P+ a! Y# c
E.结果集中包含对NAME字段的描述5 |( F7 ?" A" q9 M  y: M

2 v5 T/ _" i' ^& \  C! {9 l
0 p$ I8 W" O  P12.以下哪个不是SQL函数?
7 C% [8 k1 w) u* e) r4 r. |. J# N3 {0 U9 A2 B
A.AVG* p# N9 P4 h) d
B.SUM2 v/ @/ x& P7 X/ p8 u" Q  N
C.MIN; s) V$ s% e) y5 L7 F! o9 T% v
D.MAX
. x# _3 N5 T9 L# PE.CURRENT_DATE()5 q- Q2 \1 w& G% K/ J5 a

( T8 p) J; A1 P0 |  m$ d" ]4 [, m: `5 x  Z: x; ^( Z% X
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?! l5 J3 i3 ^; i1 y( T  a; z' F7 R

& c& a6 J/ M' Z9 Q- T  \% W' H8 QA.该字段必须有索引0 ~" \/ s/ p( T$ x* x: q4 O
B.该字段必须包括在GROUP BY条件中2 z5 h( G4 m) Z
C.该字段必须包含一个累积值9 ~3 w7 @( b. {
D.该字段必须是主键
$ g% O/ `' f8 LE.该字段必须不能包含NULL值, {! D; ^  n- N. T8 q8 \

. n, ~5 z; N$ y2 e8 w
) V( D* S. d( ~0 n* U" `14.以下查询输出什么?
1 u6 P, {/ n# T8 W3 g* X8 \% g) F3 _; u
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
: T9 B# z9 W' N0 E! m1 mON TABLE1.ID <> TABLE2.ID( j7 J* I. E* r5 `
) j1 B! r, @1 A) {4 v( Q
A.TABLE1和TABLE2不相同的记录
3 J; i  ?+ g$ _4 |$ DB.两个表中相同的记录& G, x2 z8 a  D8 }$ v
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数4 X' d* a9 o0 p3 S9 e0 f  e7 i
D.两表中不同记录的条数8 f7 |- A  I$ R  j% D4 @
E.数字23 G2 ^+ U/ Q* |2 T
9 j/ @$ W  o( y0 I5 O" g7 q9 c
8 C9 ^: t+ g/ X. z# F
15.______能保证一组SQL语句不受干扰的运行?+ R3 g8 ^4 ?/ G% s& V, S$ }
4 n& N( z. \; m6 i* A/ V5 H
答案:____________- }1 Y, G0 ^# l, i" H: J* i

1 ^0 m2 L* l* F2 e
, B4 G8 R: q& `# P4 d) A' R7 V) c* N/ b+ q# I! |4 e+ \
答案速查
; h4 p- A+ ~1 E8 A: L% K* i  W9 G1:BC2 y9 v, I# T6 H: f  o0 B6 U1 m
2:WHERE
% P6 B! a6 P) z4 r- I& C3:B
- r1 k# `2 @* ~; r4:E
) B( K7 u' `8 k5 k: r9 [5:BD# d( b6 M$ H; ~9 i4 b0 V, h
6:INSERT' z+ _* n7 \9 c7 q; S0 l3 L4 w
7:C
  \7 t# _9 Z# }$ z8 a) b  w4 Y, F8:A
( M- D( [: ~( F/ t+ S- o9:C2 W$ @6 h* @7 f5 k& ]% n
10:E
6 F; E2 `- Z* P  `11:C
  S! F! r( d( \2 g0 C* i12:E
  e. ], o9 K" u# |* m& _- B13:BC( z$ w  R: M7 K* C! t9 d
14:C7 Z/ m" F! X" f
15:事务
8 ~4 H& t5 T' v; }2 l) R5 L" e1 x+ B  ^! D. E" g
& E/ G' K# S: t  k+ C
! [. G+ A3 \9 V4 h/ f0 N
答案详解, ]' x. K! U/ O  R
9 I+ Q4 }2 S; j- l# B8 m5 T
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
# \+ M, u/ ]" @- L: n
" B3 O4 N5 @5 N4 L1 C5 {; h, q2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。' m) S  X' R; K& m) R9 U
9 I9 t- {9 m! V+ j/ G+ _; F
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。" M9 T$ T) x0 b& b4 n# N

  [" O( R8 s% h! Z4 n, X4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
# I" d+ O* q7 I7 ]
! I; u. `" Q; L2 ^( ]% E5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
- V+ k% F3 P5 B( ]/ f1 h5 M# A7 t8 [& Q: m4 \
6.答案显然是INSERT。9 l1 ], {; N" J' m3 S6 J( i

  E* Z$ @4 Q( g6 O7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。, I, V9 f& Z- B2 v& W& {
( ?" l# `- X$ m
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 g$ c( l! z4 L8 R( I% W) j
( h- V. j. _/ J; ?9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。  ~; u: `3 h2 x: Q: |# V5 q9 C
" M2 l+ r# e8 E. j, Y
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。* V( f& s6 @7 ]& j8 ^

8 O) c: r; b. e5 `. u* j11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。: Z) m/ T7 u6 ]: p1 |6 R

9 [0 O2 v- x# C0 Z4 V$ _8 O12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
; c+ }% A- L1 n4 v" R
. L1 Z9 s) t: U% P2 d13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# p. T& F" p) X0 ^! K
9 [; @" K5 @: e3 ~1 k6 M# G14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
# a; T: G% \- D: [  p+ n& N
# l% r5 n, C* _, _- l5 U6 d15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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