返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。( ]# j4 w( \+ c- D2 |  M: _
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。  z! M  r6 c- G) @- F; ]
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
4 a  K& ]: j! z
1 i* w; c# P- k$ y7 r* j9 n5 U$ d0 Y7 |, n6 E+ y5 U) ~4 Q+ {1 l
问题
$ ^- j0 [) D2 S$ l* R
$ Y7 }6 Q  u1 S9 Y0 c+ {1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
1 O# M9 [5 u$ P- y- T
5 [3 e: y7 s2 ZSELECT * FROM MY_TABLE
, r4 c" n1 x/ E/ U! ?% i9 B( W% J' h. i; O! x! Y. |" Y
A.如果可能,用把查询转换成存储例程
9 u7 F" q+ ]) G$ G! E8 d/ z# NB.如果程序允许,给查询指定返回记录的范围& x9 g3 P4 k6 Q2 E- U* e8 A7 `6 H
C.如果可能,添加where条件
- d, \2 {) H6 ]8 A4 i3 h1 n  Z% iD.如果DBMS允许,把查询转换成视图4 T- u- E4 z6 E' H6 I$ i* r
E.如果DBMS允许,使用事先准备好的语句2 V& W. H. k& y: {/ O) B
4 g: W  `- }$ w% ?
- f* G9 J- O0 y7 b) Z8 p
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
5 H7 C( g& Y% E+ U# I" H$ D. h$ M8 N% z
答案:____________) e# b; s- k. S% L$ B

5 A& b9 u; c' b6 ?9 Q& f, e; \" L( }6 n! c3 m. P- v" p+ X
3.内关联(inner join)是用来做什么的?8 P7 `; i+ k) s

2 }% C! r5 i# FA.把两个表通过相同字段关联入一张持久的表中8 ]2 r7 Z+ C- g. j& Q# B( G
B.创建基于两个表中相同相同行的结果集
# _$ X! j6 Q, OC.创建基于一个表中的记录的数据集
% [2 g" X$ L4 RD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 J/ K2 N* i3 N: d. }% eE.以上都不对
2 S3 ]+ q" r& N2 Q( L3 F2 P3 ]# \
! p* k+ ?0 e5 r9 e- I* L  _1 [# ~+ d" F5 I, A
4.以下哪个DBMS没有PHP扩展库?
2 K3 R4 U6 M1 S7 K! Z$ h, U
; h, ?& @( C7 u; jA.MySQL! A* `& S0 d4 ]; O' B- ^3 H' i" f
B.IBM DB/2
% v2 k3 j4 T/ r9 }4 |2 c% b0 J+ KC.PostgreSQL
9 R' B# Q4 X' g2 ^. y% ^0 `( dD.Microsoft SQL Server  S, q+ y& [6 C
E.以上都不对
$ p/ k. h5 a$ T: Z- f3 s
9 n4 b+ [/ X8 Q' ^
% k! o' V0 I' s! b/ {' I: t8 O5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
. x- J9 ]0 b, G3 x  h# ~  ~
2 O* o# P* f5 p8 v( \<?php
* u) U! a9 d3 }$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
7 N7 z8 v6 F" o: U?>
% f; e- B0 [0 `. l% ?7 p
! b4 L4 L. o; {- fA.MYTABLE表中的记录超过1条4 j) Q5 }; K, G: E+ V
B.用户输入的数据需要经过适当的转义和过滤9 Q1 g2 h" A0 l: z
C.调用该函数将产生一个包含了其他记录条数的记录6 V1 L1 x# D  k3 H/ h
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
) D, B. G$ c/ k$ G1 ?  D% BE.查询语句中应该包含数据库名9 N$ S8 i; F7 P" P
) X5 ]- m3 c  u6 p% d7 f  t" G

5 Q! U" P* u/ k" i5 i. a& A; j6.______语句能用来向已存在的表中添加新的记录。, r) @- t' Y4 M5 B2 v/ {$ H' R8 e8 J* K

$ d1 z4 Z- l' ]7 C+ ^答案:____________- O4 Z  V, p& k, Q# @4 o4 ?# X* M
% E" _) z7 t$ [
' {. i* j+ g, T. _9 X
7.以下哪个说法正确?
- \1 L$ ~8 E2 {. `- @3 [4 K% |
* z" M% t( Q3 ?! y: GA.使用索引能加快插入数据的速度$ ^/ ]% |4 ], \0 g0 [7 t
B.良好的索引策略有助于防止跨站攻击* b' k- E" T  G  i
C.应当根据数据库的实际应用按理设计索引
2 S1 ]% }( {  _* t1 c5 u8 @7 _D.删除一条记录将导致整个表的索引被破坏& o. v: @/ T' z" P5 w4 d
E.只有数字记录行需要索引6 O: K( Y: V4 U7 |: f2 l' y

8 ]' {( ^. u9 h5 R- n5 f. j" I
. W  d6 @# Q2 V0 ?- d! [8.join能否被嵌套?. k( G5 H' G  h

3 t( S9 ~7 ^+ w. P! E- TA.能
3 Y  i& j2 x9 Q+ }B.不能1 _5 h2 B2 y2 v% |4 j4 N

3 u9 X6 ~9 @! z% j8 V8 s/ O8 d# w: q0 T0 A% J5 y; l8 Z% a' w
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
& D/ b& g; C/ R1 U, C; b$ n
: T$ w6 I1 L# ]' F& O4 ^6 }CREATE TABLE MYTABLE (
; p4 Q+ s! a; A5 C( N3 iID INT,
  |5 _: n5 g/ B6 oNAME VARCHAR (100),
, s& m% W5 O1 F; B# X& j0 ZADDRESS1 VARCHAR (100),
% V% v. C) v( @$ Y( }7 EADDRESS2 VARCHAR (100),6 `2 J  ~3 O( g- c  n% Q+ J
ZIPCODE VARCHAR (10),+ @! c& j% |8 I- b. s
CITY VARCHAR (50),
5 L7 k7 d( D% y7 PPROVINCE VARCHAR (2)
) e& i/ @0 O. g8 I/ o9 ^5 ?% J) G)
2 E+ q  l" D- ]6 y/ aSELECT ID, VARCHAR6 z. F2 t/ _; y
FROM MYTABLE
/ }( C* [+ x" t% s) [WHERE ID BETWEEN 0 AND 1001 ~/ ~/ H# m1 Y2 N
ORDER BY NAME, ZIPCODE
) p" k1 E- O9 v! o. F: x2 \: X3 E+ z# p8 y
A.给ID添加索引
+ I! t1 J9 Z  S- q7 ^  n5 v$ Z5 |B.给NAME和ADDRESS1添加索引
" r" }( }' f5 u0 L7 mC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
9 F; M9 o* h9 W" J7 |D.给ZIPCODE和NAME添加索引
3 [" l; H. X' ~$ i8 eE.给ZIPCODE添加全文检索. V1 N6 n1 v# k

# ]  J; C# u" M4 ]( v; q/ ?  L5 F& B  P6 x' k
10.执行以下SQL语句后将发生什么?
1 D2 U7 u' X" @  K4 J0 O  x  Q8 S* u/ c! L4 c
BEGIN TRANSACTION
8 F8 R) |7 b' B, \4 ~. lDELETE FROM MYTABLE WHERE ID=1; u6 u4 v. _% _  x9 L( X
DELETE FROM OTHERTABLE5 d3 `( r1 l: Y) ]' Z/ J
ROLLBACK TRANSACTION
- F* p# x8 T7 R
8 C) h, d' O. z3 O0 z# H! \% HA.OTHERTABLE中的内容将被删除
7 C0 Q$ w0 t! B& R) y( Z9 _+ U: CB.OTHERTABLE和MYTABLE中的内容都会被删除0 O/ ?2 M1 u8 {3 {+ c
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除. R; B. x: v! c# \$ I
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
, N, Y! c$ J* `- ~# V& g( o$ DE.数据库没用变化
- ]( w2 h6 j5 x! ~$ n! V; X6 p
6 w' [3 ~6 e/ G! o7 K, t: o5 T4 g5 h7 e8 e% {1 s. s" Z
11.DESC在这个查询中起什么作用?: e( c4 i+ h$ Q! Z+ I3 i8 j

9 \! u# V1 {% }. bSELECT *
, M( X) d1 q+ t# S( yFROM MY_TABLE, z" u1 O0 M, S/ B
WHERE ID > 0
0 X5 H0 g; a4 B: m: AORDER BY ID, NAME DESC
, s  Y+ d  o0 U% I; b; x& t
2 l& O; `8 D/ a4 i0 y! ?A.返回的数据集倒序排列$ l/ K# a% z' U* r. O" d
B.ID相同的记录按NAME升序排列9 M: p1 M& B. @* k: ~
C.ID相同的记录按NAME倒序排列# c- c# d+ ~7 F
D.返回的记录先按NAME排序,再安ID排序( z+ ]8 ]. x6 m, I$ W
E.结果集中包含对NAME字段的描述2 _) D" Y" |% U% B+ L( a5 f, c- P/ v

/ u* V4 r/ P( M6 a, o0 O' y0 v
5 \. `9 T, ~- M* o) f12.以下哪个不是SQL函数?# g, k; d" g, |1 i  k$ O, y

) c& D: K4 q2 H( H; d2 t9 B4 y$ xA.AVG
2 i" |1 ^+ O/ W$ N4 y0 H. GB.SUM# {$ i, J3 L* ]* H6 y
C.MIN- W  S/ l: i) |& R
D.MAX. b% ^# @4 z4 f' I  {
E.CURRENT_DATE()  x/ i4 @0 D* g- t; y5 f- D

/ {0 x- H  B3 M! U! x  u1 _2 E# ~8 I" d( H* l' k( m, i
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?0 e7 h. p/ F. h  P# D" H# i
% f- t# y: @' d7 P1 b. H
A.该字段必须有索引
% s, s2 g" J$ U" H% |3 eB.该字段必须包括在GROUP BY条件中
% V  o0 t1 c# [4 vC.该字段必须包含一个累积值
& W$ }) o6 \/ d% A* N+ w3 a& v/ uD.该字段必须是主键
  S, T7 }4 t  ~2 f7 y) UE.该字段必须不能包含NULL值
! R% p4 U$ B3 y9 p, u! @! Q- J, U  q1 I! y) |% K

8 b6 ?* p6 t4 J% u4 ]14.以下查询输出什么?2 r* k' v& Q3 @7 o
( z9 y& N( T" n( O' y4 ^
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2$ {7 x( k: k) u- k, E! ~& @" h
ON TABLE1.ID <> TABLE2.ID+ z6 I  w# D0 \. R5 _$ l+ K8 @0 m

9 }. T1 q6 j( r/ TA.TABLE1和TABLE2不相同的记录) w0 T* Y( t% I, k0 q4 j5 G% Y
B.两个表中相同的记录
/ l+ h( r' `. M2 L6 W7 aC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
( j' K& x- `) E2 ]D.两表中不同记录的条数( g" j) ]" Q: ?% f
E.数字2
; ~+ S% @, K6 Z8 A+ [- n" U4 P: \3 @7 {
; K$ o$ k0 t9 p2 L0 d' |% X" o: C, q; l. k- i  _
15.______能保证一组SQL语句不受干扰的运行?
7 D8 D2 v- R+ O5 ?8 m  V# l
: {6 }6 ]6 Z" O% Q( ?答案:____________
  D" y! d+ |& v: q6 n% w& n) k# K# X1 _. i0 v) @

! e4 M0 [( y3 D* P/ Q
( U! ^; Z9 \3 s* u' M1 t. a答案速查
  T, ]5 N7 U/ A1:BC
& v! q5 v# W7 v  v2:WHERE
: W0 k! Q: |9 f- F. E6 G2 P3:B
) g* y% {. _7 H+ {% d8 m4:E
  [+ ^( B) Z: y6 o' U/ H5:BD
1 Z$ g7 P/ _8 U' u: h6:INSERT
% e7 |2 ?! G& {5 k5 ]1 G( I7:C
6 n1 j; |: |+ E( S: c8:A, u! Y' S2 x5 `; k* |
9:C
9 x. F, W5 j7 H4 m  ~# m$ B8 G' p1 d10:E. ], ^  z3 L/ }  Z& L
11:C
3 W) A7 M$ O7 t; E' p6 F: Y4 w- ]% c1 {12:E. q2 w# m) S  ^( C+ y, i1 [
13:BC
) w  L. D! c  I# @9 z" y: f- \5 l# k14:C2 c. A. ]# W! X/ ~* F2 \: i
15:事务
0 f% z( l; O* V2 `# f0 U4 B2 |: P9 d0 T2 g; r; {

( p& z( j  s4 Y& H: \7 Y2 X1 d. Q4 t. p" ]
答案详解
+ S/ n2 z: @* ^& a9 r1 m0 o" |# v5 _1 w4 u7 A  i  @. ^2 I5 Q0 S) D
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
9 B0 d% i1 j4 \6 k0 C2 q9 |+ y- C. i( w
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
$ D2 @$ b9 S5 O5 l+ A6 j2 \- \
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。7 k2 b0 x/ ^6 I  f' i6 w
/ e8 {! B: t4 A  W* \
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
. H1 D$ q6 B+ D* A7 I( a6 h  K. e  J( c
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
* A9 m' c9 w9 d2 N! X) i' W: k5 z! t8 E4 i: Q7 U2 p
6.答案显然是INSERT。
( ^) \4 z: M* o  S8 h& w8 m; \3 I' Q. l. h5 w% I. V' B8 t
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
: A) T7 l# L4 R/ s" B. ^3 z" |" z9 w& j3 p) @; P
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。5 `' H5 M7 B& p" H/ ~1 ]1 G3 U

1 T5 i7 L& n+ j# f% _" m9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
8 V* d/ }. _& _4 J3 K
  v* {( X' t8 b. ?6 L# T10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
5 W2 @4 L' m; F  h% P: q( F3 q
1 G9 ~( N5 k6 h- B) v11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。' Q. U6 W( Y$ r5 X9 `5 \

. h; h# b5 Q3 C. P12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
* S9 j7 g- {" S- ~" a. J0 |7 q
  W" E$ R5 h# U* K13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
; h3 R7 T5 ~4 ?# v# r% Z3 `1 z/ u, |% M3 b
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
9 P5 Z5 B& V/ t2 c8 B: D- S4 S9 f' [0 t" g9 O
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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