返回列表 发帖

[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
" }2 m3 Y) h2 K' Z$ a0 vPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
- {. H  U- U) d9 }本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
& \0 P) r/ I, t$ I$ |. y) y4 m1 W$ {  x# O, K1 p2 C2 v$ l' j1 d9 ^8 S

  t* u- N3 K, \; ]+ X7 ?问题1 C- B; t% J' r" e4 v+ u
/ H+ Q; o1 A6 ^2 o/ T. L) c
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)/ O7 z1 P/ U8 M0 r
8 \$ i& W: j5 d! h, h' ^
SELECT * FROM MY_TABLE9 s  y, ?- V/ ?( K
( c  _; Y9 D/ T) g$ f, y, o$ S) c0 n
A.如果可能,用把查询转换成存储例程
* y: ?5 v8 h. X1 ?5 v$ ?1 J0 WB.如果程序允许,给查询指定返回记录的范围- T! C1 ~; K! |: D% g& E1 s7 v2 R
C.如果可能,添加where条件
* z- s; c: U! w" a$ O4 OD.如果DBMS允许,把查询转换成视图9 j1 g/ [/ b& a
E.如果DBMS允许,使用事先准备好的语句
) Y! S  e/ J+ R$ K
+ o" n/ Z* c8 a: M9 c) ^1 O' h( _0 I/ G  p- t8 y" J  F
2.可以用添加______条件的方式对查询返回的数据集进行过滤?: h& \9 m5 J' U1 z+ V' @1 L/ T

' @( i" t7 z6 `7 Z3 k- J: O- m$ [答案:____________
% r# z, h" W% K( z" ~) h* A
, l8 d5 y9 `) P  ]. ?+ J' v' S, r8 Q2 ]3 S  e+ `
3.内关联(inner join)是用来做什么的?
& A' O3 g; {* P2 b# [) u9 V) {9 z* O% {, U% e& m
A.把两个表通过相同字段关联入一张持久的表中
. T: k6 E% e. U0 ]  }* jB.创建基于两个表中相同相同行的结果集
, Z* `+ q  N2 F: S8 S; e/ C- [7 F7 aC.创建基于一个表中的记录的数据集5 Z8 C0 L2 o0 ]
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集2 y1 M  q9 `( |+ J) X5 h! }' M
E.以上都不对0 M7 q" w$ D4 X

- J/ D  H/ S5 p0 U6 m+ a8 e' _) t. s; s, u1 A2 q0 }
4.以下哪个DBMS没有PHP扩展库?
2 {; t' m3 v# _- j5 @; S1 i! l: C' }" g
A.MySQL1 C, {9 h: c& F; ^
B.IBM DB/2% C# _  G2 K$ j' t. A, f% E- r
C.PostgreSQL
+ W: W: Y/ w9 @8 h9 Q# l7 RD.Microsoft SQL Server
9 I$ _; @' O' n0 g+ AE.以上都不对
% y+ U9 {% T% y# d. j2 ^+ t" D
2 N$ t8 P' \7 H" `5 ?
% {# j& @/ `7 \3 I( z5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)* \. c* {+ l1 D! U

' G/ t; I3 s+ b8 v$ D* T<?php
5 o0 f& t- u$ }% s! o! H$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
  n: E  f7 e; e9 ?/ Y) d?>
+ t& Z9 x4 s0 A/ h; x# b% p" G
0 t4 _/ c6 I/ rA.MYTABLE表中的记录超过1条7 S4 z$ {1 Y% c/ C) w6 h# x" F
B.用户输入的数据需要经过适当的转义和过滤
# c, s& |/ F: X' h4 ZC.调用该函数将产生一个包含了其他记录条数的记录% E) f, _$ @7 P6 B6 @$ L
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除+ r7 }! H. T2 Y0 K
E.查询语句中应该包含数据库名
8 K  U. A, r0 T% }+ q
( H% ~% R, e# t' R+ t
3 {& B, h5 k3 ?+ y- D: y6.______语句能用来向已存在的表中添加新的记录。% e- V- H+ `5 J' C, K+ O, E0 s
) E4 H# I- k) x2 O, f2 c. F
答案:____________$ w6 y8 g1 q6 c# p% b

; v- t" a% L5 d) R  n1 s& l4 j+ Y9 s& ~8 E5 M, b7 s& B
7.以下哪个说法正确?; E/ z1 D# W6 X

0 H* i) n" Q7 s) Z9 rA.使用索引能加快插入数据的速度/ o3 i4 h* e. p+ c, X
B.良好的索引策略有助于防止跨站攻击
8 q, N% Q( H# V7 |: x" G" YC.应当根据数据库的实际应用按理设计索引# E5 m1 @6 s3 b& x1 x( H7 G3 q
D.删除一条记录将导致整个表的索引被破坏
7 j0 m' n& \! EE.只有数字记录行需要索引9 O2 K' |9 ]* l' m

) ?5 j% ^& W. ?$ i+ s
6 N% z8 G# ^* L& E1 o8.join能否被嵌套?' w5 o, \" K% P: @. k
  q/ d4 w  q8 {4 o0 ~2 N- H
A.能) t0 t1 D1 D- }  o; ~0 k0 x
B.不能9 A$ g' }8 I1 J) N
% J2 }  r5 j* F8 `% z; s

) H/ N) V9 m3 ]0 ?! N9 ?, }9.考虑如下数据表和查询。如何添加索引能提高查询速度?
$ L# l" U4 D) ]2 U- `" y
8 m+ [9 Y% V: }; S, Y: B! DCREATE TABLE MYTABLE (8 j6 ]% t8 M/ Y0 c$ Y; R
ID INT,
8 F: u+ ]+ _1 |3 n: \/ m! JNAME VARCHAR (100),2 c. `" U+ T# J" j' A0 s( Z
ADDRESS1 VARCHAR (100),% \* @/ P" ~5 |: E
ADDRESS2 VARCHAR (100),' n5 L" Y: u9 G8 @) @" D) ~* o2 y
ZIPCODE VARCHAR (10),
% k8 Q0 u+ u0 |, X* Y7 VCITY VARCHAR (50),  v) c" [7 p1 I/ e# ^
PROVINCE VARCHAR (2), x+ Y' m! a  y; I8 Y" g0 p: l% e
)
# ~' e! d: Z1 ISELECT ID, VARCHAR* e" B8 q1 r  w, e+ _
FROM MYTABLE
  g; V! n  W; G# W% a% M1 \WHERE ID BETWEEN 0 AND 1000 S- I& N# C% I3 q
ORDER BY NAME, ZIPCODE! u% t8 @$ l) x) e" z

% L  x. C3 [; H! s  dA.给ID添加索引
1 t; |( n% m8 d& u  }* p* EB.给NAME和ADDRESS1添加索引
: |) X6 M3 R3 ?7 t! _1 XC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
3 [+ f- Z) n7 I5 A1 I, I& nD.给ZIPCODE和NAME添加索引, Q; u* p7 W$ K- ?/ Z: B# F, W
E.给ZIPCODE添加全文检索
" H& e- C; A1 j  j3 m" k; @8 k! Q; A4 _
" e/ ]6 O7 [* m3 B6 @/ h$ F
10.执行以下SQL语句后将发生什么?
$ H8 }# ]2 a) L3 x* }% U5 v, s, f- P4 a8 D
BEGIN TRANSACTION* G) L& |, p6 h6 ~- u
DELETE FROM MYTABLE WHERE ID=11 U& U# w' K+ E* f( J9 U8 O- N/ F
DELETE FROM OTHERTABLE) k2 j4 x& q' L/ X/ s, t
ROLLBACK TRANSACTION- F  [# a9 ~6 d7 v$ G/ E
: `+ q  d. ]' D6 E
A.OTHERTABLE中的内容将被删除+ a1 M; J! V' p4 b4 d$ p
B.OTHERTABLE和MYTABLE中的内容都会被删除" j1 Q1 n0 ?, A9 F* F
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
; U$ m* {0 V6 {5 XD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化- J: x/ o6 O; g5 z. ]# w
E.数据库没用变化
7 ~* v' X! c; ~
3 @* ]' s+ T$ P+ _, b" q" I) W( |: Y9 M
11.DESC在这个查询中起什么作用?7 }/ P% t, [1 Q+ _
# l3 N( M. V0 T
SELECT *
1 ^& |7 X; c' t2 c3 y( ?FROM MY_TABLE
- D( H5 R0 w9 s( k3 t; j3 J. BWHERE ID > 08 V' h9 g$ M' a
ORDER BY ID, NAME DESC
/ q4 J, s1 a% L5 M/ @0 y' a; n4 H& x
A.返回的数据集倒序排列+ V' D% v. j' \' d6 q% A
B.ID相同的记录按NAME升序排列& U4 ~5 u6 u/ ]% S: r- \  n
C.ID相同的记录按NAME倒序排列0 _( ]9 X$ H6 t8 _8 i
D.返回的记录先按NAME排序,再安ID排序8 H1 e# ], h( n# B' v
E.结果集中包含对NAME字段的描述
# c2 y- s: X3 n1 \; l: g; j& l; ]! v  W& q' ?9 }

9 Q6 s: ~8 d8 n* Q4 X+ \0 n4 B12.以下哪个不是SQL函数?: |* @4 l. v0 x; c% U

; O8 P0 ?+ w+ Y: CA.AVG7 c+ t+ ^/ Z) [9 U2 Z0 k- W
B.SUM
6 F7 h1 o& n4 m5 O2 A) H/ _0 Y( d+ eC.MIN
( ~+ b3 \6 |) D1 g) Z' U* }5 k5 ZD.MAX
. R; o6 K# {' x- B' gE.CURRENT_DATE()
4 B( Y$ w% G6 i; ]/ i9 d: g7 `5 S/ I2 N) Q) L/ ?

! d" I6 \0 Q- c13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?5 X6 h* v' h, T9 b/ F( `
" O1 q, X2 F6 _$ p! E1 |
A.该字段必须有索引0 ^4 O5 ]% T, Q9 Q( L! E$ W1 d/ O
B.该字段必须包括在GROUP BY条件中/ D7 ]0 D4 r5 f; i' Z
C.该字段必须包含一个累积值
9 ^4 ?- ?' t) L& p+ s+ UD.该字段必须是主键0 y9 y) `, D/ e4 s: S# o( C# m! w
E.该字段必须不能包含NULL值
* u( H4 }- Y( D& Z; v; |: l. _; C% j) ?- T! {$ R

% s: s8 X7 p/ z& C% T. {14.以下查询输出什么?
( Q, ]1 S7 q4 h% A& `( t, @8 ~4 _( c8 s% z! [# G; s& V
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2  x+ }5 j1 \# `3 E! K% S' d; }
ON TABLE1.ID <> TABLE2.ID
3 j  \2 o, [  y6 K; k- u# `3 s& t  s3 L# g4 f
A.TABLE1和TABLE2不相同的记录' H3 l; ]. Z; I3 R) c6 ^$ r
B.两个表中相同的记录
# {! s9 t; S/ d' \: t2 y9 q6 ^" @C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数' b1 U7 G' F) ?2 i5 ~7 J
D.两表中不同记录的条数
7 Z  Q6 J: ^' R/ [0 ]$ RE.数字2
% G% U" [/ d# B* R& y- ]1 l# d1 s6 W5 T6 P; y' K& a, P( k

" Q, W% X6 B  ^7 q7 [1 w15.______能保证一组SQL语句不受干扰的运行?; x: b' W3 b4 F( l* y+ ^# m9 H

, D: W7 S9 Z: K$ N答案:____________
* e$ t% a: I# A. F3 y0 r3 n  s$ ^8 @: u
9 M7 [/ w+ U# g5 m
. b  Y" c9 \! t3 y' u9 D
答案速查% P& i, n& \7 {' h  l
1:BC4 t/ `) @' x' t$ r' m3 ]2 y
2:WHERE
$ o' L1 U8 e" }7 p1 U% o3:B6 N8 q! i7 O2 g; x
4:E
! U6 |& F/ D, k1 U: F# `' B) J2 O5:BD
& p* |& w, h1 r6:INSERT" D; l) C; d9 F* T* f$ }; r
7:C5 E2 u" H1 Y) E( T$ Q2 X
8:A" M: ~) w% s  Y0 ]: W
9:C
! E' r, F. V4 |10:E* B0 B! T0 ?& J6 e4 n+ E1 \' U, p
11:C
3 N$ F7 c1 U2 Y# p7 |- Q1 _( h12:E
# z# q( D, [1 r13:BC
3 R1 Y2 N2 s- y3 T2 R* ?14:C
/ Q3 d( x& h# l6 g7 J& o15:事务4 z- N1 u- F) t6 F, {& Z

0 C$ j+ h0 ]% p& [7 Q7 h8 C! C" L: N* G  g4 t  t4 r( ^

( [0 d' a- d& O  z* S# I% _答案详解' [" k3 P# t* Z6 S) y1 i

, r$ F4 [0 ~/ y$ H1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。, t% C) `  X0 r+ d& K! q; W. O
" ]2 B4 M3 }  i2 P- e- I) P
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
, u2 z7 x; X/ l0 {& Q) Z4 O7 S0 ^
) d* v" a9 D  H' Y: V3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。) K& l) |$ q* b  W2 Z
/ @( X! e9 m' c6 ]! T9 Y
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
- d+ Q2 F& p( G( v/ m. h* u. l5 F* G! M7 v) c
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
) x% a  U) ^0 H2 I6 {
$ V2 U) `. j! Y; k/ X' u6.答案显然是INSERT。) h" B/ j; i% ~

% r1 v0 q; r# h7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。' x2 i& k; @# o0 A

  @" \3 X5 B% B+ ^' N. a" o9 ?8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
* E: ?3 J8 T) U' L
: l3 v1 J7 _2 _5 K6 C9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。6 E* ~9 d+ L* l/ w! Q9 r2 D" |  {* ~

- C2 i" w: i  G3 ?: ?: N7 T10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。2 z( k5 V) T9 D3 @2 U5 \
. W( X' W6 D' i4 h  |9 l" T+ z$ a8 V
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
2 d7 y6 u1 x7 ~$ p0 P( ?5 N, D6 B3 Y* Y+ J8 i9 ?
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。2 T3 f' x6 K$ r7 I0 B! S
! k! {( ]5 v0 ~# p
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
" g3 ^# Z' S2 O
$ p6 r0 ^0 l5 ^! m( H! B14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。# X# P& V8 {8 e1 G
$ c9 H- U+ D" _. e1 o& v& U
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

返回列表
【捌玖网络】已经运行: