  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
( L3 m" {* f0 F3 e s3 Q. I1 D1 R+ rPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。: I# E6 d/ Q; D! S( m# N+ {9 I
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
7 Z( U9 {/ p7 Y( g" F* p! T& v, u" X- n1 p
$ F; P7 S; @0 @0 w问题
* M" l& L6 m% v$ \3 \6 f: X7 @) o- g8 f
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)# r! _" T5 {! m2 w( s4 y* i, a
. V4 Q) C% a% aSELECT * FROM MY_TABLE
p7 s- T+ Z7 x% v3 h3 r
9 D* \* z9 n1 h6 k) NA.如果可能,用把查询转换成存储例程1 H" A/ B N, W* j4 g
B.如果程序允许,给查询指定返回记录的范围! n! p+ g1 U1 ] Z
C.如果可能,添加where条件0 k* j8 X( ?. z2 z- V: T2 Y
D.如果DBMS允许,把查询转换成视图$ [- a3 D; t) _; m: e, y( n
E.如果DBMS允许,使用事先准备好的语句
: a# c5 _+ A4 G/ x* `8 A; o8 a+ F8 m$ w9 [% r4 O; i0 J% l V, Q V' u% C) [, C
; n! L5 ]. O" V* ^0 l0 p, j2.可以用添加______条件的方式对查询返回的数据集进行过滤?. J f2 m4 l& t+ C# J
* v0 t5 D2 j( W/ @' x) R \. y6 C答案:____________* z/ D8 c" h' L4 x+ k$ L* k {
2 ^* h0 K: ?; H r9 }" w
( G" a- ^" i" X# I3.内关联(inner join)是用来做什么的?3 `+ @5 h. t2 J4 L3 J9 S4 B
( x4 s1 s4 z, p, O" `* PA.把两个表通过相同字段关联入一张持久的表中% I9 f1 H& q. H7 P& F
B.创建基于两个表中相同相同行的结果集8 v! M$ F# N8 z6 S
C.创建基于一个表中的记录的数据集4 m+ N9 h( P8 k8 n& H
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
. r, P0 D1 V/ }! |/ m& Q9 A9 RE.以上都不对
" N; u7 F) b4 Y, H' u" H, Y1 y& |+ s4 v+ [1 Y6 T, g
" M" y+ s) @) L4.以下哪个DBMS没有PHP扩展库?
6 ]0 n: z& f. {+ p* G# n2 f$ k
A.MySQL" M+ V# I0 k {7 |9 T
B.IBM DB/2
1 F' H6 l3 Y; d0 _C.PostgreSQL
3 o; t; c2 _ t+ _D.Microsoft SQL Server5 D, `9 U) q4 T0 v: r2 T
E.以上都不对
( W3 c4 |: d; {0 H. q) T+ _! f1 B, `# v0 o9 V' h; ?
. f- E3 R( e2 T5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
( i9 F* x! H1 ^' b2 }1 J
, Q( w3 Y; _; a( w7 M/ U; J<?php
! L) F! E; ~; J9 ]% V: T5 E$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);$ c, x# E3 ]; O- m8 l C' @
?>
2 z' X8 t. h. A9 t- d* {" w( }) l4 B- _3 M n
A.MYTABLE表中的记录超过1条
0 c5 X O. {& Z4 }( FB.用户输入的数据需要经过适当的转义和过滤
& `1 F0 P1 x; q8 D3 xC.调用该函数将产生一个包含了其他记录条数的记录5 S" Y0 E% ]4 W3 i1 D: `) J1 b
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
K- J0 H8 W6 @( g( n. @& ME.查询语句中应该包含数据库名( _2 W. g( u; G0 {! I8 H3 A
2 h; V- k6 z8 e: ] l- w( o* C. N
m# E: d6 t Z2 H/ V6 ^6.______语句能用来向已存在的表中添加新的记录。) D+ [8 \. k- Y) T- L' b4 P6 s7 n, V I
' t$ W# e7 J/ D, q6 K
答案:____________" t' E4 T3 K+ R6 G3 k( p
* c4 w; x8 J4 h7 I- V" e7 X) }7 ]: Q6 n) o. F
7.以下哪个说法正确?
& k9 R/ D( c4 i5 p! P7 o) {" [4 q, N; c1 F! K" P; u/ H# p- e
A.使用索引能加快插入数据的速度8 i0 J" N+ g' J. c6 Q, J: F
B.良好的索引策略有助于防止跨站攻击
# y q6 p2 |& a' Q! ^; V: rC.应当根据数据库的实际应用按理设计索引
+ ]! y# b: B4 O# H$ \9 E/ L: u" {D.删除一条记录将导致整个表的索引被破坏
8 {; Q! D( q: bE.只有数字记录行需要索引# a5 g" `+ j0 K2 b$ r1 \8 l
% L; C1 f- E. i5 ~9 l& l6 G
( R/ `1 D9 d0 A
8.join能否被嵌套?4 h9 {2 H& e& X
9 [9 E" g& G7 k5 s+ ^A.能1 S3 j9 b( F3 K1 H) t
B.不能
3 {( a' g& f8 e- l) T
9 q1 i K4 S. A/ {2 P6 m7 P# c& R9 }3 U7 X, z
9.考虑如下数据表和查询。如何添加索引能提高查询速度?3 X+ k) o& S: T) v3 m) q# }
1 W F" O v" K0 m1 F8 }CREATE TABLE MYTABLE (
9 ^2 Z' Z/ S' v$ d, M- |% qID INT,
/ E9 n6 o% E% v) c: ?6 }NAME VARCHAR (100),
8 Z/ W M: U: I8 U6 PADDRESS1 VARCHAR (100),
% @: f9 {0 d; s' S; s) Z2 A2 |ADDRESS2 VARCHAR (100),3 i' j2 x* \0 S) L9 L
ZIPCODE VARCHAR (10),- n; L/ q' H7 l3 p; ]/ A
CITY VARCHAR (50),
* i) J# S$ t4 r8 Y7 G, h% c. bPROVINCE VARCHAR (2)
; A- ^/ b5 \, a9 d)
" Z! O6 {7 }4 [. G: J" fSELECT ID, VARCHAR! |9 F% D; V& N1 d) y0 ?; e4 j7 \' ?
FROM MYTABLE
( U% x7 p/ `6 L/ n6 iWHERE ID BETWEEN 0 AND 100" Q/ f7 i1 L, J, u- \$ X9 L0 n
ORDER BY NAME, ZIPCODE# w8 }2 i% ?# s
) M* m2 _9 ^+ A+ k7 k2 W* aA.给ID添加索引
+ _3 o- h5 ?8 i0 S! i6 [B.给NAME和ADDRESS1添加索引
% u; T8 [+ J# H) R sC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引$ n6 r+ B& e4 C; n4 E4 ~
D.给ZIPCODE和NAME添加索引
: Y' }' Z% m0 O) s; ?E.给ZIPCODE添加全文检索
4 G5 ~9 W6 |, U6 _3 ^! L; k& [# I( u \# l4 m
$ {7 T+ [9 c) L7 f10.执行以下SQL语句后将发生什么?
6 u$ h( q% Y: l& a4 y$ {
# M% o# W. c5 R. }BEGIN TRANSACTION
' Q' t5 a+ B$ \4 eDELETE FROM MYTABLE WHERE ID=1. m! a6 ?2 j5 @3 `; F: T
DELETE FROM OTHERTABLE
& i# o5 a3 V5 y4 g/ ZROLLBACK TRANSACTION( `% k R1 d7 b) S7 i
: t& J" v% {3 E, lA.OTHERTABLE中的内容将被删除
. N) @& g6 ~3 l/ gB.OTHERTABLE和MYTABLE中的内容都会被删除2 m9 _7 @- W( ]& @3 m- O5 n
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
8 ]5 o3 {+ c/ V: mD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
5 l2 c6 h8 Q" a* PE.数据库没用变化# H, [0 z; R. |" g
8 j( M+ ?, I6 W$ B
* p) K8 V# y! B6 U/ D11.DESC在这个查询中起什么作用?* ]. e2 E7 T0 m3 z3 |
: d# ~" T+ y7 m A$ XSELECT *
+ a( m0 o& ]0 X: \9 rFROM MY_TABLE
+ d7 l5 A1 G$ a% | O- h4 T }WHERE ID > 0( d4 J- Y# M( i$ c7 \
ORDER BY ID, NAME DESC4 e* w4 ]' D) [* H# _
- t% G+ n4 e! ?6 }# Z% o! ~
A.返回的数据集倒序排列! @+ l) z9 Z9 r) b/ S* h: l9 m8 C6 d
B.ID相同的记录按NAME升序排列
% s" b$ g& D: x6 bC.ID相同的记录按NAME倒序排列- n- k/ z4 U4 T
D.返回的记录先按NAME排序,再安ID排序0 J2 Z7 m* i) q" A/ U7 G
E.结果集中包含对NAME字段的描述, h) F7 U. G9 a) [) F& n& Y- T
/ l3 o7 E7 b# y3 G
2 q$ N' T/ W/ T& S- B12.以下哪个不是SQL函数?
& ^3 G! B8 C+ b' l1 ]& I
5 f: u, ~4 X1 |: M! A: lA.AVG4 p* {0 j# _/ A m/ N3 ?0 W
B.SUM8 C3 S, i0 w, T# g/ b" y
C.MIN
0 A$ S* k: x2 P- I4 p! O, D; GD.MAX
7 z8 [0 O( ~& [& N* C( r+ xE.CURRENT_DATE()
; W" W# Y2 _3 y ]% q! J) S i+ G) ?: X" a# [& | f
, X* z! {% `9 L3 R" \13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
/ x! b' o$ {$ N' I% g2 `" o; I2 G# \4 D* w& I( L
A.该字段必须有索引6 _, f8 a! u) b6 q
B.该字段必须包括在GROUP BY条件中* B. n# e& \5 S9 ^
C.该字段必须包含一个累积值+ o4 j( p$ D7 w
D.该字段必须是主键# \$ O3 j# |9 D* ^
E.该字段必须不能包含NULL值, w" Y- D" X" N! h
& e) y. T0 P$ L! W/ a3 G9 T
( z4 J5 u. J' ?/ x( e4 X14.以下查询输出什么?
g7 \# P Y8 b& t5 Q, A+ S
- j- s v8 w+ R KSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
9 A. a# C0 Z- o2 ]* p! H+ z+ z6 _$ xON TABLE1.ID <> TABLE2.ID4 ]& N6 T& I8 @9 \9 Z9 r
- A% _4 a3 C! W2 w( F( N4 G
A.TABLE1和TABLE2不相同的记录
8 I: T8 C4 B* |; f- e9 {B.两个表中相同的记录
: c1 v) I p+ L2 X6 HC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数1 a9 K6 v9 V) a! W3 \" N
D.两表中不同记录的条数
' q5 e: i* d+ g& x+ h2 YE.数字2
6 \8 U2 }+ P# @. A- d Y$ C0 g9 _& m
! Y" X3 X+ V/ j5 @# j5 c15.______能保证一组SQL语句不受干扰的运行?
2 @- C; K, R4 {; C$ }) A
; F2 h7 K1 x: m答案:____________
1 E# A4 M0 Q3 n# k! z
- d. v$ g$ W8 I2 n9 k4 L9 g- d1 }. _) ^
" N6 v, I* t- x( L, h
答案速查% J, ]; Y8 e c/ S4 p5 p9 r. `
1:BC
`7 |. k, F+ u2 N2:WHERE
! Z) x1 K2 I3 I9 a3 g9 c7 x3:B7 S- a. P! b5 g8 z! o8 u* K
4:E
6 B6 y3 G9 a, j5:BD6 {8 U. U! _0 {( p% ^0 @+ |
6:INSERT
- U K9 ?" I7 \7 \8 }7:C' D0 @' i9 ~" Q& _
8:A
- Y8 ~: i/ l Z9:C
' }$ t4 t I* A2 ]. q) ^# @2 ] R' k10:E, Z) [/ w, b/ D, P' ?
11:C1 F3 x2 P; t8 a z6 l& {0 P: `) `
12:E. n" y4 e/ @& k8 B: I# g1 L
13:BC& R2 A& p8 R; H- k9 l2 T( W3 [
14:C
6 H# S! ?. N0 d4 v4 V b15:事务
( }9 U' s! x" H3 N: t6 b
0 h1 G1 I, C8 ~) I! j# p
3 v6 b$ `2 G! K, q) h- G% e u, l1 J; x2 {9 X6 M
答案详解
% a7 s7 T) _; n j+ H! G8 `4 x0 c7 U6 \1 F, T# O6 U$ ^
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。1 [/ N9 [2 q1 b2 D
# C% m. W) i$ ^7 s2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。, @$ t, F, O r- t' i" S
* w2 C. U3 |: V" h0 O+ h- k; x1 E0 k
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
; b7 B3 S/ c! j
/ K& b# n, @& O# k4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。+ @4 ~, C( d" E
7 l# D+ ~; v7 G5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
, S$ P3 U4 B$ b' V9 ~( k0 A/ `" \; Y- u' V4 R* Y' f/ G2 |% ?. G, i
6.答案显然是INSERT。
* [' ^; n# c( i( Q# a& A6 X
3 n6 Y/ s# P0 I4 @2 @7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。) Y% {0 u5 [( I+ v
, [. U2 B* i% k
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
4 w* N7 U8 j* E$ g/ b
7 a* a5 s8 s: |, u6 {9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。% [3 Z! O. b2 S# \2 [ X# X$ Q
0 ~9 ?2 c3 K' ?; V4 [10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
1 ~. }: @2 s$ ^) X' ]+ @
! R, t' f: i) i11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。7 r" I5 ~: p! b6 J% A& Q+ l- M' o
9 {1 L. ]8 {) ?( L12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。8 F% F: z C0 K7 f: S( P: _
# u4 y, o* c1 p% K/ \
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
: f6 B5 ~$ s1 s8 Q& p
$ e% H2 d i4 f! r6 Y14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。$ k4 {* o! _! m2 m0 D5 N& P* F8 B
( e& G0 B p5 {1 P
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|