|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
' z% S! d: i. HPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。+ t: S) a0 W' o
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。9 ]( N" D7 j% _2 N
" A- r0 E+ F! p% S. Y0 s
) I5 j" u5 _7 c1 l问题' s9 s/ G' U, R- h! Q) p, w
S. R( g( D& W2 w" d! _( m* _& x
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)4 V+ k+ F! }: q# X% A. a
7 B8 {% M4 _2 @* t6 g2 `8 d5 q
SELECT * FROM MY_TABLE. n; T, U6 \! y8 t1 e. [1 R3 v% t. F
$ G% D) Y; @$ P" c+ wA.如果可能,用把查询转换成存储例程
+ ^4 n. z9 e; |; v- l: ^B.如果程序允许,给查询指定返回记录的范围9 |# Y6 [7 V2 m3 c# Z
C.如果可能,添加where条件4 B/ c" @2 d& w& e
D.如果DBMS允许,把查询转换成视图) B; _% g) _, K" g# @
E.如果DBMS允许,使用事先准备好的语句1 m, q: ?9 P: w$ D9 m/ S; B# ?
0 j0 f* [3 v1 j2 Y& |
0 N6 |1 y% U/ D9 ]8 Z+ Y9 h. y2.可以用添加______条件的方式对查询返回的数据集进行过滤?
4 Q, L% s f0 s4 w$ _6 Z, Q8 `% N/ K/ f' @8 D" q0 J
答案:____________
4 o; {4 }& n' k, b4 C9 G( o3 w* |9 ~- r* N, M% T
; D. b A9 u" W% w( j4 l( C3.内关联(inner join)是用来做什么的?
' K, n5 D: w. u
0 X% \% h9 r; w9 o R8 F; V3 QA.把两个表通过相同字段关联入一张持久的表中
/ L+ T; q7 F: r3 a1 [$ cB.创建基于两个表中相同相同行的结果集
8 t; @( N8 }- {0 V) ~( L v7 HC.创建基于一个表中的记录的数据集
1 U! y8 s2 b7 E1 S- k$ {, nD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
2 O: |" U; A- X; |( ^2 fE.以上都不对
G! \4 V7 b' w
4 `7 X) o9 s+ T% @7 }5 A! M3 U* N% m9 c+ `! R
4.以下哪个DBMS没有PHP扩展库?
( h; ~* k3 w% v, d" J. t7 h* R% j
" w9 S' X" O N$ d# SA.MySQL
& H. {8 p0 D' Q+ ?B.IBM DB/27 P" [" A, |1 T5 m3 t. K* ?
C.PostgreSQL- T* h0 \- ], ]* e
D.Microsoft SQL Server
+ b7 t5 a4 s. R- Y5 \# iE.以上都不对0 B& {! R. E1 d
9 z0 k. [, B) o
9 Z4 W7 K w. J; L2 w- `5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)2 f7 X j/ w* s6 H3 r+ B. J2 i
2 b+ S! ~" }, s& l! \<?php" j0 K$ J1 S( |3 c
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);2 M/ w: E! i0 B4 V8 K5 T
?>. \, b, X% R' ?# P q3 P
" Q0 _0 X: Q1 u9 v! w: s, z1 C% @( T% b
A.MYTABLE表中的记录超过1条
' q5 @9 p4 Y; U; _B.用户输入的数据需要经过适当的转义和过滤
* q" q- Q" r6 @( e1 |1 C' r5 uC.调用该函数将产生一个包含了其他记录条数的记录8 y& s N ? \; y% L$ C
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除7 x) t; h) e( K) j3 v
E.查询语句中应该包含数据库名+ s) q+ m5 W: U. g
# i2 Z6 V. j* ^" P, x( J9 p
6 D2 X' E1 g* Q, i7 T5 E7 T/ L6.______语句能用来向已存在的表中添加新的记录。
+ L. L; [) a" n2 x/ D
2 s8 T: ^# ~$ q; J2 Q答案:____________
* \: ?4 E0 u7 `' w
" @: z$ i. F# {0 X/ L, E+ Y; {& G. g" w& m
7.以下哪个说法正确?: e3 Q3 c/ t" a! C5 D9 c: V
- t" s$ n1 Q) S* C% E" X
A.使用索引能加快插入数据的速度
5 |* j7 p+ z+ e7 D4 [3 k# E; iB.良好的索引策略有助于防止跨站攻击
8 x% |6 N; ~ N2 ~0 GC.应当根据数据库的实际应用按理设计索引( G& m% s$ n# o' t1 ]
D.删除一条记录将导致整个表的索引被破坏0 E5 t- k: M+ ]# P; L0 o4 l& x& c
E.只有数字记录行需要索引
2 s! E( ^0 X# P+ }3 {6 M& y6 n; `/ M- F9 C: z2 v9 f
6 n8 P' X/ ]1 D& H
8.join能否被嵌套?
9 s$ B( p: W* F/ Y7 v- ^; G: J0 T6 U9 Z# ? v3 u' @
A.能
0 |7 b! o: S+ g2 L# z) \) { PB.不能
0 @) f ~# `" B; w' N1 Y' z, W, F: R7 y: c J4 ]
2 H/ ^7 E& D9 }$ f. Y. r3 h9.考虑如下数据表和查询。如何添加索引能提高查询速度?2 Z* s6 X* q+ _9 B6 }+ [7 B
: ^0 C2 `: s R
CREATE TABLE MYTABLE (
, B% \( T1 y* ^# _; hID INT,
# X# s0 u# h7 i4 p0 i B6 mNAME VARCHAR (100),
$ w7 _6 [( ^% G* G# pADDRESS1 VARCHAR (100),
5 x1 `! ~5 E4 QADDRESS2 VARCHAR (100),- j4 [+ i6 w: {2 k
ZIPCODE VARCHAR (10),
/ j$ \% @' K p8 @5 s" ]& PCITY VARCHAR (50),
* {, N' _$ o6 F ^PROVINCE VARCHAR (2)
6 w& c M' y* n" \)' @" h$ x+ p9 K2 ?
SELECT ID, VARCHAR
# P: `2 S) I. L: `FROM MYTABLE4 S% x$ C. p9 h2 ^) j5 A
WHERE ID BETWEEN 0 AND 100
* ~3 B2 T$ D* R L: v) vORDER BY NAME, ZIPCODE
" A5 O+ P% D6 w. L/ [/ X6 N4 w) K5 G q+ i& {+ E
A.给ID添加索引% o+ x0 N2 }6 w! o: S
B.给NAME和ADDRESS1添加索引
' m3 h% Z; U6 tC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引! Z! q2 D+ ^9 C7 g7 C
D.给ZIPCODE和NAME添加索引
1 P1 h$ t$ h/ H# O, VE.给ZIPCODE添加全文检索
0 Y* l) x; _, N: N( I* X: U/ G
/ o e& X) k0 v/ G: f+ Z: a
. {. c, |; N. |+ C% O' t5 S* i* B10.执行以下SQL语句后将发生什么?
6 c/ A# W6 F: J* M/ K" u& p4 L% k( m% r, b M4 n0 E o
BEGIN TRANSACTION; U* s7 C% R0 J* i0 F" _) u0 ]. P6 O
DELETE FROM MYTABLE WHERE ID=1
+ m0 m9 F. M# ]- q: J# FDELETE FROM OTHERTABLE" q' }, e& p- [$ @
ROLLBACK TRANSACTION0 k. X4 U" O, c4 Y# u
L( B: v1 f7 {& o, l+ X# P7 H% w0 }
A.OTHERTABLE中的内容将被删除. E( p0 l" F* M) S
B.OTHERTABLE和MYTABLE中的内容都会被删除
/ ]- v/ G6 l0 [! W3 E& Q. WC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除 @: x7 B. d" b- `
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化6 Z; r. M. q3 u0 Q7 g. B- d
E.数据库没用变化
; e3 B3 |4 C$ X8 d6 S* p0 i h( ?$ w" r e; V1 b( X
# S0 H. z' t+ i* X) j
11.DESC在这个查询中起什么作用?# o5 g% z9 }/ l1 }
: Z& J$ d9 V" u$ ?1 @) Y# a
SELECT *
2 Q/ ^2 I) `# U4 v$ @7 UFROM MY_TABLE
5 q5 r. A& g: M" l0 c* gWHERE ID > 0
8 B- [) Y% t% W RORDER BY ID, NAME DESC# s$ F1 V. |. B( @
5 C0 k& r% W) ~/ h V) p
A.返回的数据集倒序排列' L) ]- O q5 S C, |" m
B.ID相同的记录按NAME升序排列
% m6 D1 u$ I! G" Z0 f! QC.ID相同的记录按NAME倒序排列
$ H! @% \5 _. F2 ~D.返回的记录先按NAME排序,再安ID排序$ {! L3 S$ o4 K; b5 r* a! H
E.结果集中包含对NAME字段的描述
( S1 L) x+ o! i4 }& h5 q5 G5 M4 z8 O7 S6 f& U: C
h z( M. D; z' H12.以下哪个不是SQL函数?
+ k) }& F; k+ ]: q3 E- b
1 M- |. @' Y' [7 ~A.AVG
0 H' Y( M2 V( \B.SUM( |. b" ]& z# s* P; m
C.MIN
& w- k8 b. N; a7 M" a, RD.MAX7 u3 b9 ?. V3 [8 ~4 n: d
E.CURRENT_DATE()
7 t+ }- X# e; ~2 ~5 k% q% g0 X( |2 p1 c9 a
* J, o% h/ q- x9 s0 z9 p13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
, p. ]) Y5 C; t& U; ?$ U2 n7 ^: }" E. Z( `# X8 D8 g: l/ X
A.该字段必须有索引
6 h+ y/ g; c% h9 UB.该字段必须包括在GROUP BY条件中
/ B; X6 e( n2 o; ]! Y( _C.该字段必须包含一个累积值/ v6 Y) R: t/ J# H" p4 b( D% h# S
D.该字段必须是主键; e' R7 a) J- n" N; t
E.该字段必须不能包含NULL值
% z# Y2 y/ Q7 Z% V/ S& t" r/ P
' y3 D5 K2 Y6 }( Q6 x. H: w
/ s$ E9 j4 q! b. S1 v# `8 f9 y14.以下查询输出什么?
C: ^9 A& c/ ^) D6 n1 Z! H" ?
( O! q/ D+ O" I' M; KSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE21 A- j; V) z: |
ON TABLE1.ID <> TABLE2.ID
9 E4 I2 Y8 l9 G" G3 H5 I" I
+ v# Y* X: I/ a8 fA.TABLE1和TABLE2不相同的记录
) {" G( _. D! B3 k7 ^# F' j! U! lB.两个表中相同的记录
! R* k& B. y9 S. o2 uC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
( Z* B! y' S# {D.两表中不同记录的条数, ~# n6 \- i/ a* z" @
E.数字2
0 A6 B& D) k3 D% R* R2 x
/ V' c3 f: X- L/ @: H0 }9 y+ {: ? |
9 S9 }( e' \* i+ K; |15.______能保证一组SQL语句不受干扰的运行?8 F Y" D& S$ H; T; b3 r2 z
% F0 l2 X( Z) A
答案:____________. J0 H) e" P- d& k+ ]# i
' k% j L! g2 J1 k6 X: h
1 Y( x! w3 p# s# e, n( d4 [
- W/ a1 G! S$ u* T8 H
答案速查: v R3 ]# E, D5 S
1:BC
! J& N9 o9 \. o5 W1 n' F2:WHERE
0 B1 }5 I0 j+ I/ u) }7 J4 u. G3:B* |9 t' u& P7 `
4:E
4 z V( U0 x$ {$ \8 z, v$ a, w' Q5:BD. f' G) D" B; u( s9 a2 G
6:INSERT
3 E& @7 ~$ H1 f2 |6 U( q( I7:C! U+ B# y5 q3 `0 \
8:A- f$ E5 \/ j$ s, [
9:C
, z& B' m4 ]" l7 W- k* k10:E
( c4 A: s5 i. G3 ?% p2 J) V* h11:C; h0 K6 }2 P) G: S
12:E
# |2 j" K% Z# |" ^7 c9 z, \- p! Q; B% x13:BC
5 R2 v' a" ~( I$ B8 v14:C, s) b/ O: L" ]4 [0 _1 r0 R
15:事务
; s1 b. F' J% s7 j: I. }7 ?- g. U9 b+ Z
: ^# c- A$ r8 H
0 K# g0 ^" n/ r7 ~
答案详解
2 f q: D0 F, ^5 W% @: P; Q( C8 q' k
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。' e1 s' | M; V0 W/ N8 M
0 m8 U& `9 _3 ^6 R5 V* |
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
3 x+ l; I3 w9 B1 F4 S q$ t/ W, Z7 D' a2 H/ y1 P
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
! ?7 w4 a Z# e9 E8 N# k8 W
* q e" t; ]4 r4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。+ {- n0 B! u0 s4 G+ h* n X
* v, J! U3 t# v D8 Z5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。) x1 Z8 z. ]2 K* {4 o/ A# j- A
7 `% m) J% T# @( x! C/ `6.答案显然是INSERT。: Z! [& D* p# u( q& K& W) P3 Q
/ D' q3 Z8 r$ R% _% x5 [5 C4 h3 O7 \
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。0 c5 D( U+ A- x* H
9 o7 z, n: a$ R5 m
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
+ U& P4 }! x$ M8 X1 f0 j3 g: j$ P- ^8 p: K
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。( y9 c& ]" g, g
5 ]2 z" i2 |1 _$ V; r7 L10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
. C* F* j) j% x. q
, ]% {. s) N( Y+ `+ G) U11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
# X) l! L; Y( e; V: d0 m
% [( ?9 k+ z0 u! k12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
( m' ]. S& U' {& i) y- l( K4 C! x0 H* ]: \
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' X& t! H& w6 k1 l
- G$ _# ?/ q2 G6 r" o2 n1 f
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
% H; {4 j5 M) @9 M4 G# R; X3 {# m3 S
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|