返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。: B# W" ]& T/ G* R1 n. {# {8 m+ J
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
7 G, K1 e/ N7 t; e( e# ^本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。0 v6 ^/ A' G! p
  G+ S" m  p+ {; S4 l) ^

8 B0 _* {5 x6 j  j问题
6 C" X+ V8 E6 e9 E
* q6 p/ \! [- l* ~: r  j1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)3 f6 Q) ^3 y3 g+ B0 I& _, X
' t( v( m+ n. I, e" ^
SELECT * FROM MY_TABLE
$ u, b# ~4 D. {1 z" h
! h; i" c4 g4 E2 \) @% [0 p3 n3 VA.如果可能,用把查询转换成存储例程
2 v* e+ s9 {. {6 v9 ?& JB.如果程序允许,给查询指定返回记录的范围! a5 K: {. u3 O4 B
C.如果可能,添加where条件. {2 k5 w( A1 a, E4 Q, r
D.如果DBMS允许,把查询转换成视图
: Z; Y+ B$ S) d# [- {0 e! E5 hE.如果DBMS允许,使用事先准备好的语句
& p. c2 A: n. P
  y' O0 }* X2 f
: q; B; t  O  e1 ~2.可以用添加______条件的方式对查询返回的数据集进行过滤?
9 d# O# r+ {+ l8 r( K
. ^: c, c2 A7 h  |+ I' G: H答案:____________: f( A" Y2 Q5 V! _0 ^, L, a
+ |8 F2 c0 u) f0 v
# N4 V, M9 I9 r+ U+ N
3.内关联(inner join)是用来做什么的?
5 G% m6 {' H  l3 B
" n. v8 Y3 M* M; zA.把两个表通过相同字段关联入一张持久的表中+ [% l- z2 Y# J$ E
B.创建基于两个表中相同相同行的结果集
1 ?5 j3 k1 y! y1 ?C.创建基于一个表中的记录的数据集
9 a* J+ u( K! Y9 OD.创建一个包含两个表中相同记录和一个表中全部记录的结果集3 C9 [& E( q" e, D6 c0 P% h) |
E.以上都不对6 H8 \3 N( n& b6 j

4 V( W) W+ Z1 O( c1 |; J2 P: H4 E3 [5 Y
4.以下哪个DBMS没有PHP扩展库?, H1 E5 h& @  M# R0 |

, ]/ g9 y7 L8 M( \: q3 pA.MySQL
. j2 l  Z+ g6 `B.IBM DB/27 M, n3 Q1 |  y8 ~0 l
C.PostgreSQL
1 Q3 ?7 d$ u8 F+ t$ K( f8 U, iD.Microsoft SQL Server: r: L0 t, E! e! \( H7 v
E.以上都不对
1 F* \( L" S! A' a, g
  a& `" Z8 l8 x7 T6 K
# P9 i1 w, f$ ]# \5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
7 L/ x/ {4 S  @* {0 m) }" P/ z4 ]8 j
<?php4 p7 @, r  E' R9 W& ?; l
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
& {; }5 @! J/ J: A' Z& W1 _0 W?>
8 i, T6 {5 C" G3 B8 v" \  L: w; _6 \8 n8 n
A.MYTABLE表中的记录超过1条" l- `9 y3 O- ~+ A6 n2 t( L
B.用户输入的数据需要经过适当的转义和过滤
# w4 H6 z, w* w( q+ s- k5 U+ eC.调用该函数将产生一个包含了其他记录条数的记录: ^& I# W) B4 d8 v+ a
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除0 `* U8 n6 [& Z  Y" B
E.查询语句中应该包含数据库名
' V7 ?! D& m+ _
! o7 B! q" G( s5 c; g3 J6 P
; m+ I1 L& t# S2 x/ O6.______语句能用来向已存在的表中添加新的记录。
  ?3 {* m' t4 i% i+ e; g! N. O( W  M# a& s/ x6 C3 c
答案:____________) a9 v( O# q9 E3 d: T
' M0 ]# Y2 J7 A+ g) L4 N. A

5 K9 Z. F; S: T8 s7.以下哪个说法正确?
  B0 Q" L3 h8 _8 r" n$ [2 `* `5 G( F5 c# H
& U. P5 Z4 C0 x/ {A.使用索引能加快插入数据的速度: Z+ A' l0 L; P/ r
B.良好的索引策略有助于防止跨站攻击' u0 \* r! A7 p- _! q, B3 H
C.应当根据数据库的实际应用按理设计索引
8 j, E4 z0 Q/ |; z8 R: |D.删除一条记录将导致整个表的索引被破坏% H4 c5 C  O/ {; n) N( C& p
E.只有数字记录行需要索引2 d6 s6 m8 {( `, f. Q
- {% y# g8 m8 ~6 x9 i
7 p& t9 k4 s3 P3 T
8.join能否被嵌套?: u5 w. U: _$ e. u& O
- k3 _3 Y6 y) r* Q1 U) K$ \
A.能+ x% C* P, ^$ p5 @% F8 E
B.不能( V: z7 D' l! j3 X2 b
) Q/ K8 m# @4 p# I+ l

& Q6 g# M2 M) V9.考虑如下数据表和查询。如何添加索引能提高查询速度?7 Y! ^( P# ]" z+ K* h+ K

; r, O9 R! L+ N7 HCREATE TABLE MYTABLE (2 U- O1 t# g  w$ I' a% O
ID INT,
0 _. T& f+ r6 N8 v9 i9 NNAME VARCHAR (100),  m; Z0 ]3 K( \2 q# N3 u" k4 @) `
ADDRESS1 VARCHAR (100),3 C5 g! u5 A6 A- M- O( K3 |3 f) K8 l+ {
ADDRESS2 VARCHAR (100),: R" W8 P  ]& ~2 Q" B% R
ZIPCODE VARCHAR (10),
- Y0 x) f6 j; \1 DCITY VARCHAR (50),
, T4 O) x  X/ u1 d3 RPROVINCE VARCHAR (2)
9 p: V. q' P) D1 s/ g; v) n& s)4 t/ y$ ~% B7 `1 W0 b
SELECT ID, VARCHAR
8 x) e' B& z( Y* ZFROM MYTABLE, ?5 p: q" l8 W3 `1 D" y: N/ p
WHERE ID BETWEEN 0 AND 1004 r4 G" l; g8 f1 O# l8 Y/ v
ORDER BY NAME, ZIPCODE
: L  d6 ~" t+ ^: U
. C9 M. f0 S7 |A.给ID添加索引
3 e3 W# ^; F# D4 MB.给NAME和ADDRESS1添加索引6 i& Z) o# ~! `) D% r8 Y3 Y
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引  E) ^% E" Q+ x/ d( o3 Y( _
D.给ZIPCODE和NAME添加索引
1 L% P& @! y+ R3 [6 z$ X3 \E.给ZIPCODE添加全文检索2 F1 |, X4 _7 Z& l' A4 E' y
2 N% o9 v7 d8 C9 S( q
% N/ [+ Z5 u3 H$ ?5 T+ ?
10.执行以下SQL语句后将发生什么?4 Y( C) P- R  b' p

$ e1 S! c) i: U" R) n% E( pBEGIN TRANSACTION
' B7 p0 I3 [8 w7 n* xDELETE FROM MYTABLE WHERE ID=1. o6 Y" h9 p+ l( x& ~: O
DELETE FROM OTHERTABLE
$ Y8 B. p1 C# n" KROLLBACK TRANSACTION0 V- R8 q/ s9 e- {- v  T3 ?, N; z
0 Y5 ?* ]' Z2 g+ c' S8 K2 [8 h. X* ]! \
A.OTHERTABLE中的内容将被删除
: O1 a8 r+ T; u6 T8 SB.OTHERTABLE和MYTABLE中的内容都会被删除
2 W7 A' X+ m3 Z/ {  h9 y7 p  @C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
8 Z3 L/ A# J) iD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
( U0 K+ ]0 O- k1 i+ bE.数据库没用变化! ~3 {. t! i+ W2 W

4 b( a; d, T) @2 c3 o0 r/ z: k4 F
11.DESC在这个查询中起什么作用?
: I. l+ D+ H6 A. o/ l
2 ^) J7 n- V) rSELECT *4 A% t1 V" Y# z$ x9 {! q
FROM MY_TABLE; D+ c) }$ r  g
WHERE ID > 0. G; [: v# P; L8 v' O! n
ORDER BY ID, NAME DESC) b) e* c, U. v

0 U8 n( ]9 l6 A6 `A.返回的数据集倒序排列& U' c/ ]' H9 c- H! I" h
B.ID相同的记录按NAME升序排列9 `6 m. F% S( m
C.ID相同的记录按NAME倒序排列
. G. _0 n. o7 u. @) R/ T! p5 U& KD.返回的记录先按NAME排序,再安ID排序
* G! P+ \% _) jE.结果集中包含对NAME字段的描述/ h1 G5 f! L7 U( U5 e0 s! A

8 b8 `$ E! F+ d& |
* O( ]& K1 K( \12.以下哪个不是SQL函数?
- e; }+ \- S) U7 X
0 k4 O6 m3 Y: b' }0 \2 m6 G4 f3 @/ FA.AVG2 c' G9 Q# E. f; x* G  x$ n5 t
B.SUM& `; ?. @; ?( A: X, a; [
C.MIN% U3 I. i3 m9 A5 j# V
D.MAX
# {! d  M6 R2 d$ k( M# P/ F. V( x* ~E.CURRENT_DATE()2 _0 w. i8 P- I$ q8 n
' q+ U. w  z: D; v7 r0 G5 J

( E+ r: l8 X4 Y! H5 v6 S13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?% |& [6 v' s( b" z7 _

: r  g' \& N$ V. aA.该字段必须有索引
# k8 ?2 d8 |/ BB.该字段必须包括在GROUP BY条件中4 q7 j, D9 L5 e) v7 L( I
C.该字段必须包含一个累积值' _8 g  j0 b, u# h: L( r
D.该字段必须是主键' T9 D0 R2 D7 T0 g0 D
E.该字段必须不能包含NULL值" z' N& q2 G, H8 J0 m
# a- C8 _& X3 X6 G" O
; O: }9 e7 ]' r' \$ n" j% q5 M
14.以下查询输出什么?+ o+ P& M, c0 h& D9 u5 M
- S- h: S+ m. f0 H
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
& x. W9 X' v0 W6 r# ^4 X& h' f: hON TABLE1.ID <> TABLE2.ID2 f2 `& m+ u2 h; e5 `5 C( \

0 S; L, T: D2 ~. l; D# {5 R- ~A.TABLE1和TABLE2不相同的记录4 {7 S" K1 {( m5 O5 j" c' p
B.两个表中相同的记录
6 T$ ?1 z$ Q$ n: w: tC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
0 |5 B) R' s8 C1 d4 U: d) xD.两表中不同记录的条数
/ @  h2 b' e4 ~( B! PE.数字2
% P5 l8 M. x3 r0 v* R* Q  A2 ~* G: K0 l* a$ K
0 L9 ?( x$ W" \4 \. ^
15.______能保证一组SQL语句不受干扰的运行?
3 B8 A, E- C& Z" A# @+ b2 e: G& D! T4 C+ m, Y4 _: }* J6 I
答案:____________" |" U$ Y9 a4 I: ~! C1 k

5 @9 M- B! q$ R+ B1 Q1 M+ \" b
; ^; r6 Y; y. O1 [- ]1 S: O6 {6 n( [+ \" o" i$ z
答案速查/ o9 J8 W$ E3 |
1:BC- H0 K9 c1 ]% d; }
2:WHERE: _7 `- D# o$ B5 T. v2 |
3:B' Z3 T0 B0 O9 x$ K/ n/ m' L  m2 K7 t
4:E8 f1 h/ Q- H+ x0 A! \
5:BD; n. Q3 s% ^1 v$ Y+ U5 F$ u' J7 r
6:INSERT
) x( `( M% a+ |" {" p7:C
. }) c" q. ?6 t6 z5 ^8:A
" P8 M4 r/ T. C3 f5 m" a4 o6 w# R9:C
+ w+ }; i) e! i4 ]8 H* Y; c10:E
! J0 `- V+ g# d4 `6 Z  ?11:C
  K/ r6 }' ]  u' D% r/ a" E12:E
2 H5 `) _* ~( b13:BC
$ y) f2 ?/ m6 G$ y) G/ ~14:C
0 E7 \( N+ I  ?" f15:事务+ y# b3 v$ l: {" B+ a8 c' D0 Z

8 F, z- b- a8 k; i- n1 P, p5 B
0 c" M5 {8 i+ P  A" b" I
+ s6 T: \9 X' V. q答案详解& j( \6 L8 I' H+ T6 p$ X3 a/ M1 h1 M  j
% e; V  o  E1 {
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。# \- i! r; p( G( h3 L& I* M

& y' _0 X% f. [0 f, T, ~7 @2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
. p  C+ A. a  [& C% E0 i" b" S! |( o- q6 Y' n+ e+ R6 J! V7 s
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
0 ], E8 d* i( f8 q, y
: U( i  R6 r1 O4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。" H+ l& z6 U6 ?7 S) m" s

7 M0 L7 h+ F) m( h8 D! \( P5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。' t: k5 t, X! e" @( y7 _8 K3 Y; e

5 G- U; ~" V7 g) i+ W& P6.答案显然是INSERT。0 O, G. o7 o  A9 o0 [# ?2 O6 h
' w2 t8 h: L0 U+ Q" i8 X& Y0 e
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
/ G* s# C* m( |( ?+ Z- Y, o" B. q3 W
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。; ?! V$ T( f, P7 J. n5 a

* H2 U( R9 i9 C6 l, B# \- z9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。/ q; b5 q' P( R: Q
/ T' f+ Q7 u" a( |4 Q
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。( U! L: d' \9 N" a
, E, u0 `$ \8 j- w' }
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
8 J- L2 P/ k" ]+ A& @' Q7 g5 r3 h0 F. {' V
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。1 T5 f' j% B& t8 B

3 ]  o  F" F, Y" j2 p9 o: T, {13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
2 U5 n7 W8 k9 e3 c7 V- m7 U7 u1 M* f1 [0 c. x; H8 h: X
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
% z7 X! E( v6 p% G4 T  n* G- s; k1 y, ^; W
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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