返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。/ y' p1 V/ V. B) R" I: M
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
# }9 t5 ~4 K7 Z3 N7 Y( I( k' X4 r3 [本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
5 h2 \; P( j" D& b
/ D$ {" u+ z% @5 p, F
: g2 q  o5 t% |( ]- @5 M7 I3 Y  D问题, u/ z& J7 h' y/ x# T
1 Z& H' H1 E3 x
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)6 V: R& d; H1 m0 V# l" z. T
) e; r+ P1 Y+ L! L- ?8 V$ g; \! I
SELECT * FROM MY_TABLE
2 H# j9 T2 M5 h# K7 y$ k! v' z
0 g. F7 x+ M" s6 t% d- oA.如果可能,用把查询转换成存储例程0 u4 O4 N7 u  \# E$ q1 r5 ^
B.如果程序允许,给查询指定返回记录的范围
$ L7 C' K) G; F0 ^C.如果可能,添加where条件6 U1 k4 I9 D+ {- {1 S  B) V9 }( q' T
D.如果DBMS允许,把查询转换成视图" p; k% N" J6 C2 y
E.如果DBMS允许,使用事先准备好的语句* G6 w% A) G6 Y
2 p# H2 y0 F! ^! {6 q
$ e8 n  w: A7 a: l
2.可以用添加______条件的方式对查询返回的数据集进行过滤?9 h7 ~, M4 }% m6 d6 W0 ~
7 Z" r3 _  @. x2 S. m, T
答案:____________
: b& \% d, v" l$ h
* ?1 \0 J' X& g4 \
- ?& Y- o' z* E3.内关联(inner join)是用来做什么的?$ s8 X2 e  q7 d7 m6 e, e# {' B

7 {; Q6 G) o/ F1 N" G7 ^$ W0 P5 Q  TA.把两个表通过相同字段关联入一张持久的表中
- j; S) R+ L: ]% i9 c8 f' XB.创建基于两个表中相同相同行的结果集: s5 v$ w1 U/ e5 w1 o4 T3 _3 B
C.创建基于一个表中的记录的数据集
5 d% W. ^, v" mD.创建一个包含两个表中相同记录和一个表中全部记录的结果集; L) ], I" d$ Q. s2 ?1 H* M+ _
E.以上都不对* }: {: I% K6 ^! e4 B4 l& L  V& i

2 G5 {* E7 S7 V- |2 T6 ?5 A- G3 h# e8 I8 Q
4.以下哪个DBMS没有PHP扩展库?! I, W% t) i9 s7 U+ z2 E
2 y4 z; j4 l7 Z) ~0 M
A.MySQL9 O2 W1 j4 R* B/ o/ T
B.IBM DB/26 o* h) p% g  U! T+ w. f
C.PostgreSQL
. d0 A* G. C* u& d# C2 LD.Microsoft SQL Server2 i7 k# D9 C6 }) f9 r5 m
E.以上都不对
0 d* Y; _) K; G' g
6 [; Y3 I: L. _' S0 x- X* z4 j* S+ |/ P5 z; G* ?8 a' {' m- V- T
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)6 a+ G9 f0 X7 c6 A" b: H
* R) F0 H: K5 h/ h+ ?3 A$ R  x; A8 e
<?php
( b1 z3 n! ~1 X$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);! t' V3 J" _2 e/ @$ m  Z" O3 ^
?>
& ]& \, g9 k3 P8 C
4 f4 G+ {6 }2 `2 J  J, K) WA.MYTABLE表中的记录超过1条1 R0 K, J. Z  N1 Q9 n: N+ @1 `7 x
B.用户输入的数据需要经过适当的转义和过滤$ {: I1 |, R' K( a& _# m
C.调用该函数将产生一个包含了其他记录条数的记录
9 j, V: T. k9 a2 M5 W, dD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
9 t* d+ [& m7 bE.查询语句中应该包含数据库名$ g3 d" s" f6 ?9 h5 e5 q
" q; s& L( {0 q7 J. U  ^) ^& ]: N  w( L

% l2 Z4 o/ g' t" H  i6.______语句能用来向已存在的表中添加新的记录。
$ s. C/ h5 }0 F; X  `, _. M- X! e* Q; s! ^1 R+ B0 `
答案:____________- u/ V" o: s2 V8 w
( i+ K, m5 H( t! M4 ?' h
3 g# U& q  l, u3 ?7 o4 |
7.以下哪个说法正确?
% Z- y/ G6 e, |) i) L, P1 f& L* [2 K& m0 [& l/ I3 R
A.使用索引能加快插入数据的速度
+ P! Y: o+ z: {0 pB.良好的索引策略有助于防止跨站攻击
$ K- d. S: Z- y* U# }- lC.应当根据数据库的实际应用按理设计索引' \8 S; a& U  Z' `# |" w5 n* N4 `
D.删除一条记录将导致整个表的索引被破坏0 A2 s  s* w/ a9 m$ ?9 s. ?
E.只有数字记录行需要索引
$ K& x' s: z3 P6 H0 e6 T
8 z0 d7 r- Q* p! q) ^$ d" w- G
+ R. H6 |! E( J8.join能否被嵌套?) g# w* ?' B$ l- M9 U/ o6 Q& e0 z

2 i& V# [$ S! k9 N( i. }A.能& w; t% w' V) P
B.不能; u/ U7 O' c6 |! T" ^4 @
1 ~7 Q* B+ H5 ^) W4 Q

! C/ S. Q2 b# a* D* O, z9.考虑如下数据表和查询。如何添加索引能提高查询速度?7 S  ]6 J5 p+ s8 ]0 l- u8 U9 `
4 Z* ?4 T7 M; k
CREATE TABLE MYTABLE (
9 E1 t9 j2 v& O3 v, W0 jID INT,
" p5 h- C8 Q9 \/ J8 eNAME VARCHAR (100),& q/ |3 G' V9 a. u; p0 ?
ADDRESS1 VARCHAR (100),
6 e8 i  E8 A3 n$ hADDRESS2 VARCHAR (100),; C/ f( y9 V8 Y, T' y) S
ZIPCODE VARCHAR (10),: d: s% t7 l: i
CITY VARCHAR (50),
  \$ E: Q$ L2 k% PPROVINCE VARCHAR (2)/ u2 S. Q" X9 F# O6 R% ]* p, g
): M. E% s( j4 n2 A
SELECT ID, VARCHAR1 S1 T% W! c$ V4 N
FROM MYTABLE+ ~7 c- Z* a2 u0 u1 x& `
WHERE ID BETWEEN 0 AND 100
8 \5 Q0 o) `5 L, Z' t' MORDER BY NAME, ZIPCODE
! L4 Q# _4 v$ N: t% n
, n( q- R, Y* b" p! |6 X4 bA.给ID添加索引
$ }5 y% q9 t/ m( k; J( HB.给NAME和ADDRESS1添加索引
$ q  p. \2 D0 A2 D, h6 zC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引* E8 x+ k) T, f
D.给ZIPCODE和NAME添加索引/ `4 g3 O' _. W5 q
E.给ZIPCODE添加全文检索
1 l  E0 d4 G2 ?# }* n* E" ~2 w" F: t. a8 f8 t( v0 P0 F: q4 Q: A

* u# V- ]- H& K5 H$ n10.执行以下SQL语句后将发生什么?
5 {! m) W3 Q7 h  l
% h, i8 C% g' L$ z8 ~7 X( {BEGIN TRANSACTION! y* k/ j6 \: d0 {: y
DELETE FROM MYTABLE WHERE ID=1! L" Y; b7 x* m
DELETE FROM OTHERTABLE) _' A7 @4 G) V) R* m
ROLLBACK TRANSACTION* }: u! x; j  S. @& ~5 a4 S3 o

9 D7 h6 X2 N& v# v! m0 K4 b. W$ lA.OTHERTABLE中的内容将被删除
7 |' I1 A2 A* [) ]3 EB.OTHERTABLE和MYTABLE中的内容都会被删除
) ~% u; \" F1 O; @+ _C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
: V2 i3 {) Y- o, r+ AD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
$ p0 G% ~' {* [; t  ^- k1 UE.数据库没用变化
, L) Y% U2 r& N' A$ s$ v3 i# }! ?$ H4 P' \
( H2 K% s( J4 R* V2 z
11.DESC在这个查询中起什么作用?7 x" a0 G0 ]: J: \3 a
9 X. d' j; i$ x
SELECT *
4 O. o4 P$ m, u6 Q, CFROM MY_TABLE6 Z$ r" R4 s% f( s+ A
WHERE ID > 0
5 k/ c' E& k. u+ uORDER BY ID, NAME DESC. X- e' B0 M8 ?7 s& a, {# J' z' K9 }
# O; C8 U" k; N) w- s! D& U0 p
A.返回的数据集倒序排列$ t9 _: g* `: _
B.ID相同的记录按NAME升序排列
" ^9 w4 m  g1 S* U. PC.ID相同的记录按NAME倒序排列
$ F) f0 a/ G  z0 [( Z" n% eD.返回的记录先按NAME排序,再安ID排序4 A& v$ M) x" @/ }" z! \* U
E.结果集中包含对NAME字段的描述+ V! s6 |* B0 S( J9 |

; H+ F8 p. T  Y  t3 a) p  Q1 q/ ]' H& n6 L$ c: n) Q0 p( h7 s
12.以下哪个不是SQL函数?
+ ?7 ?1 Z. V6 c- \/ v$ e, T' z; m' g2 c5 f9 W
A.AVG
3 U; ]) J" N7 d+ ]7 w! @B.SUM
- j/ d: V1 j3 T) M! q5 HC.MIN
9 W, @6 j/ N/ ^7 T% kD.MAX; J0 }* X/ c3 \2 p1 @1 H
E.CURRENT_DATE()( o) l/ Z: t9 s8 ]" B

2 ]) {8 ]" F# {! R, n3 G; e. D6 b$ T7 n6 @& x* [
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?: h7 q& r1 R6 W9 P, C/ L

/ z8 |' M) ?! i* nA.该字段必须有索引
! E. I2 m- t2 q, B. QB.该字段必须包括在GROUP BY条件中
' R9 K( \6 M# k' m6 YC.该字段必须包含一个累积值0 i; r( K9 I$ t
D.该字段必须是主键
' [" a3 Y: o! m0 oE.该字段必须不能包含NULL值
9 |, i# @6 s8 M0 q/ X5 @4 y6 A( S3 N1 M4 B
. P0 J* ]7 r2 O! j% F7 c) J  m
14.以下查询输出什么?9 ~, N1 f% ?  z4 N

  V  b4 `5 u3 _: q* W& R; V3 X" o% hSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
7 r) k, l, X# B* n7 ZON TABLE1.ID <> TABLE2.ID5 x7 P. b# x1 \& Y0 z

  R! c7 Z' R' p, V/ d4 G5 kA.TABLE1和TABLE2不相同的记录
- p6 Q2 X3 y, {8 k$ s/ ^. W' OB.两个表中相同的记录; h: Z( p. ^# c" K5 H
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数2 ~6 |  y# E8 V' J! h* P. z) l
D.两表中不同记录的条数
! C( ?1 j" E8 z( d) aE.数字28 Q& p6 }9 k5 U$ R$ H/ ^
- o  T- v& I) T& r5 f5 w" |

& q0 g9 u) j: p8 }2 z15.______能保证一组SQL语句不受干扰的运行?' r1 S7 L, [5 H0 Z
% t' m; S9 o# m6 v3 j6 Z, T7 R% _! j
答案:____________2 a$ [5 S7 s$ T

7 J8 m- D! g0 n8 z& w, S* z, n7 a# ^4 T4 ]1 p6 r9 ~% H+ ~
  ?% }! \( k3 A& f6 ]
答案速查; X( h* Z8 w% [4 p
1:BC' y' D3 @. W" _! m
2:WHERE
5 F  }5 v7 H( u# N) t3:B
! v+ ?! v" F' F7 q5 o, C+ @; h8 L5 M4:E9 P( N2 a4 N% S! R
5:BD
# ~# j$ N  c3 D" O- w# B% ?6:INSERT4 A9 b! l/ y" H: ]
7:C
3 Q8 h  Z  @% X2 O% E8:A  ]5 k7 t9 C8 W
9:C! C$ y) K1 P" {8 T# Z2 X0 c) |6 N/ j
10:E# X. v4 T* w8 k1 S
11:C
% L) P+ b3 i; x' {: J) ?12:E
5 {' V) u4 C: F* [( v. M  F13:BC
5 Y& `: Y$ u' u0 P) Z" m! Z14:C8 E: L: h1 f. I0 s+ g
15:事务
8 }; K2 {5 Z2 U: a' |: M" g" ]4 [' G$ [+ l- _9 ]7 W
6 K4 C1 g3 P, Y# A

& y5 p  P; U6 M答案详解$ x' V* B4 |2 D/ K- b: k: l* s
( X' h* B* A( A) q
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
: v1 r) Y$ t7 }% p, ]* p# G& A
/ `3 C( l& B/ Q) n2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。7 B2 N' y4 p# a4 \/ T6 p1 Q

, J* P- w% d& p* E3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。" l( ~0 q0 O, i: F7 V/ X6 f) z3 X3 `3 O! T& r
: q: ~4 f  H/ m$ x2 n3 M# Y
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
# `0 O5 X4 v" d7 @, _- p
& T7 ?, Z$ J  e9 x, s; f7 u6 U5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。  p) }: p9 j) l  T" x8 A- k0 m) k

8 `9 ]# K7 Z4 }2 }8 W( s6.答案显然是INSERT。/ [. }7 l1 |& i" L
, I6 @# ^% z# k. x0 y! e2 A
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。: g# \; C; }9 M

1 m) _8 O  Y- @5 @  {8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。6 z0 d8 M- W! a: a
& C0 w+ E. ~$ E
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
  O2 D; E/ y; E# J
& z" L# \& C* g' H10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。8 F  e9 V  w. x3 I# f

0 A2 r2 Q- U' N8 w) K11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
* \: v% B3 O" ^) h, C5 I! v9 @' R/ U2 u  H, j/ W6 E' w
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
1 M9 h1 l" m3 @" U+ z7 n6 R$ ]/ Q6 q. D0 X8 Y# S; _
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
  \! @0 s1 W5 R2 n7 w  {; V& C; z% c& m) k  d
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
  L. K% ?* f5 _, a* [9 `
1 U( D7 H- l0 B15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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