  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。 k( z( t& ?9 N0 Q5 `5 @4 G# K
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
5 w7 J2 |4 N% j" w- p" f! Q) q本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
4 d1 l+ ]$ ^: |
) }2 Q5 j" V- n/ k4 _" s
7 g( }5 y2 Y" `问题
4 x* Y% p9 I7 J; l! X+ }0 d3 S- w. ^1 l3 d; x: h2 H
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)1 P8 V. K4 o# x: t* n" ?# m
0 [( l* l& R+ n4 R
SELECT * FROM MY_TABLE
3 j+ r( n" H- W q% L* }. k* T ~" c9 ^: \* g
A.如果可能,用把查询转换成存储例程6 F+ z) X3 n0 |9 X' P$ t/ K
B.如果程序允许,给查询指定返回记录的范围
5 S7 O: J }# p8 [( X( yC.如果可能,添加where条件
3 k# n. j( ^. R* x1 g: ND.如果DBMS允许,把查询转换成视图
: w' R7 J6 B" G, R0 F3 lE.如果DBMS允许,使用事先准备好的语句" v% f ?8 f! l8 w2 E$ t/ T: o
( l9 J$ b4 E B& `0 b' @9 K
! n- B, b$ t8 V. O) j3 K4 X j+ L: k
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
3 m4 T9 O U" \& N
; u( I/ Q% R% v5 _2 u答案:____________) @3 S I) Q& e8 T. `" M. w
. ^, \0 F6 C+ W+ l' M3 s2 }& }3 _* v; s" E
3.内关联(inner join)是用来做什么的?
4 `8 c$ i* B% J g: g$ ?2 f
; v, O8 z. y, o5 f6 Y: v/ \A.把两个表通过相同字段关联入一张持久的表中
$ Y$ ]8 ~9 b0 x' zB.创建基于两个表中相同相同行的结果集
5 r1 |! _' d# O [C.创建基于一个表中的记录的数据集2 g2 G6 p' x' i! R/ M1 W2 R6 N6 C% e/ k
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
& P1 L$ T v. |5 K: B1 ~- J2 sE.以上都不对
4 c7 f8 @/ X6 E% |; n2 x) `% r% X8 X2 I- N0 w& i
8 _1 r. I; u" q
4.以下哪个DBMS没有PHP扩展库?
- R" C4 M5 D! g% W9 t) d7 h. a# @9 U# }
A.MySQL
4 [4 p1 j8 l" l$ QB.IBM DB/2# F r5 p: |, g8 o
C.PostgreSQL
5 c# }9 V9 y: j" `0 kD.Microsoft SQL Server1 Q) Q& I/ L* }& Y ^$ H
E.以上都不对3 m, S, V5 L2 }- c$ v
/ h/ `9 t0 _4 \2 h6 S) E( j
" \2 l7 b% `' j/ n- J+ A8 o5 [6 @2 ]5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选), A& j' i A2 z3 C5 B2 J, w
3 R8 z( R: |9 n q* r) S
<?php
! n6 S0 i4 f! D+ F7 l$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);8 M5 N& A$ L0 O
?>6 o3 P# G7 w2 t& e
& P; J' P, J* P, Y! W U% bA.MYTABLE表中的记录超过1条
5 _1 } H; ]4 p% e$ y) A9 B! Q" WB.用户输入的数据需要经过适当的转义和过滤: r, a: x8 L. B) D' Z
C.调用该函数将产生一个包含了其他记录条数的记录
5 @( D. B+ ]) r2 [D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
# z& ?, n) V5 K! Q2 m& RE.查询语句中应该包含数据库名
j- ]8 ~- r7 \; I- [' @. d" o+ w: g8 h( |1 y
R! [# \ Z" E* c6 N8 ^
6.______语句能用来向已存在的表中添加新的记录。; K1 s( n) H! C, [+ r
7 E+ S9 k2 |, U4 E% g! [
答案:____________
' Z6 S/ u1 j/ \" N
1 D* ^' v# ~, f2 D7 u4 v* f5 ]8 Z4 [$ {. }" J) w6 _* P5 i
7.以下哪个说法正确?
2 F0 A/ p6 a0 m6 U- j+ u
4 N+ b9 a* O, u9 iA.使用索引能加快插入数据的速度4 G- k, }5 ]% V8 m; f, O
B.良好的索引策略有助于防止跨站攻击
% S4 e, X, R3 Y, Z# \1 w& zC.应当根据数据库的实际应用按理设计索引7 V% ~1 K" U) l/ d0 V3 u( S
D.删除一条记录将导致整个表的索引被破坏
5 Q( }' [7 V/ o" |) x! ^+ M5 dE.只有数字记录行需要索引
* o3 x/ | W& A$ E1 P5 k$ p$ }
* l5 I3 r8 V5 k
2 |6 H) `2 f' I- e9 G8.join能否被嵌套?3 W B8 o; c- Q7 @' u2 c: V
9 A6 o H; e1 H$ WA.能+ v( o8 S3 W, F$ s7 \8 ~
B.不能3 I8 Q6 M7 A2 U2 x
3 t+ f" L3 C! h+ F) }
5 i5 A* B# _) X m4 q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?$ X9 _0 C% }8 H( H" U: ]* b
$ u# C3 q' g3 f; v! b1 l# P6 k9 LCREATE TABLE MYTABLE (# g& U2 ]" V! Y8 _6 J: r8 {% ]
ID INT,
- Q1 O+ }8 V- \$ a9 U9 DNAME VARCHAR (100),, |; L$ V4 m0 K
ADDRESS1 VARCHAR (100),
# i+ N6 m* d' p: IADDRESS2 VARCHAR (100),
& P: G6 I2 w5 ?ZIPCODE VARCHAR (10),6 _' n5 V4 b: H
CITY VARCHAR (50),) k' ]/ K/ D1 z' W, b2 A
PROVINCE VARCHAR (2)& T6 t+ f6 A1 W+ {2 f
)
6 K- ~! S5 _* TSELECT ID, VARCHAR- E& n: v7 x8 J" z/ ~" H* p% Z) O$ w2 X
FROM MYTABLE9 s8 ?+ A5 p8 ?( n" ~. F1 n
WHERE ID BETWEEN 0 AND 100
( M' {9 w; S6 u; T' U$ m, x/ UORDER BY NAME, ZIPCODE
/ H5 K) k! P6 n0 U* }7 ^) q
$ M( L O) ~6 I7 q7 f4 j j. [A.给ID添加索引# ^, R0 F0 E/ X3 R+ G
B.给NAME和ADDRESS1添加索引
6 B: E0 \ E0 L4 k! N/ s) MC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
0 j4 a* P6 M: s" Z l9 }* wD.给ZIPCODE和NAME添加索引1 l! k2 w: h! D; K' y- e; e4 w+ K: |
E.给ZIPCODE添加全文检索
8 r7 ^8 a; f: f, e, D( D; a% _- M7 K0 G
4 h- S- B" Y, A3 ?, a+ |
10.执行以下SQL语句后将发生什么?& ~# @5 J( K3 y; Z$ v6 s
( b# r- a, X5 p% O* gBEGIN TRANSACTION
) @8 x6 m& a$ d1 k9 yDELETE FROM MYTABLE WHERE ID=18 Q3 x1 R# R2 l0 m7 O7 [4 }
DELETE FROM OTHERTABLE
e2 W; ]: a2 w) wROLLBACK TRANSACTION
) j7 u$ g/ I7 w$ |) B
; S9 ?+ q" v; s. ^A.OTHERTABLE中的内容将被删除1 m. q' }- S5 X- x
B.OTHERTABLE和MYTABLE中的内容都会被删除5 i) P* Q% |# G9 E1 K
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
, A& S' r# ?) X% R) S, ]2 RD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化& T6 ?. P7 d' H/ f8 n2 B- W( G4 r
E.数据库没用变化2 u" Y% Z/ v. R# X9 Z6 Y' s0 ^
2 x6 [4 J/ W* v+ R2 W
8 T! M5 T% @' q0 e* Y' @* G" {) n11.DESC在这个查询中起什么作用?
8 ~- r3 R/ Q J" }1 |/ v
5 j7 N9 Q u. @1 mSELECT *
' [3 ^6 ~" y+ UFROM MY_TABLE
* P8 U* N' q/ e/ RWHERE ID > 0
, B+ S- u! }/ @ S6 X$ G3 k7 L, YORDER BY ID, NAME DESC
* \4 x) v. ?8 P H7 U9 U1 E2 k
3 d9 N0 l" g5 F5 W8 LA.返回的数据集倒序排列
& d% b9 ^0 {, W1 Q# i! }6 wB.ID相同的记录按NAME升序排列/ V! q8 x& T5 L* o
C.ID相同的记录按NAME倒序排列1 |+ m/ c: z# H/ C# r V5 N- q
D.返回的记录先按NAME排序,再安ID排序
# [; p; b4 R3 F# k/ b/ IE.结果集中包含对NAME字段的描述
- k0 u% P. n' T" y5 d- Z: A# k, w9 `: \) m
! M* [, x! x, f+ q12.以下哪个不是SQL函数?3 C8 i' f; [; _: R3 t( h5 |: P
+ k0 d$ B) p* i" \
A.AVG6 l1 W- J/ R2 q5 W+ M" t7 w5 `: U
B.SUM) W, y; j1 f. o' N' M' D
C.MIN
; e% {6 g5 t4 i9 [' OD.MAX* D( D% F7 w/ o6 r" n: e1 w8 n
E.CURRENT_DATE()% W- X. f* q/ O2 e
+ ^- B p3 ?7 T% J" N) n
( n% ^9 r3 O9 @
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?' ?' d: h# C( d4 A" y4 f: \
: {" T" U- P* z1 e- e3 u; Y4 \
A.该字段必须有索引' W$ b* x8 _3 o' u8 `% j
B.该字段必须包括在GROUP BY条件中0 n5 J8 {8 T) v$ W& h+ o
C.该字段必须包含一个累积值
; j" c! h, h9 x9 ~D.该字段必须是主键7 ~" I$ ]& h( j' o, g
E.该字段必须不能包含NULL值% Q5 {8 }; D! a2 a5 j
* G1 y6 a1 K) w- g) ?/ {
. j5 B* \, a; ?+ W& ] i5 C14.以下查询输出什么?
$ U! P0 q, N$ [" L; U. m# [/ G5 X/ }1 x7 [- z
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2/ H5 S( J3 j9 a! V8 u) C
ON TABLE1.ID <> TABLE2.ID
2 X, g& I* j4 h4 U
4 K1 S: E# D, a2 ~/ gA.TABLE1和TABLE2不相同的记录 P# o# X% \7 y7 h
B.两个表中相同的记录! v+ i" M) J8 U" J
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
: p4 Y% J$ y9 K: B gD.两表中不同记录的条数
f, d9 e" [( j' f) ?E.数字2
3 |" c( R' U- f4 s; `. @3 |$ B5 g1 W) W' m( h# s
' }8 m" }8 q/ x9 O1 x7 A& ~15.______能保证一组SQL语句不受干扰的运行?
. {6 @5 M) K* ? E" g$ V$ f8 j$ l, S; |
答案:____________* u7 W$ r/ ~6 S$ q0 A) }" s+ x
# e4 }8 x8 u# F# G5 d
; M7 j8 a; w# `5 B- S ?; l
. [ J3 X- ?% d( ^答案速查8 a& H# \/ x. p" a
1:BC: D6 X! L6 \9 J% P; v
2:WHERE1 d6 ?; i5 z2 }$ w
3:B
8 E T1 M+ c. |6 q" G8 ?$ \4:E h2 B5 N h9 T% ]$ j, J
5:BD4 u/ A7 n) L0 d6 K! l
6:INSERT4 ?) q+ b+ G) H5 |, x$ w
7:C
9 b5 m& I, a b- I8:A. U, ^+ f8 t4 |* v$ z/ A
9:C
# M; \2 |9 k) Q2 T5 {10:E' j' r0 Q( R% j8 d7 Q1 \
11:C
) K" F) P+ @+ i' D, v7 v12:E+ I k7 S+ C* a5 c
13:BC
" a5 X% z: q ^- T* t+ C% }6 L. |14:C
, q' F, Q( Z4 u' R15:事务
6 t9 e8 q: B! I8 O6 n/ s+ |/ C6 @/ \1 H! c; d/ I
$ P7 C D0 C; } k( a9 ~
6 r- ?" U3 N2 i% N6 S0 G: c答案详解
4 r' i; E7 g$ c$ a! L* R8 ?( ]" C) L
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
J7 c2 L5 c4 d# C, t7 O; d9 i3 ~3 V
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。4 E# d, Y( l! C' H$ V' {4 z" z
( ?) X2 n& e' G2 T9 H: L4 \" m- T4 w
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 b, o1 C& h( I4 G( o
$ M- l8 j/ P! i( }4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
! ~1 P6 R$ d! Z7 r3 f/ r' P
4 ?5 h2 L/ V; V3 J+ x5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
1 R. }, ?, [9 `. g9 t9 Z5 ~: r* x" Q7 h8 O4 s
6.答案显然是INSERT。
$ n% s8 ^( h t- I1 Z& ]
( m2 a* T" X0 N, _) i, t4 Z7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
5 V8 b4 }1 Z+ _) f" c& {: a8 Z2 P4 z, T' r9 J& k' K
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
( ^7 R5 Z9 U; z
U' A/ c- {1 _7 L5 `8 \1 x0 S9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。) } x9 z8 x3 U+ L
3 e, @8 r- T4 r10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& G, R0 z' q) v: d6 Q) }6 ~1 q; M% F
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
+ x3 N6 D! Q6 r' @1 p& N3 j o b2 j1 z5 V# x8 l8 B
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
0 u" m! h9 _) {: d5 F! o C, D* c1 m7 _6 {6 P1 s% y1 r( S9 Y
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
+ P6 N. E7 F+ N" A% F Y1 g/ J8 |0 Z
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。. B1 m& p) X0 I# V: U
, ?( \% d% f5 k" G* p) ~, [
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|