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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。" [9 \5 R) d; R; N6 M
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。/ Y  e+ U' H8 Y8 O; W
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。9 V' z$ E5 J- K" u6 \/ ]- U3 b
6 E, h: b9 [0 O* c, V" U+ h

. _+ o" \& {* Z: F: x3 l! d6 \问题
" W  i" k9 L) ?$ O2 _& s& q# g5 ]1 ~0 A# u" T; x7 N! ^
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)! }# ?4 D2 s+ N0 t: K- J
  ^5 g* u; [, }- h: ^) h
SELECT * FROM MY_TABLE' _2 }7 u/ C+ D5 [

8 |  p' u( W8 U0 T( R; o" NA.如果可能,用把查询转换成存储例程; Z$ I3 h4 k7 C2 w
B.如果程序允许,给查询指定返回记录的范围& z& h$ H4 ^4 F4 h1 k
C.如果可能,添加where条件
; W! J# i: ?7 S% AD.如果DBMS允许,把查询转换成视图, c) [% k2 }% P% ?+ \3 W' c8 l
E.如果DBMS允许,使用事先准备好的语句# M+ B" p: I' n1 R; L3 g
5 I5 ]" R9 o! m. \/ t4 ]
6 [5 L! X9 W9 }! ^, W$ I" a
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
& O) N3 G! K3 A4 x1 }2 G1 W% C" ~; `* j8 I( s" v, u( q. |
答案:____________8 J; `4 E6 o' f: H5 V, A

3 o% ]7 y, V1 r4 P& M+ z) s: g6 t5 w8 e  a+ w4 S# X9 F
3.内关联(inner join)是用来做什么的?% @' z4 z% r: H/ n  d7 m

& u. u) G7 M7 `1 |: i3 |A.把两个表通过相同字段关联入一张持久的表中
& ~" s% c* G& q! N  x# q& J0 }B.创建基于两个表中相同相同行的结果集
5 V4 I. _; [9 f- x# ?, o! pC.创建基于一个表中的记录的数据集
) K' G: _: [$ \6 T9 J5 Q9 HD.创建一个包含两个表中相同记录和一个表中全部记录的结果集# ]" [1 z& G# p, Q9 o0 q$ G
E.以上都不对
7 k- o; S) y) T; h
. T8 W* P, c- s2 r" x1 [& ?9 }
# o/ s6 ~- S! @+ o: f; c% ?, f2 ?- K4.以下哪个DBMS没有PHP扩展库?  ^8 i9 K) [  R9 t$ C( J
- @2 ?( @  Q, B2 m+ Q9 ~% u
A.MySQL
$ [3 f3 Y. m9 Q: n1 xB.IBM DB/2
( ?2 B$ o! a: ]C.PostgreSQL
6 L2 o. A6 {5 w5 @D.Microsoft SQL Server# ]2 D8 w' L# H( m) z
E.以上都不对
# O( p' t5 G  L
  z, W6 \' B; Z/ S4 q1 y$ _/ u% g: B9 P+ C+ @7 {; \# X
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
+ |3 ^: [9 m, \9 N; h8 }' p( J! S# g9 q5 t9 s) X* M
<?php; z) z& e/ V& d( ]
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);% Q' `& q2 D( c4 I, {" f+ `% f
?>
% l; b/ d# ~4 G) X3 L, q5 b# v$ v9 a" G* a; p4 N$ ^) l
A.MYTABLE表中的记录超过1条# w( j7 e7 n% X9 X, z
B.用户输入的数据需要经过适当的转义和过滤
- e9 H4 W. b# y- fC.调用该函数将产生一个包含了其他记录条数的记录
6 `9 e2 N$ j! U1 e9 C1 M; HD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除/ b" C' `( u+ U% A/ W2 ?$ ]
E.查询语句中应该包含数据库名7 p" L; r8 M0 |- Z5 ?

/ Q, @5 S9 A( |0 }" o8 N$ j; Y$ Y3 [) n4 X
6.______语句能用来向已存在的表中添加新的记录。0 [  H; U' N2 M! y; {, w. _% [
0 y3 [& I* Y3 g- h
答案:____________
# z  u3 H% w& l% E: t1 L/ \/ w& s3 _: G  }

# R/ u$ N3 f' m9 P+ L7.以下哪个说法正确?  ?6 }+ L; @: T* U8 _; W. |% b
! B& L' ^4 }' u/ [( T+ D( C0 V/ v4 N
A.使用索引能加快插入数据的速度! [$ K; u' I$ |% z- s9 C: Q0 E
B.良好的索引策略有助于防止跨站攻击. s' o  B" }- {; Q
C.应当根据数据库的实际应用按理设计索引$ W+ m8 A$ \- R* a) N1 A
D.删除一条记录将导致整个表的索引被破坏
9 k" x5 v  O) I" @E.只有数字记录行需要索引" a: }, x7 Z8 S' v. q- `- c  W
- O9 Z! ]% Y# k

# Y4 a- _* V1 B, ?1 ^0 Q1 ^& F8.join能否被嵌套?+ @; t7 L7 [/ c4 V

% P( J. j6 C: N% fA.能
  z5 E. v& Z( u6 c$ b# b7 t; N/ a+ VB.不能/ ?# ^! K% W' W2 P% {

9 i/ U- `4 P1 a, W
$ _  j- a. e3 v& B4 a4 p9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% y  W* w: K) h& n" D3 ^, A9 B9 v: J/ L! P% b) f
CREATE TABLE MYTABLE (
7 S8 {: [% y! E1 p) \3 T3 MID INT,$ P, D6 s  O( K" `- o5 k
NAME VARCHAR (100),
- A' T% b7 r. x8 z: pADDRESS1 VARCHAR (100),/ ]7 z; U4 r) C* \5 f/ O5 L
ADDRESS2 VARCHAR (100),7 u6 l/ G2 C3 ]* Z/ e* p/ x; T; L
ZIPCODE VARCHAR (10),2 b9 H! F" n' W0 U- P3 `( u8 W( R
CITY VARCHAR (50),: |& z; H7 l$ ?+ W' |% X2 R7 o
PROVINCE VARCHAR (2)
( w3 _; W6 A9 u)/ o+ F$ B# D0 R' ?' G# Z
SELECT ID, VARCHAR
7 x% s3 r' W" m3 L3 ZFROM MYTABLE/ R! u: s7 i0 v" ~( k  c% i3 f7 e
WHERE ID BETWEEN 0 AND 100
, n7 F# C- G/ QORDER BY NAME, ZIPCODE
* X( I0 s1 a. }' ^( B0 J7 c
" z7 h. e; X- R- fA.给ID添加索引  U3 R2 x! \% \' e: \
B.给NAME和ADDRESS1添加索引  @+ a4 H% S$ b% G
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引7 C, y6 u  \' O$ r
D.给ZIPCODE和NAME添加索引
; F, C/ x0 f6 q& E- A6 @! xE.给ZIPCODE添加全文检索$ r3 W3 j3 n6 c
  E$ `* P# s+ n9 k
1 r& k8 ]: X" G3 V1 V1 h+ t
10.执行以下SQL语句后将发生什么?% x# t. }& ^" R" |' E: c. ]
6 G6 M' J4 J7 c3 u- N- b, ], ~9 H
BEGIN TRANSACTION
/ q+ V5 G( k$ lDELETE FROM MYTABLE WHERE ID=1
1 |/ n) v( s6 p( s8 wDELETE FROM OTHERTABLE
5 L' L; C: O; T) G7 o/ {ROLLBACK TRANSACTION
/ P1 }8 @7 t; m( \" K; |
% w/ X  ~  N! A0 A; \# E6 SA.OTHERTABLE中的内容将被删除9 H; F6 Z8 ^4 i3 R- X( Z, D
B.OTHERTABLE和MYTABLE中的内容都会被删除( U; t" t+ A' {
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
# ~# k! r# n. J; ]D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化( d6 f* W5 `) t8 y
E.数据库没用变化
6 _# s( M" L8 V! ^1 u5 I% Y! w- C/ T* `
/ L& B. P3 W5 i- _1 Z( I: g/ x9 q/ h+ _
11.DESC在这个查询中起什么作用?7 }4 `, O7 q& e7 z
' g: U7 {) \+ h8 B& F
SELECT *  @  q5 H& }/ d* \3 ]: z' [
FROM MY_TABLE
+ R; M$ @# N3 D; F) G' U2 L; JWHERE ID > 0
* {$ }) u" @5 `ORDER BY ID, NAME DESC
% s, [5 @1 L0 i( j7 u
3 s- T1 K! s; l0 `2 s& yA.返回的数据集倒序排列! C/ g& R2 X  C# M1 H
B.ID相同的记录按NAME升序排列
5 X. n2 Z8 A- M! ~C.ID相同的记录按NAME倒序排列9 r/ t; P0 p3 \
D.返回的记录先按NAME排序,再安ID排序2 H! A: ?3 G6 C2 ?5 R
E.结果集中包含对NAME字段的描述0 O  W3 o4 h& x+ f; S
# S0 k( C4 @7 f" S/ k3 j4 N7 |6 M

8 D' o/ T. A+ a5 t$ m0 ~; E4 L! J12.以下哪个不是SQL函数?! b8 p! o2 U. v- O% A0 U$ h

9 I6 W( j7 t3 F! ?. @0 |' D! }+ jA.AVG
( {( q+ m+ z8 y. q" R) t" eB.SUM; w" x. }  i, K1 \) b5 l
C.MIN
/ D0 e4 N, \. K8 RD.MAX
9 k/ q4 s" H" K- P% lE.CURRENT_DATE(), V, r$ W$ K6 E$ B- l9 y, F

: h0 _6 \8 P! [  ^. [8 |" j0 J4 x3 p! {; Y( t6 a5 T+ D; d6 e
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?! E7 W7 A# ^, _; i. g
4 i9 V' }) t" x
A.该字段必须有索引( a0 v/ U( @0 v. f4 ?- V4 s! H2 R" ?
B.该字段必须包括在GROUP BY条件中- u7 O1 [% W, Y9 a& |" _. N
C.该字段必须包含一个累积值
4 ^( A4 I) a1 |: E6 E$ c* e) ~D.该字段必须是主键# \" l( V2 p7 t
E.该字段必须不能包含NULL值( r( ~8 T( W" g

* A7 u1 b- u+ k& }5 i  d, Y& ]) r( [6 k% q  k$ S  v
14.以下查询输出什么?
% w/ K7 P1 M+ z2 }7 u! Z' f& o# n: ?. Y# c1 s, G, W
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE27 @1 y* u( E" O* C
ON TABLE1.ID <> TABLE2.ID) y# O4 m$ e( b5 t9 x, i" }7 L' s
+ @. R6 ^1 U6 ?4 y5 Q* x6 V8 h
A.TABLE1和TABLE2不相同的记录6 T  P+ N1 T" U. }- N. _. P3 e! ]
B.两个表中相同的记录
5 F$ g0 Q% {* n; _  r% @C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
3 h6 V- v4 U4 B8 KD.两表中不同记录的条数
' ?2 w: ]# t8 tE.数字2
1 j# _' N" [. u% k$ w$ I- l
5 a' G" p& l, e, n1 N6 S& W7 _  y( r+ u: i' ~
15.______能保证一组SQL语句不受干扰的运行?
& K2 U  y% X0 @$ X8 v7 x! `6 i* l: p! `
答案:____________
! W, t) C4 R- `4 |  G; n3 w1 ~$ E8 f" C$ D
! [$ L  U4 R% A% R! n
( M8 I: m2 E2 K& y  i
答案速查9 Q, `+ L$ F6 s, t# q7 t
1:BC. c$ v+ Y9 t5 i; S# A- l
2:WHERE
1 Z  Q. u4 H6 i, _3:B
9 q5 o, U( B2 e+ v& ?$ _4:E3 X, ]3 t/ u# N; E4 ?% C+ Y
5:BD; v" Z3 s# A' h4 k% r8 h. h
6:INSERT
2 Y( C8 B& L+ x7 W& X& P7:C2 R0 U" R. u# q. }
8:A/ z; b- V; x) i, S+ k
9:C
) K% W- l1 t$ u5 o% Q3 T10:E
4 O3 ]' a* V& A! u& s6 |( o11:C+ Y* Z' b$ N- s0 ?" s3 v
12:E9 |' `2 h! _/ C' S1 P5 H
13:BC4 U* J! N( ^+ z% U% W- [; ]
14:C
! F7 p  Y; W+ i2 P15:事务/ k6 Z/ B9 P  p$ r
' r3 W8 r- s) |* d6 |7 @4 O

6 ]- E$ C$ j# A' P2 V# @/ `8 v* p9 A6 B- S+ e5 z$ P
答案详解/ v0 I, d* B) P+ `4 T% Q4 y: W

- I: J. h: v7 h% W2 R: o1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。2 k+ ~: _) C% Z( z( w
) l% _6 @$ y( u2 I- t! m. i( Z
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。% o# i& C1 m. W" V+ e

$ q4 }0 ~* n0 H) C! C  t6 X% n3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
6 t5 ~! v: r6 _; w3 y5 e6 U2 V/ k( N5 B; G2 `5 L3 m
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
3 J. v/ p& A9 W0 z0 p$ P$ g; s1 l, b. r0 s' P$ K4 x9 j; R4 i) M
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
; b3 Q9 Y9 M9 k% a; D4 R9 S! G8 B) d/ Z  R* \" S4 m" O
6.答案显然是INSERT。
0 ~1 p4 F' ?9 b$ C& K% G" F+ L. s$ L) p
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
5 e3 r  p9 }0 g- i) |/ }+ S6 L" T: j
+ R& E3 m+ q* U9 X) z8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。& t. r: @2 Z9 N9 i

8 o/ R$ O4 x) @. g9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。( u, U5 W% d1 Y, Z. x0 I' q
3 |- x$ W" u5 {" \: h
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。# n% Z9 @" j9 @) r% k" a( H: T* c3 r

* q7 D8 N; s9 q3 M- f4 D/ I* D- E11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。5 }8 E8 Z! K' h- |1 Q! U; s
+ w7 y0 u. i  ]" C0 h8 ]* `* u. J' N
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。' x* n. J3 e4 [3 q' t

3 }& @' e6 N3 T$ e13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
9 c" x2 \0 o: I4 r8 T. L1 T0 @
8 U' T4 K4 P+ N5 i: t1 z; v9 T9 u14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
3 U  Z! }8 J" c, \! R# D
) K' |2 J( d- j% k7 h! _5 U15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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