返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。# u  E0 \6 u) ~/ L; A
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。" o  v+ u5 h& u- e$ c
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
* f) n. G8 s2 l6 T" O) V
4 I+ g, x5 V) k+ R* Q0 }
7 o4 m" v& a; n) ~+ ^! I& k6 n问题" ^- [0 z) ]/ r8 l" e% }6 H
7 j8 t& i7 [$ E* P+ Q2 S' Z: P* R2 C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
! S3 Y5 Z8 h! B2 }9 N5 X  Z% Y5 m
1 A3 R% ?! |; [, W+ d% V( M6 l1 ESELECT * FROM MY_TABLE
5 T8 X. I3 N! L: [
; {" _8 g% A" m5 e9 xA.如果可能,用把查询转换成存储例程
# L  K' u; ^% o: X' zB.如果程序允许,给查询指定返回记录的范围& s3 J* B9 [' g+ a$ K1 k' x7 u% k
C.如果可能,添加where条件( A0 E/ u9 V5 B/ J' F1 e9 d8 Z8 d
D.如果DBMS允许,把查询转换成视图# D% B( Z# r' A: P: I; f- h
E.如果DBMS允许,使用事先准备好的语句: n6 x! C! r5 x1 e' w
9 g( _1 D& g, K( U! k

- i3 T, Y( y0 ~" K4 t* Z, [2.可以用添加______条件的方式对查询返回的数据集进行过滤?
, V" I" G. |5 J+ N2 F, a# ?3 |# [. M. v
答案:____________3 t- j, V; g7 P; `1 a4 l! [+ G0 S
7 B* n2 X5 t$ A. B
2 A' c6 T4 l+ {7 r( f+ O
3.内关联(inner join)是用来做什么的?
3 I: w( F) }/ _) Z
3 I; l) W; q5 E  T8 GA.把两个表通过相同字段关联入一张持久的表中
9 O. x5 q& V2 `# m8 b( J( I. EB.创建基于两个表中相同相同行的结果集
& X5 S. ^9 l/ x$ a, R, ?7 kC.创建基于一个表中的记录的数据集0 F3 ?3 X* X' p0 q# B
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
9 r) x: t$ @. ~+ v  b$ [E.以上都不对
% E4 B) R! Y- x: a; P
$ a1 S4 n, H+ _0 ^' p
$ r7 T9 D& l/ E. ?4 Y% ^% Z4.以下哪个DBMS没有PHP扩展库?
# w' G' G1 t3 ^8 e# E8 ~- i! i) q2 @& _7 v3 {
A.MySQL
7 i4 Z" {1 i% N5 s. QB.IBM DB/2
# K! q* C2 q* ]* }C.PostgreSQL3 |4 c  d. H  ~) d8 u, w: R/ z, Y
D.Microsoft SQL Server) K$ X# f! l# X9 g6 J
E.以上都不对. d' J9 G; a0 [* @. V8 ?' E
+ M! M9 Y/ s* w$ A* \
# ^8 t5 F+ J  \/ G, X
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)- I9 G9 E+ J* Z5 k0 K0 U3 c0 i
/ C2 Q. X4 L+ B' U/ @2 c; {
<?php0 m+ E1 A' t/ Z. H2 S) N
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
2 ^$ {2 O& L- ^- w3 k* o?>
: a/ F/ z6 q0 T
; u, `: G( v% F7 B4 h; B* TA.MYTABLE表中的记录超过1条
: r. W9 R/ J( K9 J$ |B.用户输入的数据需要经过适当的转义和过滤- U# d/ \& ^# F/ j# U1 l
C.调用该函数将产生一个包含了其他记录条数的记录9 N2 O/ p  ^' j2 D1 Y4 z$ u1 J5 p
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- H" ~* e+ N, F& s0 l* IE.查询语句中应该包含数据库名
7 f* h. Z7 O' m1 z* n( I7 a) n& z6 s6 s  ^" v

- s' H: g0 R, B  `( I4 L6.______语句能用来向已存在的表中添加新的记录。  f9 W4 H0 b. J. z2 g

0 _1 L3 a1 l% W4 F5 z. p答案:____________1 w& P9 _& w" J! c

$ r9 d6 N% G0 @# i+ k! ^' `
& H, T( t7 k- [$ y- n& }% J: k7.以下哪个说法正确?$ R  s& m9 E: n! e) u
  j# ^5 U  ]6 C- n3 Z
A.使用索引能加快插入数据的速度
% D  \+ Q/ p7 x% T# ZB.良好的索引策略有助于防止跨站攻击
" ]2 B6 K% ~8 ]9 A3 M: AC.应当根据数据库的实际应用按理设计索引0 b: R* v' h7 e7 Q. C) g
D.删除一条记录将导致整个表的索引被破坏
! J  J- i) V* c7 |E.只有数字记录行需要索引. E$ [9 v$ `- l% g4 b

' R0 @# X' V0 j* q- v% n3 w0 e
& M  x& W2 U3 C9 c' w% B0 j8.join能否被嵌套?! Y. `; Q6 a' j5 p
  k5 I4 B  e, c, d" v: F* Y
A.能3 r: m; l  |" ^" a
B.不能
- w7 M" M  @# c" j7 v
( t# y: [) v! D* a# [0 f- @5 W, v# n
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
/ p8 l1 R6 \" i& l. r1 \/ L. }9 g; G3 l. n
CREATE TABLE MYTABLE (- V, z5 C2 B' a4 K
ID INT,2 u8 x& C+ x- u6 D4 \
NAME VARCHAR (100),
7 q& M" P# T+ C% t2 T% l1 fADDRESS1 VARCHAR (100),7 o, z3 K6 N- y  R4 W. m& H" T$ y
ADDRESS2 VARCHAR (100),
- T8 |3 j* p2 ~( s. HZIPCODE VARCHAR (10),
: z6 u* I/ ]. U4 a! eCITY VARCHAR (50),% q( o7 s2 `% ?) ~, T
PROVINCE VARCHAR (2)
0 g8 L# j( h+ C! @1 |)
( w7 ~$ e' \; C* S, b) DSELECT ID, VARCHAR% u9 S, D) V  ?
FROM MYTABLE1 |' J0 U% H- u+ D5 m1 P
WHERE ID BETWEEN 0 AND 100
) F3 ~9 b: U- L+ s$ L0 S0 FORDER BY NAME, ZIPCODE6 f6 B9 d4 G5 `
, O- W% k4 M( X" T6 p0 U: ^
A.给ID添加索引9 H' h6 S9 i9 s9 h7 y
B.给NAME和ADDRESS1添加索引- E& j' A$ m3 u% B" f( t
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引1 y$ h8 w, O; F; b, ~5 M% h
D.给ZIPCODE和NAME添加索引
/ W3 f5 e$ }) e9 s% gE.给ZIPCODE添加全文检索2 A: N, g# h  J# O
8 t' l; b' {( w, ~. u7 ^$ r

5 l* f" \& _$ H' h) n3 R10.执行以下SQL语句后将发生什么?
( Z% E: \: Q9 q" B# c  |8 H8 b+ L1 W. u* Z) \; l8 C
BEGIN TRANSACTION. |/ c; L9 B) j) D7 W4 O9 z
DELETE FROM MYTABLE WHERE ID=1
  |. R2 j# a7 ^/ R, ODELETE FROM OTHERTABLE& T5 R8 M$ l$ A' X; J
ROLLBACK TRANSACTION  G3 {/ N" f# {- c" t6 K
+ P) B1 H2 k- h9 U6 {5 {+ y
A.OTHERTABLE中的内容将被删除: P" X8 E5 v3 \8 |8 F' T, \, b4 }
B.OTHERTABLE和MYTABLE中的内容都会被删除, T6 @2 `9 E$ T8 I
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除( J5 \! [7 {! N9 O: K% r2 p3 Z
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化0 @, C7 W6 [. F: l4 v
E.数据库没用变化' b9 I) f' ~8 @* l- ]
6 G* k; `/ z" w4 a

* U0 y6 s% d8 J- J/ h11.DESC在这个查询中起什么作用?
. z8 y" ]7 o  P# I$ o. v5 a" }5 O5 Z" p8 ?& \
SELECT *
+ p/ P! c  ?' R/ ^+ BFROM MY_TABLE; }! t0 b4 r8 x7 p0 U* S' n
WHERE ID > 0
' E  p) Q+ H0 N" |9 IORDER BY ID, NAME DESC$ L! j1 d& A1 s! i3 K! D

8 r( ?! @' o7 z+ L1 |' ~: tA.返回的数据集倒序排列
5 ^9 U& p" F3 n, Q: pB.ID相同的记录按NAME升序排列
" z: o6 n: x5 lC.ID相同的记录按NAME倒序排列
" {" L7 U  ]) o. h5 x# MD.返回的记录先按NAME排序,再安ID排序$ k' Y0 T' ~" G
E.结果集中包含对NAME字段的描述1 E, r, D8 r! N' w: V' r
- N& d. ^0 E5 ?

( y. }2 L  c$ E9 d12.以下哪个不是SQL函数?0 f' }" t# S7 F0 k# u, K4 n

8 [( ~% W. ]+ z- R+ k: T7 K) HA.AVG1 M: x6 F8 _. ?! f5 Q2 @3 b
B.SUM$ g& q9 `' }7 E2 o0 V6 M# I
C.MIN
  K( Y' ]; y1 ]- ND.MAX& m# D! `: `5 V9 J% U
E.CURRENT_DATE()
/ o5 [/ a) j3 ?! j7 t
: f+ e. k! ?) t, o1 ]- |1 F
- \4 R$ t, |) w6 t  f/ }13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
! u4 K0 t" L, E( z  z
5 Q1 z4 V! C7 v& [2 L6 G& iA.该字段必须有索引" X8 A( h, G5 ?1 [/ w
B.该字段必须包括在GROUP BY条件中
! r" ]% k' v9 W2 f2 D* GC.该字段必须包含一个累积值
& b  E3 q& k/ B+ ?- ND.该字段必须是主键5 d3 O  [# p6 l: ?0 z5 |7 G
E.该字段必须不能包含NULL值
' N9 E- i# G0 d6 E5 _
& E3 f0 j' v/ q. F/ L' \$ L; {( j3 |/ n+ d- |2 ^# U; l
14.以下查询输出什么?3 B. i. }0 v- G/ O  G+ u

7 R& P; z4 _' P+ M$ ]SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
: L5 i3 G! }: A! p5 v0 iON TABLE1.ID <> TABLE2.ID- C# d6 B5 [6 o, {2 @
6 z5 ~! n# c  a/ e
A.TABLE1和TABLE2不相同的记录
' v* H2 p2 v+ T% l5 [1 JB.两个表中相同的记录: F) m: z& _  `# h% \
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数4 W+ Z: B) {' a$ h( [$ {
D.两表中不同记录的条数( h, c7 u( c9 `0 b3 }
E.数字2- k* w8 e9 g- K8 b1 ~2 t
" X1 }& l+ F2 L7 C% h

  v, h  |/ m  ?/ d5 h, L; F15.______能保证一组SQL语句不受干扰的运行?4 q% z2 T* A5 _' \$ l+ R' E! a- t9 O

* [: \: M1 E$ n答案:____________
1 H5 p* h; V9 v1 t$ W5 L: S1 d+ k/ p- u3 C4 j9 Y. R
  D4 R# s9 r3 m0 A5 P" k

, w5 @" q2 Q2 y% ~8 ~" \+ `% Q答案速查: v2 b5 I! X; F. p7 r. }0 |' F
1:BC
$ s* K" R( s: M2 D5 s/ B* L5 z# b2:WHERE0 y( d! g  T& w' X4 h
3:B
6 _# O0 ?- `. J  m! {: T7 U, a4:E
, q3 l. N# I/ U7 p) P5:BD
( n) |. D5 F. z1 g' o! c6:INSERT" _: ^, K0 X/ ]# A8 B
7:C% J# }" b6 y* C2 b% C
8:A- r, U5 i+ a0 t, P) @* k- R
9:C
! D$ U7 Y7 @8 c" M10:E
) Q8 a% q3 Y7 E/ @11:C2 w7 V8 u6 D- P5 Y
12:E/ s+ H/ J5 ], ]* W9 T* |/ H9 X
13:BC
( L$ g0 }; s/ q+ _/ D& F14:C
& P1 ~: e5 u" `& [* b15:事务
0 Y$ S( |% b% q# e5 E6 r$ R6 T* K3 s* F! K1 `$ P6 E
# |! p% o0 \5 M# [, C

1 z- ?2 D, T+ |$ l" r& v5 A4 ?答案详解
; }$ l. c; C& |, u
' G0 A7 v7 k0 n8 h9 |2 I& F% j4 W1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。' a: p7 v# ^1 w# P0 t% `

, k8 J( h" [0 M& T2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! M+ A4 l  f1 z7 T6 W7 ?6 `1 S

  o! ~; \- H$ i# g" P3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
5 v) q- R1 _& ?+ a; A9 H( Q% t  K3 T% V
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* p- \' l4 j, v0 }7 R
- S; m0 [5 u) O# H7 ~' g
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。9 ~* c4 M' V1 }: `" \
% ]1 Y  c! Y$ T
6.答案显然是INSERT。2 Y8 D! A/ Y9 j8 ~$ R/ f% j
0 ]2 S; q8 d9 k7 s- m: j
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。1 l6 E( F5 v) A: G1 d
7 J. r# V5 M; V$ Z( L% e
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。! h$ i) Q3 P0 F2 X

. u+ G9 l; w& u9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。. |; l9 I6 x# p+ |
1 l9 g3 s! a" F; L: q
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
! L/ n1 e% q% j, ]  ~( i( a' R  w! f- s' a% N& d; g$ F/ |
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。. m+ I2 [+ e* E
/ Y( C1 A. r! \, U
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。1 x% d4 c4 X; n  {8 w
$ {6 R, B4 {- A8 b, O! i
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
) E+ E5 y# d& v0 r. I2 C; c. Q3 R. _+ [; E; F  P( ?' a: {* X
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
8 o7 B. k, ^/ l! {
5 c) b7 v( x+ t+ |9 L15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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