获得本站免费赞助空间请点这里
返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。" K. ]7 V: G' Q1 A4 V4 A0 _
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。% p% o" J  g( I0 }( Q2 ^- V
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。! S) a' z3 t! b. o4 ~

1 l8 V; _' n: p1 V( r1 |! T9 p3 K/ k' u0 O+ [, T
问题+ F) z6 k( N6 k4 m
; K  `6 N4 ~5 t
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
$ o. s, _, |% \; b+ D1 k" G4 U1 p8 ~" L1 f! y' [. Q) k5 t# `5 [. h
SELECT * FROM MY_TABLE
$ b- [$ D; S3 D- y+ d4 Y
9 L; w& j- j* h; s3 B0 I5 cA.如果可能,用把查询转换成存储例程
% k  _6 O5 q# H5 x( c1 @B.如果程序允许,给查询指定返回记录的范围
; l- V; \1 Y# z: m% E  VC.如果可能,添加where条件: `" ^; w3 L1 n
D.如果DBMS允许,把查询转换成视图7 `/ @+ x2 o& q1 x/ \4 v' i+ q
E.如果DBMS允许,使用事先准备好的语句7 E4 `. T* U8 A( {

: u  U+ ~. w! B9 q2 v' p/ W0 a1 j7 f3 n
2.可以用添加______条件的方式对查询返回的数据集进行过滤?( s! F, b3 S! k7 \' v0 U3 w

" n0 `" ~* [. l" m) ]! M答案:____________
/ _. E/ W' O$ w! t! f7 ]) I' P/ _' }* c* T5 Q  L

) M" J+ @- M2 j  M3.内关联(inner join)是用来做什么的?, p" o" z& h7 e

4 c' t: X3 Y; A7 {A.把两个表通过相同字段关联入一张持久的表中0 d- h4 \$ y& r. E
B.创建基于两个表中相同相同行的结果集
' a8 |4 [5 T3 w6 aC.创建基于一个表中的记录的数据集
6 R. B; q' T7 g" F  K- qD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
, B; }3 ]5 W$ a+ p2 D( BE.以上都不对
, q; i+ j% `+ @& d" \- [, H5 K; Q/ H3 W4 J1 b7 [
& u" p" z. f0 ^, `& a! a
4.以下哪个DBMS没有PHP扩展库?8 j6 l' T; K# t: ]4 O

$ \1 M- m4 w. P$ b) o4 eA.MySQL1 M2 b$ b  A) c5 R$ {; J0 J9 u# N
B.IBM DB/2
( t, M. _0 g; [- oC.PostgreSQL
/ X! ~) |- m/ E) j* RD.Microsoft SQL Server6 D- v  {+ ]( b3 ^- R) V. H
E.以上都不对+ l- V$ g( f4 j

' p: M7 v8 v, N8 P& u$ _  ^7 }" k
. g* @3 m  q6 L0 x* Q: T4 N5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)9 O/ a" C6 ]% ~2 C, `1 M/ b

) P3 S- ^5 {4 `0 v6 D& D& U; x<?php
, a- `5 H# Q/ e" T$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
! v( \, Y8 X) _1 v?>
) V4 O1 A* e' Y  F5 g$ v: P
+ r4 }" p, Z1 b/ @9 p( RA.MYTABLE表中的记录超过1条
/ P% E, o" c" O; g. z) SB.用户输入的数据需要经过适当的转义和过滤* D! }' g4 N7 y
C.调用该函数将产生一个包含了其他记录条数的记录1 U, K$ @/ n1 t
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除5 q- V5 z5 g4 J2 h0 Y. j2 H* q4 _
E.查询语句中应该包含数据库名
7 K9 ~# t5 T" O. H( A( B7 v/ s- @' ]. K( ?
" |& J1 X- @  C! j
6.______语句能用来向已存在的表中添加新的记录。
! O2 J) d) T; {; l( U8 C% S
, i5 d' P' N/ M$ G( z5 K! z6 J答案:____________
2 n( S( M3 p3 E1 {+ Y* _* h$ ~8 B0 A
% _% d1 f  f! F2 D* h1 R+ D: h& q
- v. s7 T+ [' a7.以下哪个说法正确?& Y$ ?8 B( P9 w

% h* u  _2 [  o% cA.使用索引能加快插入数据的速度* i* w  j! Z& |9 d; a
B.良好的索引策略有助于防止跨站攻击
2 C/ u7 c* \8 Y3 BC.应当根据数据库的实际应用按理设计索引
& g' J3 z8 g( I7 XD.删除一条记录将导致整个表的索引被破坏
, e" d7 U# d2 YE.只有数字记录行需要索引+ o. T& n. n# ^6 W# k

7 ]$ w9 f' h  d# _. C, }- R8 }1 W* e' x  A& Y- @
8.join能否被嵌套?
5 ?1 ~) U$ l& t! o5 g  f5 P, e' `5 f! T* Z2 p
A.能
; Z+ A1 n4 ~+ L, IB.不能* E7 e2 v& ^- R( s4 t8 _  D
& S. N' t: d" W* R* j! y
+ R* S1 i& k2 ~& T2 \+ X
9.考虑如下数据表和查询。如何添加索引能提高查询速度?9 l- W7 L$ U& G

$ \% j$ T3 d, s7 c4 c! YCREATE TABLE MYTABLE (
, `$ ]4 i( Q" Y) e2 wID INT,$ k' q" M5 e0 r) m: o' A' w) i) }! r
NAME VARCHAR (100),2 L* S8 Z) l$ ^
ADDRESS1 VARCHAR (100),% I3 w: t9 s- O3 E
ADDRESS2 VARCHAR (100),
* w8 Y1 f, C. l( e2 rZIPCODE VARCHAR (10),- l/ {6 a8 x  k0 n: [
CITY VARCHAR (50),
1 G' N! J/ B. o. @; P4 q7 dPROVINCE VARCHAR (2)
1 g) [4 i$ R( q. f2 })! N( _' Q* a; H
SELECT ID, VARCHAR
( z& a* i2 P! J- ]$ w0 v+ F! wFROM MYTABLE
  {. B9 f+ `+ d' }$ R7 ]7 |WHERE ID BETWEEN 0 AND 1007 \; Z* A( j+ f0 R
ORDER BY NAME, ZIPCODE
7 y: E5 ?. S. {  {) Z7 |8 `. S$ Q3 v6 V2 j* N8 ?, `* E7 R3 Y
A.给ID添加索引
8 R1 k4 ?5 F* q9 ?8 ?8 ]" \9 v2 hB.给NAME和ADDRESS1添加索引! j* f: ^0 m; V8 N0 }; l; {" y- S
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
- P5 ~8 a/ ?1 n% F3 iD.给ZIPCODE和NAME添加索引
9 p3 ]  Y3 B0 EE.给ZIPCODE添加全文检索
0 O/ V2 K4 j7 i0 L1 E) D, N" d% r& y0 C# [. h: R
: a. i' O; U1 }3 |/ D8 u7 V8 O! q- [
10.执行以下SQL语句后将发生什么?
* c7 {- \1 _+ f' X2 C- o( o1 m; D# q. F* `4 X* d
BEGIN TRANSACTION3 ^- O5 q1 r, o" ~, U
DELETE FROM MYTABLE WHERE ID=1
$ V9 K: j) K$ gDELETE FROM OTHERTABLE4 o2 i4 V1 J# B4 L) _% _( b
ROLLBACK TRANSACTION4 \5 _/ L) i4 `

3 V5 L. `8 ]9 u7 s- d6 p% t% mA.OTHERTABLE中的内容将被删除
+ h( h- N* b5 e/ wB.OTHERTABLE和MYTABLE中的内容都会被删除' R8 J. m* j) E
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除8 @$ B) c& J, |) g! y8 M% V" T( Q
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化% g( }! G7 ?. D$ V; Z
E.数据库没用变化
$ a" ~( Q7 J; l: V9 |6 P: d  Y# q$ D3 m0 Y! @# V4 j
6 L( P4 D4 a# a& Y3 e. I3 J% }
11.DESC在这个查询中起什么作用?  \! W; e3 f1 ^  d* }: o1 ]* ^: w
/ O* W5 @1 N6 B+ M
SELECT *
3 u) N/ X, j% t) yFROM MY_TABLE" P0 ^* g0 c& _7 K8 r" P
WHERE ID > 0. G5 p9 X; J" _3 m0 M! l1 R
ORDER BY ID, NAME DESC: W- ^& L0 O% p" d. C

9 J: G! F9 G# A" w# H7 Q) WA.返回的数据集倒序排列4 A  W0 e7 s5 w; A; n7 }2 e
B.ID相同的记录按NAME升序排列) f% H' X) V) i0 b2 D: y, }6 @0 H
C.ID相同的记录按NAME倒序排列. r0 A! \5 z8 j2 I0 V2 d( ^
D.返回的记录先按NAME排序,再安ID排序! q, |+ n! a( j" a" }
E.结果集中包含对NAME字段的描述( b8 o4 N, B/ P, |' l
6 h& n- w9 I" X1 q# ~3 Z
" B$ y0 M# S  j7 I
12.以下哪个不是SQL函数?2 \% Z1 N) Z1 H! b; J0 {2 c4 S. {

9 m! F! r- ]9 k1 \/ T7 nA.AVG; L+ B8 x! S! e% u2 I
B.SUM  t: M8 \  c4 B; q% k% K5 d
C.MIN
4 n( z2 V( \5 ?/ U% zD.MAX
0 g! O1 l5 k8 G8 h8 rE.CURRENT_DATE()1 C: d8 R! a) C. x
0 {  z9 k  t5 v4 u

7 j4 O! T0 E7 _5 u9 \! E& C13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?* d& |$ l& e4 s+ p

" c+ X: Q8 f4 Q1 C- lA.该字段必须有索引
2 y' k. g+ `# M5 C7 b- JB.该字段必须包括在GROUP BY条件中
( Z( y" w1 p+ L# n# P' j, PC.该字段必须包含一个累积值3 V0 I' b& k; a+ r0 W: ^( z
D.该字段必须是主键# l  L( [0 a7 J' Y
E.该字段必须不能包含NULL值
9 P* U1 L! `  l) ~7 u
4 [2 A( h, ^+ O! ~& M: u4 V
  H# g9 V! ^1 y  \/ R+ T: e14.以下查询输出什么?/ v8 T/ ]5 \$ _* H8 s/ [
' q- w3 L- _$ i
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
9 R, _+ f! _! F3 |: I+ }ON TABLE1.ID <> TABLE2.ID) E2 v6 T- r- E  Y' T# T
1 B- O# K& T% z) s4 ?2 D! B
A.TABLE1和TABLE2不相同的记录5 m- g) L5 T2 z* a
B.两个表中相同的记录
$ B; \5 W7 R6 E" W" NC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
# T: F, T$ {* x/ ~% ZD.两表中不同记录的条数6 H9 ]5 l( u$ F) L4 |2 `  R  X+ N- V( h
E.数字2! L. ?9 u5 R+ x- R* s. Q
+ i8 y( c! z5 z3 j# t
9 g  V3 M1 A( K/ q; @& X; s2 k5 ?
15.______能保证一组SQL语句不受干扰的运行?
! v6 M* N2 N5 x: C" j4 E3 @. B
0 J& N- I- O; m" j% Q8 e答案:____________2 W& G) S9 U9 L9 A

& s  K' i8 o5 K/ s. ]4 V' N, C, q4 T7 U4 @  l" K
% W' t' _; \6 ^# T# }/ q4 ~5 Y
答案速查
/ }0 h/ m/ `6 _$ D% j1:BC5 f4 {  F8 l( c# j; [4 d
2:WHERE
, P  ?  C, r% G3:B
1 c/ l$ C+ A" ?! H4:E# R/ G. `6 v5 s  a
5:BD
& _! c. v* ?- y; t" K! G! @0 n( p6:INSERT7 X8 [" u  e& R' j5 u% Q
7:C4 U, R$ b! K! \. E& o; L4 g
8:A
. J- P0 _4 z# t0 b8 ]/ y5 Y' P( Q9:C8 I" v% v9 M3 r* F
10:E
" t. P9 ]! s! D0 T/ @: h1 E' h* G11:C
1 L% Z( a$ }! F( G! m* m12:E
/ p, z' [+ e8 R! H4 F13:BC
* y2 J0 m: @" @! _8 h14:C
8 P  b, z6 b" ^& b+ n5 J15:事务  d/ W$ d' C* K. n5 |7 W

% M/ f7 E2 S" X$ y" V; u: W5 @9 n) \1 Z* v

: s  ]8 B5 x* c% T1 Z$ ?  v答案详解
8 M2 r8 U0 I6 }: R( l9 O# I4 U* u# B' n( m3 e
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。1 o! a7 f# D/ N4 ~2 K, }

0 K  S- ]! N" b- p% I- a2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。: U" n& X$ _5 \( f) r

% b3 A2 |& ]9 ^0 K* {" a! x  c1 z0 u; t( Y3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
+ P) ~" S9 O- }( s
& v) F8 D2 k. o# m" Y0 N6 H4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。8 T8 H; ]6 \  F+ A. a# b. ^
. {/ F: _" P. ]7 U
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。/ i4 \, V5 W/ y% x/ ?* q% W

! C1 D0 V+ z+ T0 P+ K3 q6.答案显然是INSERT。
( o) c8 D, C8 E: \8 {' c
/ D! r* G. Z- F. }$ }2 f6 r7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 C7 `8 }- v! \4 c7 r9 {7 I- t
, e  M9 Y; t8 `' E& M8 X" F
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
' n$ B% g" B& n6 i- t, t0 r, q: m
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
" a& H# x* f$ V9 U, e, @) M1 H( i2 ?; A, N2 @; k8 h1 v
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
  L5 ?$ s$ ^  s$ ]; {% d
6 d1 V+ E$ P5 z5 `3 V) a5 X11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。* p( e% r& e- m7 p

: h1 G# V$ u( N$ M' u12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
5 \' y# A5 [( l0 |+ V+ I; y2 I8 i6 D  b
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
( m) M) H! D2 s+ q
7 D, Z! D. R6 ?/ d( U14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
! z$ j( m2 X8 Q& F5 T8 l1 E' Q; u1 z9 r% s7 w* x
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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