  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
7 `1 c7 j' _% B* t- D iPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。3 ]- [5 t7 H- ?! B2 X: _2 q
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。5 c6 I6 @7 ?2 F, X0 ~ q
4 J/ B7 `" X/ k4 u2 H2 u; @$ d
1 k$ q! c! d- D
问题
: {, i- S4 N. o3 \' ?6 ?) I( T" }8 ?8 L
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)3 c( `6 f6 _$ O& ^
- y* t7 E/ e6 k% w, g; RSELECT * FROM MY_TABLE
8 a# J: T- Q6 G. t* ?
0 r8 W% W. z3 A7 M2 ]: E8 ^% nA.如果可能,用把查询转换成存储例程
+ ? a5 Y( u6 m7 \B.如果程序允许,给查询指定返回记录的范围# l6 w- O& |. K7 H) Z+ E _5 }& \
C.如果可能,添加where条件' M' s; K5 J" T& [, A* Y
D.如果DBMS允许,把查询转换成视图) Z% x5 f' N& V3 k" N
E.如果DBMS允许,使用事先准备好的语句
( }& z/ G: o0 e/ f7 o$ C1 j$ h: M$ m. b n/ i0 `' ~. u
! ]' y: K& m" c: e2.可以用添加______条件的方式对查询返回的数据集进行过滤?
" p6 k& |8 a& ^2 U' w4 [4 f
; v$ m) C+ c5 b0 g8 T7 h# }答案:____________
. x1 U4 q# c* F8 b' D$ F. F6 J
& m, q2 O. L* V" k6 x9 d% D. S) o+ q6 U+ u
3.内关联(inner join)是用来做什么的?
/ ^. ^ D+ j7 ]# L1 G1 Y/ [ S2 J* n3 O& Z q
A.把两个表通过相同字段关联入一张持久的表中
8 } @9 O! c4 nB.创建基于两个表中相同相同行的结果集
9 L& ?0 Z% h) |' _C.创建基于一个表中的记录的数据集' T- Z; {8 W- D+ F: z$ F9 S
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
. ?3 e: l# X/ E3 V: W/ Z+ BE.以上都不对
G0 W, o( C! K$ R; l6 i: n4 h
' L8 V- W% F0 G1 W6 I, ]$ T& d' d: R2 Q
4.以下哪个DBMS没有PHP扩展库?2 t O1 H+ |5 [) L( |
) s/ }4 H6 v$ o9 j3 j1 ~
A.MySQL
: P; U; @5 [' ~! X6 w, jB.IBM DB/2: P) ?9 N) U8 `8 v
C.PostgreSQL& `8 ]4 E0 E% U$ J% h+ w' `
D.Microsoft SQL Server
% W' O8 T! J2 x! _1 tE.以上都不对
' z: F" ]1 n3 P; u
( r/ }2 }' m, W& D- i" R7 u6 D! \: V" }+ Y) f& p7 @
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)8 Q/ C4 V# O4 `2 E7 F1 a
) y$ s8 x7 p7 V6 V- N7 E
<?php
: A2 S1 y/ D T- c" i1 k$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);+ r4 I7 g k8 z( Q! G! w v. u) r& J8 s
?>- v" x+ |. o7 ~) F& K
2 K4 D' r6 ?- H* o5 M
A.MYTABLE表中的记录超过1条
+ l5 n2 E. g/ wB.用户输入的数据需要经过适当的转义和过滤
5 D2 q5 Q/ H6 o: F8 P) _* aC.调用该函数将产生一个包含了其他记录条数的记录
! ^8 {4 p. h# K. f) V. w fD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除* x5 f" n: ^3 i" O; a
E.查询语句中应该包含数据库名( C' ~ h5 n) F7 y
+ e3 Z. I$ r! W3 @" N* N$ |* w8 u
* H$ R- o9 d+ n; j
6.______语句能用来向已存在的表中添加新的记录。
( F' T( J$ k. P0 ]; u/ B% q; F. Y7 n* y, x! s w
答案:____________
/ t+ b, @/ W- ]- L& m& e' F0 c' g$ y' @9 e
& u% G! j& n$ C5 c$ C; \& X$ p7.以下哪个说法正确?
! |' j4 M* E. P' X$ o( N) L8 B6 |& Y$ ?' W
A.使用索引能加快插入数据的速度
+ |: h. \' g+ u- {) lB.良好的索引策略有助于防止跨站攻击
! \9 Z" c {' _$ y' zC.应当根据数据库的实际应用按理设计索引2 I2 J; {$ y; B3 z {& Y' l8 g
D.删除一条记录将导致整个表的索引被破坏3 e3 ^3 L6 l9 c
E.只有数字记录行需要索引: a [+ X1 K- O3 q4 w
; M- ]( @# B5 n
, O' O& ]& s8 ~8.join能否被嵌套?
9 X: @7 S8 F: Q Y/ U4 v1 {' i6 o2 i F# O) e q9 M/ d9 G
A.能
% |. V0 m6 _8 f3 `, y% Q& fB.不能& N w# W- V' k4 [3 X8 C6 }7 d Z
$ K9 C) Q4 d2 ^2 E+ V; \8 I
* F, |' a/ s R- \) U* g9.考虑如下数据表和查询。如何添加索引能提高查询速度?
. r: {2 r/ F/ F
* s4 J) _1 P! o! fCREATE TABLE MYTABLE ($ H$ v1 K% i; O( |8 ?" l
ID INT,0 G2 p$ F* U! ~% g% R8 \* w
NAME VARCHAR (100),
. { L% Z5 h5 \: a; E2 _& X) O. ?ADDRESS1 VARCHAR (100),/ @% r; z. l" _6 y7 E* A
ADDRESS2 VARCHAR (100),4 R( c# K2 i* @% R7 g1 D: h, S
ZIPCODE VARCHAR (10),
6 P n" Y" C$ X M- L* NCITY VARCHAR (50),* M! I5 j" f* J5 H7 @
PROVINCE VARCHAR (2)
! j, N$ a2 q- U$ J5 c# A' g)1 W/ i' C5 }6 P% }& u9 ~
SELECT ID, VARCHAR
" D8 n: E+ |6 H6 ?% ZFROM MYTABLE, J5 A' w3 d7 i1 s+ Q, \
WHERE ID BETWEEN 0 AND 1003 K# ^3 Y8 T# I( _( U
ORDER BY NAME, ZIPCODE
% n2 S; q- k* H' Y5 W) \$ D9 j7 w6 b! X7 w0 f0 J2 J
A.给ID添加索引
/ P+ b) L* U2 lB.给NAME和ADDRESS1添加索引
" k- c5 Q. E3 n L6 |C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
; Q F) n0 H* x6 j3 vD.给ZIPCODE和NAME添加索引
% O4 z* J. X/ u- ]+ P* H$ WE.给ZIPCODE添加全文检索; _8 X4 Q, a7 X6 d0 H
5 Z6 ?) B% ?. d" @' b. x* _& \7 ^2 s7 `; \& E: t1 x$ d' k2 ]7 }# y
10.执行以下SQL语句后将发生什么?- ?6 S+ t. `( Z' p$ V3 E; P
( e( ?1 u% j$ a- jBEGIN TRANSACTION
7 j3 G* H, `' C" [: Q; ADELETE FROM MYTABLE WHERE ID=15 }6 Y) P( K4 l& N1 {& J4 r4 }
DELETE FROM OTHERTABLE. y8 @5 H! j* f/ W1 w) C
ROLLBACK TRANSACTION/ C! B. S; q9 G
" N" \8 ?, r$ X+ ?5 sA.OTHERTABLE中的内容将被删除' H' o; R! G, V$ H+ s
B.OTHERTABLE和MYTABLE中的内容都会被删除
. S/ q$ s, @9 S. g' [' ~C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
( |- u( t7 u2 M( g* W( w5 C& f' DD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化% p, ~7 V- p1 T" C7 v. @$ o! a' U9 ^0 W
E.数据库没用变化& J* C" l) t4 I/ n% H' ~
' a: w. H+ L: g/ X
$ Z5 ^9 E4 d7 i0 c& b. g, [0 [
11.DESC在这个查询中起什么作用?
$ g( H4 r4 c# a' P' c8 g; Z. e( I6 c u: Q9 O1 ?2 `" L( d0 Y2 q
SELECT *
4 p" I1 Q) c1 |' wFROM MY_TABLE: ~$ o( T8 ^2 g" M
WHERE ID > 0$ _8 F( T8 s+ B' P% U3 E
ORDER BY ID, NAME DESC- O$ {1 e- l( U: J3 J$ M
, ~7 F8 P6 S. h8 w J
A.返回的数据集倒序排列1 g3 j& w& D# _ v: `5 r& G" U# E/ O
B.ID相同的记录按NAME升序排列6 w( ^+ R% M1 {9 ]0 e5 s6 B9 t
C.ID相同的记录按NAME倒序排列4 K2 J) c) D2 S$ ]0 v* C
D.返回的记录先按NAME排序,再安ID排序
, m8 j! k% @* s+ R, C3 U* J0 X! pE.结果集中包含对NAME字段的描述
: @( j# W: Q4 i3 q* J2 ?6 E* S( L! T i
- S0 A3 b! `, l8 s12.以下哪个不是SQL函数?& B* ]3 l" f4 ^) E" G9 ]
( r& m' U! G& }; s( H; v% a; a+ T fA.AVG3 T% P( n8 n" E g* l# b
B.SUM
: w, {: S# D/ ^C.MIN7 `$ ]2 M6 T8 r. h) z* [: `: l& {
D.MAX0 A3 u: R- Q" u$ D3 j& ]9 G8 H# V
E.CURRENT_DATE()
9 y! o% Y4 }, a5 ?/ w/ N: l/ g9 v$ L5 y( Y" ?: p3 k8 ^* g
" f) ^3 K- i/ r13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: R9 z0 I: l# r% n& c+ b4 q* h. }
! F; ?, E e9 r, k5 tA.该字段必须有索引
1 t8 \9 x; }, z2 iB.该字段必须包括在GROUP BY条件中" s# H. P7 T# |8 G1 U
C.该字段必须包含一个累积值7 K& {% ~8 } o! I/ U- L! _
D.该字段必须是主键
2 J* k6 L; U6 f+ W; ?7 ME.该字段必须不能包含NULL值- j$ X( h' t/ L& `9 O' b3 g
" c) L# M' Q* {( \! A
5 }* A. C. E: Z8 d- y+ \- P0 z14.以下查询输出什么?+ N' s2 E& w) e5 o, J7 ?
. f( p1 u& v# { _SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
" N3 y* M! X I A4 O, l( M" l# E3 d# x' ?ON TABLE1.ID <> TABLE2.ID( k! T1 |! f1 z! H& M$ }2 D
6 ?$ b) V. {7 `3 C) JA.TABLE1和TABLE2不相同的记录
! h. F; u, R4 J, V% TB.两个表中相同的记录( w% @$ Y! P0 Q1 ~1 Z# X
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数3 S+ x: P" _4 \2 p$ d* W" Q# Z0 ?! }
D.两表中不同记录的条数' y" d9 e, W- R2 r- t* k
E.数字2
7 f9 V, f5 p* E. K8 T# e
- b1 U3 M: S7 B
+ q6 D/ `, q9 R7 T6 Y' t* A15.______能保证一组SQL语句不受干扰的运行?9 q* a+ ~! ^$ l) O6 Q
5 x! l4 f/ w" f答案:____________
, t! I( t# z/ f3 g+ e, V1 K; U7 x7 s% R# }, g
- b0 W) h4 h: f. {
7 m( | @- G( `" t; V+ t答案速查9 Q: m* T3 a7 ^8 b! |
1:BC
/ ^* N) O9 w2 S2:WHERE, A1 B- u$ S& C4 l: c
3:B- z+ W0 M% C$ `& T
4:E
0 K+ ^! j; s( ^' \/ v2 \3 ^% |5:BD1 |0 `7 S6 Q ~" w$ K
6:INSERT" W% k( y4 K7 [# g# N8 E
7:C
0 A7 a& ^! O( X0 U; n, F. ^8:A
& `' W$ _- N2 \" ^- U! B1 t' N9:C
+ h1 R/ H' O/ @5 m: x( I6 N% u/ s. R10:E
6 r) T3 a9 U1 z0 p11:C7 l* Y! q( N$ u) N" c9 _
12:E
5 A- T ^+ W: n: x4 B% `% u- E$ ~13:BC5 Z# Y0 v9 b/ Y [. q+ i1 _
14:C# j, ?3 P1 e! d6 N$ P( D
15:事务
# S4 {/ m# ]: S; Q$ ?, ]: }8 j& @" L. M6 t& J8 C' B; [2 f% G
9 v: `3 M6 S) x5 c& W
& o0 Q% A. _% x
答案详解
+ E8 `5 I% e9 A' q& {$ B
: E/ A3 @3 p* [8 \" [5 Y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
% z' Q4 h6 Q' L: L1 d
8 i% ~! D6 L6 k" Z$ b4 U2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
, H9 _: K8 h& I: l9 v3 O
" F' Z+ W# R7 O% N" a7 V3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
; t+ C# U& o5 K4 ?5 |# c' }) @& A/ \$ n# d
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
; H8 l1 ?) N0 |; s& w* i c
: _' ?5 {: Z" _& h- G5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
4 J' B. }7 w6 @, {6 v9 f8 ~; F7 z/ d5 Z$ C0 ?0 V$ h+ L
6.答案显然是INSERT。
+ S- u$ O8 z" m/ n. y2 k
- C# e ?/ z! \+ [# l7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。- D9 @/ j- a+ y, l
/ S& q* Z& e( @
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
) E/ ~3 n: D. c% C' ^/ ~2 t7 O: {7 u/ L6 x3 ?/ f
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。" |7 R- n+ C# l+ [
4 @% D1 A$ \: F( F/ z8 @# H10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。/ H8 }$ M4 ]5 ]" H3 ]
* Y( b& Q" q; t9 l- m* b( o
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。# N, ^2 C; h" ?9 Y* Z
; Z1 h! C8 d a' T
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
5 ]4 l A2 T2 b0 H- L5 e- U: L d! `- b2 ]* @9 Q
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# C5 C% v8 ]8 k
; U8 J. Z4 E; C; S& f6 y14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。( o4 g4 {* p$ m$ G$ F
) x& l5 y _$ ]9 s
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|