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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
. m' A' l7 }. }; R9 R9 |PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
$ u+ P) s8 w  F( ^/ W9 d本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
3 \) Z6 q6 [3 W) ]2 L7 F
" `3 _# w( k# ?  z. W
9 @( W- L& J) q+ e) C9 Y1 g问题& v2 y0 f' \* t# }+ x
4 k7 w9 L* p4 n" y- p
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
! U- n* C. V( d; A
' M5 ?7 N3 |9 r- Q9 f3 }1 kSELECT * FROM MY_TABLE* N- \% n% X4 Y

9 `$ }  E  O5 u& zA.如果可能,用把查询转换成存储例程
3 j% T9 Q5 {9 i) k, s8 z# GB.如果程序允许,给查询指定返回记录的范围6 l! \0 L" A! T
C.如果可能,添加where条件
4 f/ y7 v3 \" X! z  tD.如果DBMS允许,把查询转换成视图; \: @: @  [4 \# ]/ ?, z
E.如果DBMS允许,使用事先准备好的语句
3 l1 `1 L2 x6 F6 g3 h5 ]
( R/ u  C8 J% n8 Z$ ?
: P, S8 l. D+ T  e  F5 h" E3 j2.可以用添加______条件的方式对查询返回的数据集进行过滤?
) ^: Y) x$ L1 h5 A) s% T# A( [8 A* K# R! r6 r- _, K3 D0 p
答案:____________! A* V" b# d2 j0 H/ e' w

6 w- p) }2 S1 L7 _2 `3 n5 @& G/ c3 g* u* @
3.内关联(inner join)是用来做什么的?
/ r2 i) o% s, d2 I/ ^- Q6 q% G: w# j
A.把两个表通过相同字段关联入一张持久的表中
0 C; @1 M. C4 \, HB.创建基于两个表中相同相同行的结果集
% }9 D" h! R% @C.创建基于一个表中的记录的数据集+ ]/ f3 x1 s* O/ E' m1 Y, h
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
% m% \2 O) R0 }3 E$ B" aE.以上都不对: J' H1 d* r+ h$ f4 Z7 i

0 t3 N0 L( d! s4 ]) z
/ k8 P. U% ~/ e% b1 ~: [9 G4.以下哪个DBMS没有PHP扩展库?
+ W( @0 a# ]9 d  H
0 A( k) _. D% G* HA.MySQL
! ]0 X& Z: p4 [( Y) bB.IBM DB/2
* A, C9 A! h: _! vC.PostgreSQL
! j3 K" M3 |( }D.Microsoft SQL Server) E+ }% K" r& Q7 w
E.以上都不对  R  b2 [9 p: g, L
4 y$ i# p( x, m
$ F/ _/ X" M" X" Q
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
6 x7 n$ V" E, N  u' @% Z% w$ H4 f3 p7 B& s" F
<?php! j) X% }' H9 c; i7 ]
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);; P6 C. D# V- x+ ?+ H0 ]
?>0 Z$ {$ _! O( L' K# T" |3 @
1 F5 j. D* h! [) q( ^
A.MYTABLE表中的记录超过1条7 r/ e5 d# G  Y& a& D; O
B.用户输入的数据需要经过适当的转义和过滤
0 \' I4 e# M% b5 E3 g, cC.调用该函数将产生一个包含了其他记录条数的记录
0 X5 L( Y* j" H9 `7 K0 e5 GD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
4 C( n, F! l! n" h/ r' L! t+ UE.查询语句中应该包含数据库名
( S% H* h. [" X& o
" o% t" Q9 d; C5 E6 |% |2 i" W$ p' {8 O% w! [  l+ I
6.______语句能用来向已存在的表中添加新的记录。
! F  E( F* s( m) n
) q+ ~0 W, \. P( i3 \答案:____________) `0 s. G& w" s/ S' h/ `
/ M0 q! f* [, w; q) D! a$ j
* h9 W# ?5 {# W' m
7.以下哪个说法正确?
: E4 ^" ]& b4 }8 Y4 h* g. v( `) c/ a  j  l2 ^7 j
A.使用索引能加快插入数据的速度+ {# q! C; u5 R( K6 q/ q" v2 @% }
B.良好的索引策略有助于防止跨站攻击6 S! \* `  f% Q; E4 K( l
C.应当根据数据库的实际应用按理设计索引
, B3 |, l% k( k- I( _D.删除一条记录将导致整个表的索引被破坏
) \) ]* i# d% ?  E  p$ ]E.只有数字记录行需要索引' J; x+ |5 r( o
  ]( h: p0 ~& A- p1 P7 J

2 A; s/ [$ c% Y7 ]8.join能否被嵌套?
. D2 v/ `6 K- V/ q' u# I
# b7 S% W% V$ B8 D9 }. `; y  G) IA.能0 J( q7 b2 Y" J7 U# l. V
B.不能
7 v) G$ |* C1 g; l; [
2 u/ `1 y, C6 W9 J& T. J7 Q5 Y9 X7 b4 m7 \; w, @( |5 m! p* f) P1 D+ X
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
+ _, V0 ?7 i& X3 e7 P0 C3 V/ p1 ]" H9 W
CREATE TABLE MYTABLE (9 Z3 R0 ?4 S. z; d3 j6 H' J! p
ID INT,) q% u  j' E- I6 u2 c" G4 A
NAME VARCHAR (100),6 E) \: V9 W6 M4 k
ADDRESS1 VARCHAR (100),* g. ^0 e& S- E5 l: B' h1 b' D
ADDRESS2 VARCHAR (100),6 O) X  e4 @4 i9 V* m0 M' S* @( h
ZIPCODE VARCHAR (10),' [# m5 k: G5 S
CITY VARCHAR (50),! g6 h+ k: \4 d) {  U
PROVINCE VARCHAR (2)! P5 W0 q9 F/ w3 t  z0 a6 o
)/ U/ {" h* P8 z
SELECT ID, VARCHAR
# ]# q% t( J% P# C  ?FROM MYTABLE3 [9 I7 u$ T* d- R% E3 ~, `
WHERE ID BETWEEN 0 AND 100: U  a( `8 f$ t0 h3 x$ ]- n6 U9 u6 n) a
ORDER BY NAME, ZIPCODE
6 `3 {% C8 R( F3 H; u# e5 f4 u/ y: |
A.给ID添加索引- r; g& c4 B  A5 A# v/ y- {) {
B.给NAME和ADDRESS1添加索引
+ |4 {) f# k% E- W) Q! LC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引% o! W( T5 U, Q1 Q* {
D.给ZIPCODE和NAME添加索引+ b0 V: z4 ~+ Q" K1 N5 F
E.给ZIPCODE添加全文检索
8 H3 S5 [5 G) `$ K, w
3 M! N2 ~1 j* P8 v8 }: x0 B
1 q" @$ A  y9 v: G/ k6 B8 u; h" Q10.执行以下SQL语句后将发生什么?4 P( W2 P/ R; T0 U1 j6 u) f* [) d
# V" O! Q  x* x# n! Q8 d
BEGIN TRANSACTION
4 H4 m( K, o' M4 Y" f9 bDELETE FROM MYTABLE WHERE ID=1
1 }0 D* Z! k% f, l  K" ~- M0 t! RDELETE FROM OTHERTABLE
7 G" J) J: S* A% R" R$ V  fROLLBACK TRANSACTION
# e/ d, s( g0 t& J5 b& E2 z4 M0 S6 e6 V: g! U* x
A.OTHERTABLE中的内容将被删除
# S+ Y7 ]1 p  Y; JB.OTHERTABLE和MYTABLE中的内容都会被删除
! }6 j. T" N* _; S: H+ F+ w$ wC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除5 B* j  ]' ^3 y5 N
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化  s# x! y' C+ e6 {2 ]' m
E.数据库没用变化
; \4 ?3 I+ l: [% Y3 Z3 F
& ^2 ?  I( e% s2 R7 S
8 `1 B4 ~, v7 j, B9 n- h11.DESC在这个查询中起什么作用?* U$ K# m! w7 [' e9 e- f  o- J+ O0 W

: Y8 ~* c2 q2 k! pSELECT *4 x) Q6 J0 @, ]6 E
FROM MY_TABLE; U# B" J  N% Z( S/ J: w
WHERE ID > 07 F0 v- L0 E+ B$ J& J0 i
ORDER BY ID, NAME DESC  q# w" q9 p" p, u
/ C( V' R/ W  J9 {) @6 L$ b3 W
A.返回的数据集倒序排列" |% V0 m- V  A! _( u
B.ID相同的记录按NAME升序排列7 g& w+ j0 Z4 G7 Z
C.ID相同的记录按NAME倒序排列
3 m% B$ N1 x5 C; QD.返回的记录先按NAME排序,再安ID排序
4 `. T. K) n9 c- v1 xE.结果集中包含对NAME字段的描述
2 G3 q; u0 [9 s& B) T* K7 [9 P+ z6 w* C5 t& _4 {9 t
4 D' L. @9 f1 Y/ w' E, E8 X
12.以下哪个不是SQL函数?
& z2 ~  v" {) A; h# s
4 d) ~( ?# R* M- g2 k! gA.AVG. O4 B! X/ |1 ^# ?" k3 k/ \; b
B.SUM
8 @7 P( U6 k* y1 @C.MIN
0 V/ S7 |( e7 r1 w2 }/ RD.MAX
3 F0 {2 u# @7 w) EE.CURRENT_DATE(): }' W7 _" {/ Q% k& H4 H, U$ m4 M

. ~# l. k3 A& L7 x
* ^, X4 x9 Q! E8 @& b13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
/ u8 H9 i1 A2 p: K, d1 P1 n- G& Z) X8 y, `% x
A.该字段必须有索引3 L; C: p( o3 ^6 O
B.该字段必须包括在GROUP BY条件中
, q% F/ _9 J. s6 OC.该字段必须包含一个累积值4 @4 \- N* B3 X
D.该字段必须是主键* I! M' x9 x- v4 H* ?; G; \% I( V
E.该字段必须不能包含NULL值4 c$ _: k5 q9 Q" P

% T; g, O/ o: P1 z
$ W- ?1 Y! ]0 G! Z& x0 ]14.以下查询输出什么?
7 V( m, k' ?' i
+ h$ i# J1 k, }  ]: r$ W2 U/ V4 ?SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE20 O! `0 G: Z8 K# y# W0 ?* |
ON TABLE1.ID <> TABLE2.ID) j/ P6 q* p# E& ]

3 n4 o$ X) a$ F0 {0 ^* r8 uA.TABLE1和TABLE2不相同的记录
7 I+ Q1 i6 v+ Q$ O" q/ P5 a- c4 sB.两个表中相同的记录
3 ^* w1 ^; m" ~, z- Y+ {C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
6 f0 O8 T) z+ s) C" M6 ?D.两表中不同记录的条数0 P+ W! [9 B- U+ H
E.数字2. h8 o) r$ a# `! L6 g
8 N" `# |( Z) b3 g* y
# \' |6 G- K; V7 W' C6 G
15.______能保证一组SQL语句不受干扰的运行?3 N! u, V' o  N4 v8 C, N3 \4 A, P
4 A5 Q' t& s$ j* n- r% [
答案:____________
6 R4 W6 B( p9 {1 i& r/ t& N" |
# ^$ N) v0 c/ ^: j$ L* T! T1 l0 E( x( O9 d6 |  z. w
3 m, C/ N$ M7 s* z
答案速查
' K/ _  ~! s$ J8 X- `  M3 s1:BC
( c6 ^  A2 G3 s# Z2:WHERE
) i% _$ U& B- f- L1 b3:B! A% Q: o% u1 h5 l
4:E
+ J. r/ R/ v+ H5:BD
+ H9 ~2 ^) {" w6:INSERT
( J' {1 d- c3 b% ^7 {+ \7:C+ h- _% b2 E9 G
8:A
9 l) L5 o. ~2 W+ |% `. |1 Y1 F  U9:C$ x% b! s# g  u4 a/ Y$ R5 X
10:E
$ K4 O! s6 l, F3 @' @; P11:C
' Q" l" k5 d1 L- k12:E/ r; o" }" ^6 N( N; k& T3 y7 \( y
13:BC$ A) e" P- q2 |2 z; x
14:C
1 Y% p, n# L+ o15:事务8 Z; b1 \! y. |; N+ ]

9 Q6 I4 n. ~3 Z' V1 D* X3 z% Q7 O, q1 b, k% g. E
( J! Q  Z' A3 l; q" U/ q1 J
答案详解( l7 b' z4 l6 J/ Q

; u2 ^! q6 f0 u) W0 z9 \1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
9 e- P; m3 O- r: M& i* l2 d# z4 A; b' n# `
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。2 X# k) h8 T8 m6 Y4 I3 ~0 Y

2 O* w  @7 r$ B* I5 R# n3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 T' N/ ~6 z2 C) ?: [$ D/ T( _
2 W. S  _9 L, g# f' J
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。0 t+ o# Z) d2 l2 h

. }! T# t6 p5 j: Q! E5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。9 `2 M+ a& f/ L, X4 T

% T6 \/ ~) w1 t8 Q" E, Z6.答案显然是INSERT。# b, x9 ^+ w! B0 A
$ ^$ s' C2 J+ g$ V" Q6 ?7 J
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
( Y+ ~2 @: K' f; l
- F: v) i9 g- s8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 a9 ^1 t$ D6 L. G7 j0 e3 r. B9 W

3 F9 [, M; D% E8 r/ [4 h9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
7 @) D% Y% r( m8 S: P6 x9 `
3 \9 m( O: X& D8 ~' A% c$ ]5 K( h10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
7 E# i- Y. F6 P7 ?/ c1 c* D
) q& _! H  I" S# w- C8 ?8 ~! {11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。/ E2 l1 U  T/ _+ ]  g/ k

% P3 z% e$ h  p6 d( N12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。4 b" L; c! }3 `0 [0 G

/ f# `$ X7 \2 D& K" a13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。" N! H: z" H" [2 L3 ~+ m6 Y
$ e' t8 E# R" C. S2 e
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
$ j4 M8 G, P$ c, r7 y1 J; }4 Q& C9 [$ R3 r) u9 L' K% W
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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