返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
& J- N5 o4 x. z2 N. B5 t) d& y  LPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
% ~# Z# w4 e" `: ^本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。( Q- T' I: F4 c5 v! u- ^# h

. C' l! N0 c  d3 J7 q! x$ M
# z1 \4 _+ i" L4 M$ w) m问题
5 d) `3 q3 U4 H) N# N$ e
2 h  v! D/ k8 H1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选). ?; |( G& K- ]9 f# N

* K! E6 o7 m3 B' E2 y$ I$ g* HSELECT * FROM MY_TABLE
/ A) y2 D4 P; A) s7 W8 s
- I3 E: c4 |, b* O/ _A.如果可能,用把查询转换成存储例程
2 H6 v/ Q* S4 Q# ^: T0 P3 [B.如果程序允许,给查询指定返回记录的范围- T4 y& v& ^# m2 A% v1 r
C.如果可能,添加where条件
; ], }+ R; }% p6 K2 LD.如果DBMS允许,把查询转换成视图
$ C' x, _& b& Q# a% F. E$ T% _E.如果DBMS允许,使用事先准备好的语句+ b6 }& `" @) g0 f  q$ g& I% [

4 J. f8 V% x; v5 p! l$ a( N6 X5 ~  _- m' D) ^2 E+ Q
2.可以用添加______条件的方式对查询返回的数据集进行过滤?, Z: U: K4 h) w1 P" c. J' b

1 q4 V  Y2 d+ b  @% A+ t答案:____________
% H. h& l" c$ D9 \3 |7 B
% |. f6 v3 Q& O7 m# D! v! w; \! v8 V9 F; J% w. z/ {: l
3.内关联(inner join)是用来做什么的?
: ^0 A9 z9 Q0 W% k( l! ^( o. [. n& D+ R3 C3 Q
A.把两个表通过相同字段关联入一张持久的表中
4 O- M9 @' a- [- o; C: y% KB.创建基于两个表中相同相同行的结果集1 J: q# X4 k6 `5 F
C.创建基于一个表中的记录的数据集
$ Q- C; `& O" B* a& G6 cD.创建一个包含两个表中相同记录和一个表中全部记录的结果集+ D/ C! o& ?, i
E.以上都不对
' z! w8 y" F7 S7 R% _( [9 ?, |5 {8 n3 z" T  o

$ g! z2 G% e" e6 f" f0 y4.以下哪个DBMS没有PHP扩展库?# M) e8 ^; T+ C, I

/ U; X- {: L6 M& e% t. {A.MySQL5 X% \0 ~, l# F2 h
B.IBM DB/2
1 @0 E7 f, S1 f% WC.PostgreSQL8 L5 g# G( Y  L# \' v/ ]: u
D.Microsoft SQL Server/ X' j% c3 J: s
E.以上都不对) U* [8 n1 C2 @4 L5 C
. Y4 F7 \8 B% J: d! T* z8 R
0 z* \8 r' R7 x: |' g
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)9 U/ F3 _1 ~- z$ F
  y5 B0 F( [8 _' `
<?php& I; o) i4 ^% E- `
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);9 `2 ^, \6 P! N* {$ ?& C
?>, G) Y0 g* B2 W1 g3 P, ^1 R

& Q# y1 n  k0 N1 G: }: S. cA.MYTABLE表中的记录超过1条8 N# }, Q0 M( h) t8 O: G
B.用户输入的数据需要经过适当的转义和过滤
0 v: ?7 I$ I- M# P1 u$ BC.调用该函数将产生一个包含了其他记录条数的记录
  z) O  P; t9 X, P% VD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
" c( o: R8 n( d: z7 d, N$ k5 [E.查询语句中应该包含数据库名
8 F. I. Y. A" E4 ?  p9 T+ [4 I( F2 [
+ e' u0 P3 u+ \6 n, Y# v% a. v8 H' z# r+ Y/ K- D
6.______语句能用来向已存在的表中添加新的记录。. S7 z0 L1 y! U2 U

, ^& h4 [4 p' a答案:____________
: v! u. a! y9 p2 Z
" m4 `/ H" |& h/ g1 X) W! [3 A6 N
  x- i4 h3 w- I+ W0 i. b6 Z& y1 d7.以下哪个说法正确?8 h+ D/ r$ c9 a! K. f& `8 _) P9 o

3 d0 W1 ^$ K( ^A.使用索引能加快插入数据的速度% A% i5 {! j- a0 i# u/ d
B.良好的索引策略有助于防止跨站攻击0 `$ M% v) I' `- ~' m( C5 w
C.应当根据数据库的实际应用按理设计索引2 m/ j6 {* M# b
D.删除一条记录将导致整个表的索引被破坏
/ ^& g0 s2 _* E+ QE.只有数字记录行需要索引
" Y- v. ?% \% H# @3 B* X) ?
2 \/ W6 C* Z1 B- k2 m! r, [; C- h1 d  F& h7 P) G8 c  P" w+ ^
8.join能否被嵌套?
! T# w6 d( M  [
% X; k' m( I( F$ R7 ^A.能# X" n* F! ~& g9 {! G) ~9 n
B.不能
0 W% Y4 @" i7 O4 Q; Q  _; i6 F- L" @4 C* {4 e" B
# M* ~! g: L5 Z/ q
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
/ W3 k8 c9 {7 |0 T! P+ i% Y. @# p' Z  W* z) D# O8 N! d
CREATE TABLE MYTABLE (
9 h9 m5 d! M5 vID INT,. d' Q& y8 j- j4 R& Z4 ^
NAME VARCHAR (100),
2 y* z9 w0 R4 n0 E0 D( Q. W! NADDRESS1 VARCHAR (100),# Q5 F' S) _. Y/ U5 {% |
ADDRESS2 VARCHAR (100),
0 c* F2 o7 i) `4 |) QZIPCODE VARCHAR (10),
" f" q4 c  G( g$ k9 @* h& q( tCITY VARCHAR (50),. G8 @4 }; g4 l# V
PROVINCE VARCHAR (2)
6 T% L- k7 p' }, V7 {)% c& t0 A' d, R* m0 U
SELECT ID, VARCHAR
; R6 _4 T4 f4 p$ aFROM MYTABLE
+ _. a* ~8 t) q8 Y9 E: m& c/ m0 sWHERE ID BETWEEN 0 AND 100
& O) h6 P. ?  A0 U# VORDER BY NAME, ZIPCODE% ]: [! l: |5 y3 j3 _" `

$ D6 a6 U1 y2 |1 FA.给ID添加索引1 q* {0 `  y! H* _" }1 n* @
B.给NAME和ADDRESS1添加索引- ?1 {1 T- h1 n1 w; [6 Y: N
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引+ |4 O, g  S+ a3 ?& ?; H8 G! w
D.给ZIPCODE和NAME添加索引9 j, C0 t) x: x1 u* }
E.给ZIPCODE添加全文检索: E* b7 O5 ?( Z( k. U  }

9 M$ H& \/ D3 W+ }
1 K% }+ M, `) a$ I! T' V, Z6 F10.执行以下SQL语句后将发生什么?  G. g/ ?0 D4 R" G# J5 u

/ H6 s6 C0 R/ NBEGIN TRANSACTION6 d2 f# }) ?. \" W1 m3 |  v! H% v
DELETE FROM MYTABLE WHERE ID=1) n% U+ `6 ]5 E. c4 W. m
DELETE FROM OTHERTABLE; t& o* [+ n- |- N7 g' z* ], f
ROLLBACK TRANSACTION& p6 t0 ~# k2 x* Q, _
5 E: Z$ N) `0 X8 y9 y
A.OTHERTABLE中的内容将被删除5 q0 {8 c* J2 B: k* S* y9 k
B.OTHERTABLE和MYTABLE中的内容都会被删除7 i4 ?2 `% I9 p+ q
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
: x6 P6 M. |! {: J! v# @D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
5 [$ x) `4 p9 [, s3 W( x4 |E.数据库没用变化/ k: i3 a9 F! U, ]: K- [. i
# }6 l. C: z; q' B$ T/ S% x9 Q% A
- b& w& \/ @- z, ?; y6 ^: ]! ]% z' ?
11.DESC在这个查询中起什么作用?
6 {% t2 P" x7 b$ f9 z3 e
9 s) P. U8 T6 d* ySELECT *
  C7 V2 W. n9 Z5 `FROM MY_TABLE
% m& \, t7 {% b: m# Y* Z+ j: }* ZWHERE ID > 0
" i4 y) C3 Z; j0 Y  U' S# O1 wORDER BY ID, NAME DESC
' ~: y! H$ W. b- P8 [7 X
" U, P* w; C# Y8 uA.返回的数据集倒序排列
- _% }$ p4 V, b% P- QB.ID相同的记录按NAME升序排列. P. h3 Q+ C: ?+ X% N
C.ID相同的记录按NAME倒序排列
: f- R7 _4 t3 G) GD.返回的记录先按NAME排序,再安ID排序
3 B! m# Z) Y2 T( `E.结果集中包含对NAME字段的描述* h7 j. w  z& z' I! R5 z

. _: j, u7 C6 A# n0 t/ c# `
% O+ S$ X9 T1 P12.以下哪个不是SQL函数?
1 r+ U; _" f5 A3 E4 k1 f; B0 w* |
+ W* A- r/ y: P) A! U. QA.AVG
6 a1 S+ O0 V! Y! IB.SUM
6 f! F/ v, i1 Z% ?$ u" `C.MIN
( v* c7 _9 C# vD.MAX$ l) P" n  p2 `( ~% `
E.CURRENT_DATE()
9 _/ p! v9 l6 c% n' \2 c, A$ t, K: a, X/ j- Q: Z& Q
1 l6 q" G5 Z% X! D1 j: `4 P& [
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?7 x1 o# I5 G& G2 }& Y# |  _
" V* J1 H6 Z$ U2 q" R, E6 u  I
A.该字段必须有索引1 v( Y, p. }' ?' D/ w% n" t$ H
B.该字段必须包括在GROUP BY条件中
( o7 Z" E4 I$ }: l5 d) i$ h1 r- [C.该字段必须包含一个累积值
& ?+ Q  q7 Y9 r8 AD.该字段必须是主键
' l# {* b( a& ^0 {E.该字段必须不能包含NULL值& x+ O0 J/ n/ T* \" S9 s
( T. l& O8 r- W0 O

' J8 i/ y& b% S/ p! O14.以下查询输出什么?  D5 A$ J2 N% T, x7 f
, C2 h, l. o8 r# w, e) B
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2* Y2 O* Y3 d# u  V0 C
ON TABLE1.ID <> TABLE2.ID
9 L7 J# {# y& V+ N- P/ I  Z) m7 y7 o) ^: ?( o1 S4 n$ D. r
A.TABLE1和TABLE2不相同的记录) ], q# v+ \  f! ^+ m* T( j* `- L
B.两个表中相同的记录
( _5 _4 Z& o/ M+ n6 GC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数- l" S' f& P  ]- R
D.两表中不同记录的条数! Y+ Q* U6 _5 `; T" R6 O& ~
E.数字2
9 i% V, i- \, P" b, L
/ ~7 ?. @* l* c; A* y; ]% h  G  A# f5 e7 O% \* i3 v9 w! |
15.______能保证一组SQL语句不受干扰的运行?8 d! i# w$ T6 V5 h9 P

" G3 G5 T2 T4 H9 x1 N答案:____________
7 e2 [( l' r0 E  g! T+ o; \" g' I* {/ ]0 }
& S8 f, J" @: z) O  o* l7 {
5 V$ h$ B- a$ {; Z: J6 [
答案速查
* O+ E  p. \! B8 T1:BC, x) `8 m; m: g
2:WHERE
/ Y7 h0 M9 T' W" A; H3:B9 g% u. b+ c6 Z, `& _% X
4:E
5 a( X2 I% b& s# S) M5:BD% D4 s0 O  F9 ^% U, y/ h' _
6:INSERT7 l  S% b+ A5 N
7:C
( Q- _; a, a0 p8:A
! H+ b2 u% p; p8 A9:C
! ^3 |3 {. o+ \' n. V10:E
2 l+ f7 Y; J/ P* J9 c* A11:C0 |) j# H1 D5 I2 j3 G
12:E
8 L' T) P2 {3 z  n13:BC1 P; i/ |( U6 t3 T, z4 g
14:C
& e" S# V7 b& K1 Z$ U, ~& }. X15:事务6 Z" I+ h  j, R3 \; Y$ o

: M5 w* {  O0 o# I& x: z+ F3 t( ~5 m2 I4 J; I

, D+ `3 I) S% \7 P答案详解
0 c- M' l, a$ J- P1 Z6 ^) l$ A% r; t( M7 y( p
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。( g% d( X/ U( N2 |

, n7 J" t/ \/ M1 t5 `# l2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。$ L* I, ]  H4 K$ M! P6 q. l, a, ]% c

  V1 I2 I; a: G* F2 P% f8 t& o3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。0 H! E( Z- _. e2 g0 K

5 z$ u! Z. s2 k; M( O! V* @4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
- T7 {7 g) G+ Z7 S8 p$ p: v% {" ^+ F; ]/ X: |1 E& e$ H
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
, d3 n2 E$ u2 W
) i; g5 ]9 b7 f3 U) d  }4 |% B6.答案显然是INSERT。
5 R6 F, l, e, G+ E! d* t2 ^4 C
: p8 h" Z: q* S$ T8 P6 c7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
4 A# e0 F/ h+ G" }6 @3 {- c
% l+ ^: v3 {# O8 g6 a4 Q, H9 O0 l8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。) s1 ]9 k9 O, S/ L7 K9 k/ ]5 K

0 `# \6 s) [3 m9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
) ]' }$ x9 L/ f( T8 I( P# V9 \
. ?/ c$ f( x! ], {: w8 g10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。) f3 a) ~6 S; m+ C' s8 d1 I: j7 j

0 ~" `6 N: S) z; t11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
( t/ j, O5 L) L0 O0 n; V  b+ y( m9 X0 w, B% _. O8 f4 n. w
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。0 L: ]- X8 q/ t9 m
9 y8 Y, |* T- J$ `; D9 }
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。- w- I: _0 ]4 |' c# K

- S: ?: J9 |  L1 v) f$ \/ S# J14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。, E! m' @4 G' v/ ^! j2 n2 u; ~

. e! y) q, s- ~) T15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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