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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
$ {9 O' ]" V7 F' Q/ P* r% _8 BPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
- k5 S# s, V: y: ?: A& k本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
3 m, r2 C: m% g9 p1 u( o/ v+ F. q( u8 `! s# ]0 H! `' J
6 q9 R+ x9 ^+ X8 B
问题
" T4 ]9 Y5 v: |9 y* n  J$ F" C3 V6 g) D( N4 M& d
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
% C2 P3 l# T2 s: H  _. Q7 W
% c( e  ^+ {6 |$ USELECT * FROM MY_TABLE
1 l( g: o" X; Y+ G6 }3 g, n
0 g4 a9 ]& a6 {+ h  PA.如果可能,用把查询转换成存储例程
$ M5 l, z$ g; j/ |, \/ CB.如果程序允许,给查询指定返回记录的范围
! W2 S) T! _! v' w( dC.如果可能,添加where条件
8 _. l$ l1 q6 J0 d3 r& lD.如果DBMS允许,把查询转换成视图
7 W" L" ]3 J* F8 EE.如果DBMS允许,使用事先准备好的语句
) B. Y2 H$ q+ O* o' Z% `( a7 E: v9 w/ C. `1 ^4 D3 _6 E
3 X( ]! ?) w5 q  }4 t& g
2.可以用添加______条件的方式对查询返回的数据集进行过滤?/ f9 D- ^2 ~" s  ^  q( d9 `
) E4 J) \. H5 k+ L9 Y# ?' T& j
答案:____________2 h% _" q9 V) g6 x0 ?* D' |1 Z

2 ?; h" ]  l$ V+ G
! x" v2 R1 H( Q' y$ l3.内关联(inner join)是用来做什么的?
& h) h+ y; @& o2 e6 _% n
- h) z( g% |8 V; dA.把两个表通过相同字段关联入一张持久的表中' v  S0 a  c2 ^  @: o1 x' U: z* a/ U
B.创建基于两个表中相同相同行的结果集; H/ `4 X! ]  H6 }% O) m: W! b0 K
C.创建基于一个表中的记录的数据集0 Q. s& z+ }) z6 V) K
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集0 P: P5 I  O; P! b
E.以上都不对
; Q) I9 Z$ ^+ t# w* j3 v
/ h1 g& I7 w7 `  d
+ V4 H7 q: p6 |  k3 I4.以下哪个DBMS没有PHP扩展库?$ g  Z" O8 _' Z

+ G( z/ m. y5 I: GA.MySQL
" F8 o* u$ N: M( g6 CB.IBM DB/2& ?' w6 `6 M5 @  m3 g1 Z
C.PostgreSQL
  [; ]/ y. u  N' |% uD.Microsoft SQL Server5 R* R' R9 x0 `: b6 S
E.以上都不对0 G9 g- \/ W8 P% ?: V3 V' {
& {4 o& Q( D' O' R7 g* V

4 ~- G2 Y, |. L0 o5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
9 _# W0 {; q6 z2 I
0 K  ~' B$ H5 C/ e3 b( ?<?php
* _  x/ i+ A- P  k7 b" n! `$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
0 [- I- }- c/ a; x! T4 r?>
: I: p; r0 u& H* }8 ?+ U$ j! b1 F* v& T' Z
A.MYTABLE表中的记录超过1条
5 Q+ e. U. J5 l9 z' ~  q* BB.用户输入的数据需要经过适当的转义和过滤
. i/ r+ r& ^( MC.调用该函数将产生一个包含了其他记录条数的记录
4 Y/ p0 h' r0 w0 [2 qD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除  A9 [) l; J3 I4 e" o
E.查询语句中应该包含数据库名4 i. O: T. ?+ m  E* z& {: J

) ?2 a/ c9 ^8 l9 J% F5 A) x: D2 e; J1 k0 _& h; h
6.______语句能用来向已存在的表中添加新的记录。+ F( `: U; y1 G* b  a! P/ M% T

/ v5 _/ o0 y, l' N答案:____________/ F9 G1 G5 D" f; p# V

( e# W  o9 Q& H7 {0 t0 c$ H5 ^  q1 H: l/ m8 M
7.以下哪个说法正确?
: c$ Q/ W' [9 p  L6 @1 |
. g6 ^8 r- |! q: ~! M, p# oA.使用索引能加快插入数据的速度) m. m" O* ?/ P
B.良好的索引策略有助于防止跨站攻击
7 ?& a/ a( A% d( E1 AC.应当根据数据库的实际应用按理设计索引
$ a$ B+ A* {! h/ w0 {D.删除一条记录将导致整个表的索引被破坏
: Z. g- @$ ?4 w* |9 lE.只有数字记录行需要索引
! `' o4 n1 g+ L  P$ Z( Q$ b1 j2 C1 V, I' o

4 p( r  m! {- j2 S* V1 [0 n8.join能否被嵌套?
4 Q" T2 t! a& m
4 Z# ~* H6 p8 f% D) kA.能
* U7 |  r3 N' \- nB.不能7 N+ q+ v5 s2 n5 M, t
0 Y& l3 v; D, `+ A' B8 g
% w+ ]: O% f; j  \4 O1 h
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
& p, e! N0 [  @6 H! y8 b# ]- Q0 @2 g$ q+ R+ c# @" `) T
CREATE TABLE MYTABLE (% J: {; a. E) h) o
ID INT,
2 M; e4 I" }2 N, r- MNAME VARCHAR (100),0 G$ w; D$ L  \2 s% Y9 g1 J7 _
ADDRESS1 VARCHAR (100),% Q" C$ j$ W; ~
ADDRESS2 VARCHAR (100),
' y5 _: G: X1 q6 x8 Q2 ]  `ZIPCODE VARCHAR (10),
: L. C3 j2 A! y8 y0 eCITY VARCHAR (50),
1 N: ~& v9 V( _7 O2 s" U: B( gPROVINCE VARCHAR (2)
8 s4 g1 v, i0 f6 L8 q)! V5 T& c' G4 e3 V  Q2 v
SELECT ID, VARCHAR* R! U: y, L' G8 K
FROM MYTABLE% O9 B% M' e* i& [
WHERE ID BETWEEN 0 AND 100
3 A; S, P4 c9 S7 }ORDER BY NAME, ZIPCODE
0 x+ l; F4 a1 `% W. ~* J2 ~3 k9 c. {0 c
A.给ID添加索引* X( k( \* n* J) A/ Y, X' X
B.给NAME和ADDRESS1添加索引% V, p* e" w( c& N1 Y
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
2 x9 \$ R- P: i9 S, _D.给ZIPCODE和NAME添加索引
# x( Y# U7 ~/ T3 }: O' J' R9 HE.给ZIPCODE添加全文检索) i6 V, _* w' S3 x# n) K7 X

, \" q3 k/ {8 a  U: ~6 k! ?  J# p& L' \% b' t
10.执行以下SQL语句后将发生什么?
0 Z( U, l/ v  _3 T
( }  z* T' e' h# aBEGIN TRANSACTION
* D- D, A' ^/ C; s) }DELETE FROM MYTABLE WHERE ID=1
$ \* w. U5 r% ?7 H  d+ X0 |# V4 ^DELETE FROM OTHERTABLE
& p; S! }; |! j2 |/ SROLLBACK TRANSACTION! \5 J1 e3 V* o

: r+ l  x% @+ `' [  t: N# ^( f  ^, {A.OTHERTABLE中的内容将被删除4 o/ [# l2 {) m4 ]) L
B.OTHERTABLE和MYTABLE中的内容都会被删除
3 v3 N0 m+ ?* s/ EC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
9 i" i( L1 G% a2 e4 k5 dD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
$ }& n+ n9 A* c& A8 H2 HE.数据库没用变化$ P9 {( [2 {( P4 q: n/ ~2 {
" ~) W3 L. d# z9 B8 C3 c% W

4 t: O9 |# w  K  f- ^. z9 a11.DESC在这个查询中起什么作用?6 a' X0 t! f. k1 M( m+ M
" w  [8 p- h5 _6 F( d3 z
SELECT *
1 F1 }% g! b$ v7 z- }, I+ c1 u  l+ {FROM MY_TABLE
2 n% u) B2 M. J; l9 ZWHERE ID > 0) }0 {- m9 Z7 V0 w
ORDER BY ID, NAME DESC
% ]$ @- {. g  X& y2 }4 u% r8 u2 Z+ [7 |2 G0 D3 h
A.返回的数据集倒序排列
6 u% v/ p8 I4 e0 `/ d" eB.ID相同的记录按NAME升序排列
8 p/ t/ u4 u7 Q  T' ?- [C.ID相同的记录按NAME倒序排列! W3 D' h$ ]: E1 Y3 y: F5 d0 B
D.返回的记录先按NAME排序,再安ID排序; T+ b6 U5 H4 N0 X& _
E.结果集中包含对NAME字段的描述7 w5 T( K- F$ ^9 R0 x4 C
; ^3 ]0 A- z% H  E# c
+ K, ]( ^( t8 G+ w
12.以下哪个不是SQL函数?
) r! f9 d7 U, q- ]0 v8 K3 J5 q( `; l. r* ?4 t3 ~: V' p
A.AVG, o9 d! h# r9 C% X( q  S: H( }
B.SUM
. ?' `2 I6 f# D; d2 ~" pC.MIN
6 ?& u( t6 V* F& |$ i  j. OD.MAX
; u+ L; U( c: @" a# v5 ^E.CURRENT_DATE()
4 Y* b- Z, A+ W+ M% j+ t3 j
- r3 h  D' L0 V2 D
$ j* y, k$ B9 k/ `4 Y13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
; r* o* |! j- K  `8 M  w
, ~6 ?0 S8 C3 K; c( eA.该字段必须有索引
1 k) ]/ Q, s0 X8 \% t+ M0 QB.该字段必须包括在GROUP BY条件中
9 U5 N: r0 @$ L, f+ U( ^7 E, DC.该字段必须包含一个累积值
& x1 @7 b- Q0 R! S) ED.该字段必须是主键
5 @" K& r1 l6 l& O; H6 ^2 \E.该字段必须不能包含NULL值+ l8 B8 p) q5 ]' ~; o& c6 l
3 i4 t* I2 ?+ f! w& ^0 N

4 |( H: C! c: I0 C6 M14.以下查询输出什么?; j9 d0 X$ G& e- d  v8 S4 c
% |! l/ i' {' {% q! C5 ]+ M
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
' f; q2 V: L' zON TABLE1.ID <> TABLE2.ID2 M1 z7 k, N& |+ x" r6 S; N! r

& f. b9 L" J# `, K; L  q+ S( t0 GA.TABLE1和TABLE2不相同的记录
1 E+ H8 \8 b, XB.两个表中相同的记录; U% V; [! P! g
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
1 r. s! Z( ?. d3 JD.两表中不同记录的条数
; l; L6 o# F, K5 N2 UE.数字2
+ k3 H! a0 [( g8 T  G# M  M5 J4 Z/ |' O. k
$ `% [8 f3 q! _, K% |4 N5 E: o6 J
15.______能保证一组SQL语句不受干扰的运行?
7 s7 K& c3 R% c
2 M' |4 n# K4 S; p0 ~% [4 I- @答案:____________
9 s7 a, l' E# Y% h9 P6 Z- b
/ m4 {; X( n' ]2 E" w% T; [. W0 d1 a

0 f0 m  x% ]8 Z* A3 @% b答案速查& y5 [2 ~) g& T( ]
1:BC
0 P: l% q" \/ j7 h2:WHERE2 R) ~  k5 `5 t% M: q3 r- S
3:B1 _9 K: n0 {# L) r' W6 \
4:E7 k8 b% T# ^+ x, Y$ G
5:BD
  f, V* }. P* \% _4 v" \( V6:INSERT
6 O, m) {5 {  }5 d; i  u6 e7:C
& W4 {0 J: \2 u5 p7 i8:A# y# e/ l+ \! l$ w% s6 `) x
9:C/ C0 N$ D! L( l0 |1 E
10:E$ ]- j/ }4 J+ w! _8 s: j7 s8 C
11:C
- |& k+ N. U1 }  \0 L12:E# ^6 j! t+ W% U1 }: ]& p
13:BC
2 m1 p0 X8 W* U14:C
% E) K7 D0 A3 K2 w15:事务4 C, t! x4 i# J3 w, M* T# o1 `9 b

" J; w8 p' _3 {, b1 ~9 T! I+ @! r; j' |% M1 A- d* J0 H
3 K# D# x9 O1 z/ c# j1 @2 x8 p( z
答案详解! T+ R1 w3 v1 [" \) F6 h# I

/ G7 H/ C0 R3 u8 F3 X" b- Y1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。9 R9 b6 ^% y( ^
' i  h; N+ f: E# S% x8 {6 ~
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。( y9 X2 v* i8 V
7 a. g, z9 e8 }. d  a
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。& s3 O( ]+ _6 e' x. }

' p; c2 w- N& C5 W4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。  J8 U  z/ w, S7 y2 j

& F- W% K' A/ f+ \5 C7 V2 ]) X5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。! t2 m1 d. M% ]# d9 q  G) a
4 w) S" @- s% b4 \" X' e- Q- C
6.答案显然是INSERT。! n* Y2 l5 e8 k3 b4 v
  g( s) S/ \( U
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
8 S  }* ^1 T; ?9 ?& }
8 Q0 k3 X1 ]. s2 y7 ~8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
, s& s: T9 @; @; G* d
( n/ N% z+ U5 K* g+ i0 e9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
9 h* X& s8 o( P4 k, O3 n9 I" H, B4 p. L4 a0 L( H
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
. e6 }; _1 h. U/ I& i/ \& N5 l$ p: ]' f9 W$ V
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
8 x( T3 O5 R& K. ?$ J4 X
& z( T/ `" g/ Y3 B! B0 U$ [/ Z$ \12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。# y  l2 k" B  c: c6 @6 G
: b6 f4 W! W& i5 q  b2 `: m
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。7 z( E3 W: C. i& K0 _3 Q+ z
! o3 U4 s( c7 Z9 m, K* C0 y2 z
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
+ }) ]! b, S! H) I: C: G- e9 ^; ^
8 \' I" J  Z$ b0 i" L  p- t! t15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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