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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
  z0 |  {+ y9 @$ K  y! KPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
2 e1 b2 s; o- h4 A  V) P6 q, ?  t# B9 @本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。' |; H+ S7 R8 o  T
7 O& n( z. S$ a- Z+ H# y5 z

' g; S5 b& Z; {8 r问题7 ~; N1 V: d, t4 G) B  l
. E, T0 `0 P, |- @
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
$ k6 x, f+ A$ k9 ?2 i
  @2 B0 }0 n5 BSELECT * FROM MY_TABLE) e% p. T; n! Z- q* |8 X. B7 w
3 |; }3 `8 ~  }$ X: E- F5 P/ o
A.如果可能,用把查询转换成存储例程
5 ?" b9 N! R6 a/ `: [B.如果程序允许,给查询指定返回记录的范围- K- A, F0 V& w3 {
C.如果可能,添加where条件* ]; R  |7 i: T6 c+ W7 T
D.如果DBMS允许,把查询转换成视图/ `7 y# D$ T) }! C$ Q
E.如果DBMS允许,使用事先准备好的语句
9 p7 V  B% |! |! J7 C) c$ M
/ E- f7 {4 O. G' n
2 p' E  R9 s, }0 L- B, K6 P9 f$ b2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# L$ y& N; O, {+ y% K, a& g
) d; g, z: s: j8 b6 x& C" k/ \0 k1 q答案:____________
2 W3 f8 s6 G! J+ W- M! \1 P6 s7 D' _1 m+ {6 B6 f4 g- M
7 l+ m8 P  I9 a5 H7 f8 Z
3.内关联(inner join)是用来做什么的?* A) F+ U+ ?: Q( I  N/ C
" F' R" o) U+ a
A.把两个表通过相同字段关联入一张持久的表中
; _$ `; c/ C7 TB.创建基于两个表中相同相同行的结果集! J$ {! I  }6 J6 a0 }3 e) F
C.创建基于一个表中的记录的数据集
. _' G$ O1 }7 @( rD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
, n  z) F6 |6 o; HE.以上都不对# O; Z5 Y8 u7 n1 ], G
. m+ L4 P/ X3 J$ h% M9 H

- b: H0 h! |- v- g( k* _% K4.以下哪个DBMS没有PHP扩展库?! T0 J/ A6 Q- M4 u& k+ Z. G

- H4 k9 W1 D! ]A.MySQL* a$ [+ w2 {8 }* V
B.IBM DB/2" l+ }8 M5 G$ p* E! p7 ]" w8 A0 k
C.PostgreSQL
( T; D/ O/ Z9 e& Z% [. FD.Microsoft SQL Server# ~( A* ]/ S! ?( K- F
E.以上都不对7 D$ ^2 [5 t. ?' @0 ]6 w4 d1 m! D

# T& O2 H, Y8 e! u9 j% C0 W
$ U9 w4 B2 W& H) ]5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
0 d  y& g. i1 i6 R9 K0 r6 j: y; H0 u7 l5 ^, v
<?php1 x+ a$ [, q! N- p+ J& l
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
) h- N& [7 X) t4 }; h$ E?>4 j- b7 ]; B+ j7 M4 t! d6 Q! ?! j6 A
4 k  I! e2 h. C$ I0 \% X7 b* h
A.MYTABLE表中的记录超过1条+ M* J9 b/ \* ?" ?  Y5 W  X
B.用户输入的数据需要经过适当的转义和过滤7 ]  T" A2 C9 D6 B, t% r
C.调用该函数将产生一个包含了其他记录条数的记录
1 _; ~' c+ w6 M1 B, I% g& ?4 CD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除, M; U# t9 P4 ^; R
E.查询语句中应该包含数据库名
5 W1 ?2 o4 ^- a: X% \% F4 {3 |' l) y$ o" U7 T, R7 s  ^! f% d

4 \& t2 ?# |4 E( t6.______语句能用来向已存在的表中添加新的记录。
8 I) k" E  ?, v  y
! {" F* L' ^0 J/ K# q9 k9 l答案:____________* o1 E/ w8 b; ?* f

" Q. ^$ V7 x! r7 y6 n
3 p$ i1 P4 Y4 `$ i& E7.以下哪个说法正确?4 b* i$ }1 h$ f; J
3 w1 B1 J8 A" O2 A$ t3 u
A.使用索引能加快插入数据的速度
3 P. F3 b3 |! v8 V; f1 ]+ ^. lB.良好的索引策略有助于防止跨站攻击- e( T; g4 d' Z* h7 L' v* I
C.应当根据数据库的实际应用按理设计索引2 K" I6 L0 z4 X. q9 ?; Z" ?
D.删除一条记录将导致整个表的索引被破坏% J* W" y0 _; Q. e' i
E.只有数字记录行需要索引
. {1 {/ z& ?/ G1 v8 B) g
" i5 t* P6 V) \( ~7 E* W( J( B
. U5 ?& e- x% j2 a3 f0 |8.join能否被嵌套?
$ L7 _: e9 N8 L" T0 X4 Z
% K6 E! H# N1 g3 p# r- l$ T; sA.能# ~* E8 d: B& @( @* `( g  @; R
B.不能5 c! r8 r! h9 p+ I& }$ t$ j: x! Q% z

5 z7 l9 ~0 k  D' `5 Q* N! u% x/ B5 w9 c$ z
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
# H* V8 k( P+ e$ S3 k
; _) J( Z8 ^) j. M" G8 w  I7 @6 LCREATE TABLE MYTABLE (
. ?+ s% T# h& e, p5 ~ID INT,
0 y2 }" ^2 f- A/ @) d  S5 BNAME VARCHAR (100),' z+ q# A7 X: x5 x
ADDRESS1 VARCHAR (100),9 a4 Y1 p- I$ n) `6 ?$ z
ADDRESS2 VARCHAR (100),; Y9 @- s- x4 l
ZIPCODE VARCHAR (10),1 ]" k% U* E9 c; q. t6 G4 I
CITY VARCHAR (50)," n( V8 r9 q  k
PROVINCE VARCHAR (2)
& c0 D3 \1 x, r; f2 N8 @)
. Q3 w5 _/ G8 hSELECT ID, VARCHAR- n" M. s8 p# j
FROM MYTABLE
7 ]+ X, y9 i. i1 l* CWHERE ID BETWEEN 0 AND 100
% v2 {! Q7 l' ~* [- T! x* f8 B) T8 uORDER BY NAME, ZIPCODE
, I: K+ _- U3 Z1 P$ }  ~0 ~
' j  n" Y9 D9 w7 m; bA.给ID添加索引0 Z  x4 [1 C* a! S3 N+ M
B.给NAME和ADDRESS1添加索引7 l  m$ Y- w! ^+ g4 j; C1 ~" S3 ?3 y. e
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
. g0 A7 A/ n* @, JD.给ZIPCODE和NAME添加索引# n  f* \6 J8 p! w6 D4 F9 b
E.给ZIPCODE添加全文检索
" {1 I$ F$ \% U5 T
! o4 \" M2 x* `4 a+ t: ?: e/ b1 Y* x, w* W
10.执行以下SQL语句后将发生什么?8 j( C. o8 s) g1 x! E( b: I5 W) K
3 F' x/ L% z) `
BEGIN TRANSACTION! \, A7 o6 @9 [. R6 Y  [
DELETE FROM MYTABLE WHERE ID=1" p6 A6 ~8 P3 V/ H( W% x2 q* W
DELETE FROM OTHERTABLE
$ }+ r$ l( N9 V1 ?3 Y) PROLLBACK TRANSACTION+ t$ L1 g/ n" M9 B4 y- L
' D) d2 x  J. u! T
A.OTHERTABLE中的内容将被删除
% m" t' H2 s8 L) f. J. ]" L9 JB.OTHERTABLE和MYTABLE中的内容都会被删除
( f6 Z' ~* c/ j& Y. B- {C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除! B5 y: g1 N) r% W# Y0 u) Q
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
- ?0 ]& U6 Q; `E.数据库没用变化3 U5 g% X1 M6 Q

  I5 ~0 t& T( J9 F, E
/ o5 ^6 B! p+ V4 ?11.DESC在这个查询中起什么作用?: B9 y- n5 a1 ]6 ?( _
9 u8 }6 P4 i0 P1 \9 M
SELECT *- \( |) G! m. R5 D5 z- |0 A
FROM MY_TABLE
- Z1 u: X+ t3 i( GWHERE ID > 0
- U6 x0 [% M: T. bORDER BY ID, NAME DESC
: A; v8 m! H9 g2 P" J5 _( e( e  ?5 |! z$ n& L. _1 I+ O; V: ^# C, o
A.返回的数据集倒序排列
- E: r- l5 r7 G; D7 @B.ID相同的记录按NAME升序排列
3 T2 G2 @1 h$ M, y/ e2 hC.ID相同的记录按NAME倒序排列+ T+ E0 ?8 `' J9 v/ n3 b
D.返回的记录先按NAME排序,再安ID排序
5 ]% a+ O3 t2 uE.结果集中包含对NAME字段的描述
2 @' ~' S7 e/ |) T2 X9 P6 C- @* T: O  ~+ Q3 w  a1 Q8 @1 K* v
. F: E' O. J* b) a) A- }( Q; r
12.以下哪个不是SQL函数?% r9 e4 f  L* i) G: j7 E) t7 H' k' d7 s

9 w9 z! {* J3 V; d8 D! X2 `A.AVG
$ m: V$ E! Z, PB.SUM$ d9 {( c* ^: L6 s* x' Z  [
C.MIN
& y5 E8 O; h& I( v- _' t8 RD.MAX
4 m  F7 s9 G% GE.CURRENT_DATE()! |, Q% ^$ p0 Q6 |2 R$ i" V0 I

6 Z, s$ z4 u4 N# M5 S9 P- B8 `4 n- A1 b; S
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?: J' F8 A* B+ {' h4 Z% J( ]& m
6 {) j3 s& ~& D; l0 b
A.该字段必须有索引
/ I" k+ l& _7 g* j$ ?) b& ZB.该字段必须包括在GROUP BY条件中) z/ O: a0 g- Y! U# C. B: m
C.该字段必须包含一个累积值
+ @. _0 R) X3 k, SD.该字段必须是主键7 D7 @4 Q# P0 d# @1 \/ O# p
E.该字段必须不能包含NULL值
( G# S# E! o- z/ |  H) n  c2 \( x+ ?8 n/ n# \
4 ~8 l" W1 z! X2 B) P
14.以下查询输出什么?
, d/ t+ S4 s. T* q4 }+ \* p/ v6 {# X2 X7 R3 d
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
& X3 |- ^  a) c% ^: J1 ~1 ION TABLE1.ID <> TABLE2.ID
% F, s5 p; M' X3 m) ~+ K7 r% a/ C" h& H- f& P# [6 |+ o
A.TABLE1和TABLE2不相同的记录/ J9 h) H8 w, S' V9 J/ I. ?+ @
B.两个表中相同的记录
* Y- b+ K  i% O1 a* A9 F+ |C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
0 ?( X% T+ h5 Z, y9 K! UD.两表中不同记录的条数
* G; C+ U2 s; g5 D' [4 W, DE.数字2* \2 y1 t9 G9 L6 K" ~5 r. [1 Q
9 M* y* U7 p9 \; ^0 m$ F! J( e
% i: [" N/ Y; k2 J  t/ J
15.______能保证一组SQL语句不受干扰的运行?" s6 z  z% @( m& ~" E
- z& V* B; a) U# v
答案:____________
2 A7 _  U- B1 l2 I' f1 s/ v: g" Y+ E- ~% u% c
3 s4 g! J7 f" X* C

* ?3 e) S' g5 G+ M) Z  R答案速查
4 q/ q; I% F$ a6 A! L! I1:BC  h0 ?  S5 m$ O5 W
2:WHERE
% ^2 z6 R' r, f2 T& r. V3:B  c- L$ j( @! W7 W7 j0 W% X
4:E
$ \" W5 w$ O/ p. |; n  E3 \/ [5:BD
( h- I) c0 T& J! o# R' Q- d6:INSERT# J* \& r. w$ C; O
7:C. j% d. O* I0 J! u9 {5 K
8:A
2 @5 B' P1 S4 G9:C. u5 Z* W/ U; f8 T2 A
10:E  N( Y# z% D: j4 B& O% z
11:C7 p+ D9 Z8 ^* ?; X' O
12:E' P3 d2 f8 ^' N8 Q$ C) U( W! m
13:BC7 |  O  a+ W; Q9 O
14:C6 A/ ^8 n! O) }( O& j! T
15:事务
, K1 V' z& b" ^; R; a, J2 Y8 j" z* }0 G/ y. b
# D0 z! s2 y$ G9 b
5 X( Q5 _5 g) H& U% R! E8 R6 G
答案详解
% Y2 V% M, J% Y1 G
2 b& M+ x$ _: A$ V1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。; l1 ]) j( n4 Y6 ^

: B) L3 W$ a0 d3 _! ~2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。- e$ q, a) w, K8 f: r7 k% p

) R' f6 N3 J; b% x" V3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
7 [. G% K6 g1 ^" R; r7 k4 ?8 I" L& e* ]: o) u+ B3 s! F1 l/ p! u" i
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
$ q% _' M# ^; S
$ S2 H/ F3 [8 y, J/ \# J0 V1 U5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。5 I( Y) {2 m) `+ u/ j1 }

' G# ^& T/ b' d& E1 M9 t$ I2 Y" \6.答案显然是INSERT。1 `# X' {' l4 }7 D" a) u6 ?

, i2 l, e5 R1 b: N7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
3 {/ `% ?8 e8 I/ N+ |% x2 b' h, t  Z8 S; n/ c4 [1 X
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
) a% [: B6 m& L4 Z/ o) _1 ?# |# N' R6 |2 W) }( h
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。  T# J& ?7 \7 E& b0 l8 g5 V! Q

3 v9 `6 h; f0 P10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。2 C& Y- q! n! A8 L4 `

) [1 G! k7 {5 V11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。7 V7 x  E) K* p, E
& X! G( u% f3 g
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。8 Q1 B4 u4 U* a$ }+ e
, m6 o6 i8 w& }% T. x% x6 `. y
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
+ d& M' k) A# N9 X" B- R* s
% g- v) W4 b' i; s) ~% n14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。# d/ a; k/ K! C! n& d

5 ?; q" K# p4 R5 s/ ?) z* |15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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