返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。! p+ |0 `" W# E) h, ~% P
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。6 d* D% q7 K. C! M
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。5 n! t' w' D: M2 J- Y
/ f1 C% M( U! A7 l* k

, y5 E7 o# ~  [' K问题
% D) ~# [/ m2 n0 \1 R
9 j4 l6 F6 e6 R" z" h1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)  L5 z( f8 C# R1 a) u

  f% R+ m4 W4 g; y3 F) B1 {SELECT * FROM MY_TABLE
& J. E# r: z2 e" c( C" t& C- v
% Z( ~0 W+ ]; x( b' y! d5 iA.如果可能,用把查询转换成存储例程0 l7 h3 F6 w' X. o
B.如果程序允许,给查询指定返回记录的范围
# r; p+ [8 b" u7 C$ qC.如果可能,添加where条件# k: A7 J$ ^* k  ^
D.如果DBMS允许,把查询转换成视图3 o; k% s( W; l+ l
E.如果DBMS允许,使用事先准备好的语句
% L$ f$ u% i, ]# |9 W! S' I- |
2 K. o8 E' c# ~. A+ r+ h2 I( \4 {* M9 ?9 s: C
2.可以用添加______条件的方式对查询返回的数据集进行过滤?1 g/ B) |) [; Y3 X- [

/ B. j! q& [1 u. c3 F答案:____________) \; [# z) ~# M. m( c+ g& i: J! e' Z0 R

/ m! G, t' B9 C$ e3 U2 W' O
) a  L+ M7 _+ S3 b! B  c3.内关联(inner join)是用来做什么的?
6 B% b; @1 ]6 o$ X, x0 ~  Q  g9 ^8 c7 \3 Q' P% D2 x  Q6 ?
A.把两个表通过相同字段关联入一张持久的表中% y/ k0 j( Q- x
B.创建基于两个表中相同相同行的结果集# b, X" o/ b; M  o8 D) [" ~
C.创建基于一个表中的记录的数据集" i# X6 t( I; V2 W8 g7 R
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集  B" U& d8 M5 \
E.以上都不对; v0 S2 G, h6 u* Q! x8 Q

$ s( l7 ?, I0 n' U
% m6 \4 F& w  A. W4.以下哪个DBMS没有PHP扩展库?
) M+ m3 V3 G5 H5 a- L  @) y$ L7 |4 T  y9 L& x- m
A.MySQL
" t5 z6 x7 n' d. e: M0 H9 oB.IBM DB/27 f$ ]. X+ {' L/ E+ p4 ^0 c1 @# z
C.PostgreSQL. R' m" A, y0 E& \2 ^  a, o
D.Microsoft SQL Server3 q) A" J& X' Z6 D4 Q
E.以上都不对% d0 W. j: d: [4 T- E7 }
8 a# b8 o5 Q. [' E/ n( @
, ?) U% f$ t& y8 K6 A2 N6 z' X2 c
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选); D8 ^6 n" o& ~+ z! S
" W7 ]3 Y9 a: ?
<?php
8 A  j* `) o) Q( E; c: J1 o% S$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
6 G' ]8 o0 o4 W- C: S. {# `?>
( b# y! f$ E. {6 ?2 }4 @8 C
* ^) L. H: r1 h( LA.MYTABLE表中的记录超过1条: k( s( N7 v% ]( @& o
B.用户输入的数据需要经过适当的转义和过滤; z; V) h0 [% t% u7 l
C.调用该函数将产生一个包含了其他记录条数的记录
5 I1 ~; w" n" j: YD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
0 v( {' _9 k2 c) _( P4 e' d) F) C2 WE.查询语句中应该包含数据库名
, A4 E+ F; J0 T# s; a9 y% n+ h( L; w& y4 X/ T8 W' t0 _

5 W) S9 {( I0 j6.______语句能用来向已存在的表中添加新的记录。4 f% W, p. Q$ r; ^7 z5 ~9 @+ n
% X4 \' A2 e( c: m
答案:____________
! q, P! K1 C" J5 }; y4 x: \9 b4 h" j% o) J' s( i% P0 T
( ^8 |2 B7 h5 h) S
7.以下哪个说法正确?
' p, I( G$ G0 Y1 t
! Y  O# j" j8 ?A.使用索引能加快插入数据的速度7 h4 d' {+ `. [, J! J- G
B.良好的索引策略有助于防止跨站攻击
4 \4 s9 _9 T& T  c) M8 wC.应当根据数据库的实际应用按理设计索引  W/ j# Q& I8 Y
D.删除一条记录将导致整个表的索引被破坏+ H' N7 t& Z3 L% }: }& I
E.只有数字记录行需要索引. p  K0 U- w; ], ^
# [% m5 ]4 b3 d5 S0 h0 }

7 g) e0 x9 B. T/ n) r8.join能否被嵌套?0 |6 n) u$ i$ E9 u
) u( g2 I5 N3 l6 B5 w6 P
A.能. ?/ B9 h, n4 w
B.不能
. B+ x2 f5 V/ v5 `9 L2 r' H4 V8 U/ X
! _# ^1 X, j) e$ _2 ]7 [! m- W
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
$ p$ x! A) a( _% ]/ a7 k; m/ ?3 f6 Y  W. \
CREATE TABLE MYTABLE (0 _! h" ~' f& `- @
ID INT,2 N! e& Y, ?0 [; q: Y
NAME VARCHAR (100),' p% t0 N5 C/ g# Y% r
ADDRESS1 VARCHAR (100),
) ~2 ]$ {9 T* R/ S/ F# v3 BADDRESS2 VARCHAR (100),
- @  x* C2 T- N' W' UZIPCODE VARCHAR (10),
& m9 z" l7 @. [CITY VARCHAR (50),* g2 W' V% y3 U# \
PROVINCE VARCHAR (2)
0 w4 Q0 M! i3 |0 ~)
9 w# y7 ~4 _  JSELECT ID, VARCHAR
7 J1 |/ |4 s# F; U& ^$ w5 oFROM MYTABLE, g. n" n  c# V* A* O* y+ ^3 f0 I
WHERE ID BETWEEN 0 AND 1006 I& b9 F$ L- N3 w2 r# G" G/ I
ORDER BY NAME, ZIPCODE2 i- k0 W" v3 y  ]2 |! V

5 d0 O/ H4 H1 ?: E2 e2 OA.给ID添加索引
5 ?! M8 P% i7 R  Q2 w! e# O* {B.给NAME和ADDRESS1添加索引7 s* ^$ v: k9 y) q% u
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
( F- J+ z/ D6 f' XD.给ZIPCODE和NAME添加索引) K" \- P8 v2 D. t
E.给ZIPCODE添加全文检索/ P2 o# f7 N- ^, }% ?

8 ~4 Q1 u3 |; i2 Z  i/ o0 w% O- y8 A( d4 q
10.执行以下SQL语句后将发生什么?
7 c- m& v2 n( Q' Q7 B
& M( K* v; f1 D3 q& X2 cBEGIN TRANSACTION' h: X6 e" a& p& `! ^
DELETE FROM MYTABLE WHERE ID=1! E! v. y! G/ Z+ y
DELETE FROM OTHERTABLE
2 ~: q4 h, @6 n1 S7 ?ROLLBACK TRANSACTION7 H4 u/ |. X9 p+ t
4 F. `( a( c3 S: `: @
A.OTHERTABLE中的内容将被删除9 e" t8 J2 i6 [/ {, I9 b
B.OTHERTABLE和MYTABLE中的内容都会被删除1 o6 L) }- y7 O7 r% G" j$ Q; K
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
# B7 F$ T' h( p# s; VD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
1 i* K+ C( L& J7 g- A0 w7 yE.数据库没用变化
1 w% m1 p1 C2 L9 Y7 {3 S1 t9 {
8 C( e9 t# S  v2 G+ G6 ^9 ?3 w  h; i; P
11.DESC在这个查询中起什么作用?: @' r! M/ f! j
! @4 ]+ m) r/ D% N0 {1 x! ]  r' x
SELECT *0 a: e: R# p1 W4 n: H
FROM MY_TABLE
  |5 Q4 h" N: l; S/ N: yWHERE ID > 0
3 e: W5 ]  N5 vORDER BY ID, NAME DESC
' t: k4 A. v) N% A" l$ [
* Y- N3 i: S9 _: g, C( hA.返回的数据集倒序排列; T% |$ |5 l9 q5 f* ^! n8 p
B.ID相同的记录按NAME升序排列) D% f$ ?3 c& j+ D. V
C.ID相同的记录按NAME倒序排列( t2 h2 W) i5 S4 Z
D.返回的记录先按NAME排序,再安ID排序9 X' l9 |# m& b
E.结果集中包含对NAME字段的描述
8 I2 f" x- ^- {* ?! ~& e% {/ W) _. X  Y

, b9 I% d- e& R+ h  u" H5 |12.以下哪个不是SQL函数?
& v3 x( T( a" z8 g! q
" I. G# d. P5 X. b+ L% d3 M. YA.AVG' H8 Z3 i1 Z% p  X7 j8 N. @, X! r
B.SUM- Z& ^* w7 y# u+ U1 U  w" u
C.MIN8 H! e5 x5 [8 C7 K' r) Q
D.MAX
( l9 z3 M. t$ ?# ^% tE.CURRENT_DATE()
! G" w, R" j( r  Z0 r$ M  \
# }" M2 V2 q$ e( N3 n7 I- R" r  x  v! A, `+ `, Y  b
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?& R/ F4 V0 j3 s: Z

. D, L9 t+ _$ j  {A.该字段必须有索引
6 C8 a/ [% [3 N8 m- nB.该字段必须包括在GROUP BY条件中$ v% `4 [  p0 @
C.该字段必须包含一个累积值
8 |& h& n+ o4 J2 GD.该字段必须是主键
5 Z5 [" I5 k; ~+ f- n3 JE.该字段必须不能包含NULL值
  W* P/ H! {( V6 }6 m& a7 J2 c% H' |) o) v% W' S, N9 ]

7 F& R: _" b9 \/ ?/ p; e14.以下查询输出什么?
3 u# c3 Y, r; w. z4 `. }8 {( A! z  D7 s7 a. E& g$ l; j: T
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2. P" o& Q- p. M9 k( y
ON TABLE1.ID <> TABLE2.ID- P  \8 M$ ]/ z# p) y  r
5 N: c4 l) U% Y( C
A.TABLE1和TABLE2不相同的记录7 l( q' X4 ?. g8 p
B.两个表中相同的记录( ?7 `+ Y# c5 g( [
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
  ], N& H' V5 k! Q7 {/ a/ R. E5 k+ k# yD.两表中不同记录的条数2 i% W5 m8 B2 ~1 R0 W+ [
E.数字2
+ O: e& {/ i$ Y2 _6 u% m9 J; V' }

. t- c5 g8 ]  w( l4 W+ Y15.______能保证一组SQL语句不受干扰的运行?6 M: w6 U. M% _# L) P. ~
' |4 ~  I; D- H
答案:____________) `4 M9 A; k: w) t& {
- h2 l: M8 v0 T6 C% ?
9 d9 G4 c  f2 m0 i
( _% u! h* B3 T, V0 b8 [# p: K
答案速查; k( y" Z; F" q0 u. l; ?/ T
1:BC
/ u& s) T/ b  l" C2 Q2:WHERE5 j0 w7 g5 W3 @2 B' |
3:B5 Z2 b1 G: r9 l; _, o
4:E
4 v5 w9 \' W. K3 [3 A1 @5:BD# H( E# P& N2 `/ M
6:INSERT
+ l8 q& R5 o$ l) |7:C
) L$ I" i+ f0 z9 y4 m2 m8 [8:A2 S8 i7 f- N2 y4 q3 C
9:C
8 s# h8 f/ j* e5 c10:E
: o* i5 j" N% s3 c& V11:C
/ O* V+ f+ \0 r, E$ K12:E
. H" B; @( H6 W' K  `13:BC
; F' f. x4 T3 [( R' z14:C! E) u3 i3 A$ r6 T2 U) {: a
15:事务  }' }5 O; v# u, A  n
# Z; z+ X: Z- q; g' `* O# W
3 `4 s1 m6 J" R! \( j) c  C
5 Q4 Y4 A6 L+ `8 Q2 g
答案详解
2 c- L. F* l& J; O
; ]+ y; C) T$ t+ G1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
5 Q' ?6 z3 d$ T* o. L  D
/ D( H  s$ M. t8 K) `6 o2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
# y* N5 \& c# f" m% `6 q$ m/ m
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。) f; U- |& u4 X1 O

8 C2 c3 L9 t! B- }4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。5 x: O' F& E) G) l

$ M% K5 f, R- q5 m/ R. n9 O6 W# P5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
4 Z4 L$ W" D- @1 Q
* p1 Y# f' B/ o- X3 f: q8 f8 \6.答案显然是INSERT。
  F( @0 Q; T- B) A+ X
9 z4 r! c- Y, u5 N0 c7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。& r3 M  Y! Y8 }1 f

' C$ S7 M; o. ?" i8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。* a$ Q: t: l8 A4 o- f0 `

8 T& w) C4 Q& Z; b+ o0 z9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
+ G. R' U3 U) c+ ^
* I" D: |2 E) p8 G0 j# R" D% B10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。9 \( c5 H& Q  ]1 l% w. K

3 n1 m0 m/ r$ {- m11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
8 {/ u1 H& z0 x* Z+ B4 B, ], Y$ p7 d& e# E3 b# d6 D
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
- O: p7 b! ~% U3 H/ c8 _* f1 q. \% o! b! `$ R- e! ~4 w
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
- S. a: {3 Z% x* Q3 Z3 {( c4 d5 K8 v* k; M, a/ i$ D9 k
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。1 G& y5 H& ?+ W  P
4 z3 {1 F9 \- G! D% s/ O
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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