|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14349
- 金币
- 2460
- 威望
- 1647
- 贡献
- 1408
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ G+ {0 H; A: `; PPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
2 P3 D% s |. ^. W本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。' T, `& b) A a6 ^' x- ^6 ?) P- m
9 `) r# m, V# d4 q( e9 r0 X. K; [6 g- K2 }9 j& o! ~
问题' C& c& s0 q1 T S* _
3 m- J3 x7 _# R3 s% ]8 a0 h( C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)% g; n- u1 U6 ~$ g: r' k
8 a7 G9 A) {: pSELECT * FROM MY_TABLE1 q. i# J6 J7 Y# \5 y
; _* k( K Z: [4 s
A.如果可能,用把查询转换成存储例程
3 \) i+ J2 q0 YB.如果程序允许,给查询指定返回记录的范围
& O) Z) I& _: `, H5 RC.如果可能,添加where条件4 {% ~) i/ G7 {+ t" d6 z) p) t
D.如果DBMS允许,把查询转换成视图
% w7 c- n, @. kE.如果DBMS允许,使用事先准备好的语句
; a1 ]" m" y" ]% d) m `8 }5 Y! J
. A+ _; I& k$ v) h5 C2.可以用添加______条件的方式对查询返回的数据集进行过滤?' ]# X& F4 D( \% w7 E/ d. A B
1 F2 N, S* C6 X: `
答案:____________0 o& A8 i. L3 m7 C) x0 l
( T2 _5 v) D. X
$ S( F& `3 ^8 Z2 D3 V; }
3.内关联(inner join)是用来做什么的?
* `4 K# E8 w. f/ n3 S' P4 F; ^, w4 S9 F4 i- w( f0 Y( V8 E
A.把两个表通过相同字段关联入一张持久的表中: {5 b. y0 K+ I7 E
B.创建基于两个表中相同相同行的结果集( C8 F6 P/ M% v& |
C.创建基于一个表中的记录的数据集
5 f/ @6 X9 }( F. @5 fD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
! ~: u) i# i0 wE.以上都不对
2 D( \: l+ X& r8 w
# ]7 n$ }0 k* A
, S g# V1 }. V; ?4.以下哪个DBMS没有PHP扩展库?1 H( K9 r0 k% b- ?% k; K
$ _. I: s( f* H# P! X0 ^8 B3 VA.MySQL: V! p2 `/ F5 g- A" M& ^5 a% ]
B.IBM DB/2$ [+ }$ X, y5 M* R) x" ^ j
C.PostgreSQL
$ G1 o: i8 Q5 L! g0 ~6 s oD.Microsoft SQL Server- { ~( v) |; R5 ~3 P5 d' L. i" r
E.以上都不对
/ @0 k% X- ~2 x7 M
% w9 M2 Q* ?( e( }0 m+ m F' i- A8 M7 x% b& x
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
/ P9 x# U. b: N6 v! N
# L( e9 i( }! S4 f5 k: I<?php
5 U6 x4 V6 N% g( d4 e$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);/ _9 w, |' T8 a5 I& `
?>+ p9 q( f, A4 U6 u$ Q9 X- V, S
: T! b o4 t+ N$ @5 Y5 [/ x
A.MYTABLE表中的记录超过1条
4 M8 }, C9 x8 d0 L0 D( wB.用户输入的数据需要经过适当的转义和过滤& c. Y. d2 q4 k9 f1 H" M1 j
C.调用该函数将产生一个包含了其他记录条数的记录
9 m0 `. o5 k; d5 |! F3 h' oD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
' j1 q# q+ Z. B5 b* ?E.查询语句中应该包含数据库名
3 Z$ F; E& u8 u2 r; b: R7 H1 Q+ b+ q! R- a G, b: K
9 L1 d+ Q' n {. u# r6.______语句能用来向已存在的表中添加新的记录。
& k$ A7 K( o$ g/ x4 N/ _) f* X
' N9 U) p* r/ W- [答案:____________
/ h. u; t& F* I9 g& G, B' k1 _% ^9 @ s9 I- z) o- b: Y
/ ?1 ^1 ~8 n7 E- s: ^1 E1 i4 }7.以下哪个说法正确?/ a6 T* d6 L A* d
0 O4 g6 D/ c( ^ x/ q" H9 O1 X2 Q
A.使用索引能加快插入数据的速度
2 f5 F& J" _( M1 k3 k- o+ K* t1 kB.良好的索引策略有助于防止跨站攻击
+ U, @- [6 _, {* S! [; `C.应当根据数据库的实际应用按理设计索引/ y# C6 p+ o4 s' I+ x
D.删除一条记录将导致整个表的索引被破坏9 V& {/ ]& r" Y! y0 O5 Y2 j
E.只有数字记录行需要索引4 c8 A. h0 \# }$ M2 a& W5 u2 Y3 S
, w. P$ k# k7 r' f; e3 N
% j, u% S5 P, W) _8.join能否被嵌套?. \+ i4 h$ v2 ^; I4 l0 ]9 x/ _
7 O N9 x* m3 W3 U; I. WA.能! u3 c M; A' ^. f. U j! r8 M
B.不能 [1 O8 o: C. ?! w6 M. r
4 z& B. G8 A9 [
, ?) h+ a6 X% @5 @4 f _% N9.考虑如下数据表和查询。如何添加索引能提高查询速度?
5 R4 n' o6 z7 r( s( c8 G$ f8 W9 z$ s' O
CREATE TABLE MYTABLE (
1 `/ y- f% T9 u5 qID INT,
3 A, H) C2 I" C5 U7 D( z' G. gNAME VARCHAR (100),3 k/ ?) U% M% A X8 t) H
ADDRESS1 VARCHAR (100),
6 a& A. d9 O8 v' R k, F3 r8 gADDRESS2 VARCHAR (100),
( _# }! {) E* H" r7 a/ t. P1 F9 rZIPCODE VARCHAR (10),
7 X' b; b: ~1 _. }" w0 K& vCITY VARCHAR (50),
2 ^- p' A9 n& J- q: X2 V+ ^+ r8 bPROVINCE VARCHAR (2)" g) C- P. p: E O' c2 L
)
. Y- l& ~0 V2 M' t: H; oSELECT ID, VARCHAR
1 o" X5 b' I+ h: T0 G/ O& |. F2 dFROM MYTABLE2 o& E1 l& J7 W1 M2 N4 S6 M/ l
WHERE ID BETWEEN 0 AND 100
- q$ G8 Z/ m" s9 W' w4 e6 u) TORDER BY NAME, ZIPCODE0 G+ V2 L! X% z3 Q/ H
( F t6 \/ I9 LA.给ID添加索引
& `! a9 m; A7 m/ T4 [B.给NAME和ADDRESS1添加索引
, e, j% e7 b# ^6 r$ J/ QC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
9 V3 F3 }7 L- Z# R3 K! hD.给ZIPCODE和NAME添加索引; x% Q1 J- T6 X# f
E.给ZIPCODE添加全文检索: p$ w- u5 A* z& [* ?0 m
9 Q. x. }$ {4 s" o: Q
' V, H8 u6 |( M4 Q7 T, t6 b; t
10.执行以下SQL语句后将发生什么?
+ ~5 G4 Z1 S* ?1 @6 t* M! B! C
1 W+ H) T5 ?. L( ?0 i! W9 i/ X I, l' Y& yBEGIN TRANSACTION
0 b2 y, v0 ~) C7 o/ UDELETE FROM MYTABLE WHERE ID=1
" [3 H2 S# l& S0 W* hDELETE FROM OTHERTABLE: Q# Z; b* F" Y3 _' n" j
ROLLBACK TRANSACTION' D) M, G/ b# C9 S0 P& }
% I, F) G0 D E/ B+ R/ B
A.OTHERTABLE中的内容将被删除
9 S' i6 A. E5 \$ L; Z, KB.OTHERTABLE和MYTABLE中的内容都会被删除
6 t- o9 B. n! k3 ~C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除9 N3 J/ u1 ]* x) o3 l
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
5 w, K' W/ l) W+ k3 f! N& SE.数据库没用变化5 x/ n% _& x% [* P$ R" V3 v8 |
4 n0 R* c. m# D7 R& g& H' u7 K' k
2 t% J/ X' c( H9 x$ x* H, j
11.DESC在这个查询中起什么作用?9 P/ f6 ~* t- E7 @+ S
3 |3 `! i, l1 P+ W9 h1 y. j
SELECT *
1 J& S" d: k% n/ x* Q5 UFROM MY_TABLE
. f1 d; g9 \9 h; V# D% {3 a$ B- n. ~WHERE ID > 0 V s4 q4 u# C4 v5 X1 Z8 f! M
ORDER BY ID, NAME DESC
! i1 O! F: R2 B4 [; o/ E5 E/ w- H" _4 T/ E2 d
A.返回的数据集倒序排列5 B/ h( W( G2 K1 ^/ I- K
B.ID相同的记录按NAME升序排列
9 b/ G3 e8 w) IC.ID相同的记录按NAME倒序排列+ z0 A. p+ Y. s" p/ \& y
D.返回的记录先按NAME排序,再安ID排序
E5 H; X; {: Z! G9 H7 i/ S& L5 dE.结果集中包含对NAME字段的描述
9 ^1 n2 [% k% b7 m/ w, w1 x+ d2 q4 ^
; C2 j0 Q& j: k h6 c+ P
12.以下哪个不是SQL函数?
! ]6 t0 T r% V$ A3 [
* ^# i4 R4 O. gA.AVG: j; ^" ]5 \- `* i2 B* Q" ~/ O/ R
B.SUM2 C/ p7 ]2 l; ~/ z& N2 L( _
C.MIN9 O1 M' I9 ? D; ^2 [
D.MAX, c4 _, g1 d4 r7 i$ ~; W
E.CURRENT_DATE() q; S( x. A4 W# B" S
- x# U U* F N6 w$ s8 m# E# k" X" I
K( X8 C% R4 I6 J! C13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
2 o* j. T7 {- r2 Q i. @3 h+ n( b$ \! c' k4 \% q x
A.该字段必须有索引" F6 O) [- |8 f
B.该字段必须包括在GROUP BY条件中
- G# X$ j, F3 D% }* v% L) [3 CC.该字段必须包含一个累积值
2 P( K$ [. B3 [) K. B' m1 Z( }1 b! W3 ED.该字段必须是主键
' b2 J1 I+ m, j/ x! ^) ]E.该字段必须不能包含NULL值* w+ }; Y- P, ]7 C) Y, Z
. V8 _0 P" M5 c g G0 ^9 A R
3 N! Z5 O7 @1 b4 ~2 G9 _. c
14.以下查询输出什么?
0 ?2 N0 a2 u* i
9 y: F+ Q0 z/ H+ t# O. v2 oSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2$ ^9 h7 \; n0 R4 e* L$ _/ Z
ON TABLE1.ID <> TABLE2.ID
3 r+ M! w. E) W
, j0 v2 w y% @, G$ FA.TABLE1和TABLE2不相同的记录
" U. }6 m$ a- `9 D! A$ ?, SB.两个表中相同的记录
6 J8 Y! V' ` d3 OC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数7 h( t9 f5 x; s0 y2 M& o: Q1 c
D.两表中不同记录的条数
. p' d5 U: ?1 Q% hE.数字2
: h+ E0 C$ D" w9 x) i0 u+ l& D, c7 q& V2 K: R) g: X
8 V, f" t7 S, @! Y- }5 b6 w15.______能保证一组SQL语句不受干扰的运行?
4 p0 D& d! G% g ]' p8 G3 g9 `2 {3 c$ \) `* a* I; }* h5 r
答案:____________
! N, A9 B3 W# [3 M/ g' [# {- O R- N- g. M1 D9 P6 a
. Q. U5 q5 M0 s' c1 y/ J! t1 ] U/ B2 q; K. h m# |
答案速查# o8 Z T6 p s2 O
1:BC( O' W; U, P! _
2:WHERE
! C$ D. T, E# M" m" c9 V4 l3:B+ d& t- R- E& Z* i
4:E
; R$ h. W2 Q; f3 i9 W# x5:BD
8 u3 b7 I$ i5 j: _5 {" K! U! v6:INSERT
0 }$ O9 V9 V1 g: h* u7 m4 M7:C3 O, R- b: y# }9 Q: X {
8:A o3 ]0 ^: x& Y. n) f6 A
9:C$ e' K5 ^0 ?* m: m
10:E+ S) r2 J- R0 q0 j. a
11:C N4 r9 ~9 F! E- ^8 G: p
12:E
& l( Q* R( f+ |: ]/ q6 A9 |) W x13:BC
- ^: m8 I5 |* `, `8 I14:C
: c9 q+ g4 s& { `$ ?' [9 y( [5 H8 u15:事务* E. C. a4 `5 X8 _
n% E% k% C5 T9 ^5 S: K, s
4 _. F& T; o Z1 P9 b
! V) Q! |1 U F( g答案详解
( C! \8 ^$ y# _, }* G! u, h4 d
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
' A: ?6 s# G. M4 {5 H3 ~' ^9 O, P: f; Y; h
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。+ S! W3 f5 D( j+ Z
1 C( G8 x9 Q u! y8 Z }* W8 o0 y" l
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。1 Y+ |7 l( ~* Q* x* O
) p6 |8 k3 z3 i% s6 d
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。6 i/ v, j8 h$ j
5 E' F3 @. W$ g- x$ D
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。 L0 P: ^# z& |$ Y) C, i' D. W
. D5 K7 t0 C( f- m7 f+ d. {
6.答案显然是INSERT。
* D( @, x/ p, m% c% }/ m3 Y2 {- h2 I: |
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。; M3 k8 S% [1 G0 ~8 U/ T7 P
! q( ]; Z4 W' ^8 p- j; D( M8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。, j- n; q# a/ K) @8 a
. g, R+ T. h9 m2 ]; a1 h, f9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。5 z+ }$ k/ }- C$ E
+ m F6 h+ _# z8 f8 V3 ?
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& ~0 Y, _# J7 D! D C1 b" O9 u( S; N5 F+ {/ `: m, M5 b
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。, |) w1 Q4 M- P3 w: R
' h7 G4 R! J. A; w" E l12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
" o& w7 R3 m" f3 e8 z% r* o6 O
% L1 V% u8 {- P. F' ~13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
. O W {4 U, @4 j5 X( c6 b) P/ N
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。" W+ ?! ^7 J) l; ]$ |+ k% D/ t) W
" O3 o* ?% G- g15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|