  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14153
- 金币
- 2367
- 威望
- 1647
- 贡献
- 1315
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。5 j/ \, K: r" X; V* i1 y. [
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。. v; s1 c! |; i4 q/ s' X, B }2 h
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ B* b/ B7 D) x/ h; A" N S P4 t
9 b. m& S Q- }& ^. B问题9 I; y. a! F/ t& _
/ t8 F; U- Q; a0 _' |
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 Y9 L6 M) i- L3 y! H' q0 x
8 n7 Y8 d+ s6 I' P5 ?) j2 J" bSELECT * FROM MY_TABLE2 V5 |9 y; |* {. P. ^6 }
3 W3 ]7 n+ A. z1 A9 n) DA.如果可能,用把查询转换成存储例程' a) V6 S J: D' }7 H. ]: u
B.如果程序允许,给查询指定返回记录的范围
% L8 x4 k; @0 a. fC.如果可能,添加where条件
: J0 o+ ~& u* ^3 ^4 rD.如果DBMS允许,把查询转换成视图
7 v3 _- z# j) FE.如果DBMS允许,使用事先准备好的语句
5 f- g5 M5 o- }7 B
5 f- N7 h6 l z. h9 t- S: D: ^- O7 H
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
" ~- n+ ?7 L' E1 @. I! x
0 y& R! o8 t+ Z0 {7 D' @" g2 ~4 O6 `答案:____________ q- ^3 |. l8 V/ ~# X& y+ n
3 {1 Z8 @& z( w9 o1 i; H2 p, }
2 a6 C0 }: Q7 {' `: |3.内关联(inner join)是用来做什么的?
) h) S, Y" k1 s/ K# u( E% J2 p% v. r
A.把两个表通过相同字段关联入一张持久的表中
" P' H) f# g: `: v @$ v4 RB.创建基于两个表中相同相同行的结果集
! z9 H' c% ~' i6 X4 v7 v) [: z; fC.创建基于一个表中的记录的数据集+ x1 N2 D0 |7 \6 Y- J1 m
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
- Z: ]/ U2 G, ?3 | cE.以上都不对1 p: T5 Z% @# T' i/ Z9 j+ A1 Y$ s
+ p( b. M U7 i5 |$ t
" W/ y( `7 l+ M, L
4.以下哪个DBMS没有PHP扩展库?! K, G; t' Z/ l& u
2 n2 Y" H4 H! O1 q7 |! ]* ?9 V5 j6 }A.MySQL) z8 b, E8 ^5 z' Q5 G
B.IBM DB/2
& \4 ?" }: [/ K: ], BC.PostgreSQL
/ v. ?7 D1 s. D# h6 u* d+ cD.Microsoft SQL Server
# Q. m" ]$ z. _; D# |! O* {E.以上都不对- ^' {7 S" o- F/ u2 G
+ G. ?6 j! [$ t) o
+ ^" w+ v& O" F4 K. U5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选); m, D6 T& q- ]- }, \. l/ B
) S1 O N$ I9 B8 c<?php
5 O8 [) y$ c+ ^" f$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
$ l/ w9 y3 o) G# T% y# z( a& j/ P& j?>
) @, N q9 f0 z2 P) ?+ i
$ H% n6 O9 R! F$ Z/ lA.MYTABLE表中的记录超过1条
; l+ Y3 V' [" @1 nB.用户输入的数据需要经过适当的转义和过滤
5 u, B" {- ^: N; vC.调用该函数将产生一个包含了其他记录条数的记录
% u! ?( o+ h% G/ m3 b$ a3 pD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
1 |: B2 I" n! ZE.查询语句中应该包含数据库名9 ~* u( T- F2 A7 k8 h
; D: T5 L/ T# v U: X' M4 d) H
# U: h. H, i# o6.______语句能用来向已存在的表中添加新的记录。" Y, o0 _/ q2 t, D7 V/ v5 i
' ` A- D1 g3 }. `3 y1 U- ?. d答案:____________# T& ^* l: l7 i( a |0 Z1 O
- e3 q4 d3 `* K1 s$ O2 j
9 J, D0 D9 t0 w2 m8 E
7.以下哪个说法正确?
1 k. _* I) P$ s4 T% A: ?2 T- b
9 S: g$ l& V/ \1 {5 o$ `; Z6 q" X) IA.使用索引能加快插入数据的速度8 Q- F5 e$ O# F7 R
B.良好的索引策略有助于防止跨站攻击
$ I: ]' M/ c9 tC.应当根据数据库的实际应用按理设计索引, y6 X2 r- W& y
D.删除一条记录将导致整个表的索引被破坏- W6 {$ t5 ~; [# y9 U1 y0 P
E.只有数字记录行需要索引 S$ E' V' {9 K8 X/ y6 g
* Q2 @( p" {& H: v; }( h
% H* j. K1 N& C) [- `7 t; Y/ H
8.join能否被嵌套?+ Q$ S, o+ A/ `- s; ^* l
) \5 t i# F$ F( ~+ q O2 a" iA.能5 n$ Q- i. g2 K% R3 j) R" @
B.不能
$ P. E9 O/ z6 c: g ^5 y* I4 ?, R6 i8 h8 p% B& s
. }1 O+ B& X a6 }% j
9.考虑如下数据表和查询。如何添加索引能提高查询速度?0 [' q! A _" @1 E+ x
1 \' |9 h+ u- I0 c0 NCREATE TABLE MYTABLE (! I2 }! v7 }) e6 _# |6 H
ID INT,9 k' o# |$ F2 k6 N4 d3 N
NAME VARCHAR (100),
; c! O; M8 O9 _/ x' B. BADDRESS1 VARCHAR (100),) f S) c; M4 y4 A
ADDRESS2 VARCHAR (100),1 G' W/ r! \1 G, ~9 v9 k4 `
ZIPCODE VARCHAR (10),+ h m( z9 r0 t2 S
CITY VARCHAR (50),3 x0 j" j7 w8 r' ?0 Y1 ?$ y
PROVINCE VARCHAR (2)% \+ U3 V& T8 ?& c0 ^" U" b' h
)
. m6 L" Q/ g' N( q0 v% |7 T, qSELECT ID, VARCHAR" p( I- |% g$ N% _+ Q; H* f
FROM MYTABLE9 i8 R* n, Y! {
WHERE ID BETWEEN 0 AND 100
9 [: n0 C3 S- W/ a: X4 X' b3 OORDER BY NAME, ZIPCODE
5 [) e; x9 I3 V7 w# o* N+ ] a% l4 m, f$ q- w4 J
A.给ID添加索引9 _: Y0 r; J# d5 M5 z
B.给NAME和ADDRESS1添加索引
9 M/ s- v. u j# K& K( NC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
2 t n, O3 k' V7 H8 B9 _, g$ i: D' p9 rD.给ZIPCODE和NAME添加索引6 z2 S H4 C) p4 e. x Y4 c2 e0 ~
E.给ZIPCODE添加全文检索
0 \! D S, ^ Y1 a% I; [
+ [: u, _1 J- s
" t8 r$ H1 r2 @# \4 e I/ t" U/ o10.执行以下SQL语句后将发生什么?( N3 W* O- `: A9 L6 [' g* s3 L8 P1 d
8 l* K/ a# f; [" i" yBEGIN TRANSACTION
) E& R9 i9 l& o- r+ pDELETE FROM MYTABLE WHERE ID=10 g7 x3 V. |9 y7 @5 i
DELETE FROM OTHERTABLE
& `2 C( N6 m' O. A c! rROLLBACK TRANSACTION
; y( w0 e2 `* O4 N/ ~9 s1 u
7 @) E7 c. z$ e/ V9 _9 v6 F% C& nA.OTHERTABLE中的内容将被删除4 d: F+ I# ]; Q% U
B.OTHERTABLE和MYTABLE中的内容都会被删除
( [3 r4 ^+ i% `1 ]& H+ AC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
% K) J4 `" o. RD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化. i* w, D9 g7 e9 B
E.数据库没用变化4 l7 }2 y8 s. [7 _# d% X
2 o+ c; c3 Q- j- p
+ J. R3 @2 R3 X* H, D/ J11.DESC在这个查询中起什么作用?0 z5 Y& i9 t6 ?* N
/ x% ? G+ y, s9 BSELECT *
. P8 {. o/ a$ @3 NFROM MY_TABLE$ F, }' k/ H, o' A/ B
WHERE ID > 0
4 P: y4 R X8 n3 \ORDER BY ID, NAME DESC
4 r8 C8 J2 `, u* b. s2 Z. e; E T$ P- P# I
A.返回的数据集倒序排列
7 y9 i7 T; ? j( Q4 FB.ID相同的记录按NAME升序排列
) Q$ ?1 K- `/ @2 d* y( R7 I0 N, OC.ID相同的记录按NAME倒序排列2 Y) m% A7 `' P k
D.返回的记录先按NAME排序,再安ID排序9 _! g# F9 T9 a/ i
E.结果集中包含对NAME字段的描述
0 G3 E5 m4 n5 i8 m9 t: C& L* p" _2 V$ m Q7 L, V8 ?
5 G0 X! E2 x) H3 p' \9 k12.以下哪个不是SQL函数?
6 M9 H h7 ~' w7 A y
1 U( i1 E$ o$ i3 L2 n# g( ` X4 aA.AVG k- P( Z. A G% S3 Z( U' u2 y
B.SUM
1 _" U( S0 @: AC.MIN
) D5 J7 A) D5 P, u& {. YD.MAX
- {3 r, e) b$ V2 EE.CURRENT_DATE()
i5 s* b' U, U+ h5 j$ @ p& ~) _* b5 B/ V( |3 U
: I' a+ F; o! v: e13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
( d* `7 Y9 p" x9 W4 S r" K
4 f4 `/ e w% }. y; gA.该字段必须有索引
4 n0 S0 Y$ ~ W' n' Y" M3 k% b8 M7 R1 [B.该字段必须包括在GROUP BY条件中
5 G; A9 `3 [0 j( r; I0 J, n2 R- BC.该字段必须包含一个累积值
0 g4 D% ~; U7 V3 i! ^( QD.该字段必须是主键
8 Y: f- L0 q4 w2 |( z. N. gE.该字段必须不能包含NULL值
8 j l' ~) Y6 d+ G8 Y
) G- O( [' F7 q: c
; Y: v. Y. y% n- }9 t14.以下查询输出什么?! i+ y4 C$ D/ T, n6 d% `$ z
! Q: J1 a9 n+ ~5 W1 y2 KSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2 h& m/ i4 o& `2 C, q2 v s$ D
ON TABLE1.ID <> TABLE2.ID* Y( E5 k; D* T
# q P S# I' n% d
A.TABLE1和TABLE2不相同的记录
3 E1 @8 {/ A7 P3 dB.两个表中相同的记录& S. h5 f" Y/ @& d
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数4 p3 T9 c6 N9 d" K. F
D.两表中不同记录的条数
% M) }& R/ ~# Y0 t3 gE.数字2
1 [- t& |& f! W" S7 w& }- O$ }- z: G# {1 M& C
0 X! ^, v. }3 Q8 T. D: T+ V/ k15.______能保证一组SQL语句不受干扰的运行?
. l- N( ?5 x% R4 A2 @! _6 V3 p1 @$ }& X& T/ B# K
答案:____________' A. w8 B1 {6 f, h6 i1 c
% [, l H& H' \8 c; o* ]
: s5 _( z B; F' N$ J6 g
- N0 P6 {5 a, {4 H' M* i- `答案速查8 Y$ u7 d3 b; ~" x* P- T7 C
1:BC% W6 ^$ e- Q0 m3 [ u
2:WHERE4 z, E3 [$ @3 q& D+ F' n; U
3:B
9 j* S& m# q+ L' L, H4:E/ h+ K5 V# A+ O- o
5:BD
& j* U" Y/ Z( n: J5 q6:INSERT
# J: H9 l v8 t7:C
' m! S N9 ^1 H" c% e4 f/ a8 |6 P8:A6 L, g0 S) d( H9 s7 D
9:C, X6 }/ C: z# t- d( Y
10:E; J T7 _2 {6 C7 L, @8 D _
11:C
/ |# ?4 {+ x, L+ J12:E! C/ k( A: ^; x$ u' u: |: g
13:BC! v% n5 r4 T( D2 @8 y6 B
14:C% P! C2 F9 v7 s! J4 H3 ~# L0 J
15:事务- I7 ^7 o B& A2 G+ ?
- P" j7 i) `/ K) y" `, S
$ ^7 f+ @, I+ P. K" a
( B7 `; ?* {7 B0 P g5 F: g" ?2 V9 P! v
答案详解! E) j) \7 g2 P5 z- D( V
3 q9 Y6 T6 Z( E/ ?! { C6 y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
. o3 K( F, f& B( c& J5 I1 c
! c* T0 U" Q c. v3 A7 t2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
7 S% t* s, i+ o( p% t, t- p$ }; G7 a! V- [' I" j
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。8 v. e3 s R; g5 i6 m/ j
$ r/ w i$ f% P* w4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
1 `# F+ \! U& D- P% B! D( D( y
: ?9 D, ] m) t. a! k5 K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
7 B2 A/ P f( T! s) \0 E: E
* N1 t7 ?) I9 W& P( p6.答案显然是INSERT。
$ w' P* I) n4 D7 w/ J4 s+ \2 m( f$ q5 L
5 v: f% X S I( M: r# T7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。* x3 i9 s$ z- e& t z2 u1 ]8 b9 y
# v* @5 U2 @" u8 Q; `1 S
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 h7 ^( D+ T( b" c$ F0 f
' r+ p: s$ c5 }) l( `9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
; _" m' L) a7 R& @ k
5 j2 X/ r+ S4 j0 o" n6 ~/ Q10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。! m! Y& W( K* V3 B+ c" J
: X+ ~2 |! h2 ?11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。! u! r. [3 [' ?! E4 Y
( \1 M4 h: ^0 O) I- n/ ~# ?
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
\5 U. i, M% i, r7 v" O3 V# N1 J* w, A
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
* g2 M, a' J. T2 R- a" d* o0 k6 S8 M0 f0 d8 K
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
0 b' Z H9 k; D q8 [5 \, Z2 Q& X! |( q: n2 f+ p1 a4 I% c
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|