|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
4 h5 T1 ~8 Y7 x& s9 s" zPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
; m/ \+ D/ I9 N2 E6 V本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。% h6 w0 k: L, R7 E+ ^$ H9 S0 H
; n+ z5 P; j. s$ |% k- A# y: P6 C# u+ F( o- I
问题
2 A8 }: |3 ?7 d8 Q4 P4 f. B8 M
* l, a; F6 r, c1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
) a* F. W) M! ^; n% F' b
& L5 p8 C" w1 h2 RSELECT * FROM MY_TABLE1 ?" O6 j& N' {
) x0 ]" S2 e' M! tA.如果可能,用把查询转换成存储例程+ R2 ^& y' C, Y. N, d
B.如果程序允许,给查询指定返回记录的范围- x0 x# z& o2 M8 d) P1 @
C.如果可能,添加where条件! `" i5 ~1 u9 l/ r
D.如果DBMS允许,把查询转换成视图. c% y. v7 Z* Z5 v0 k
E.如果DBMS允许,使用事先准备好的语句
$ e+ b5 G4 n# q/ |5 N1 ~6 u" @* F! ~" j x
2 U/ K5 L; G: u' |+ y" ~7 x( }2.可以用添加______条件的方式对查询返回的数据集进行过滤?" z- a4 h) V( s3 P! k8 b
- o' B8 t I/ w7 e- l4 |答案:____________# h; k# m2 r" J( d0 c7 `* j
% U+ G& h4 w6 r) F& n
' \! |+ ]' \( ?/ a
3.内关联(inner join)是用来做什么的?! W# I+ }& Z' |' n* n
" |3 G# ]0 P5 T. {/ D6 S
A.把两个表通过相同字段关联入一张持久的表中
, P1 U& b/ v5 `0 _2 F, K1 nB.创建基于两个表中相同相同行的结果集
Z5 Z$ n9 Y/ rC.创建基于一个表中的记录的数据集# L& [+ C7 h( I: L3 `: R
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
1 a; o+ W7 |, E4 j5 s% u. d% pE.以上都不对
3 F$ v( q3 r v6 V6 S x% [
7 d3 ]+ M$ `9 ]# a Q* T# c
% h |, L5 [9 ^& B' S, \4.以下哪个DBMS没有PHP扩展库?- F5 J8 K/ _; T4 M) S
! v9 z, \: Z0 w: ]" ]A.MySQL
% Y/ G! U5 u" r4 a" L! u, I- d: CB.IBM DB/2
/ j3 S% R0 B- q+ q( Z6 D, DC.PostgreSQL
2 l; q8 U+ R3 X2 F( E/ n5 hD.Microsoft SQL Server
; s' J, r7 u3 Z4 Q1 J( \E.以上都不对
" A+ R9 @5 @9 M( P6 e* w
4 T2 Q1 }- D2 T/ i1 F3 `% i
' G( P: X- o! }* @: [4 d5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)4 s: L* h7 [$ J. G9 n
" C5 t; y! r7 _6 I6 ^: }
<?php& k" o: | D1 x6 `+ Y- S0 J
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
0 _; S7 ?3 o+ x: r! ?9 _?>% o' q; H+ B2 S* y1 V9 O( X; @/ ]
$ G" K$ v3 D! N# ~5 l9 i) m( DA.MYTABLE表中的记录超过1条4 D2 P$ k* z1 \" H- D! d, a
B.用户输入的数据需要经过适当的转义和过滤' R4 Q" U% f/ m$ c# Z8 X2 J- w& B7 L
C.调用该函数将产生一个包含了其他记录条数的记录# \4 v( e( I8 P: ]7 I3 x7 h% u) h
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
2 F- `3 ]: j( k* aE.查询语句中应该包含数据库名
% ^6 G! i. R! W H: A7 N1 x6 M- @" Z9 e$ j7 e4 M8 }
4 i ?) ^: U3 ~# i7 P& O8 H
6.______语句能用来向已存在的表中添加新的记录。
% T) Q" d. h9 @# Z
/ ?* j+ g6 P- |3 h* D答案:____________( Y9 P3 e* O3 l9 ^% h8 i' c
6 M, [& u8 F' Q0 Z& P: w
! K- f4 C. v' K) t! l8 B+ l# O9 v4 Z7.以下哪个说法正确?5 B1 M/ P0 h3 M
! v4 X `: m0 }3 }A.使用索引能加快插入数据的速度8 h5 S* V0 Y; |% q. B$ Q+ R
B.良好的索引策略有助于防止跨站攻击: ~! u5 H2 R( ]( |" C; \
C.应当根据数据库的实际应用按理设计索引( s7 `) H/ ]+ `+ W
D.删除一条记录将导致整个表的索引被破坏
+ c3 b/ M8 w8 k: P$ \ W, g" x: hE.只有数字记录行需要索引! H8 t \. |4 s
$ _ ?/ l) z. E: u* |1 h
. C. ]( c, {+ B8.join能否被嵌套?
- r. [# L* i ~& \5 [0 L0 ]5 d, M; Y+ j/ y9 y* `& S& K
A.能2 k, ]; `6 c8 n- n% ]% w
B.不能
3 I: q& C1 \4 o) d- {, ?& x: ^. t' t0 o" `. O
( g# }( Z4 d0 ]( N
9.考虑如下数据表和查询。如何添加索引能提高查询速度?9 z$ @* N+ K- B. _6 L. P! b0 F
5 i1 s b& p9 D; `3 _
CREATE TABLE MYTABLE (
6 O2 o# G0 n$ s- ~ID INT,
) i" N5 j5 @) E0 ENAME VARCHAR (100),
8 y1 L; K( |" ~6 U2 I+ \! o- q$ aADDRESS1 VARCHAR (100),/ D- D# i7 K% O/ e( ]$ T
ADDRESS2 VARCHAR (100),
( Z) u$ J- A/ k4 }: n, kZIPCODE VARCHAR (10),
2 p4 D! S, `8 `CITY VARCHAR (50),
) S* H: c) w; C4 A. F7 u: ?% pPROVINCE VARCHAR (2) N- g! ^7 Z0 {; e( \8 n: w" u: P
)
* }, X0 X2 F! s# t2 z/ r a* lSELECT ID, VARCHAR7 q, `: P' i R1 E7 X( y. t
FROM MYTABLE
0 H! C" y7 w* g( I7 _& R5 b( jWHERE ID BETWEEN 0 AND 100
]! {2 W2 [* W: ]- ?ORDER BY NAME, ZIPCODE! g9 B2 B r' L) Z0 Q
! j% w1 s/ h4 Y
A.给ID添加索引
2 f+ D* } C3 ^6 lB.给NAME和ADDRESS1添加索引: { R3 ]! Z7 K" s4 C
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引9 T3 |# N; F4 C, V, p* l1 D2 T& n
D.给ZIPCODE和NAME添加索引/ M: n! Q* l/ C3 v
E.给ZIPCODE添加全文检索! {$ X$ K( j3 H
- @1 m5 G/ U9 q, z% c# X0 r$ ]3 G: {$ j
10.执行以下SQL语句后将发生什么?
& g. S; L. |: K1 f( e# q$ T, R0 b0 p, A( F1 ]6 M0 W
BEGIN TRANSACTION9 L, U+ Z$ n/ w: e! F3 w
DELETE FROM MYTABLE WHERE ID=10 Y* Q$ e' O. [1 R2 A' @ c
DELETE FROM OTHERTABLE0 ]4 \+ J! {# R6 W4 {0 A8 p$ l- g
ROLLBACK TRANSACTION
- J9 H, Y& X) U' ]! E
3 H, ]! x( c" C9 N4 |# w& t) xA.OTHERTABLE中的内容将被删除
% s8 Y+ b! X0 _B.OTHERTABLE和MYTABLE中的内容都会被删除
~6 x2 n9 K! L* W' D/ F; d5 RC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
0 d K5 a, j6 F# K- B7 ID.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
[% y* L F1 Q1 NE.数据库没用变化4 [- w1 W1 @0 I* v( W& a* y
8 Y7 i# n5 x, ~$ @, Y. b
+ Z5 f* |5 N, M' J3 s5 h
11.DESC在这个查询中起什么作用?
% V/ { u% V g5 h; ?2 z* N+ k. y3 C5 C1 O4 W O7 c
SELECT *
! J) P6 ^; r5 E2 P* Q/ B3 L5 b8 m4 EFROM MY_TABLE- | N ?: X) n( H! Z
WHERE ID > 0
( E2 d9 B( k5 @* u! z5 Y, T2 p# QORDER BY ID, NAME DESC" T: q7 j. @, R
; i' w N/ o/ j2 p
A.返回的数据集倒序排列
: @' a+ O; N$ N1 wB.ID相同的记录按NAME升序排列# |4 o# Z: |4 E8 A1 R8 t
C.ID相同的记录按NAME倒序排列
& l" B& [5 |/ F! bD.返回的记录先按NAME排序,再安ID排序+ g$ {! C+ F3 c+ M: W
E.结果集中包含对NAME字段的描述6 v( ^# z+ u1 K6 T: l% `# q
9 n2 ~ I4 O: F; m2 u& k6 o
* \' t' @2 e) Y7 ~6 o$ K; |7 r6 S
12.以下哪个不是SQL函数?
5 m# u: q* d4 u4 h3 F) u6 H9 q+ y! p' J* R
A.AVG) r% N+ T, ]) Z) |
B.SUM
! j0 t* M# d& i2 k1 {C.MIN8 e7 S3 T- {! _! o4 b
D.MAX! s* F+ g3 \, N6 I/ {' Z/ p
E.CURRENT_DATE()
9 O$ x8 g& F" a+ a( n' `0 y. c# W) ~" a* q3 m* l: W }3 u9 `
0 K' E' L |5 f9 i7 p" J/ F5 D4 L
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确? c e+ v$ {7 N( T
5 C) F, O9 _. ]/ P+ w7 hA.该字段必须有索引9 w/ Y- s4 y" V
B.该字段必须包括在GROUP BY条件中0 ^ b+ k- x e; ]9 ]( `$ ^3 a
C.该字段必须包含一个累积值. Z' o# Z0 [" D
D.该字段必须是主键7 \6 z1 Z) @' c) b* L
E.该字段必须不能包含NULL值' P9 l/ x# f# ~
* [; c9 d) L/ @8 m) [: O6 q- M+ d- K3 i [& V! u
14.以下查询输出什么?' c; o/ k& {0 ^- ~) K7 Q
, ?' H9 E' k5 F: i9 ESELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE26 h* D/ u' C1 f: k x
ON TABLE1.ID <> TABLE2.ID* {' ^& @0 M& i) x$ H
( ?$ Z( H2 A- X, wA.TABLE1和TABLE2不相同的记录
/ f7 w4 p( O( J: X1 N6 KB.两个表中相同的记录
+ z$ Y; ^' S" }) G9 d0 R3 B/ |- @C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数' U4 e) g# y# U+ S1 W/ t
D.两表中不同记录的条数
" E8 F6 W; k, Q2 q9 |. e; K, \E.数字2
& S9 o4 R/ S! r9 O! v1 e
9 N6 Z' k& z+ Z4 g2 a7 _) }/ m1 R/ G3 o! e" P; F1 Z i* m0 T3 g
15.______能保证一组SQL语句不受干扰的运行?& r1 J e/ s/ \# m k: f2 c; f+ h
5 E$ l& t# w' v; g o- c
答案:____________0 p: p$ C2 F9 S3 v( K8 p8 K5 c
' L+ i, V, k. g; X# `1 B: t
R9 y) B' x4 a3 l* R2 c
% N/ O- Y% l# h答案速查
6 P3 d3 N- v3 s% `7 ?7 j1:BC# P Z6 @ p2 A, U7 ` H
2:WHERE, e# H/ C! N0 u% @* l
3:B
. T: H3 h* Z) a: K# i$ H [( [4:E r3 J5 Y1 Y3 ?" N0 K4 y
5:BD
9 ~, N5 [3 R. ^5 B# Q' z% u6:INSERT
: P# W# }' T! n* [3 j7 \4 {' O7:C! S$ F0 p! o. L/ j: P$ _! f# b& u
8:A- d1 Q* Q! j% c8 s U
9:C' }& @+ }# i8 [6 i) z: l0 I
10:E+ T2 @, b; I7 |) ]9 q0 W
11:C
$ [ P2 Y1 P( z2 y1 e3 F4 x9 S6 w12:E
' P* L6 V- n9 ]4 s% _13:BC
: }7 k$ n g. S3 ~6 @14:C" W$ F5 P7 M$ L/ l$ @
15:事务0 `9 h7 R5 y9 K% o) e* z# F! b
4 I! M1 l) q# z
5 G# q: T* P" g' i4 j2 _, N- H* w# z% `2 h% A7 d
答案详解
; |$ P3 G8 m# ~7 w% I# I- o4 A; h8 V, S: W% `1 D& G
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。5 G d+ l7 l% _' V% J- c- R
5 p* @# k4 A$ K$ L2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
# ]+ D9 b9 I$ Q5 B/ `% S+ a1 z9 H1 U! L1 B/ r$ g6 R+ k
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。0 C" D& W5 U) `- b5 T
* X; M3 X* {2 ^5 C* b% s$ Q+ c
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
9 ?, \' _4 W0 c& Y! s3 m3 K" O. i6 T- W3 H% Q. ]# O: W
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。2 {' j2 `, \* P- L! s* i4 x
' _ C3 C2 d; W6 J6 b4 T# w6.答案显然是INSERT。
- y; P6 m- l: D3 g& e7 @7 i8 P# T
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。0 F/ E1 C# b! _
+ J) [% v8 G- {2 Y- l4 Y$ w- W8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。( ]' ~5 U7 ^$ T2 S% X
' i+ U7 n4 d% v8 t2 k9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
@; {% M' f3 r! H% h
* D" U/ R% }2 S* f" ?6 @& w10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。; F8 ~* v8 P/ f5 F" [
1 X& O! [0 `! A- l8 u7 k11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。& Q, L) n7 B' V( N- D
3 [3 N" r8 p) D# a8 U
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
7 u. }( X4 a; K6 S
) z d6 Q7 f; Z3 n/ q9 ^8 H3 P G13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' \) r( a, p! N2 J
) v* j. L. `# \0 k14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。6 P4 m+ V2 X/ ]7 K
3 B& q5 E2 v1 L+ x# i15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|