|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
5 u% o- H/ `% b" w) iPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。( x0 o/ a0 L; d5 X" z. l# |
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
! N$ k5 w2 P F9 |% b, j' e( B" Y5 `% z
" H+ ^( @7 A2 W' I1 W7 p7 w
问题
7 x8 U% d* V% G$ N1 ^
* m8 e3 L( M! o/ G; v3 E0 d1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
( M: ^) t, n3 s8 d# ^
; Z4 M+ @$ q- z1 hSELECT * FROM MY_TABLE
" ?/ K9 g l2 k0 |( G! o
+ D* Q; x& W! g7 w9 B$ xA.如果可能,用把查询转换成存储例程% K4 F* E& _ j4 T! ~5 j5 H
B.如果程序允许,给查询指定返回记录的范围
3 H& H5 |# D+ |" \C.如果可能,添加where条件
y: t9 M9 c2 k4 u. ?! fD.如果DBMS允许,把查询转换成视图6 d3 l2 h4 r7 \& Q! w1 i- `
E.如果DBMS允许,使用事先准备好的语句
6 p" }+ x1 y6 _9 @' H3 f- N' @! o1 Y' S9 n5 j/ A( x, Q+ T* D
8 S( n$ V4 R1 J; C9 Q: v
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
8 N0 a! }, p+ D) L4 ]: [5 Z1 g. _
7 O f% K$ n Y答案:____________6 y4 K3 I' D, n7 i4 j" u& e
+ D( [; J) p3 `. L. T; Y0 D
, f7 b7 O% M8 E$ p3.内关联(inner join)是用来做什么的?( g/ z) R+ i3 u
/ b2 d" I4 K6 _& J$ _A.把两个表通过相同字段关联入一张持久的表中
0 W. ]. F- P. i8 q9 ^$ L' gB.创建基于两个表中相同相同行的结果集
# `4 W& Q# S5 }! g' m/ A; `6 iC.创建基于一个表中的记录的数据集% B- m' J, V& n- _, M5 M
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集0 @4 a7 C! w1 K k( p2 e2 B
E.以上都不对3 ~. p9 f2 q" @; W: W3 K
o: Z, _3 y- M3 a8 h0 ~2 ^: u- |2 x. p6 g; d# C
4.以下哪个DBMS没有PHP扩展库?
* O7 Y. u" F; l1 p- {6 N
% o" u8 F- l. I6 H2 z& z: cA.MySQL1 h# B6 S1 L8 S+ m/ E0 L0 `, [; Z
B.IBM DB/2
5 _0 j/ z" N# q8 ZC.PostgreSQL# H+ A$ E( T2 h: s' j3 \' [
D.Microsoft SQL Server
t/ a2 N+ V5 l( mE.以上都不对# y' k& t* S' d5 h9 m4 ?# C9 p6 b/ I/ T+ s
1 M' Q! M9 Q& S4 ^
4 S8 k5 d1 |) |/ G6 G; s5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
4 U3 x+ }2 r8 \% M& n* [' r& U5 K2 W5 s6 T1 C
<?php- R5 a A, x0 Q* d
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
( O2 w r" e; p; a Z5 s9 s?>
" T$ ?0 C% U/ D2 l$ C# p' V: `1 \$ p( o( n
A.MYTABLE表中的记录超过1条
5 j" ~! p( [& @0 h2 a `B.用户输入的数据需要经过适当的转义和过滤/ |6 }; J2 N. t* j
C.调用该函数将产生一个包含了其他记录条数的记录 H y: B, C. n% G3 n& r1 z
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除* k% |' S2 _* ~( z9 p: s
E.查询语句中应该包含数据库名) y% K2 s# s1 {
3 a2 _3 J4 ]2 t1 J3 k: D2 |7 ^( p4 d8 F1 J
6.______语句能用来向已存在的表中添加新的记录。
' R) O: E, @6 p& o- r
6 U" Q6 Q! J( @ d k3 ?+ V, W7 u答案:____________
: ], V( @4 l; W- d( M$ ~: C( Q6 \: R8 Q; b
V! C# R1 A+ e) R
7.以下哪个说法正确?% E; N3 @& w5 {
% Z6 r% j4 y; aA.使用索引能加快插入数据的速度) w$ t! {; z* H
B.良好的索引策略有助于防止跨站攻击2 p& W! w$ q$ t( D j* b- y
C.应当根据数据库的实际应用按理设计索引1 [0 A ~; S$ {# D
D.删除一条记录将导致整个表的索引被破坏
5 D d" T8 |4 R M; `5 u* VE.只有数字记录行需要索引
" A" N8 O9 b4 K8 k7 L+ x3 ?
. D' C, v0 E8 c+ c/ N6 @3 {+ C/ E; F+ C7 y$ n( Q
8.join能否被嵌套?* j9 Q; `) H" y
* b0 ~0 m4 L$ p; Y; DA.能2 j- C0 H" R% F/ C
B.不能
& }9 N- C, v6 B( B1 b
$ Q+ n) l+ f1 c, y1 k. t! n
7 `3 R$ L6 Q% \9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% b+ |' p& p$ N8 H4 R2 T
" J1 r2 f3 A7 Z! A3 C# l7 D' iCREATE TABLE MYTABLE (! ]& ?2 A1 y5 ?7 {
ID INT,2 H4 m& Z. I. ~) n- Y2 d" E
NAME VARCHAR (100),
# x9 e/ d# ]; ? o2 y X! cADDRESS1 VARCHAR (100),
6 ]# G9 K' S! f8 K+ g, dADDRESS2 VARCHAR (100),
4 M. ?- i6 y0 Z# Y# qZIPCODE VARCHAR (10),4 e" I4 }0 s% [' `# l5 J% ~1 K
CITY VARCHAR (50),! |) ?4 H/ ?# E+ F5 T9 i
PROVINCE VARCHAR (2)& z0 R# ~2 ]" r' Z! }
)) K7 }/ |0 M/ R& c& C6 S
SELECT ID, VARCHAR
- R/ v2 {; J4 ?, T6 c+ wFROM MYTABLE
+ U! A$ b1 `9 r$ { w$ aWHERE ID BETWEEN 0 AND 1005 p2 W9 P- j) d! K& J
ORDER BY NAME, ZIPCODE: D/ L! m8 O: G* F1 {$ U
( P y1 y* [- h1 n0 Q6 _; h3 ]A.给ID添加索引
) q8 ^. R# o P. ]B.给NAME和ADDRESS1添加索引 }4 x2 q) |6 g) s9 c
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引7 m8 G' u2 r8 E# s2 f7 D9 @
D.给ZIPCODE和NAME添加索引, n$ X9 a+ s* Z9 ^, L+ z, T
E.给ZIPCODE添加全文检索0 n8 J8 `$ B5 A# `6 K) I
: k. n. {* L' ^) h( e0 r+ M. [. K( G6 i9 c# k, Z0 T
10.执行以下SQL语句后将发生什么?, E/ H: F e/ L; Z! L8 M" x
' s5 U% k \- ?( L$ T3 v
BEGIN TRANSACTION) j; r* q' ~% n* i* d: J1 ^) T
DELETE FROM MYTABLE WHERE ID=1
$ q- d' U1 B: n7 r8 t) b; L' e; o F" NDELETE FROM OTHERTABLE0 X2 C$ W6 y `1 r0 v1 u( n
ROLLBACK TRANSACTION' w s" ?4 g8 i
& O& ?' E2 x" W1 f: @A.OTHERTABLE中的内容将被删除
# y& [4 g) ^: S" T* ]B.OTHERTABLE和MYTABLE中的内容都会被删除
7 y3 ?+ H; F5 M1 |. DC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
! C6 ^, M# o/ p; f6 ^& q D. r% T1 aD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化! ` K0 @, [8 l& H
E.数据库没用变化
2 t @* f! b1 q, X& U7 x7 U" M/ t! ^: o; Z. d" L
- C5 W! Y8 ]- w/ W$ ]
11.DESC在这个查询中起什么作用?- F5 K: |+ {: ?% w1 e" z/ U
7 I, M' r. F+ U0 g
SELECT *8 L8 {* ?7 A, i& S
FROM MY_TABLE7 P/ i8 e# l2 i% E3 C, r
WHERE ID > 0
( @1 \ S. P) r: ~) m& tORDER BY ID, NAME DESC6 b' k6 R3 X% k2 C H, D
' ?, n2 D8 y- A5 r8 K M+ ^A.返回的数据集倒序排列
; L8 A- w' `! q$ [3 gB.ID相同的记录按NAME升序排列
* c' ^( z: R" {$ u A3 ZC.ID相同的记录按NAME倒序排列7 _" k5 R r2 A) `6 j! J2 Z! I
D.返回的记录先按NAME排序,再安ID排序
- s% ~7 L; t6 zE.结果集中包含对NAME字段的描述; x1 V' J; Y8 ? q8 l& n
) [% i8 b; ^0 M; m ~
- r3 I7 Q4 a9 M% c8 W2 f
12.以下哪个不是SQL函数?
6 D) a3 p" i; X9 V: O9 [
5 Y4 h0 Z. U9 z, z+ |9 Z7 n1 RA.AVG
4 q, ?0 ]* C: J1 i, R8 w5 k" I' sB.SUM
1 i+ o2 P. G; F* \$ U: BC.MIN
! o! Y( F3 y$ y5 P/ q0 F1 f& H, YD.MAX
0 Q' {; m- C1 c% o j! CE.CURRENT_DATE()- K, j5 a3 _7 X7 f: }1 w4 K
9 ]) C# X# X" Q [7 L, S( q' V" {% Z- l+ e6 _% D5 J
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?2 u+ O$ X5 _2 Y Y
6 x5 N4 L2 W* \2 A5 B2 i1 OA.该字段必须有索引8 [5 y/ |+ d$ s& g. D
B.该字段必须包括在GROUP BY条件中
, Y. s& n1 U% g. E9 E- F. P" P, YC.该字段必须包含一个累积值
% A) M3 }9 }$ I; i" ` FD.该字段必须是主键# x) n. `: w. t3 W' y
E.该字段必须不能包含NULL值
$ D5 l! o) A2 j$ @) n! Z2 D9 P0 [2 m# J7 K- I4 u3 v. p: }
7 a# s3 M- O D* X+ A0 v14.以下查询输出什么?- A( A, C4 U& \* Q2 ~, P
t# U. [$ \1 T# K" @' Z* z8 ASELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2" K& w4 c/ |2 I) Z! ]! R5 x
ON TABLE1.ID <> TABLE2.ID2 k# V% | i" |% [$ A4 Z
/ U3 O) Y2 I, r' p
A.TABLE1和TABLE2不相同的记录' P8 G& Y' ~" X" n: Q% S3 U7 F# ~
B.两个表中相同的记录
, c2 a4 P& F' F) v" S* dC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
J+ H" v/ U! C# r2 lD.两表中不同记录的条数0 K9 G) v/ F% p, G
E.数字2- h4 I. D7 T1 H! E7 L# Q# o4 s
: v, k* K- c# p) ^! L
2 T0 v( `8 v# q J$ w
15.______能保证一组SQL语句不受干扰的运行?" b% i* R$ L% {1 K9 l
$ [! l+ w7 A' o4 |4 ?9 m0 Y答案:____________
! r7 U. ?7 d0 Q u: E0 x' V$ R7 {6 K- t( D2 Z; ]
" U) z# V* v# L! O- X0 r2 k- l9 Z2 ~5 Z
答案速查
; o- ]4 P. B: G- \# B n! Q3 H1:BC
: E: G' w2 i- Y" K1 {2:WHERE
# R$ t( |* D1 j; h" \3 d% r; [& _3:B+ |! Y8 y# x6 h: c
4:E& k* n0 f; O! [4 ^9 `2 d
5:BD
1 `; ~9 r% y0 q9 Z4 }6:INSERT
! Q7 i& g$ e M6 _7:C
! e2 }+ s5 n j2 C1 P# Z: I; ]8:A
2 R8 \8 t, j, o9:C
! S4 ` o) C. s" H( L6 N- k- S10:E
0 M, P, Q4 x$ T- ]* s+ P( e2 m11:C
* B* R2 t& A$ o8 B: s12:E1 o* y1 }) G2 k$ t$ N, B s
13:BC& Q5 g" \; p/ ^! }9 g
14:C; H- O/ f- ]1 q0 p1 `/ j( \
15:事务4 B, L Q r# M; h
4 c2 b4 f6 ~* l
9 \9 N5 p$ y; V! j
/ H2 G) D6 M8 ^) k. H: p" }7 g答案详解) p) [# c) Y# Q' l
7 U9 }3 ^5 [5 h$ k4 p
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。6 `; |- y# |' }; f
( \: w; t9 t0 t2 g! w' Q9 A2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。* D8 @* i' ~2 @# {
: o6 i# U: f5 d2 h/ j. s( ]9 ~3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
7 c0 y& n7 ~; s9 P4 [& A9 z5 r9 ^, P3 G7 u* b; Q* ]6 P
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
; _) j7 S% U( X6 P0 F
1 T" }% b. y' M8 V$ E5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。0 y4 x3 @) w: ~ A
2 q2 E: U$ Q2 V, |6.答案显然是INSERT。
# v* z0 E" B/ \6 n* v- Z* h; e8 L2 d7 M, g+ `" x
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
0 k4 @6 B# w; D& [1 i Q3 @* V2 c4 W4 i( }
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。, k% H# X6 e4 |9 G! \% v7 r
z5 h% y3 [$ w* F3 ?/ t" R. J9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
7 Y! G& [& _9 O# |& \2 Q- _
6 S7 W5 i/ Z. m( m10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。$ ^ {$ A/ S& Q) v& d' E# f
8 H; S ^1 j+ X3 V8 T+ u11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。# o! T: O$ u% S! }
! V7 j$ K* g# u$ O- v" K# \6 u12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。) A2 z- i4 g! B* y' P9 U& w4 V
2 u, h8 F0 t' F: f3 Q( D
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
9 p: g! Q) K# P5 o7 ]; D' F* m# a' f& \: P
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。- @- p! X1 _0 x) ]# v
' F8 m; r! C5 ]+ z$ E% |
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|