|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。- q, T C/ G2 W! \- m% p- {
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。' k5 [' B8 L) L6 \) \& E
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
, M; ], W7 P" e. |
$ p* e7 q3 ]9 ]7 N) ]( Z6 r
: ~0 ~6 o3 N& g9 @* v; E8 x! U$ Y问题
3 T6 x4 x# @- {- {% P( L1 f
# {. \7 E; p* _$ E0 w2 H, H1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
R! M6 _5 b1 |0 ~1 ?: A# p9 K- T( t' d/ E
SELECT * FROM MY_TABLE
) K4 C2 c9 @- y
( J0 y3 [- I, O2 gA.如果可能,用把查询转换成存储例程
) P: Z6 v; ~) u" CB.如果程序允许,给查询指定返回记录的范围
: W$ O) W! L' b5 bC.如果可能,添加where条件! w+ K. z' Z* e1 y5 n+ @
D.如果DBMS允许,把查询转换成视图
/ T' D( X- }% LE.如果DBMS允许,使用事先准备好的语句: R! Y, ?- R$ |
8 ^- x8 u; Y6 L4 g$ x9 m1 k* H) N8 {! ?
2.可以用添加______条件的方式对查询返回的数据集进行过滤? U1 D9 u1 m2 T) Q
4 W) o; y! u/ s! H, r答案:____________
4 N1 Q1 G0 v! `/ M! S5 o5 p3 q U: _! n' I/ I7 t. {4 R# c
$ _, z& {3 K+ d* ^6 O- W7 n8 K3.内关联(inner join)是用来做什么的?1 R/ ~ P2 N. @: k4 l2 X
7 N" H! D& I7 |- N" H8 BA.把两个表通过相同字段关联入一张持久的表中- K$ e {( g- e7 L8 B
B.创建基于两个表中相同相同行的结果集
; j! D7 [( I5 R1 hC.创建基于一个表中的记录的数据集
$ t% S t! N! Y2 MD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
3 S6 n8 w3 G& K# Q$ h& } Z! u* }E.以上都不对" W: v" X" F6 V& v9 `9 [
{9 J6 l; o% M9 h
, T8 M5 ^9 r) F$ Y9 y- \! {
4.以下哪个DBMS没有PHP扩展库?: f5 z7 A( _* g6 p
! H2 Z; q) O: p
A.MySQL
1 `* P% a7 n1 R/ k2 e" GB.IBM DB/2! p3 i: Y% [% k9 V, _1 Q
C.PostgreSQL' R9 t" f1 B" ?& @) Z7 p$ ]+ b& r. f
D.Microsoft SQL Server
& H9 \/ A7 t% n$ r$ B7 A& vE.以上都不对
' g0 S4 t, n7 p$ e- g4 G
# Q- U' A# u6 D4 t6 f3 ?( R% s2 Y+ A- A+ V$ O
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)' O& H7 l8 W9 B" [: K
0 z+ O: n1 T- ?! }6 p. Z+ a
<?php
" E5 ~% V# ^& i' `0 V$ l$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);, Q- t' Q# \3 O) a$ e
?>
E# \; W* L. K+ x9 A4 I- }
' y; v6 a; U* X0 `9 P" J: c. FA.MYTABLE表中的记录超过1条* x3 o; e- w; E) T U
B.用户输入的数据需要经过适当的转义和过滤: q0 J/ q+ s: S5 }% U; u1 a+ ?
C.调用该函数将产生一个包含了其他记录条数的记录
- ]. F& S/ u8 pD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
x$ F( A5 g9 `3 _1 [" N1 dE.查询语句中应该包含数据库名' R- M2 q) O% K7 s$ g
" J" O" `2 K. o( }6 D
- D: W1 G8 n4 `6 {- G7 _4 R6.______语句能用来向已存在的表中添加新的记录。
0 W# m0 r B5 n$ T3 T, `$ }" x8 F: ?+ I! @1 O
答案:____________1 L M U+ B9 v
# W+ ^# ^8 ]$ W6 m1 e# T+ D1 Z9 m& V8 A' W# P6 }
7.以下哪个说法正确?4 t& g4 t1 C8 ~3 y0 r6 ]) ?' u
5 Q% w" E8 p0 {A.使用索引能加快插入数据的速度) G0 n4 B+ T- C2 s
B.良好的索引策略有助于防止跨站攻击
* {! n" \& f) N. T) r( h% B3 TC.应当根据数据库的实际应用按理设计索引$ _( N. ]9 m: g: `5 z: ^
D.删除一条记录将导致整个表的索引被破坏
2 g5 a% E# ~6 @' TE.只有数字记录行需要索引6 ?( Z7 o$ o% L* n
6 m2 W6 ]& {, |5 Z! k
0 H; y% |4 S- ]5 c9 F8.join能否被嵌套?
* I7 z8 W/ b, n& T$ ]6 }
3 I! J s6 F- ~) p6 B. A( V; aA.能( D6 L! O5 q" K/ S2 j E# T
B.不能
* ^/ y8 O4 B ~3 |5 @) S( r9 i% f/ M; R4 c3 M3 O- I) v
$ \' W, Z j( b1 w
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
) k+ W! f% {; Y) U
4 R6 i; \/ b" @1 c; KCREATE TABLE MYTABLE (* _7 F9 M6 u' _! ~/ A8 n- p
ID INT,
* i0 w+ H2 |5 o( |NAME VARCHAR (100),. l2 {: m Q! x2 n$ l1 ]) `8 j" _1 T
ADDRESS1 VARCHAR (100),
% S( {8 k5 R4 Q4 D9 bADDRESS2 VARCHAR (100),& M8 C, u6 ^9 z/ K& T4 F
ZIPCODE VARCHAR (10),7 F& D, m6 e& C' U! H1 w1 Q! _0 [
CITY VARCHAR (50),
/ p. v" C$ U' a3 x- s8 _PROVINCE VARCHAR (2)
& A, |9 C i1 d; e)
C6 [$ A. l1 }2 f% B: pSELECT ID, VARCHAR" t9 J) V" _% v) g: l/ y8 F
FROM MYTABLE
& {3 }+ E1 _/ M4 ]9 p- y& W. x6 uWHERE ID BETWEEN 0 AND 100
: P0 ^2 S% U1 Q2 f0 \2 DORDER BY NAME, ZIPCODE
2 Y. z1 W& B0 F5 r0 \. [- i: m9 s$ X2 Z" P
A.给ID添加索引2 l2 G8 k1 I" T1 l) @
B.给NAME和ADDRESS1添加索引
& I+ r: T2 ?# o) Y% U# X- j8 CC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
# O: ^ B5 I# e4 R/ a' hD.给ZIPCODE和NAME添加索引. G3 {9 {" C8 E& ~, [; }
E.给ZIPCODE添加全文检索: x" Y% Z/ ^& R. i6 N- F
6 F. h. z( P, r6 x( w) x5 T! I, B4 |$ n! G
10.执行以下SQL语句后将发生什么?
& j) p0 [. f& M b% I# c
4 [9 A0 N: L* P; ~, s! D( nBEGIN TRANSACTION2 G- }- q% W7 F& K( P: P' L7 M* L
DELETE FROM MYTABLE WHERE ID=1
# q7 D" F4 W2 F, Z) L, A/ }% x n: n* NDELETE FROM OTHERTABLE3 O1 U, C: Q% y6 O
ROLLBACK TRANSACTION
. C$ J7 n* D1 K/ a* N2 M9 V+ V& |# ^; ?% s. I' G+ Q
A.OTHERTABLE中的内容将被删除
- a" Y# l% ?" MB.OTHERTABLE和MYTABLE中的内容都会被删除
, b6 A5 I% _; D5 {( mC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
, z0 p, @6 n# }0 _1 c4 |D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
* M( S- j: H) h& L0 ], m, I% t ^+ DE.数据库没用变化# ^- q1 O& Z0 {/ u1 ?6 O, Z
4 e) Q7 q0 H! x5 ]" Z J' S! v' u" j0 x& H4 X M! \
11.DESC在这个查询中起什么作用?
- @- V$ S5 S1 ^3 D$ b, T
* ?* b- o3 P' b& i+ S; J+ {; w+ N; G3 ]SELECT *
2 S) }7 @; R% y5 D$ W& F& xFROM MY_TABLE
4 E9 E/ \" P4 O+ {% @- {WHERE ID > 0
1 n7 W7 _6 n0 N' I' Y. X3 k5 L6 sORDER BY ID, NAME DESC
* L9 L+ e7 Q' f% L( }3 L
6 @1 d# w1 z3 n; V- g2 t: O( D. uA.返回的数据集倒序排列* b; v" S" V, b1 v+ L3 z
B.ID相同的记录按NAME升序排列1 Q7 U4 g b s
C.ID相同的记录按NAME倒序排列
1 ~: K+ D, g7 O7 ]# FD.返回的记录先按NAME排序,再安ID排序2 y" ^! K1 _& h- _3 x! m
E.结果集中包含对NAME字段的描述0 R' M# x7 R) q6 w
: W# \9 S% L+ d1 X& g* s( h) q, Y4 Y
12.以下哪个不是SQL函数?/ B3 W0 Y* m& z1 K9 e5 h% g+ ~% R
0 U' C/ x" n! E- G& A
A.AVG
/ B9 p8 o$ T3 T$ }- o* b- nB.SUM
+ Q* f/ u- }. ~+ oC.MIN
- {6 f1 s0 g8 vD.MAX
" a$ e# ?5 {; }5 uE.CURRENT_DATE()0 `* `3 J7 j: I8 h
" x* g# z. n+ Z; C) p
1 K% B* X# i7 @% }( ~13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
, d) p! m5 s1 z7 `! f& f k+ M3 Y% x& J' \5 b% [0 N1 }
A.该字段必须有索引
% L4 G4 [* ~; @B.该字段必须包括在GROUP BY条件中9 F* |+ {9 @* Y: B1 j
C.该字段必须包含一个累积值
" S" x6 n2 B' U% t( Z0 L; Z1 `D.该字段必须是主键
( Q$ H7 J0 D$ s2 u( O+ ^3 b+ L, hE.该字段必须不能包含NULL值5 @6 A1 O+ I3 x; n$ Z) g% o6 e
$ l7 y$ o4 ^' Y6 \7 l, ^5 x. `" W1 s- A! Z, u7 J. Y( ]
14.以下查询输出什么?- m% \3 o V" m/ o- }! g- e
0 g$ E5 I( r, XSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
I% x2 d9 x: I8 K) XON TABLE1.ID <> TABLE2.ID( H1 z8 m D4 ?0 v6 e) q# X1 B
. z: k3 ]2 M1 c8 K6 {% }8 h
A.TABLE1和TABLE2不相同的记录
3 b% E# ~. d3 I6 O$ K- C% PB.两个表中相同的记录0 P: L8 f' ^9 |: b; x5 [
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数% _6 k2 a+ u/ q( k* t8 }
D.两表中不同记录的条数
" s# Q+ ]: s* u" d; iE.数字2' Y8 r1 E! F# j
, e0 \ Q# j* Q" v$ r' f& ?5 N1 J6 W+ [* U
15.______能保证一组SQL语句不受干扰的运行?
# I- S& U- `& J6 e- R+ Z* x& F1 D( W8 x6 ?- h
答案:____________- \4 o' f9 i0 ]! k
# \; v" d( O' D5 ^! m$ i5 s& [- k+ E, ~: M J- x0 x
& U# f& N( v7 t8 N# B b9 S- u
答案速查
+ q s8 s3 m' ]% Y1:BC0 Q+ V1 V4 A/ K8 S, ]1 l/ Y, Z
2:WHERE
o! ~# y) C" m$ q3:B' }; o2 |, Y3 R! \7 s
4:E$ D+ d! J; o* Q- r+ \6 c
5:BD8 H1 f4 ]7 G. I4 P( k/ s
6:INSERT
8 q8 Q1 }/ p9 i9 \, a& i1 V7 m7:C
# v& ~4 v2 G1 @* G8:A" o [- T; C4 i
9:C) l& V. n" {; p; k6 j4 r' s ]6 @
10:E
; r) Q9 p1 b0 f9 a) f ^11:C( x' i1 X0 J4 W1 v' E, Q9 Z' U) M7 f
12:E
6 ] r7 p, C! c6 N0 r0 L13:BC
' F7 d2 \' q, A3 B14:C D- ^6 R4 I* y! |
15:事务
7 ~! i( z+ `/ x6 p6 i: c/ p* B" l! x2 [! M R7 b/ O
( ]. m& x0 X! z" R2 Z
5 B: p7 V6 i' l$ D2 `. E3 L6 y答案详解
. ]! R" ^; T+ x% h
2 V3 C H3 t- \! f" ` r9 b1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。) Q7 a! h" p+ X* |0 A
E, n1 ^: u6 t/ R
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
/ y3 m" m9 d, Z1 S6 R8 Y2 P d1 F& d1 x7 `0 x( r0 Z% G3 {) ~* G
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
) R, z3 X! p6 J) a* ]# G) A
& U& l4 X8 ]/ b9 }4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* X' {& ~. V [+ j2 f
+ S' O! W4 |( [5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
4 u8 i' U" R S/ c! M! _2 [
- B0 U8 O' Y. v+ j( |5 X9 `6.答案显然是INSERT。
8 K+ e: Y) h& D% o) `9 t
$ G" f6 ^! _- }% @( o q7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。" ]- r2 G+ ]0 @; o. p! D+ L
) S; E# R6 ^* K* D; L' J ~ W7 _
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。+ S# a% H( ~% J6 s) l, a8 }
% ^2 ?% d( D Z+ y' C+ p9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。" G2 x# j4 y3 U& A2 t: t
8 N$ ?1 g9 x6 ~: o( |9 b10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。5 [6 E3 X9 ]! s2 |5 L6 W
+ Q9 r: x$ e+ E- p$ Q' Z; m
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
% ?* X# i2 x8 C2 m9 J+ M9 k! |+ {5 S! ^$ Z2 f+ E/ K
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
1 @1 f o+ S9 P! m& S. ~% L8 {) F0 A. m
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
j/ ?7 ^6 ~) c* F# u6 k. W; D8 e4 X( m; P' J: M6 B! a
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。4 N; R0 E' p5 P6 E0 F3 N+ q0 K9 W
; l( ]+ }; h4 M- t15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|