返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。9 _" P3 Q: M3 i7 f6 E1 e% v
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
5 X4 x. J0 g% I/ M2 o: {本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
  O- v: m9 |: e% f. @0 d+ y( m+ K: K: a9 M: a
5 |. {' B- @6 p6 n! h% l0 V
问题
% I/ v' l2 B9 ~# b# \2 i
0 B3 H9 j  z0 M# q1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
0 U1 k! B. m# n6 q
6 p" D: T) E7 ]8 a. HSELECT * FROM MY_TABLE; d0 B( i0 ?5 a7 a7 e* ?

; }" {. s) r+ l8 v; ?! }A.如果可能,用把查询转换成存储例程5 V, u3 a3 Y8 u% d- U! \
B.如果程序允许,给查询指定返回记录的范围+ o0 g9 d3 F+ U3 g7 }* e) f9 n
C.如果可能,添加where条件7 n0 r( s/ i  F& s0 ?" ~8 Q
D.如果DBMS允许,把查询转换成视图0 x' v4 T+ ?+ ~1 ^+ c, _# u' `: M
E.如果DBMS允许,使用事先准备好的语句) {# _, O) L4 I' L$ N
. d, E# W; K, C# }& L
% [& G  Y$ l. A: A4 h
2.可以用添加______条件的方式对查询返回的数据集进行过滤?7 F( [9 V+ X/ f% N3 Q

0 ?$ C, }& c. S3 h答案:____________; l0 `" s/ }* L" g- H, z6 s
4 e4 V; C8 E8 S1 H/ U6 H

4 c0 z  K4 p$ [6 c3.内关联(inner join)是用来做什么的?
! H' Z( X* A& Z1 ^$ H  Z! y# ^$ |2 `/ m1 L; O
A.把两个表通过相同字段关联入一张持久的表中
. p/ H' R4 L' b2 s9 E& J1 oB.创建基于两个表中相同相同行的结果集% l4 v' W! a+ i) Q- U$ J
C.创建基于一个表中的记录的数据集9 u, R) r$ W; J1 ~3 w
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
8 G  I% Y9 J$ e* iE.以上都不对2 {9 ?( T4 t" P4 `0 O! t: }" H8 e7 E
  j* h- i/ }( i1 A$ u; V* v* i# [% m

/ @) d' i) g, i! _7 d, p0 K3 ?4.以下哪个DBMS没有PHP扩展库?, I# Z( }2 z! c, ]% u4 |( V3 X6 y# ~
7 s7 g; r' w0 Y1 ^% K6 ]
A.MySQL
4 S: N' }  }% R* E1 ]$ B8 ~B.IBM DB/2
# ~2 m5 J  ^) o5 q3 U8 zC.PostgreSQL) T3 m( d, D( D- Z! y5 {7 x
D.Microsoft SQL Server
2 \8 a& }) o4 B# C; ?E.以上都不对# H- [) R  r" b+ u, I+ }

7 e* Q  \0 r$ |% p! u
+ I7 l6 G/ @; m* N3 W9 r& {5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)7 R* g5 a: `& g
0 Q( B( `" O+ E* s5 N- A$ ^& q
<?php
% P3 k. E# }, m8 }$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);0 @( N: F( S: p
?>1 i5 T2 {& |( u; _
) g  ^3 c( k" b' b+ I; o
A.MYTABLE表中的记录超过1条
: Y6 {& |* u( ]- QB.用户输入的数据需要经过适当的转义和过滤# |  `3 t! U5 x/ a7 ?
C.调用该函数将产生一个包含了其他记录条数的记录
* q4 R% z6 ?, s# Q$ z" R7 tD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
5 p9 S; y6 C: W" {* M  [8 z# RE.查询语句中应该包含数据库名( O- l/ e* x( @" M+ {
7 x( w# P* Y( L

1 D( C0 i; W$ O  Q. }: u8 {6.______语句能用来向已存在的表中添加新的记录。3 L( J% x1 J$ y1 o2 ]! _" a
  r; C0 m  Q4 V. N
答案:____________
% B$ v2 p/ I: m+ ~  X
& H/ y0 O6 a9 I4 s  J. k  J0 q0 p0 m% U
7.以下哪个说法正确?
  t3 D/ j& ?, L4 E$ `  l
' h' M% Z0 g; ?# k+ X. EA.使用索引能加快插入数据的速度8 w( q6 E; E2 j  e3 f# K
B.良好的索引策略有助于防止跨站攻击
& x) V3 j9 ]9 a& W* T% `C.应当根据数据库的实际应用按理设计索引! A4 z3 r& E4 y4 z
D.删除一条记录将导致整个表的索引被破坏) q1 a( p$ y( w; m) l' r
E.只有数字记录行需要索引
; F" s/ ^3 J! E& C3 S6 m1 W5 A7 v% D% E  Z+ W$ V

( P( `9 d, v, b: Y! ^8.join能否被嵌套?- h$ a2 @/ X  @' X4 A8 S! E. a. a
) s- I/ x5 r, {! |5 ?* q  u
A.能
0 j6 @/ y% K5 u* k4 K" R: C' kB.不能
: p% o3 u0 q, P5 d+ g2 P* q2 ?  i( p( R% r: y/ x' G" i7 S, e9 K

9 A& i- x. N6 [3 ]! x, S+ ^9.考虑如下数据表和查询。如何添加索引能提高查询速度?
; _# M$ y- A3 |& B' R1 K8 n7 w8 _
7 C' o$ o% N& C' m7 CCREATE TABLE MYTABLE (
/ H# }( _$ f) Z6 d  V# ?4 OID INT,, Z) X' Y9 M2 _  {) q+ l( o5 ]3 Y; R/ Y* [
NAME VARCHAR (100),4 ]) n0 |' V  g0 O2 b5 M
ADDRESS1 VARCHAR (100),
8 K( p- b- ~% ^) TADDRESS2 VARCHAR (100),
  _, P% O" e: a# Y1 M, EZIPCODE VARCHAR (10),
% ^7 Y' d2 d) h0 D$ \" ^+ {, A7 ICITY VARCHAR (50),
7 Y4 ]0 g- C( F# M3 a0 Y8 yPROVINCE VARCHAR (2)
. {5 E' }) ^! @. T7 V)
1 [0 A6 D' I0 ~  x) N0 {9 [: J4 n4 m, GSELECT ID, VARCHAR/ P8 u8 ~  `+ `- ~( ]+ z" ~
FROM MYTABLE
& B3 i8 S- `1 V( y8 aWHERE ID BETWEEN 0 AND 100
" D6 p. M! s& f8 n! G. i, `, y8 gORDER BY NAME, ZIPCODE
5 t2 i( h! r3 j$ u8 f8 x8 I( G* T8 g2 x! J( j3 g
A.给ID添加索引4 x% H. j2 s( O% B  E( n
B.给NAME和ADDRESS1添加索引0 v8 P- O, D8 ?0 \( T! b9 G( a; \* f' T
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引' ?3 |; g8 P3 H
D.给ZIPCODE和NAME添加索引3 _' ^& u/ }' u4 H
E.给ZIPCODE添加全文检索
" p2 v* }$ U: n8 k, _, H- H7 z9 A* e' {

1 T9 p1 \4 Y  w( `+ L10.执行以下SQL语句后将发生什么?' E; N. U& o+ G7 _" n1 c7 w- `

% S1 g6 t3 |6 VBEGIN TRANSACTION0 m7 ~. l1 R4 O
DELETE FROM MYTABLE WHERE ID=1
- g$ g6 W8 Y; H, a1 V. r7 o" IDELETE FROM OTHERTABLE; f! H2 e" y# v+ ?
ROLLBACK TRANSACTION0 F" K6 l* A6 ?7 p& C

8 u1 u& p# ]4 h! o: l2 GA.OTHERTABLE中的内容将被删除
4 t% ?- }* X8 P: ]; ^8 H1 rB.OTHERTABLE和MYTABLE中的内容都会被删除2 G# K( o4 @+ X! a  ~6 C
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除, I9 g9 d% p& R
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化4 a% p; v8 ?& `2 w
E.数据库没用变化8 J: P% M* Z: ~7 [' e
- a% C4 Q0 a3 {

! {2 B, w8 }9 f" u11.DESC在这个查询中起什么作用?; N( M) c$ W! O4 \# Q8 k; o

: D  C; ]& r. P' j% uSELECT *: W/ ^& [- z( s/ B) P
FROM MY_TABLE
# z* m& N; w0 p- oWHERE ID > 0* U. t7 r6 D: K; v+ k& n* P7 I* Z
ORDER BY ID, NAME DESC
+ Y- I! K4 F% v  c8 }
7 c) j6 J+ r1 I# \. q' r+ PA.返回的数据集倒序排列
# f/ Y2 z. V8 O: ~3 ?B.ID相同的记录按NAME升序排列8 f: b1 ^, Z$ _
C.ID相同的记录按NAME倒序排列& |9 o& i5 }) e
D.返回的记录先按NAME排序,再安ID排序9 q/ g+ m" u/ x5 I( T
E.结果集中包含对NAME字段的描述
8 [, K9 E* D* s0 m' o( f( `
% _5 F1 `- B1 H* f+ v9 A; T
" j  ^. }1 g2 I2 c12.以下哪个不是SQL函数?
9 J0 T6 x- h* \
; p" S" V% b& d: e. ^" Y+ G  XA.AVG
1 |# ]% b" n+ {& j& UB.SUM: T7 q  c: e; o& g
C.MIN
* y. f* A; ^! \2 HD.MAX% P( T6 R6 K7 B
E.CURRENT_DATE()4 ]! J# {% g; C+ i: _1 T7 Q

9 A( b6 ~; `: ?9 f" F, N. k' t- y" }3 X. {
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?- q( a: U0 u1 x- A# M4 l: f
* n) ?; o2 L, F( W0 n' b1 m
A.该字段必须有索引
  i" l5 C5 Y$ G% A2 a5 FB.该字段必须包括在GROUP BY条件中
. \  B" ?* Y3 W# `2 g/ ]: |) c( ~( lC.该字段必须包含一个累积值9 K) S3 n1 N) S2 u; N) K
D.该字段必须是主键: ?9 \/ C# F. d# e9 d6 r1 X+ e
E.该字段必须不能包含NULL值
: E1 R! @+ D: @4 l; |2 d8 y- s" M
; C' ~7 |& Z, l# \+ e& n* ?) O! @/ O& B
14.以下查询输出什么?
) h6 G9 f/ q8 Z
7 b" ?% w% Q1 r0 A% ZSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
, W2 ?% }" U8 o& B5 v( SON TABLE1.ID <> TABLE2.ID
, O; ?/ t6 t2 r; M( {
9 c  e0 V7 r. d+ |$ hA.TABLE1和TABLE2不相同的记录1 ^" I+ L; t2 h  b
B.两个表中相同的记录* z) Q2 j, e0 u
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数6 ^  a! X* i. ?1 b1 ?4 |  M5 ~" f5 R
D.两表中不同记录的条数
4 H; H( K4 @/ m- B( o( wE.数字27 ?; w, w' [5 }* O& E) J$ c
+ S6 K! R' x5 H5 J) Q
) n6 l4 Q' T3 B( ?
15.______能保证一组SQL语句不受干扰的运行?
1 h6 F  t6 I) @- Z" b* B
" b: q( T6 x' ]0 l/ }答案:____________
4 A% Q$ ^6 p( s% h( W4 r/ }7 [& A; H/ y7 L1 i

2 Y$ P" v: o9 J8 \  H2 t3 H  R0 U" D8 c# O6 s7 Z( ^" Z
答案速查
8 f# p& p/ U% B$ C. X$ H1:BC
, {$ {# K1 G( F( C; l% R& v( k( W2:WHERE
# g2 k. ~1 q- g9 y, h5 B+ R3:B
! G* u, ~4 M! c3 \) e& |5 m4:E( a% c0 o- O7 W# G
5:BD" F- s' Z8 p% m
6:INSERT& @1 ]/ x8 Y$ U& R& m$ Q
7:C- c, |7 a( J+ {6 @7 a; X3 A
8:A0 o& Z# C; z5 p) N) \  k) B
9:C
& p& O' r& F. n/ F) p0 @10:E
0 j1 X( ?* v( f1 D; c  [" t- i) [11:C7 P2 i* O: n- Q( ^8 ]
12:E4 V1 r) G! {; M& X& A0 o
13:BC) t3 v* Z! K# T# ]. a6 j7 G
14:C
6 X6 S3 y9 X& m0 \2 f* Y/ w) t15:事务
& B" o# q: Z* }, T
3 @( d( N  t  H& x7 ]/ E+ m5 E
* W  p, n  Z+ H$ v. }
5 r9 C) B' j' g# ~( H! A答案详解. k) c3 t' D2 J# w1 M3 t

9 B9 O. b& G1 n2 z. [* L1 n+ x1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。2 Q$ Z* _- v0 d  _
3 o2 U. Q$ Q) a
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
2 o3 L5 ~; q1 ]" m* W# M  h6 d8 ?* D6 }2 d$ I7 Q
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
  ^$ t9 }; ?! B' |- m  P! C8 |2 X0 a: v! D7 J9 `
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
) V/ k5 [3 e$ Y( r: {7 F8 s. W# Q4 @2 Q  w8 r4 M* i9 o5 K
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。# p9 I  P4 T. B1 _8 N3 d
! j6 q' S4 V9 W7 r9 x* i* `  n
6.答案显然是INSERT。
& Q0 l7 D. k% i
8 B2 y* i- ^0 f6 K0 q6 H7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 t) }- ]; b! @- t  U7 c5 K
7 }; F7 }" S$ V0 Y8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。7 }( f: @5 p, L( J
9 m, K# ^+ r$ L& _" y% z
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
2 e# v  a0 z9 U5 L& {/ e6 o8 [8 ]% |3 M( C# e' ^8 Y
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
; B6 ?: S5 w1 u; B8 u+ t; E! ~* v8 A) r+ L+ ]8 b
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
( Q) s; j, I+ \/ Q( c
1 h& \# g- t2 d) ?12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
7 L9 L7 Z; p1 }5 ]+ G  L. R5 q& _) t8 S$ t. Q
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
5 ~' k( h' K3 i$ p7 b
% J$ k* ?) A6 C" s; I14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。# U' `; U7 y. c3 U& V# {

4 D/ q% o' _+ ~! v  D. I15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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