|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14391
- 金币
- 2481
- 威望
- 1647
- 贡献
- 1429
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。' M! a# |% _/ b1 A+ H
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。: @3 m) c9 c# x# p, l" @
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。3 Z; i' _% N3 E. S, n: g& K; P1 U
" l) A) k, S! b' J: L5 a- y- ^
问题
B) N8 ? g5 J0 G6 C
, @2 Z& l: j5 K, I: b$ i6 M1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)1 s' b3 k) Z+ j4 e! O
% X5 f" L6 T) m) [4 tSELECT * FROM MY_TABLE
x4 j. L7 m! u5 ?8 o2 Y1 S- _
: K- C3 a3 @8 lA.如果可能,用把查询转换成存储例程0 }. t6 x& g1 V' c/ F- N7 B
B.如果程序允许,给查询指定返回记录的范围1 w0 Z! B$ F" L+ m7 F$ @. r
C.如果可能,添加where条件8 ]8 S/ Y1 f6 A! F/ p+ J. \
D.如果DBMS允许,把查询转换成视图
4 E7 P C$ k" `1 kE.如果DBMS允许,使用事先准备好的语句) ~0 N* j" P0 j% u* P
7 j. W; A) @% N
) @, {' M1 o. ]2.可以用添加______条件的方式对查询返回的数据集进行过滤?0 K% s8 ~2 \- p) ^( y
9 `2 ^6 K" I1 g# ?
答案:____________
$ [. s2 K5 ^' A' u9 c# K7 z6 B/ |: ^; E/ R5 Q7 `* q; x0 W
8 I8 w9 p! U! n! M- d( {
3.内关联(inner join)是用来做什么的?. y) c% d* \, o, y3 H8 |- b
6 K! [, W, N9 }2 r" u& ^; f: `& e mA.把两个表通过相同字段关联入一张持久的表中) y t9 @: y: N* N8 Q
B.创建基于两个表中相同相同行的结果集' p/ {) S+ @# k0 V. }& h. d, z6 ]% H
C.创建基于一个表中的记录的数据集
8 i! [& ]$ r5 V7 }D.创建一个包含两个表中相同记录和一个表中全部记录的结果集' Q: P4 W. b& z$ T! t+ \! x
E.以上都不对' L0 [- i" Y. D. w) J
9 Y3 V: a9 W4 }2 j. E8 w# n8 ?, J$ r
, B( X. l3 ]7 `6 }4.以下哪个DBMS没有PHP扩展库?1 d( F% Y3 y) t1 R* c% a
% @/ t, A$ C3 P8 Y* y$ X6 D4 M# x
A.MySQL
9 l5 w7 B5 N! ]+ Z( A) F( FB.IBM DB/2' [/ {5 X" u: e0 x, t) R- Z7 s
C.PostgreSQL: J& U0 I) ^* E! }# d- x
D.Microsoft SQL Server0 Y# r4 x7 @2 v7 L
E.以上都不对
! O" b7 p# V! F- s3 u9 v* ^. o% m4 e0 [
# p1 \5 y4 @0 [! y) z5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
9 w# p: z8 D* A O, v
~3 I3 v) ^" V% [; O9 V& Z% b<?php
1 S+ `6 i7 C+ ]$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);: B1 N( f3 m" E0 N+ P
?>
. z* G$ V) R0 \) C) S+ {- F3 b2 i2 @" k/ T
A.MYTABLE表中的记录超过1条
. n( b5 E9 P3 C3 ]B.用户输入的数据需要经过适当的转义和过滤
( a( a, C$ c! N! ^+ _8 ZC.调用该函数将产生一个包含了其他记录条数的记录/ X! h, H6 ~. D5 H- V7 P5 S
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
7 P. H8 j5 _( J3 eE.查询语句中应该包含数据库名
, X c& e# N( a( F) ~) _4 t4 y" A; T* |; m$ z
& S# P6 B9 {( B% }( D
6.______语句能用来向已存在的表中添加新的记录。
& c/ i; `2 ^7 n' |
3 x$ O* X# E4 J; q+ M答案:____________ n3 d2 B) ^' \: v
# d7 J. }" t& g7 x4 {$ e
' {# |+ a9 R; l( r8 e7.以下哪个说法正确?$ S2 @- V4 y$ f! f0 F! h! h% l
2 i3 \) E! l# H) a+ @A.使用索引能加快插入数据的速度8 A- F _5 C$ C" t
B.良好的索引策略有助于防止跨站攻击
& Y+ H2 a- V8 C( X% M6 zC.应当根据数据库的实际应用按理设计索引
! X% ]- y# m$ JD.删除一条记录将导致整个表的索引被破坏
. c& f; `& [1 f$ q# @E.只有数字记录行需要索引
+ s6 A& B! G' p4 g% X
+ m; P s0 I k0 I c" a2 @! ?- x A9 C. v
8.join能否被嵌套?8 E4 ?7 y2 K2 H L
* B1 _# C! h1 H9 s+ e
A.能
) f4 r$ Z, _8 x1 n/ C2 lB.不能2 Q" E" H/ F& Z: i. G0 k' c
- Q' l/ f7 H! D: n$ d, L" j W9 W
- D, F( t# i R c6 `. O2 |
9.考虑如下数据表和查询。如何添加索引能提高查询速度? `/ p1 q- f0 Y. y' `
% _! C) j6 c4 e9 C% [6 B
CREATE TABLE MYTABLE (. k- t6 P" Z2 u( N
ID INT,
: ?* h9 M$ H1 r" Q! Q( wNAME VARCHAR (100),
/ ^7 U, I q9 z0 ZADDRESS1 VARCHAR (100),+ M0 ` j8 r5 i M! v) H9 q% F
ADDRESS2 VARCHAR (100),
( }# n u. r2 B: {, I! J: t! p {. z; LZIPCODE VARCHAR (10),
' C% A; V7 x* w4 U7 {( GCITY VARCHAR (50),
$ _% M$ A) ~& k0 m& _" L5 GPROVINCE VARCHAR (2)# H1 D' o3 O, V! y1 D; z3 ]
). S5 C% N* h& y
SELECT ID, VARCHAR5 ?! ?- Z; D% [7 M" m
FROM MYTABLE
7 W2 i$ n @& z# |- g+ [+ ?WHERE ID BETWEEN 0 AND 100
1 I' d( K4 a* W, Z6 U* C# m9 MORDER BY NAME, ZIPCODE" Q& E: ^. e' L7 u O( P9 N
* r/ p% M5 z& i Z7 P" g8 a" F
A.给ID添加索引
+ |2 W1 q& R! L3 Y0 f! XB.给NAME和ADDRESS1添加索引8 \. t6 Y! G# l5 | S
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
: _* H( u% e. _D.给ZIPCODE和NAME添加索引
3 b" g0 a* r- J/ m% yE.给ZIPCODE添加全文检索
$ q. x# Q$ X- ^2 V3 B+ U$ W3 c, M' t
* |% f& I% `2 }( L) U10.执行以下SQL语句后将发生什么?
& h! N* A' X- n, O
8 u2 f: Z7 q$ c0 |2 @: G0 IBEGIN TRANSACTION
; Q2 U/ _% \ v, t: ^DELETE FROM MYTABLE WHERE ID=1
9 _' l: b6 p1 R& S2 KDELETE FROM OTHERTABLE% G. D# Z3 m4 m' N X! Z3 T8 r
ROLLBACK TRANSACTION
5 b' d# _( m# q% V' g( g, {0 t, X* _' L4 T' C5 s
A.OTHERTABLE中的内容将被删除
9 W- x# q) O0 [B.OTHERTABLE和MYTABLE中的内容都会被删除/ v- G2 }- }% P
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除5 l0 z+ Z5 I$ f8 e4 B
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化4 w* D% Y% |7 c7 t; Z: i) b8 G
E.数据库没用变化 W( H7 S" g/ ]: O
& f! g9 W0 K( ]! ]
: ~# G6 l+ M7 F11.DESC在这个查询中起什么作用?# M. z- k R6 F% N
" w P3 I) ?* g2 NSELECT *
( N6 ? q7 M/ a, tFROM MY_TABLE
9 }0 K4 ^1 s( j0 t' D bWHERE ID > 0
9 C+ @+ C) R" o7 uORDER BY ID, NAME DESC
% i# u* A! \5 j* P, Z1 n+ V- w1 N$ k" z5 \! z5 v& l0 b) X7 ~
A.返回的数据集倒序排列
" s, \3 c7 p% y0 `$ d! R/ R7 FB.ID相同的记录按NAME升序排列+ b% p# X- h3 `1 ~* ]( v' k
C.ID相同的记录按NAME倒序排列$ j; I6 h: u6 k1 C9 |3 g3 f, \/ `
D.返回的记录先按NAME排序,再安ID排序% S2 u, q/ X; h1 o8 ^& J o
E.结果集中包含对NAME字段的描述7 K9 S) \( c3 P+ y6 Y, \
) y X8 K0 I! s6 W. @- T/ ?. C" `
$ }& {" v9 r! w n& Z12.以下哪个不是SQL函数?
9 E" M1 D- j" T* w! f0 P q7 y
+ E2 O. K# ~. v& O4 E: [1 I7 {/ LA.AVG( T6 G o* V2 f6 ^+ Y9 D1 v4 V4 P
B.SUM
8 X$ T$ w6 e9 A2 Q9 M% ]# }C.MIN
& t% R* c* C- Y* ZD.MAX2 p5 y. R0 _: T0 b
E.CURRENT_DATE()0 L9 s+ `0 E5 ?7 F: p( L$ Z
7 m$ r$ i1 B$ W2 {
) u0 T2 O7 K7 \# ]1 W' S6 H! V13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
* u) D3 w. Z( z* r
0 c5 y8 y8 n0 i7 @) lA.该字段必须有索引
; q1 y( z2 S# q9 V8 _B.该字段必须包括在GROUP BY条件中
. x( c+ ]0 t; X+ N. j; x: d; i FC.该字段必须包含一个累积值) h; g8 W( p b# o) k
D.该字段必须是主键, c, G9 {% [ S" `1 x( m4 f
E.该字段必须不能包含NULL值
- l0 K/ L; e% h' I0 |' a; X) e) d' {& n8 L
& n' [) t3 P8 |
14.以下查询输出什么?9 W( c% ^! F- z
* b& Y' A; `0 x
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
/ O2 a* Q5 S, p. u" _7 w2 b1 qON TABLE1.ID <> TABLE2.ID
/ I$ `2 Y7 K( y
! |4 K' f' s( X- H- ~/ T& a9 z. dA.TABLE1和TABLE2不相同的记录
# e" j3 Z: {. C4 yB.两个表中相同的记录% c% d, w. }6 f2 b9 ^
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数: I0 T u' ]/ r. K9 K( u. D
D.两表中不同记录的条数9 P6 o2 o; A' H- ]5 q
E.数字2
1 ]: M# q/ S6 y$ @+ [ y1 e5 `0 c* V/ G/ A4 l" Y* z5 L% I2 c% [
3 |! w2 t! H* o2 N15.______能保证一组SQL语句不受干扰的运行?# ^9 F2 W8 i8 T# Y& _0 `: ~8 w
9 ?6 U- V; v- _/ p) @" l I* U
答案:____________0 B9 {3 L6 T. |" F
4 H) B* Z2 @& s- c5 X
c4 p; n2 d" t2 w3 S4 \/ K
# O: B# E, ]2 t; l8 W5 S1 l) W答案速查6 p9 H1 o& q) h( ~8 G/ O1 d c! k
1:BC3 X9 Y* _0 ]) ~
2:WHERE
/ _2 B. u/ U0 M/ u. L/ q- q; F3:B& h# \% {7 a3 O2 s
4:E
% `- B% e \8 ]1 i3 I+ o" F3 h5:BD0 T/ Q( b. Z9 X4 f8 B
6:INSERT
9 T6 V o8 o4 V% |7:C
# R |$ \- S9 j* M; ]; I8:A
% E$ b: I/ m7 h9:C5 A6 P) _- D5 U! H! G
10:E
' J. R3 o" }5 Z+ [; p11:C
4 p' W3 `; t1 Y/ t+ O, B' X12:E3 [9 _% S+ E+ u! G% {8 l6 e
13:BC+ K. }8 z$ k j
14:C1 o& \4 _; _- n* B
15:事务
7 I5 T6 Y7 {6 m5 l% X; A) y- F* |- M7 h" U- G
; r" \" i t& Y3 [9 ?. r$ @, O3 O5 K" `4 @# c7 S
答案详解
! [$ y+ g! @3 h7 V% V
! U5 c+ A5 p" F' i3 ]$ c( n9 m# O1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。% h0 \# g4 L- H. v( x5 H& b. U) t
4 N- o" I3 T+ p1 f. e: \
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
_' f. ]: K! [' I+ K" e6 x0 I, t2 r* {9 [9 G9 k& b f& I
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
* Z0 D! T* C: @7 _$ t2 ~
1 c5 S- R$ ^# z/ E4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 ~: r! h: ]% I7 O) R$ S! D+ v l" E3 G( ?( i0 s9 G
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
' k8 T' X- ]+ F$ ]8 t$ c' b7 Z) |7 r" K: f0 u+ r( Y& N8 @
6.答案显然是INSERT。
5 r3 Y. v# C7 W" V- G* A1 m
8 P5 e J: O6 ?: d7 A7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。9 [/ ]/ F% p7 l2 u1 i5 Z
& m8 t0 Q/ R( d* R( H1 I1 Y- @& J
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
& d! H8 w, K) U. D W# l6 z' j" d' `
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。% Y$ I7 A# C/ ?' t! O0 O9 V
1 u8 [# C9 R( g+ g# B1 a
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
n3 B" I5 S. k% l; x: b5 {. L% y6 n" \9 v2 T( {( S5 B- g( _
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。* z2 H$ e' |. ]0 v
; w' U* m" P2 F1 ?6 Y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
k0 `: I8 q$ t3 F& `: Y! q/ x- t7 T8 u
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。2 R; {8 z+ G: e$ Y" L8 J% Q/ z
7 G8 M( E0 O' ]: ~/ l
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。- L3 {/ d. N! V( d, [- l5 t
! Q4 D- b. g9 L
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|