|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14433
- 金币
- 2502
- 威望
- 1647
- 贡献
- 1450
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ T; V) p2 M2 v4 E% K# K; Q( c) {PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
) S; ~( ~9 V- s; }) M3 }" A( ]; j本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。3 R& }+ `* O7 k, |
- Z! W4 `' Q# s& h8 R7 v
0 G8 l9 E; O6 N& }% R, t* M+ l+ ~
问题
9 s$ d2 W% V4 P% W4 J+ x9 @! }% X6 H9 N I! K9 w* q
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
6 W0 a+ p Z7 O8 T8 {
* ^% b2 r" L; D; M& E# uSELECT * FROM MY_TABLE
9 P$ y( y8 f- G: v7 S9 J# z
* \: D( w" m0 CA.如果可能,用把查询转换成存储例程
6 E7 M( c/ x& {! ?9 KB.如果程序允许,给查询指定返回记录的范围- E6 |% I2 v( `# u6 ?- Z$ n8 d
C.如果可能,添加where条件
- I# V2 D. i" P+ W$ `D.如果DBMS允许,把查询转换成视图) {+ X7 g8 b( X
E.如果DBMS允许,使用事先准备好的语句
2 N8 P1 a; c4 n* p1 f8 d. g$ ^' [% f( R7 c( Q( P' q8 ?
7 b, ]/ d w% @2.可以用添加______条件的方式对查询返回的数据集进行过滤?
. S8 g' L/ ?! |2 w- a+ [- ^( }2 |7 `
答案:____________; t0 z8 W3 s3 E, V" h
: c! E) _( o9 _2 S$ Y) h0 j" M5 t1 h& X- T6 w
3.内关联(inner join)是用来做什么的?
4 Q d0 z2 `- V4 y% `; l0 C* `% \) j/ c9 I% ~* W. i' [
A.把两个表通过相同字段关联入一张持久的表中
" H5 N& M+ f4 R7 a2 yB.创建基于两个表中相同相同行的结果集* W( H* n: h# v. u' f w/ Y
C.创建基于一个表中的记录的数据集: @: W, M+ b* X; @
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集7 R6 {& U' Z8 I: ^/ n
E.以上都不对3 z* X" y# v: d. u: a# p
" {! F- Z/ T1 t. M O
' W8 W5 I8 [ }: X! m4.以下哪个DBMS没有PHP扩展库?
# j" a! K" v1 k
) O/ b# J! z2 Q1 w- z3 ^A.MySQL
6 @. d% }0 }: P) q+ J1 FB.IBM DB/2& n' G: w2 w% f6 A# n
C.PostgreSQL
% A! U) I* H9 R; u2 l3 o$ a. V8 XD.Microsoft SQL Server% J6 ]! H$ b, v8 A2 ?* ~
E.以上都不对' N" g: a- ^0 n" A/ E
9 u8 ?7 M6 @* m- M5 J) k& A8 O: i: u5 E' z: B# V8 h& D
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)* |, b& t" c$ q' c& \3 P3 U6 o
$ ?) D" L# p$ k/ \8 _<?php
- L& D* j& a% p4 F( E$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);- _/ h+ E5 Q; S' ?* ?6 ~9 i S1 z
?>5 S8 ]5 c" y. D1 i' J. @
e: j( G( [4 v: C/ ]
A.MYTABLE表中的记录超过1条
1 l/ M( ?0 x$ W K8 aB.用户输入的数据需要经过适当的转义和过滤
7 m5 m1 T+ D4 E7 X3 ]8 {8 J' |C.调用该函数将产生一个包含了其他记录条数的记录
# P+ `) v7 z! F) H0 |9 FD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除" u9 q0 x0 j N* d
E.查询语句中应该包含数据库名
9 T7 o9 q1 A) k. J+ `5 h8 i1 s& R- J
3 f% B6 u; r% {" q- n
6.______语句能用来向已存在的表中添加新的记录。; |7 p {4 @& t. d9 J
( `( x1 }; f8 S, ~/ |; K D答案:____________
6 e3 v: ^( K8 b! m; M$ j' N9 m" z2 N$ s5 W7 O1 K
( T: C7 \2 m+ ^, ^& P* K) v
7.以下哪个说法正确?; |( ^$ q# d2 u7 ^
0 U/ M# u0 y7 t8 L+ h& w3 k8 G3 YA.使用索引能加快插入数据的速度
+ {$ [: q5 q. s ]9 mB.良好的索引策略有助于防止跨站攻击9 T8 k3 a( r9 Y8 }
C.应当根据数据库的实际应用按理设计索引
" n0 \3 \+ n3 K- aD.删除一条记录将导致整个表的索引被破坏
! M# I% z9 b9 G' VE.只有数字记录行需要索引$ v( B5 n' N4 G/ `
5 }) t. ^1 [4 a! e) w' K: Z
' D6 X% c0 h# T
8.join能否被嵌套?0 y' R+ B, v* O [0 t$ Y
/ M3 Z/ H4 G4 K: A# H( H
A.能( y/ r+ L" I* u! f4 x8 g6 X. p' S
B.不能1 d8 ]8 J0 H4 V( V: q% b. O! P
( ]) O2 a0 L" B# o- b7 W7 z0 [$ P
& l$ Z' S/ L, n) R4 ^3 \: x9.考虑如下数据表和查询。如何添加索引能提高查询速度?
# J0 i8 T' _( w* [$ r: E+ f7 H0 h( u) R% [# W/ l
CREATE TABLE MYTABLE (7 w9 L$ \; b( ]. Q1 j0 o4 a- z
ID INT,! y5 z( n/ U# G. d9 L2 }
NAME VARCHAR (100),
: o3 L& V1 Y h! zADDRESS1 VARCHAR (100),
2 d$ ?( J! f+ i1 eADDRESS2 VARCHAR (100),
2 S0 o3 x8 I/ ?$ Q0 vZIPCODE VARCHAR (10),' F1 L3 W( |; e& }$ v2 G% p4 h
CITY VARCHAR (50),
" B u+ m! s* V: X! H8 cPROVINCE VARCHAR (2)* G, T3 }3 L) H) {. k* c) m2 {
)
9 T. E \! G: u2 ?! {; ^SELECT ID, VARCHAR
% u2 `( H7 d+ M0 i6 d! g+ xFROM MYTABLE
v( b0 O3 B# H/ C) bWHERE ID BETWEEN 0 AND 100
! x. S& r3 E/ V) p4 v8 y0 hORDER BY NAME, ZIPCODE
2 Z0 Z' v8 m6 d" u$ h: }/ D; C# \2 Y' r9 D. C: s
A.给ID添加索引# G! Q# Z& a& \5 k4 N \5 L
B.给NAME和ADDRESS1添加索引
9 k5 w2 A" Q) M* ~& a; k$ ^C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
5 Z) G2 C& ]2 L3 ?- vD.给ZIPCODE和NAME添加索引
' q- R1 a9 Z1 z1 [- R8 ~1 qE.给ZIPCODE添加全文检索
' N2 S% Z/ Q: P3 V6 r" S$ [- _7 O& h9 P2 g0 l0 c: V
5 J: u5 V C( b6 n- ?( p10.执行以下SQL语句后将发生什么?3 Y! x: k7 |1 F. q/ G) [
8 R2 k _- T+ E5 f: V$ Z) s' QBEGIN TRANSACTION
5 x( O" G6 t! f+ YDELETE FROM MYTABLE WHERE ID=1* V9 G0 N6 ~( r! c- _
DELETE FROM OTHERTABLE
; L( Q# I+ E0 R; ~ROLLBACK TRANSACTION+ d- h3 X3 R: K5 A) V; C
" r7 _) G( \# T, }& z3 f5 K# ]/ z
A.OTHERTABLE中的内容将被删除
/ K/ j/ v8 M* P# p; w) vB.OTHERTABLE和MYTABLE中的内容都会被删除
' n/ w/ V: C4 C/ |- J& F, N" r$ ]C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
) J1 u. F# w& yD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化; ~5 `1 \7 L5 T, V& d( ~. i. G
E.数据库没用变化
% U, e( u3 _" H# z4 y; o- S; o/ ^5 x$ z& ]
! E5 Q# p" @3 [7 e) w: @4 G8 b4 M11.DESC在这个查询中起什么作用?
* g3 y% W) w3 ?, T" G" I$ R% h- ]: t
SELECT * `9 i5 ~: T. Q/ I) Q* U3 K; p" f9 }% T1 w
FROM MY_TABLE4 \) e: f( U8 E6 X* R
WHERE ID > 0
8 r* d: v9 y0 b- {5 ^4 L& iORDER BY ID, NAME DESC
0 w0 \. `5 [. w' A" y
% X( t( I( Y7 M5 }8 }8 ^( u8 rA.返回的数据集倒序排列% E: [8 M4 ~9 e! m1 [3 v/ S
B.ID相同的记录按NAME升序排列
: _' L. d7 E, N& rC.ID相同的记录按NAME倒序排列& O& a! X2 L% p# J' e8 Z
D.返回的记录先按NAME排序,再安ID排序
0 G- Q) v0 X; eE.结果集中包含对NAME字段的描述/ P! c2 [' Z' r% G6 r6 N
2 O! w) d; ^; P1 l& X& D z6 u$ t& d9 U' _( y8 r9 l# _
12.以下哪个不是SQL函数?% [; Q F. x j9 H2 ~
- L6 U9 e' g% W* j: vA.AVG! v# g* s: @' j+ v2 v
B.SUM6 [" Z. w4 I; h6 z( |
C.MIN8 Z6 B6 \7 O) \1 x# L( J2 [
D.MAX* J, v8 }' w6 l. I3 T: q: |
E.CURRENT_DATE()
0 p# D# R4 R/ a. L& O$ {1 Z- ?3 E3 z4 @, {1 N1 D8 {2 W ~
4 d# h, Z `- L+ U5 s13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?4 L. z0 Z$ U4 m2 d
& k e9 P) |& | o' b! v( B' y! K
A.该字段必须有索引
y/ L) F% e) q: Q" K" uB.该字段必须包括在GROUP BY条件中
7 T% r, Z8 L( d6 t; MC.该字段必须包含一个累积值+ d& i# W. z, s* [$ e! p4 \
D.该字段必须是主键7 }0 F G9 u) W- \& j1 ? N; Z
E.该字段必须不能包含NULL值# D' ~. _4 S6 d7 I; m; V4 M
, C+ B* A) v9 A4 L n D y0 V( [; V; U
14.以下查询输出什么?
) F8 `0 l, ~' o2 c U& b* H2 q2 F$ B) ~; L
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
( r+ @' v; X) m. L' dON TABLE1.ID <> TABLE2.ID
" u, F/ G# z- U: m
, h+ H. z: t- _0 x; U+ T% wA.TABLE1和TABLE2不相同的记录
" @3 K' l& ~* d4 P6 K* rB.两个表中相同的记录
, N/ P( j8 z* {( p4 X. |4 Y( e4 nC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
- G2 R/ L! C! h! q7 Z, j6 G# V- {$ H YD.两表中不同记录的条数
% ?( }- j- N( P; J7 WE.数字2
( t+ e4 U( Q, U# I# u, q/ k9 Y
' d/ S4 @" [& x; \) C( |
1 H4 w0 A! ]- I) J- q+ }9 _1 V15.______能保证一组SQL语句不受干扰的运行?& J' t9 U. y4 O8 z* F# L9 H; {
# n" o# F, D, ^3 {! T* i
答案:____________
% C) |9 g% U; r* i% K, X8 s
2 \/ H2 A L9 j' ^+ d6 {" s
: Y6 i* C; t0 s3 F7 L- ?, v! O5 \: N# Q8 {$ y! t
答案速查
2 ]5 {+ d, h* ?% Z1:BC
+ C t$ }; U. t: i8 d2:WHERE
; g/ a( L1 ], r i4 w% z. W3:B* S- t- X5 R% V3 d/ f' q Q* X
4:E
1 Q7 U4 Z, v5 F4 T. m8 B- Q. T5:BD
3 i7 g- [+ y9 v4 n6 n2 \- N6:INSERT" Z8 |7 ~* s, E: d7 T
7:C8 g1 `, O/ a2 \7 i% `* w+ N
8:A
' G' N+ F- V7 {7 D6 g9:C
3 ^7 s6 E* [) I$ Z- y6 ^10:E6 B8 l, {! A3 q' U( }
11:C
8 U* l3 M3 P+ a# _12:E) r& B x2 M( h1 a5 n# i) l( G4 e
13:BC
1 w. W( Q) H4 A4 u14:C
# y# i- f+ F$ p! Y( A+ Z& Q15:事务* k" Q3 K7 R+ f" c9 H' n# ^; M0 `
2 R+ e$ T- J; z* Y
# @( ]8 \ m0 G' ~% P
* R9 E0 O9 `: @答案详解3 u. {1 }. _/ u8 l) Z; `" U6 y
: V2 V4 `' F: o8 d( @& M' S
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
( o' T. s6 S a7 q8 y4 n/ g, u _# d0 G* A2 Y j1 _3 |
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
* a# n3 k5 t1 c! C$ ~6 P& G. C: ?3 T( |7 l1 F8 l4 ?
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。; q. R0 B# P+ m, O
# M$ j; ]/ e& Z6 D% \7 o+ l
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。. i/ k( [7 N/ h$ F+ E
( {: k% Q! \* T3 [0 q) s
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。- m' e% {9 @5 Q# L
0 ~! s C7 T1 K6 }- D" x
6.答案显然是INSERT。+ d7 o t& m- l. \6 V8 j
5 e6 @% y9 Y8 b$ d7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 R* X$ i) q7 ^: O4 g) Z. [( v) m
( h7 m( y5 r+ p' e( i, X- l! \8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。6 I$ k7 o6 q `4 F( `0 g
$ V9 l% c, m3 v+ S. ?
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。+ [$ g* l ]- n1 p
: w% G& F5 F: R1 ?1 |# g3 L
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。- ^( }: @ R' a8 N9 ]
4 k' D1 o' x0 l6 h) X5 }% N" g5 [: _11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
: Z- I" n8 o- C: k% G
# ^, e8 U) z) `) ^- @" R12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 h. m0 q4 `0 Y2 M! o! _! r
+ l4 j: T; r9 `% E13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。 q' _7 f4 I( C8 S4 ]1 f& g3 ~+ {
+ T5 y+ M& e5 T) S& s- {' e0 E0 e
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。: e% V6 {$ V* w; Y- X/ Q
/ F, ^1 n: a! c; U
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|