返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。1 E; i$ a$ f5 f5 |$ @/ D
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
7 g+ T7 w; [/ ~本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
: `3 M+ T% q/ F) v; h
9 w- z; ~  ^) A) z
% Q" e2 X5 `9 ?- L3 V; O6 \' X6 v问题' G+ F1 v+ k" H4 V7 k( K

6 P0 |$ D, Z6 m5 R9 q- s  @* W1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
& y9 S- x- V% O9 H; F
8 G6 x! B6 ?+ S( J# dSELECT * FROM MY_TABLE
6 j( F  z1 l2 Y2 V# B4 z( \9 J. ?* D! {9 R5 u0 Q$ [$ V. J
A.如果可能,用把查询转换成存储例程8 A1 J  |) M# x' _( u$ }9 e$ j$ m! l
B.如果程序允许,给查询指定返回记录的范围  W- e% K7 e% M4 \5 a3 s8 ]# v
C.如果可能,添加where条件! c3 q6 x) u- E
D.如果DBMS允许,把查询转换成视图
- y) z+ @7 E7 g. _" C) \E.如果DBMS允许,使用事先准备好的语句/ |* O& [5 o$ {, G9 [% z8 d) u

  T; x6 m9 v2 C+ l# u. T, M0 V5 F8 B+ _
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
# m$ V7 P. v8 w9 Z0 Z1 q5 z) w7 R7 n* Y0 @/ V+ r8 x
答案:____________
& e. w; L: M$ l) I7 S$ x  T: j, X* |7 t& z' Z8 w

  P2 x5 |* ~9 z+ M3.内关联(inner join)是用来做什么的?  g$ w7 m* f3 h2 s$ O
: V" G  H9 h4 I1 w  ~
A.把两个表通过相同字段关联入一张持久的表中
4 u- \# O6 {7 E$ Q: Q" LB.创建基于两个表中相同相同行的结果集
+ R# a% J8 C  s& g) t$ I* IC.创建基于一个表中的记录的数据集
* S7 {7 w( ]3 _7 BD.创建一个包含两个表中相同记录和一个表中全部记录的结果集8 z4 K, S8 I1 d5 x) ~! {
E.以上都不对
+ V7 ~7 d8 s- l0 N4 H
; U9 v0 I5 e/ N6 x: w
, ?' `- i: E. {2 n4.以下哪个DBMS没有PHP扩展库?
7 p- x1 m( p' C' D: |& Y3 H5 v; \( @$ D' F# T' i
A.MySQL; j) @2 _) F/ G( V
B.IBM DB/2
! C' v. [3 G0 P" E" iC.PostgreSQL
/ N: v$ ?' g% g4 E+ UD.Microsoft SQL Server
* Y3 i4 ?0 s, r, p' ZE.以上都不对. `/ P! H; K: {/ {
  b0 J/ ^; H$ c! |

6 b& a3 n4 P2 U# h6 e9 ?' F5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)6 F1 w7 D0 \" N% @5 ^
; B3 P$ M5 ^. z) q
<?php
1 X  x& N, ]4 J$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
5 l3 I  s9 q& Y* M( k1 Q?>' g. M7 P2 V4 a

4 M5 E+ F4 k; C& e% r4 jA.MYTABLE表中的记录超过1条
/ T3 X& |; w# Z/ B. U4 L( |B.用户输入的数据需要经过适当的转义和过滤! ^' m2 u: K: P9 R' A' x* P
C.调用该函数将产生一个包含了其他记录条数的记录2 e4 K5 C. ?* n) a
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
' x4 T7 l7 N8 T  O/ F+ _7 T& Z2 oE.查询语句中应该包含数据库名4 a* {+ K% D+ [7 u7 G) J
; e5 ], z5 ^; M4 A3 E0 `
( k! O3 V% F0 g' B8 z" a
6.______语句能用来向已存在的表中添加新的记录。
, `6 {  u6 B6 h# `% y8 V4 }
; Q# Z7 {: C' ]1 X& C8 j答案:____________
2 z% q" a; a4 ~, ^' U
/ s! `; F8 N9 Z3 M: x
" m5 R: A- ^/ d; i& ^; c; {# ]$ c7.以下哪个说法正确?+ G1 }  c- S0 a( l4 M

8 K3 |. Z' K* i! E5 @, ~' ^A.使用索引能加快插入数据的速度
, |5 p1 C$ D6 K7 }B.良好的索引策略有助于防止跨站攻击; H5 ]- P7 s8 x) |5 i  x
C.应当根据数据库的实际应用按理设计索引6 _2 c% y* z) S
D.删除一条记录将导致整个表的索引被破坏6 @- e; r6 k* z- I/ V9 e/ v7 E
E.只有数字记录行需要索引! _8 X4 U2 }3 w( u+ C1 q

( O9 @7 G. `6 ?; k2 k$ E1 N
9 h4 I5 ^+ r0 U- t8.join能否被嵌套?
2 r- g. F. W5 h, Z% a; Y
+ M1 q9 c0 C! _7 D, I5 p: MA.能+ X6 n& e9 t4 J) j/ F$ E) T  l8 {
B.不能
1 m0 _0 c3 d) E9 c
: V" e- n( H* b( P: I
! O2 C, g; ^& f' y+ U9.考虑如下数据表和查询。如何添加索引能提高查询速度?- C, v1 G( H5 P7 O) p
5 o0 e# e) J3 Z$ a  `
CREATE TABLE MYTABLE () u& T, f  ^+ u2 e* A# u
ID INT,1 K+ M' d% u9 c, C& b& H! Y. U
NAME VARCHAR (100),
, b0 y+ X# S& ]ADDRESS1 VARCHAR (100),/ ]( w7 r$ C! h/ X0 o3 ?
ADDRESS2 VARCHAR (100),
( Y. t* S# s' y* oZIPCODE VARCHAR (10),
$ d' H2 g1 }/ D4 b- D- ?. ]CITY VARCHAR (50),
, c) l) i; d# e' E9 k. I4 JPROVINCE VARCHAR (2)9 i; p/ V' Q" a' `. t2 a
)/ q! _$ D  N. b
SELECT ID, VARCHAR
# k, N9 T, m' \7 W5 w# v3 V3 Q) bFROM MYTABLE* M" b( {0 B: {. Y. ?; K
WHERE ID BETWEEN 0 AND 100
2 _5 `2 A9 a7 O* bORDER BY NAME, ZIPCODE
* C. y$ W& @$ B. D1 c( w
9 I$ U4 X! Y' F) |: [8 D7 z  hA.给ID添加索引1 J) i6 O$ B, c; B8 L: p5 W
B.给NAME和ADDRESS1添加索引
4 v6 y1 t% l( t. _' y: M' UC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引0 y# S- z+ Z" A8 ^4 I% Q
D.给ZIPCODE和NAME添加索引$ a2 O" |3 w, o1 G" J
E.给ZIPCODE添加全文检索
& _7 s8 l/ I' D( x) Q- t$ _3 [6 ]: P( x- z
. a7 C/ V% O' W5 m, A
10.执行以下SQL语句后将发生什么?
! k6 ?2 d# p+ V& Q
6 @) \# G0 l3 L5 pBEGIN TRANSACTION) r8 e0 U* P6 }0 G8 `, U% h) k
DELETE FROM MYTABLE WHERE ID=1
% o5 l) B4 C: }) x% b0 sDELETE FROM OTHERTABLE9 P0 O0 W  P  S" j
ROLLBACK TRANSACTION
! d( z  R! ^* B# K( L; r9 }
# h% R# H0 J, x4 rA.OTHERTABLE中的内容将被删除! z2 {$ v' I% g5 E( h
B.OTHERTABLE和MYTABLE中的内容都会被删除
9 g1 V0 ^+ x' j! u& U! q* WC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除% a$ x9 f: I1 O0 _8 U& C# y+ x6 W
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化. g3 i: t- P  I) b) ?( N6 U
E.数据库没用变化
2 ^/ G: ]1 y- ~9 q& J8 F
8 [) w7 ~  a, q/ b1 v4 u: r* n" Y. [( @- y6 i  L" L
11.DESC在这个查询中起什么作用?
1 ~5 e( V, |* U
" p7 z  |3 H8 L2 SSELECT *
& ^$ ]" m4 U8 \9 x5 \, I7 \FROM MY_TABLE% y  M3 Y+ V) [8 l$ d# J
WHERE ID > 07 t  c, m2 v" }, w+ s7 v0 r
ORDER BY ID, NAME DESC
  _0 L; H4 Z8 D3 p, X2 L* R7 V# y# F2 b' P5 F
A.返回的数据集倒序排列, y2 b+ a6 i: {% [
B.ID相同的记录按NAME升序排列# a: P6 `9 Y1 J9 b; C6 P! E# x$ h- U
C.ID相同的记录按NAME倒序排列
* w8 K' V, ^5 ^" _8 XD.返回的记录先按NAME排序,再安ID排序: B' X2 }' P# V' f/ N
E.结果集中包含对NAME字段的描述4 W7 W1 `( H: g/ g& E# Y+ e+ z5 Q

4 \. A; n4 n. W- }* d4 W9 @
( H* j0 e1 ~5 R& a  h12.以下哪个不是SQL函数?
) `/ }$ F: j) [6 D5 e
3 L9 [+ I( d+ P! ?* D: T1 }A.AVG0 o0 }- _5 g) {( @
B.SUM
+ y/ F' |0 X! h6 s" m0 nC.MIN6 F0 `2 q3 c4 V& f
D.MAX
, a1 t4 m8 V: {9 x1 r5 tE.CURRENT_DATE()9 V+ a- ]0 }& f. F+ D4 T. {7 |

; ]: g* d; `9 |9 o6 e/ f+ }3 n$ V8 ~1 y: c' _! H6 ^1 V
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
; H/ H: R/ ~& h9 K$ I9 l' f$ s4 d+ ~! |
A.该字段必须有索引
: u1 Y. l/ w- X. S5 G8 u6 JB.该字段必须包括在GROUP BY条件中4 U% D$ W! l) w) ^
C.该字段必须包含一个累积值" y8 z" [$ W, }% X' {# ^+ O0 Q0 ]
D.该字段必须是主键
4 M% J; f$ ^! rE.该字段必须不能包含NULL值
9 H) H& R- W) K
" f" b$ L* F8 h0 o( S
/ p  G/ x& S8 c; {& e14.以下查询输出什么?
  d. y6 t- l% X. x1 S) a. h
9 b% H) f+ c3 t) @6 _& a8 H8 X8 B( kSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2$ [1 ]* T! f6 M8 T' p0 g
ON TABLE1.ID <> TABLE2.ID& z2 U9 j$ c3 U6 v- o: e& S

6 H! W* c$ N: V: _6 ~A.TABLE1和TABLE2不相同的记录& \) w! O+ Q9 O7 B
B.两个表中相同的记录# l7 G( n& p2 h5 k# S
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数" T4 q, e1 s  _! x% \3 i: B1 k
D.两表中不同记录的条数/ v' P5 P# P, Z7 v
E.数字2
$ N/ y, G/ G! a. K7 P: P7 o4 r
" p  r- n. Q) d* B* v2 W
- T& g3 u% N1 s# q15.______能保证一组SQL语句不受干扰的运行?- p5 Z  l( Q( c- L( X3 {4 e. l

. @0 D2 N2 \/ J+ H" e" [答案:____________
/ L# j& _+ }* ^4 O( a3 i2 l( j* u$ B0 s6 m5 ?  n- U9 s
0 U+ M9 J- I5 Y; I3 u" F) l2 K" A7 r
# D/ Z: V! a1 N; j
答案速查
# N7 ~3 @& `3 o9 l3 B) @6 m1:BC
, {$ x2 Y6 o0 p7 c$ O9 S' y2 F) E2:WHERE) ~9 K3 J5 T! [& A# h7 E; H
3:B
& v! a- V  J7 c- [4:E
$ v8 l# l7 `+ N- s5:BD9 E  t* D1 D* v- c* K
6:INSERT7 R4 J8 |8 P' A( E% U; H
7:C
# h6 ?6 y- V2 s5 m1 y8:A6 K3 t* @' ?/ L! u
9:C
. [& x3 Q7 C0 l, Z10:E4 z* x$ z  u& N3 X
11:C( X6 p5 x# F$ ~9 J( X& O
12:E
  h4 C/ }+ ~- G  _& V13:BC, e4 u( u6 y. j& g# P! P
14:C3 @7 ?- `3 B' B$ [* `. b& [
15:事务
' S+ v" M* @5 A2 n9 j$ X9 n1 h7 n* U& _0 v. K- z+ Z
: E+ S. r: s' x6 l  c" S/ G& k4 b
: M4 _- ~7 q& s- k/ |7 z' _
答案详解
2 U$ O) s9 v% C
* R" {3 M! E- u8 z, F+ M- ~1 Z, B, |9 [1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
" o: V( U1 t& P5 y
( e1 S6 j% ]. C4 w2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。( ^& L) q* F7 @/ ]; r
/ J3 J3 E( ?' N: M: {* S% W$ v5 u. E. T
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。1 Y3 B+ ]# e' A2 m$ i1 l
5 F; `1 u4 y- E0 m
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。/ V1 n) v2 D" |* C+ i9 k
' m& A0 Q8 ^& X7 ~6 C
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。, G& x4 s: A. i/ w5 V$ i3 {1 d! o" a
9 n) w- h5 R8 i
6.答案显然是INSERT。
) H" n+ c# p1 t: D/ _* k9 s" K. M" z) }& I
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
$ W0 d, |, x& i, h
& M* t( U9 S, |" D8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
# O& \# @+ R" @4 g9 @% T" a+ X
4 M( m  {7 k. z- N9 m% N9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。) M& P0 b( r, Q( ~5 F9 G1 G, G

1 O9 I% D3 P0 g  t7 F2 @10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。  h& O, W+ n! B* l: P; h
9 {& [: D4 u' {6 N: d8 Z! V# @
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。9 t- _9 y' U5 S! {  t
' l3 ^. o# V( R+ ~
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- _! S" M: [! z9 h  m0 t$ X
* R$ k6 \& E+ _1 J1 U# A13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。: F+ O; R3 C) k
& ^0 Z' o) ^) U1 f
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。" [- {5 t" F# E* J  M, Q+ h

( n5 V# W. n  H15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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