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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
  a( A9 [5 h- z, C6 p* N7 F; F7 NPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。8 W; W0 d" Z7 O% Y% i! J
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。) w6 t# e5 f/ E" v' \1 p
& X2 [- O6 J* C  C$ _6 f  X% @" z  P
/ u  f! X6 o7 p4 l
问题
  _5 j1 i% S5 y4 i" w; b, N/ h' k* M* n( P+ R& O
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
4 A, v9 g7 t1 A$ K: m
6 e" [: r/ \/ b( o% JSELECT * FROM MY_TABLE
* T- w! Q2 W% u7 {/ f
0 [* g; A3 h3 cA.如果可能,用把查询转换成存储例程
3 U& V1 ^# R$ r' Q4 s+ uB.如果程序允许,给查询指定返回记录的范围$ w" ^+ Y0 Z1 a2 [
C.如果可能,添加where条件
2 k! j6 y2 l. f0 nD.如果DBMS允许,把查询转换成视图
" o+ \8 [! l5 ?4 W, ~! }E.如果DBMS允许,使用事先准备好的语句
) ?3 f# V5 Q% _/ p7 w3 p
; D' M( R% C6 E& g+ U) g* f
2 }, Z$ F& |: ~1 M7 Q9 h4 d2.可以用添加______条件的方式对查询返回的数据集进行过滤?5 u% B. l) z8 C$ Q+ ?

3 i( A: Y- n% G* t; p  f答案:____________9 F$ y! D, x/ b2 i: E( L

6 L# C! N5 P4 l3 j- a& L% {8 T
/ L6 T& L" o3 U) W+ C* A3.内关联(inner join)是用来做什么的?
# s/ f3 X$ @) k' ^& f6 D- n; u7 b- e& w( i3 ?
A.把两个表通过相同字段关联入一张持久的表中
) z/ A  l8 Y- n8 S/ C% @% C7 e! }B.创建基于两个表中相同相同行的结果集
) d+ K& \: _7 d0 V3 T9 m% M* KC.创建基于一个表中的记录的数据集5 A  a3 ^1 r5 a. ]6 T" _
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集8 e% z. [7 |% |5 m' z
E.以上都不对
0 V: Y4 D6 @3 F3 y; }1 b4 g6 |
7 U1 P/ s' C: {, ]3 N5 g" B% i0 i, ^7 q/ r$ \
4.以下哪个DBMS没有PHP扩展库?  C1 ~* t# S5 r+ W* I& |+ z

4 R0 z" e% |4 O% j5 aA.MySQL2 l0 E' }- I& o3 X0 K5 ]$ H& A
B.IBM DB/2
6 R$ h& Z& b% M( Q! [3 \* FC.PostgreSQL* f" q+ ^$ V4 \4 s2 z
D.Microsoft SQL Server
8 e9 u" G( V8 Q) cE.以上都不对
; v6 R. ~5 I7 Z( Y# A! O, c4 O" t# d' P) o; t) W

$ ?5 D/ s3 u- K. x3 Q5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)+ W; C; @, V4 \. p- ]3 c0 a2 ^  c
7 |* v% X" ?5 p+ u' \8 A+ Q" r
<?php  b( {2 ?- G8 C. ~6 C$ w6 q
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
3 x$ j- C$ J. q1 P5 C( f) |) `' j6 u; W?>2 f) }/ t8 r0 q8 ]5 V7 l5 b

: P; x9 W6 g. M- EA.MYTABLE表中的记录超过1条+ T1 e, j% I! d  X
B.用户输入的数据需要经过适当的转义和过滤
$ I, F; D5 \( c, O3 rC.调用该函数将产生一个包含了其他记录条数的记录; D* ^0 ]9 Y- [$ ]
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
8 R8 k4 N  i; `7 a) y. nE.查询语句中应该包含数据库名3 R$ u; B/ C+ e0 h! t9 O
7 b5 I' |* r& Y% L* X
! I8 m1 u: z) n6 s+ H$ \: G: S
6.______语句能用来向已存在的表中添加新的记录。
" q: ]: D3 _; v$ c4 \# v6 |. h
9 a) c5 U4 |7 }答案:____________
) M* ^  K: X* K" ]1 i: `* L9 `$ B. T
3 |, `+ P7 c- M6 a- H. o# b& r: t5 O
7.以下哪个说法正确?
* d& R' p. {# Z4 V
, ~9 O. {1 ~  `  F) i# |* SA.使用索引能加快插入数据的速度- a1 h% z4 b0 ~; K8 a6 j
B.良好的索引策略有助于防止跨站攻击
2 R1 F+ R3 T  U7 G3 kC.应当根据数据库的实际应用按理设计索引% I" ~% K1 l& j) n- X7 U% M6 O
D.删除一条记录将导致整个表的索引被破坏
4 @0 I" F1 R5 x! N/ GE.只有数字记录行需要索引* C; p* h3 Y6 q1 i# V9 B, o7 }& x- G

6 b3 I" Z1 x. W$ F- k' H7 B% C1 r& s* c9 Y/ T0 g2 B0 r" J! H
8.join能否被嵌套?. d, v! q% v+ Y% n3 g  W7 d6 n

2 S' ]5 |6 ?% EA.能0 n2 _& |. c( x
B.不能
4 I5 P( m# m3 P% z$ H$ [4 |$ Q8 z9 u% v. B
" X" e" j( H6 V9 d2 t$ g+ z# O
9.考虑如下数据表和查询。如何添加索引能提高查询速度?, |8 X' y$ S- O5 i- \

8 k2 f# N3 G9 T% a+ B3 a4 D' _2 mCREATE TABLE MYTABLE (3 U* t, G9 S2 L7 x& j% p! Z/ m
ID INT,* {5 Q" v$ S, M# I& p5 ?
NAME VARCHAR (100),
1 F) u0 e# {2 F1 XADDRESS1 VARCHAR (100),# ~5 p. G& N8 n4 \  F  Z5 U5 t! }) Z: {
ADDRESS2 VARCHAR (100),4 J7 v$ v+ [* D
ZIPCODE VARCHAR (10),
% `4 a$ ~0 q" n3 a! f* v. r; \$ y1 ECITY VARCHAR (50),2 W/ x+ D1 E* U4 d) L% ]
PROVINCE VARCHAR (2)
; L7 X# c3 F% X& O)+ H4 R  `1 X6 ^
SELECT ID, VARCHAR
6 V$ L" [, ?4 x2 }FROM MYTABLE, f9 i9 F  r' j0 t! i' Q
WHERE ID BETWEEN 0 AND 1000 J4 [& B( y( x3 n; X
ORDER BY NAME, ZIPCODE2 x8 }, v7 z8 [! _
2 \  s- X2 j3 B
A.给ID添加索引
$ V6 u" L$ g, {B.给NAME和ADDRESS1添加索引
4 ^9 y1 W2 a! ^9 Q$ H( yC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
. l* X8 E; l  o) b  J# {2 LD.给ZIPCODE和NAME添加索引
2 x. }) g5 G4 S, s" X9 B& t; [0 SE.给ZIPCODE添加全文检索3 R5 H: Y7 g6 L9 X

0 j' ]. x! j3 D" ?" d" h+ {6 R9 {$ E/ u  A; i1 q8 O% |; v0 b: H! a
10.执行以下SQL语句后将发生什么?
& t+ b8 i0 Y9 B
1 c+ `' v( P- K& p2 l7 M3 C1 L, w: W% SBEGIN TRANSACTION6 E3 O% L, Q0 @
DELETE FROM MYTABLE WHERE ID=16 q/ J9 d" Q4 a* }: \; |
DELETE FROM OTHERTABLE/ U9 d; E/ l8 r. G% O* O3 l
ROLLBACK TRANSACTION6 K0 T: _& i- J  V0 P
9 M; r6 I& D/ i- n, Y) G- I
A.OTHERTABLE中的内容将被删除1 C% e  G3 u  \4 i3 [' R& s
B.OTHERTABLE和MYTABLE中的内容都会被删除
+ Y5 x( q; S9 g) C- y7 K8 ?( f: ]C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除+ B( H) x$ ~2 U: |) y+ Y/ y" ]
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
1 ?, |) A* M; {+ u+ M. J* e& {E.数据库没用变化
$ X* r4 z" A( w$ u6 \3 c( a9 s5 q2 W( `/ v; r) B

" L& N3 ?1 `6 ^& |& F11.DESC在这个查询中起什么作用?
1 C  Z# E7 `, w: ~
+ k! z+ O: w$ P- rSELECT *
0 K4 w( _& @6 m5 B0 r+ Q, mFROM MY_TABLE) w2 `. \% G" C$ @0 T
WHERE ID > 0
; e5 `7 D# K( D0 P% M. k7 XORDER BY ID, NAME DESC
5 u3 P, P: l/ _! @" f, [. }( J. o3 G
A.返回的数据集倒序排列+ l" a& O1 e3 q. E6 r- `" v
B.ID相同的记录按NAME升序排列
" t( U0 Z% y0 g4 z. |# r8 Y; RC.ID相同的记录按NAME倒序排列2 r  ~3 _% ]. t! D" N
D.返回的记录先按NAME排序,再安ID排序
3 Y2 l& c% ]# K% t5 I4 Y, c1 i. ME.结果集中包含对NAME字段的描述( R& `2 G; G5 i* }8 j- l

1 \1 y" Z3 a1 C5 V0 o4 w) t1 _: c: p( Z
12.以下哪个不是SQL函数?7 U0 l' |  [+ j2 A8 k+ m8 ^9 J
3 h. K. L" g, j* k: I+ d5 a
A.AVG
5 {1 ]. R6 F; w* h4 [B.SUM
7 @2 a1 H$ g3 O+ P, d4 S5 R7 E4 GC.MIN
( B$ V1 p# D2 }: B% f% |D.MAX5 ]& I  [2 Z3 Y
E.CURRENT_DATE()
+ r1 k% F* o% q' L1 z
9 m# K5 K4 u  U6 [
3 k0 A% p8 _' a; f: q13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?0 W9 U. o% k5 U6 g& Q8 w) B

1 w! N. C- X7 Y/ pA.该字段必须有索引" F4 h" d8 T- f4 m2 p3 f
B.该字段必须包括在GROUP BY条件中
* U, J! s1 T+ XC.该字段必须包含一个累积值* n) A0 O7 ]; Z$ Z$ X/ V$ y
D.该字段必须是主键
  ~4 G4 c6 ^: ~5 u* I, Y4 v; WE.该字段必须不能包含NULL值
) C2 X" N# n( [
) G) E# [1 T. [1 H7 |+ s% z7 \5 }! _9 C4 {/ S! Y# {( ^3 Q$ t) {
14.以下查询输出什么?
' k& u6 x. M! _& L, ?7 ]( k, r3 I; k, ~( r0 c5 ?
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2# C2 W9 X+ m, b- q7 E2 k
ON TABLE1.ID <> TABLE2.ID: B3 D/ j) l4 `  p3 R  x

7 |& n7 }. T* c/ LA.TABLE1和TABLE2不相同的记录' \( a( c1 ~5 R: ]8 M' O
B.两个表中相同的记录
) d& P% p3 Q9 Y2 j" K2 W1 L* _C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
7 _/ ^5 Y# U4 y9 @D.两表中不同记录的条数, a1 A5 F. L8 I0 v0 ]
E.数字2$ C. P# k0 [7 G6 V
- H+ R3 ]! {2 T5 Q

; A& B9 w0 w* t' q( W8 C. D15.______能保证一组SQL语句不受干扰的运行?
: I! U; G' V. A. f- f' Z/ m4 H8 K) q& x: J2 `6 r
答案:____________
/ C+ @9 T6 f7 H$ Q' P5 I
& a; S) |0 Y* Y7 H9 l3 I0 H& J2 ?  \. q. a, n

8 y# W9 A0 v5 |9 I2 A; i- q, r! p' m答案速查& T  ]& k  }( g# c- z1 L) i* R
1:BC
: b4 y( o. ~. R6 \' A% {2:WHERE
, J3 l0 p1 V! x4 p3 I' K: r3:B( F7 b" I& j+ s; w* k" V5 H9 c% o
4:E
- }7 c' M- W9 ^5:BD5 y7 E5 k$ B, e% T$ \
6:INSERT6 q6 w* C: _  |- ^- |6 f
7:C
' y+ U8 o0 C8 J% G. h8:A" n3 {# S" b3 B( {; n& I  }
9:C$ i- k6 t" s- y
10:E* z9 i* l0 `1 Y3 ~
11:C
9 r' \9 U7 \1 l3 j2 N2 F12:E
% J+ Z3 P  p+ y1 b13:BC; ~# K9 e8 u' k8 ]' M0 |8 X! M
14:C
2 {9 f5 f* `7 c, l. S15:事务' n0 V4 ~7 |" p# {$ `3 V( k$ \
; I( \- f, J# J

, ~; J) N( Y  n! e8 z
  E6 B9 A& D% {$ K- t) }! l; D答案详解
* A, p1 _4 Q: l( `7 q( K: d/ w" Y' J% t+ q* ?4 P
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。9 e5 A9 X! |. I- @( V$ X4 Q
4 v9 V, t# b  M6 g8 |& a
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
1 J) c; j* ?8 A& |" i- A) c; G  E# ^6 [: v6 O+ v' ~
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。1 l$ x0 u5 K4 j% V+ j9 [

) F8 J$ H  ]6 O% k7 }) \4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。& B+ e% G/ L) r3 c3 Q6 C: X
. _% ?3 a& g6 R. O" M
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。2 r/ }( y- D* S6 f! _- x( v

% {6 [+ z6 s3 h6 d6.答案显然是INSERT。5 [# q( ~+ M  J$ ~% j- v

0 U( |' [4 Y: v+ @/ a7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
. p& u4 b, t/ g# r( V/ j
6 |7 F% w* \5 a! A1 l- j! n& Z8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。1 n; B3 }% ?1 q
$ n% ]% i0 t7 T
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
" n: b* l- W, L7 Y
2 h0 m) b1 _- q. L$ ], ]' ]2 o10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
: z/ a; W# U" M4 e! `6 f9 z
$ r& ]; W7 `" G3 Z: c5 a6 e; E0 a4 ~11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。& A0 M" r' L7 e' v8 L5 R6 ?
! Q( v9 m9 B6 Y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
/ g1 z+ O$ p& e8 v) b/ ^$ @2 _1 x" Y- x* i& r
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# {' f9 d6 N, K2 S: Z6 r+ O0 q: w( I( U4 ]- h2 j
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。+ \' `0 m2 U3 ]; S) A4 I& e$ q4 c
1 Q; ?6 |5 |! D: G* x/ K: a$ d
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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