|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
6 C. m' @2 f/ ~5 d! p4 NPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。( I5 j0 e9 \% q$ n4 r
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
2 Y$ ?% D" F& t: f, V0 T$ e& s% B" Q' f8 _4 W
9 Q1 G6 S7 Y# \
问题
" S1 f8 }0 [ i: D
$ H: y: m/ p7 ]/ E: ~* O7 x1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选), ?5 ]/ Y: m$ Y! L1 W0 v
\% `% y1 `- v+ g
SELECT * FROM MY_TABLE2 s$ Q2 ~) d7 X
. I, O8 D9 G0 a0 v, Z6 Z9 t
A.如果可能,用把查询转换成存储例程
) a' V* c/ a. K+ \" D9 u$ hB.如果程序允许,给查询指定返回记录的范围$ B0 U! |" t: Z3 q1 O4 K: u2 D) u- l
C.如果可能,添加where条件
0 m0 } m, l* Z4 m) C% G. hD.如果DBMS允许,把查询转换成视图# g$ s0 `( h+ K7 h
E.如果DBMS允许,使用事先准备好的语句
" N- D1 i* F( h
0 e# m' n, a/ e7 i
* H3 L# K# M3 o( |. e) m- ~( K2.可以用添加______条件的方式对查询返回的数据集进行过滤?2 m5 {7 U. Y& k0 V
3 ?$ O! ? d' u9 ~答案:____________3 Y- u! z/ A: [' O5 Z8 G3 C5 A
' \% ~ O5 g; _; ?
% }9 A5 l; i8 t$ n- K6 e* t! }3.内关联(inner join)是用来做什么的?- I7 F% O1 P+ C) U" `/ Z
) |4 i V. o& \9 k( fA.把两个表通过相同字段关联入一张持久的表中& K* u# c( r* d8 D; P! z3 p
B.创建基于两个表中相同相同行的结果集
0 d7 y3 r1 ?8 \. L J( kC.创建基于一个表中的记录的数据集+ ~" x% K! L+ `# U! @
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
( Y. p: A6 J2 G7 p8 b4 ]6 z' KE.以上都不对# o( ]! F( I7 T
# n& z u, W- h8 O: ^' x( t# T9 I) E7 _/ @
4.以下哪个DBMS没有PHP扩展库?
7 E+ c( a+ ]9 }- U2 H+ C3 o3 u, W9 O" B6 x: m: T \
A.MySQL
7 Z- B! @( c' NB.IBM DB/2
* ]6 t d! A1 Y. t' ~7 u6 ZC.PostgreSQL
A( }, ?% V, j" v5 X# u( N3 OD.Microsoft SQL Server6 L% d- X% p7 f+ k n/ l. N
E.以上都不对' K8 l. O: y: J7 P. G7 q- T1 K
% k. ^ J8 X( @2 U
2 n( A& X! i4 n! k5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)) l7 t% Q1 y2 u
* F) V5 g% Q2 C/ X7 p2 [3 g<?php8 W/ V4 F2 }1 \$ r( U
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
5 }0 c3 e3 v) p) k6 }0 g?>- @* g' Q) |1 n6 G W$ K% U
+ `0 Z% `3 w9 i3 q2 R6 b% j& oA.MYTABLE表中的记录超过1条
# c, l# n% N( U0 r% u1 ]( t8 AB.用户输入的数据需要经过适当的转义和过滤
! j* T' K# h; `C.调用该函数将产生一个包含了其他记录条数的记录- t1 I3 Q( C2 N/ F
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除$ w9 k3 T! x( G$ s ^6 l
E.查询语句中应该包含数据库名
* b9 p8 h/ B8 c6 `8 N9 S# ^; [* Q6 x! l+ m0 [9 k. s% X% e! Y
7 `! b: k/ c+ d
6.______语句能用来向已存在的表中添加新的记录。. q( q3 ?0 Y+ M( a8 D6 M. B! G
# P9 F- D4 Z: `- s答案:____________* i! f- J$ {" V9 M: R
9 H- ~7 E" K2 i, y* l
+ i& U# m! @( b) i+ {& I
7.以下哪个说法正确?
" G, }0 v3 r+ W, x% r! g. D# r# h4 n( ]: M$ i$ k% H: W, h
A.使用索引能加快插入数据的速度
+ w- O7 Y Q/ c( L4 [7 xB.良好的索引策略有助于防止跨站攻击
. D' `6 V8 I* G+ _1 S1 g* \C.应当根据数据库的实际应用按理设计索引, u$ D2 r- ^( o7 J8 Q
D.删除一条记录将导致整个表的索引被破坏' }: C5 e" R$ u# s5 {! F6 C
E.只有数字记录行需要索引* a @6 g p5 X+ u, C
e7 S% M: k+ {7 e1 ?' ~( u0 U& G, W% P7 R+ ^% d4 w* ~0 l& Y+ u3 W
8.join能否被嵌套?1 s6 }. e" A" i: S, J1 `1 q6 _( w+ H. A
( k; j4 Y/ P0 @ v. _* E7 o. l
A.能 \: a4 x* r$ b3 M2 Q, w! t! G: o
B.不能 V5 _* ~' j9 o0 L
# A }9 M$ t% A, j# F
" Z& o! e+ Y' E6 I9.考虑如下数据表和查询。如何添加索引能提高查询速度?3 b: r4 d: Y. Q y9 a& X! |9 i
$ E4 I9 c9 W0 ~( @- E, l2 D5 m
CREATE TABLE MYTABLE (8 i3 ]; U. f; J/ @$ A
ID INT,
) b. ~+ ~; ?! a* b uNAME VARCHAR (100),
- l' B% f; t6 c$ y ]ADDRESS1 VARCHAR (100),; g" J, e* T7 b- r- p P$ J" Y o4 b0 H
ADDRESS2 VARCHAR (100), Y7 z! J$ X/ l, `6 X5 \
ZIPCODE VARCHAR (10),0 L ]7 i3 g5 L/ v6 v2 G- Z5 ~: H
CITY VARCHAR (50),
8 s1 I# r5 W7 q/ fPROVINCE VARCHAR (2)) |9 s- C% X$ ~, s4 B# g
)
* X# r+ E. F* M4 g+ Z, CSELECT ID, VARCHAR
( W$ m6 U: e; y2 ^FROM MYTABLE
/ p0 W! `" y8 e. l! qWHERE ID BETWEEN 0 AND 1002 Y0 y- j) q4 c, } X7 M
ORDER BY NAME, ZIPCODE
9 y Z6 g8 ]# _: R7 \& \" e
. H8 v6 E" M# X3 l$ B" @A.给ID添加索引
# p6 n% I/ f0 RB.给NAME和ADDRESS1添加索引9 @/ `- l q; W6 [; O7 v' v; R
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
+ U9 X0 ~# U* _; K9 u! } MD.给ZIPCODE和NAME添加索引
6 d* L4 E _% WE.给ZIPCODE添加全文检索
: \( v8 [, b! l& g
# z$ C4 X$ |6 L9 d5 \6 d. Y. D, x: K# q% n' t/ U; T! `% g
10.执行以下SQL语句后将发生什么?4 V+ W' o5 m) A6 ]
( l; h3 W9 L1 w' h( Y M
BEGIN TRANSACTION
# ]0 N8 X2 w0 TDELETE FROM MYTABLE WHERE ID=1% j# B2 ]5 N8 P8 _& j
DELETE FROM OTHERTABLE" B% \. F9 w$ I9 o: \) Z6 `9 J4 a
ROLLBACK TRANSACTION
- j% S0 k( _$ |3 z* n7 S2 @
2 x6 f! c4 r, { g. l4 b- GA.OTHERTABLE中的内容将被删除
" ]% d; `/ w9 GB.OTHERTABLE和MYTABLE中的内容都会被删除
7 e9 f v: y: t/ _4 RC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除# X8 |4 |/ S2 ]& O5 F. t
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化0 A- q2 c# U8 P' a2 w$ [: k) j) K
E.数据库没用变化
6 H$ X* R( k0 p) ~. ~& ?3 d6 i/ z' Z) `" _' E; o, J) j" m/ p
% u) s# s0 ?/ l/ a
11.DESC在这个查询中起什么作用?; U+ ~; [$ y, z8 l
5 T' F2 [; e! ^; j. S
SELECT *
/ P" a- } f# m+ t9 eFROM MY_TABLE
4 g+ E" L6 i- Q7 r$ G5 lWHERE ID > 0+ N { X* z# C( }. \6 u' X3 _$ L
ORDER BY ID, NAME DESC4 k& m0 q# m8 u2 e7 J
" l' D* @) H. }% @% J" v* i
A.返回的数据集倒序排列) Z4 [& M0 O2 _* l
B.ID相同的记录按NAME升序排列- H5 {. C( A" ~ J3 G: ~
C.ID相同的记录按NAME倒序排列
g! E2 w5 k1 z/ P$ U' r7 E) CD.返回的记录先按NAME排序,再安ID排序0 g0 L* ~5 |/ z& Y. A8 r1 v
E.结果集中包含对NAME字段的描述$ L, Y5 P% f/ \
, H9 {" F7 _9 n# j* _$ H; _
) ?% B) t; w8 ^! W1 o12.以下哪个不是SQL函数?! U7 r9 B z& V* t; K
- z- g& l8 }3 A9 G- a, H# u% c1 y
A.AVG
9 |: ^8 R; v5 }9 zB.SUM
) s( [3 [( J" L3 x# bC.MIN
2 H" S# ?$ q4 O3 I% b6 lD.MAX
9 c9 [! v, C5 tE.CURRENT_DATE()
! K5 w9 Y5 V: m- r
" w$ d* N" R( \& n
5 _# s+ Y, o5 _13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
9 |0 A. o, ~& u" @5 l+ c! @7 p% {* a* b9 O u. r
A.该字段必须有索引0 J6 R$ ]7 G: J1 g% t* h# t) J
B.该字段必须包括在GROUP BY条件中
( i7 v9 j7 ~( LC.该字段必须包含一个累积值
6 }3 R: z5 L" X0 u/ \# ND.该字段必须是主键; Y! X5 u6 v8 Y4 }. _
E.该字段必须不能包含NULL值
# |: \( r% R8 Z x- p3 S2 }. Y. E
' T! q4 ^" O) q! r7 l3 O
# J) u1 a2 R2 J2 h3 o$ }14.以下查询输出什么?
/ j7 r F8 Q; x! t7 A. \9 E
% K3 [- t: U$ Y8 v) f* N* lSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
% ~/ E1 G) r4 ?1 `ON TABLE1.ID <> TABLE2.ID% C/ j4 K: H! j+ U
/ r2 ?- Z4 k' O: y: ^" X0 |
A.TABLE1和TABLE2不相同的记录
/ O2 i U d5 \' |B.两个表中相同的记录+ b/ [* Q9 k' n1 u
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数3 n3 I, S. S9 o
D.两表中不同记录的条数
( R* k0 t( T: O+ D: L) WE.数字2
3 B3 r+ ?, W5 g/ Q1 R, ?" G0 G! i% e1 d8 t/ I4 u
1 ?# P0 O) O+ _! V. T
15.______能保证一组SQL语句不受干扰的运行?
0 I4 d {1 c3 K$ ?8 ^
6 c! A# ?9 k2 S/ ]答案:____________
- P( }5 N2 m& i5 I& E5 N, u! b
7 J$ O# Z& o: N% f! J
0 X7 u. O$ _$ W3 k6 \* n5 U- e% k7 C7 B1 M' Z* R# _0 r- [0 U
答案速查
& z0 ^ ]" v0 F4 k# q% [6 h1:BC
% o8 C+ n9 V: {! ^1 u& S2:WHERE
, k% I+ T$ W/ ?8 u# I3:B
, W1 k0 w2 N# E: C2 a4:E
+ O/ Q5 ^7 d! K8 H0 X' x5:BD& n8 w/ B2 r' h/ O
6:INSERT
5 P/ V; ~, k! s" Z: i$ o7:C9 w8 _, b# g$ e: | U
8:A
( R# ?6 h3 Y& K) e9:C+ V5 \* L( o5 R6 |8 x! d
10:E
" X% I# I6 [/ _11:C
5 H: i* l1 @8 [0 V( R4 w12:E
6 e! C$ P: h% A5 f13:BC3 O& y( p: m9 X* S
14:C
; Y% r4 Y# N, U7 ~" E4 s% B' m15:事务; M0 g6 k! C A& N; Z
# N7 g; K! i9 ^$ z/ l% U, l$ v7 J
- m1 m2 c8 C7 x/ K, s答案详解
5 g, ?# `6 @; K, f( { E* ]8 F* Z! z; \! C" t/ S* \+ F
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。8 e( U; `. U: u' ^1 W
0 K$ m. B+ O8 F3 X& k6 `" i2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
, g( h8 j" h0 b# X5 `1 W9 C7 x3 I/ e+ R+ J! P
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。: G' w8 w2 `. W# k, E
7 p' K" B) j3 \, @4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。; d- L( A* m& w% G1 Y; [: G! J
4 |3 r4 N. T# _1 I2 X# s9 X# W9 s
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
6 ?( o$ e* X, e/ N" T" p
2 b9 Q" h# R3 o6 U1 B" F$ y) R6.答案显然是INSERT。
( @* z2 s3 C1 ]" d
& i( o/ n" U& Q8 P7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
# N+ P' X/ n* F4 c+ w
3 O4 j' ] y4 `: q e8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
) Q& Y4 ]! H; f' M, U1 L# J
' R9 d+ H- H, b" e/ w ^, |9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。 G4 I h) K3 z4 L9 S3 T7 g% M; t
) ~& t, K% Y" @. M
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
9 T+ h6 i& ~5 [- v
1 w7 \* I T i6 P; n11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
: w8 ~& ], I, l+ m* P8 ?# b- h4 a" {' Y; Q# U' [/ y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
4 b6 _& k% t7 A
6 E4 w2 W% K" R) c8 A+ [7 W1 {3 |13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
2 }7 G) C: d5 ?2 {. \2 P' r2 J" F3 b. j
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
0 `7 S7 ^! h+ ]7 h* S2 t2 H$ p6 b k7 ~: h" A( p. V
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|