  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14153
- 金币
- 2367
- 威望
- 1647
- 贡献
- 1315
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
, O* Q7 i2 v z: T& U/ IPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。1 f- J) u% k" s+ u; }( y4 L+ A* n
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。: n, L# r$ N3 C! k V; \: F8 T
) `6 c a x# E/ E' a u7 X' q7 ~9 Q4 o0 U+ q( e. n
问题
" D W3 f( y0 D6 k
* l9 Z! K/ D5 j1 @7 V0 m1 K1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
; F+ L( Q+ S4 u. j
3 e0 l/ U! h2 Q- c0 k( ?% H, ~1 aSELECT * FROM MY_TABLE
' |2 o) u0 w8 j! ^
) X. b& N2 l( D- T1 S" [A.如果可能,用把查询转换成存储例程/ f" L2 D1 D z ]$ u4 p! V8 U
B.如果程序允许,给查询指定返回记录的范围
6 K% y$ C" b( r" M! F, X( }( AC.如果可能,添加where条件
, ?) j( {7 M/ Y2 W7 s5 RD.如果DBMS允许,把查询转换成视图
' q! {+ v, A/ C0 uE.如果DBMS允许,使用事先准备好的语句 e2 \$ x% d& d- z
! f( ~% z, I5 ]- x! Z5 V
, I: C) d/ d h# |& N$ L2.可以用添加______条件的方式对查询返回的数据集进行过滤?' L6 H6 M" F' T! q3 D
; T. B o. ?9 e, N4 a! f
答案:____________
. Y' ], T0 f j- c* }6 I W, [7 {6 T6 z2 S$ b( e& ~7 a P; h
" a: l# J$ u4 f9 y3.内关联(inner join)是用来做什么的?
: f% |+ n) C: h& W9 L( X. S6 i4 j; ?6 i0 k; b6 {
A.把两个表通过相同字段关联入一张持久的表中
% h6 b! J& {4 B4 KB.创建基于两个表中相同相同行的结果集$ M# [8 ]( f: J* E2 u
C.创建基于一个表中的记录的数据集9 {1 |: `4 @/ \
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
) t8 V! V3 B7 v3 q+ I0 ~& RE.以上都不对
* V1 e0 c0 S" [* N4 h5 V6 U, \
' L! Q4 Q }/ w7 P
) l; Y& S5 g) |. X9 L/ N4.以下哪个DBMS没有PHP扩展库?' E& Z( q/ c/ y! g
4 b! k1 H6 W. q5 m4 F4 P& P
A.MySQL7 U R3 r x8 m J# J3 A! m6 U
B.IBM DB/22 ], |% E) h5 F4 s9 X7 [
C.PostgreSQL
1 A* W2 c4 D7 g8 G" Z4 Y0 u' MD.Microsoft SQL Server' y, X- j1 j9 r) i" U& X6 h+ A3 k
E.以上都不对
: k% ~) s, a0 N6 x5 d2 G z; e' E% u# S4 \* V
3 }8 G$ f* j% ?. o5 F
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
# X. h& k5 O2 g. \% W3 g
6 W( S1 {. d/ T<?php: t5 t( U, D1 L, L
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
6 x% h! d, W7 k" Y7 l$ f8 x3 S2 w?>" {$ t% ~: Q3 Y- z
; @* b1 i! [) Y, xA.MYTABLE表中的记录超过1条5 |6 N D8 Q4 Y7 O
B.用户输入的数据需要经过适当的转义和过滤
" E5 m$ L$ S! T& sC.调用该函数将产生一个包含了其他记录条数的记录( B5 X* j: t5 f6 j% |
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
1 b0 N8 v! I" L3 u0 [. \/ V0 bE.查询语句中应该包含数据库名
1 }- B( {5 L4 Q( P8 K) A
. K8 C7 z% @) r8 e) P/ m/ [1 |" M' |! o; j: ]8 V
6.______语句能用来向已存在的表中添加新的记录。
- W" q0 o t2 F% V. R
' P; S5 c3 S" r8 N# h4 w答案:____________5 Z# I% s( l! G' o
) R) ]6 V5 z/ `8 n+ w. n/ j- u
4 @+ Y# f0 z4 M3 K7 A1 m7.以下哪个说法正确?
) E5 K; v, J$ N, m! b6 P9 V4 a" B( Q7 a! |4 Y+ d! Z- i+ D
A.使用索引能加快插入数据的速度
& a8 r9 H: t; O7 f; U3 w5 _B.良好的索引策略有助于防止跨站攻击
7 ?( V; w @/ e: K! R @C.应当根据数据库的实际应用按理设计索引* S3 w4 R( x1 l
D.删除一条记录将导致整个表的索引被破坏
9 m$ Q" c4 j) ME.只有数字记录行需要索引( A2 l) O# g; r c
0 p1 C( A X$ ?' v1 ]% {1 W6 v! T$ l$ X5 ~& ]/ U$ B- q
8.join能否被嵌套?
* f" L# i6 M/ `
& ]& r1 ?# g3 R, {! L6 AA.能9 y/ q o/ X8 H+ \; g7 K6 _
B.不能
B! y( j" L. i) H; z8 J: X, J1 o8 F; V& V
: D. g, x- s$ H/ j- l6 }- C5 Q7 p
) @& h7 |2 z% z3 C: t4 d# J! h9.考虑如下数据表和查询。如何添加索引能提高查询速度?
A9 }# G, x/ s7 C% R2 A1 {( H3 K' m" A6 ?' ^& N
CREATE TABLE MYTABLE (% d9 F0 X, u/ t+ L
ID INT,
) k( W% I& P+ B9 dNAME VARCHAR (100),
; k( X# v! H6 w. l( T$ QADDRESS1 VARCHAR (100),
* D7 u5 D/ ~. [. u+ z: `0 t+ kADDRESS2 VARCHAR (100),
, R) O1 m9 r" ^( n+ S6 `, e& DZIPCODE VARCHAR (10),# S6 t: Y& {: N
CITY VARCHAR (50),
* Y: s4 u4 @) ? @6 g; B) @) JPROVINCE VARCHAR (2)/ @+ J* G' r% N- X8 C
). ~7 C4 z0 g* y; u& ~ i7 N
SELECT ID, VARCHAR
% G+ k' T; _7 \$ M2 BFROM MYTABLE
1 E6 P. R" u' }' ~WHERE ID BETWEEN 0 AND 100
9 D1 R$ t: U8 M1 a& B. LORDER BY NAME, ZIPCODE$ h- E' q( E; k1 V6 P/ g
3 V7 T# x: ?, d' u" e( _1 h$ j& eA.给ID添加索引
$ N( V& r/ n1 [, r* BB.给NAME和ADDRESS1添加索引
8 S" Z U5 d" j: H, k5 ~C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引' m- Q9 N+ G1 s. t" U
D.给ZIPCODE和NAME添加索引
( G7 W* K* F3 M; z" q/ oE.给ZIPCODE添加全文检索
3 r/ o2 E' \9 ~0 m/ F( a+ o) Z# q3 Y8 q9 e! V9 m' z5 j
, h6 P0 `' W$ }# V0 ?3 S1 ~10.执行以下SQL语句后将发生什么?# v. U) \) v+ |0 x, F
# r8 n9 P# i4 G/ z" o: {1 `
BEGIN TRANSACTION
7 f) F- c! q t7 EDELETE FROM MYTABLE WHERE ID=1
$ v5 V# F" s3 ]4 bDELETE FROM OTHERTABLE" f# P7 G: D- W
ROLLBACK TRANSACTION2 [8 I8 O! _: P6 W. X6 m9 Z
# {* C$ s7 E& N | d- V$ R
A.OTHERTABLE中的内容将被删除
0 F) F- h# M- iB.OTHERTABLE和MYTABLE中的内容都会被删除# m6 c+ k3 x7 n4 x
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
! R1 N; K% C7 P) G- U; ]D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化0 w3 _4 c ^( N2 G
E.数据库没用变化
4 p' q; S3 l$ C% o1 `% I* ?% u" n4 k
( w% B, ~7 k4 p11.DESC在这个查询中起什么作用?
8 t6 e. A" n4 z
- W. O/ a4 I7 l6 ]* \SELECT *
, u2 v- w1 ?9 R7 ~& |/ b; cFROM MY_TABLE: ~' }( Y+ Y8 ~: i+ ]
WHERE ID > 0
* r8 Z8 a' k& L ^5 CORDER BY ID, NAME DESC% r) w( w# a# W* K
* q* O6 J4 _" [2 \
A.返回的数据集倒序排列
- s2 C( M8 h0 CB.ID相同的记录按NAME升序排列
9 f# c) y& J+ u& X) _# X" S. nC.ID相同的记录按NAME倒序排列* x' Z2 X0 S$ T. r B
D.返回的记录先按NAME排序,再安ID排序/ g4 Y, _$ L( B. \- \
E.结果集中包含对NAME字段的描述. T- ]" T( s' ]3 Q2 o& U6 n. d/ T
$ [* c9 z1 t+ h2 u8 |& C2 I3 n+ X5 M s- L, E% {" T5 l& ?
12.以下哪个不是SQL函数?# r: @/ i6 ^! L0 p7 k1 N8 Z5 y9 T, O
4 Q1 c" ?9 I/ ]$ vA.AVG
K, P' W; \" c0 T# k$ r) Z( NB.SUM
8 m7 L! s0 f( U, B7 nC.MIN
X' g8 Z( E! ]: ^( S! U* n% Q; H' @D.MAX" o9 y0 p* y, i* O1 \
E.CURRENT_DATE()
9 K( ?! Z1 c: a/ r+ ?: u4 L
9 M+ E; K& U, E; l: k- z$ `+ i+ S' R2 p- V; Y m# d$ V9 H8 u
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?& U' A9 `3 G# Z d
7 \; b5 T0 @+ H1 D& a9 j
A.该字段必须有索引
& I$ j; o! N2 h$ ]4 GB.该字段必须包括在GROUP BY条件中& y5 U/ Y D% l+ @ U- k9 U( B
C.该字段必须包含一个累积值- [& F- R. a" l) P
D.该字段必须是主键
" f* U4 \: w! U$ q& \E.该字段必须不能包含NULL值/ R/ j1 X+ Q; o) H0 g3 ^2 V2 v, ]+ t
* P0 D, Z; [' |( b, J8 x" R, `2 l# p. S6 S1 e
14.以下查询输出什么?/ V: e$ | k7 m- O4 M! S8 p8 O
9 ?5 k. ] {- \0 z! h2 e3 k3 n
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2" ]8 `- c2 D1 b. B, u! M7 w
ON TABLE1.ID <> TABLE2.ID
3 W' L- [1 m* |0 O' I* x% I" M1 _2 E& K& N" i
A.TABLE1和TABLE2不相同的记录3 }$ b5 R% ?$ Z3 l
B.两个表中相同的记录: u8 s& f5 d- l+ n4 R) E, g
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
3 R9 F9 i5 S( ~7 m* t* `% vD.两表中不同记录的条数
8 t* P& R5 E. v+ p7 w- oE.数字2
" K; T$ _9 J# W/ r' r: W
1 F' b) @: h: i+ Z L
( f3 ]6 m5 Q- B* r$ R4 q/ _$ {15.______能保证一组SQL语句不受干扰的运行?
" g0 z2 ?7 Y, h8 b5 w1 {, `4 H% B' A4 z
答案:____________
4 i* I* j+ m8 S W) U! O% ^, Q* j% M- O6 r) m8 p6 z
1 x7 l' [ w/ _7 f* L- Z
" ?7 A g: V6 G答案速查, Q' U0 ^- z* `& i
1:BC
5 _, f4 C: c* S+ @. m" o, w2:WHERE
$ _4 F- e% {% O0 N! i4 Z3:B
; d# `1 e1 q/ `' L( g! ^4:E
" v, \2 @6 Q. s7 [5:BD5 C$ {9 N3 X6 ]8 C. p
6:INSERT5 c2 h; I: k n4 F$ h% ], s
7:C3 U" \: N: M% R+ F! u) Y" U
8:A
1 v" P& X. w+ J9:C
, f& Y' k( M" q8 ~9 ?4 h" ~10:E, p9 {3 m( y, R- d* E
11:C, n% S9 u) j! w: F3 T* o
12:E- J9 a z( R' G4 j
13:BC) ^. C, ~5 ~+ }
14:C- X; v- w5 L1 S4 z0 Q4 [/ [% E3 _
15:事务6 u' b5 n$ J1 z: s
- I e# z! L# [* n' @& O4 F' Y
! G. D6 e+ a9 s" c
s5 I: ` s* K/ T' a答案详解* c; L0 t- T' U( D @
; j$ b' g% S& J1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。% z7 G: `' A9 ?$ A' H! Q4 g
- x7 E6 s! B& o2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。. L, D! C% e/ w: y! c5 J
" p% @, g) J6 i8 \3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。. O3 b6 ~. [3 Y2 v6 s/ s
9 @+ a4 W" S1 X; Z
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。, d7 U4 z" L' w3 o) f
, M# j# E$ _9 k& {8 n* c
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。! _7 u, Q) n! @& F
& t7 |, f- _9 O
6.答案显然是INSERT。) p- e: C; v" V8 V2 H
) c; I! ]3 {) i" H& r, I! B6 f7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。. k Y: Q. J$ |* [
* [3 ~/ F/ S1 g$ m0 r& g8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
0 S9 m# D2 `3 Y! ~. j
5 K- @: u6 }' r. E9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
/ o5 F2 n5 ?8 f. Q" N
- L1 ?% i9 }+ J3 R* k% b10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。* j2 S8 ]* @1 B
, G2 w5 Z* |+ t) Z+ K
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
0 U8 g6 A5 |& X6 S5 B1 G! l
; h, O5 E1 W8 q12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。7 Z5 x$ B z S5 ]+ c, B/ F, z k
" B$ Y+ z/ p6 b. a3 E
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。+ s& ?# @* x% S: X- X- E L1 z' y
4 n* W5 K5 x0 A% ~4 [5 ~' D& D2 y14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
/ b+ ~9 n. J2 j" f- ^, u& g# Z( P5 ]$ `. U
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|