返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
2 d  R3 F  S" V& f' m+ pPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。/ }% B6 l7 o1 q$ k2 q! y: @. o
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
8 s' T5 M( ^' w% I  U+ ~
8 P0 D2 b/ P2 a) Q* H8 E" K4 g5 ?% y; H* N. j& f2 D7 w
问题
, N- K; ~6 |% o4 w4 O- ?! w' y+ g" v$ Q7 m+ @3 a* u$ h
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)3 i! R! V$ E! h* y
3 h2 u6 L6 Z) v5 P' Y
SELECT * FROM MY_TABLE
4 i' e+ b1 r7 k. T9 L' K1 }# q- p5 a$ o# C) N- Z
A.如果可能,用把查询转换成存储例程
9 I2 U% ^1 j8 ~0 i  P3 k5 [B.如果程序允许,给查询指定返回记录的范围
, _, E( f, k7 ^+ cC.如果可能,添加where条件4 v9 ]: g+ X+ Y% E/ x
D.如果DBMS允许,把查询转换成视图
2 {1 {6 A3 T/ F3 dE.如果DBMS允许,使用事先准备好的语句
9 [; ~7 E$ Q& c1 j6 E) c3 k1 S5 h6 {

: {* t" J; e4 s7 @$ e2.可以用添加______条件的方式对查询返回的数据集进行过滤?
( R7 b7 A6 O8 S& Q6 `* c) G9 w0 \$ C
8 c3 }+ ]: m/ g# N6 {: e- @" E/ k/ e答案:____________) _$ N* p. T; h  }

8 X1 ]7 X( f+ w3 W# X
: z1 Z: B% O) G% E. P+ `$ d+ G3.内关联(inner join)是用来做什么的?9 P$ M# S# m; u9 _
$ O$ M# |- e1 C7 O+ W1 x5 f
A.把两个表通过相同字段关联入一张持久的表中; x( k  X& A1 B# I& \3 ?
B.创建基于两个表中相同相同行的结果集: Y& Q) x) n! l" I9 Y6 y8 R
C.创建基于一个表中的记录的数据集
1 C- A$ {7 Y# aD.创建一个包含两个表中相同记录和一个表中全部记录的结果集, D) w) }: ~; Y& x+ ?; L6 ]2 n
E.以上都不对. L# l( d: ^# S3 O

7 I5 P" r6 M3 x" o  |* T0 K- Q8 }
4.以下哪个DBMS没有PHP扩展库?
8 E$ m$ n% t0 ]  o: k$ l6 @: ?( Y  I9 R* E* @" }/ E
A.MySQL
: r8 w  B  F9 l/ m! G+ LB.IBM DB/2
1 s5 G9 C, o7 sC.PostgreSQL1 Z5 W( ^* p0 \9 o
D.Microsoft SQL Server0 X( }( x+ v) x4 k  R. k
E.以上都不对
" Y: l9 Q- N/ A* y1 ]
! }# V. o. u+ y9 D* `) U) R
% W; Y4 D; r2 f# `2 J/ P5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
! }" D$ T. R; v" g7 m+ z
: B# Q8 d. K/ l# U- d3 K  d$ y<?php0 k; z4 ^8 s- L: j) K; a7 G
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
/ e) Q1 h9 }5 ~3 ~2 R. B?>
2 n7 @& x( o4 Y' _
+ V* a, q6 D8 }% U  o/ l7 h; \A.MYTABLE表中的记录超过1条1 I' n+ Q+ _: b# k
B.用户输入的数据需要经过适当的转义和过滤% W# c3 F, U/ E$ M3 r
C.调用该函数将产生一个包含了其他记录条数的记录
! T# r- h9 b6 G+ w$ [( `D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- e( S% P! Q$ K* Q1 b# L2 lE.查询语句中应该包含数据库名8 g2 y1 f2 {* l2 S7 Y" n7 Q
& n- H2 I, r+ ]6 p3 |$ `8 P

$ [" g, ^8 ^; \, B0 g( R6 j6.______语句能用来向已存在的表中添加新的记录。2 [; t7 C- U5 M0 w5 t4 U8 p
4 r2 o: S0 q# W
答案:____________# @9 F$ \. D& i& |# x- r

. Z4 Q& B$ @9 h8 R' h) O7 o
. i: V+ T7 {" t0 {7.以下哪个说法正确?6 ]5 ]: U( ^9 ^3 s: m$ Q; `7 R

. m: a5 v7 e: UA.使用索引能加快插入数据的速度- P9 P$ J0 G  c8 o2 O
B.良好的索引策略有助于防止跨站攻击0 i# @' Z4 @0 A: e6 Z
C.应当根据数据库的实际应用按理设计索引/ V: T3 g' D8 h  w
D.删除一条记录将导致整个表的索引被破坏2 n1 g6 s  Y2 k% p8 E& ]& y6 ^5 S
E.只有数字记录行需要索引* c( R% n5 g0 l: u$ a! ?1 R
* h/ E' L& u, n  H9 V) i7 P
2 Z: ]( w2 \* f
8.join能否被嵌套?6 I: B) i* t) L% H

9 J5 r2 u: W. T; Q' X4 f5 mA.能# A% ]9 ]- T, b$ S* h; y
B.不能
6 P- [- R, C$ T) a0 J- R" z  r7 _0 G3 p3 K$ O/ c* V7 c. g
# I9 }( {- b/ @) O; R. I0 U
9.考虑如下数据表和查询。如何添加索引能提高查询速度?) d0 L; H! v! i+ H. o, k" V8 g

( ~5 u' D" x2 ^2 p6 ^" \CREATE TABLE MYTABLE (; I- n3 U2 A# t" M! H: H
ID INT,5 I: e% T' j0 ]( T. u0 X
NAME VARCHAR (100),
" s- y! l6 L4 R1 HADDRESS1 VARCHAR (100),
. e' O# g+ @- J- @9 hADDRESS2 VARCHAR (100),8 u$ U; b, Z+ j3 l
ZIPCODE VARCHAR (10)," z9 o: G0 u' z- [7 ?' c; Z
CITY VARCHAR (50),
! g8 j0 f' k; _9 w( R3 C) fPROVINCE VARCHAR (2)
* k1 e* G; [  F6 o* j- o; I, x)
2 j+ @0 u7 P& K+ {# E2 M( M& x$ ISELECT ID, VARCHAR
6 v! U8 t1 Z1 A9 O6 MFROM MYTABLE  }; ~& i' g- o$ a" b# `
WHERE ID BETWEEN 0 AND 100
, i3 a- J) i+ c2 A- iORDER BY NAME, ZIPCODE$ v" o+ }' D, M
0 P9 i+ ^9 y- F$ }
A.给ID添加索引
0 D- ^3 |5 b1 v4 ZB.给NAME和ADDRESS1添加索引
: _) H+ r5 e1 m  B  U3 K5 T& |C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引0 J" d! Q' F% |8 x6 `2 `
D.给ZIPCODE和NAME添加索引4 w, R4 E' _& U6 m( k7 [
E.给ZIPCODE添加全文检索
* ?, t; i7 o4 H& V1 K- L
, l2 \0 c2 y+ @1 v3 s: T
9 Q9 v( h  A8 M6 S10.执行以下SQL语句后将发生什么?, V& ?  O5 N) z: u& D5 R( [4 `, i

) k7 _5 @5 l* u( L6 ]- [/ v* BBEGIN TRANSACTION
2 U: }, E. ^/ Z) \DELETE FROM MYTABLE WHERE ID=1
0 e$ z$ x) Y3 c( v: @/ _4 J# ]4 B4 YDELETE FROM OTHERTABLE# v" ?& i+ ~$ z6 B# L
ROLLBACK TRANSACTION) c8 v$ ?9 n! k* l/ v* W1 I! C( n7 d' Q

& \4 Z) f: H( W. L; eA.OTHERTABLE中的内容将被删除
6 V9 x6 o. y4 @# AB.OTHERTABLE和MYTABLE中的内容都会被删除1 d, V5 J$ t1 ?# I
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
) D' w2 A) Q  W6 T6 F3 RD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
. Z" Z2 \* P% UE.数据库没用变化8 j) i4 y$ J( A. k  i8 h% T0 b% O

% b! V# b2 {& P6 k2 K* r1 S3 b8 X( p; K7 s+ x' P
11.DESC在这个查询中起什么作用?' G* m, Z) R, l* a: m' h
/ z& ?3 p) i# I
SELECT *6 w0 A9 A3 k* o6 H1 h
FROM MY_TABLE1 ^! |3 p6 Z3 i* H* I5 _
WHERE ID > 0) f9 F3 I7 g5 j- D9 R
ORDER BY ID, NAME DESC
* V! d2 Y) E2 w7 l  e$ x8 n, u0 V" k& L
A.返回的数据集倒序排列; U2 K. T& v! n
B.ID相同的记录按NAME升序排列2 P9 E' F$ X. W: q: ~$ m) Y
C.ID相同的记录按NAME倒序排列
; l, p0 p, H  |( A4 Y; K: b, ZD.返回的记录先按NAME排序,再安ID排序- y6 J: Q) K: p2 A, V( Y8 ?  ~
E.结果集中包含对NAME字段的描述
3 D8 z0 T! `2 p. }( d1 U  G
6 D5 ?8 v8 C% T5 K3 N$ ?7 k, o. S: `3 T5 M* Y8 X7 J- M
12.以下哪个不是SQL函数?
( q" G$ ^3 e( F9 X# y5 _' A# R6 _3 g3 @& P4 M
A.AVG
, T  p# |% o& BB.SUM
% h& v; @- v: GC.MIN" f. |+ ~. ~6 o
D.MAX
* D* u, J: H) u) ~0 Z# a% SE.CURRENT_DATE()
0 c& ^) M  G% R5 p, x9 M, H! t* M7 W1 Y5 m4 P" e

  X7 L3 j5 S) n4 X! J) ^4 ^13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
) n6 j( b" N4 [# h$ p
1 ~  J7 @/ v5 B& eA.该字段必须有索引' O. Z8 n1 ~% r7 D
B.该字段必须包括在GROUP BY条件中
4 g9 Z) S4 W0 ?: v# Q+ SC.该字段必须包含一个累积值% f( d7 ^. Y& c( y' E5 f
D.该字段必须是主键, @+ i' N: X1 q- o
E.该字段必须不能包含NULL值6 V* T3 P* a4 @5 L' Z
; c* N2 J2 k* }+ o) S- }
% M/ C9 M4 b* r1 |8 u/ H
14.以下查询输出什么?! i1 @2 j) z) B+ X# @6 `$ G' V+ H

5 K* N( Q( F( U, y2 _4 X& ^8 ~SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
& t. ]) ?8 X# G; F: g( f8 R: PON TABLE1.ID <> TABLE2.ID
# d; a2 O) Q% w7 R
: d0 `! U9 g. Q5 [9 PA.TABLE1和TABLE2不相同的记录9 M) w! o9 K0 ~8 ]2 H. i
B.两个表中相同的记录
6 ^( L& L0 w8 D/ _) D( H9 lC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
4 x1 J2 b$ {7 o  p4 j8 t9 ND.两表中不同记录的条数3 B$ }+ d4 w, ?  B6 c
E.数字2* M/ {, z3 E5 C% c
' i# H* r" h% n$ I
* p. ]  w3 T% ~  }5 C
15.______能保证一组SQL语句不受干扰的运行?
8 d+ s' O+ }. t+ ?, f# H& Z: z, q% X) a' Y/ u4 L
答案:____________
1 ?  Q3 o) Q! j/ [, `" a! c0 P/ l" v0 b- G  v

+ p) z, ]4 A1 u1 k7 z' W6 e% c6 W8 f% F- W& r5 f
答案速查+ E  M& P5 A  p$ T% E% ~5 r
1:BC4 W' d/ X1 I7 a5 [6 d
2:WHERE0 z7 w' [) s! b/ A7 L) o. s
3:B
7 t# b; H4 W) g* D4:E9 ~  o+ H* V6 g9 B% b2 Q3 H' T7 S: z
5:BD
% M; R8 ^9 W* w6 @9 A: N$ w6:INSERT
3 \1 a9 Z0 f3 N7:C
$ \) y" Y5 e: O8 D' O, Y8:A
5 i6 ?6 f: R' q5 A# t9:C
+ b8 x' y* v8 t! y6 o$ \2 u0 u10:E0 R. R+ D9 v* q8 w8 L
11:C
) b' l" b2 C4 M, h, W- u12:E- g/ J7 v* W3 a+ b+ Z
13:BC
" I4 ]- w" u0 e' h- Z4 v( m) J; \14:C8 ]+ J% ~  c' P5 \( f1 E  i2 i2 Z$ {
15:事务+ j0 |# D7 |4 a* l3 W: |  t, C6 |, }

( m% F0 U: b) V+ ], _. V7 w  |! ~( ^, C* a

$ Y, X6 n, F$ P7 J! l5 G答案详解
/ ?' |* Y5 g" n, q- {" v, |9 C1 z1 x% K6 X
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。' G3 G8 _% M2 h. L

1 k. w: o2 y  N0 v! y3 u3 c2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。/ j# K: [% V9 v' T" n) S$ Z( Q' J
0 g$ B  n" b: q* ]
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。; L) f0 W4 Y' G! T# }' e+ w% {; \

! C. j& Z7 }; _6 g2 e9 _4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。" s% U7 W0 o8 i: _& A- D

  v' A6 ^+ U. Z( ]1 j2 \5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
$ e8 k1 t5 K2 v" r" G' ^
9 W' i) O. l8 W! n6.答案显然是INSERT。9 u5 R# |/ b7 ~" s
" Z5 [/ }- r% ~( J8 |: h
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。" a& ^6 A9 ^7 }+ u0 w5 h$ x
0 G: k9 G4 c' {1 E1 S3 x8 t
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
5 e% B) h4 {/ h5 R5 ?2 \$ |
: U: Y0 y% B$ x& j/ h/ O& Y9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
( G: [  s  D- Q: n) ]
3 b+ U; W. s: ~$ Q0 _4 B10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
/ o, K0 |; _& `' a! O( b1 q! ^7 `$ X: E. E; o4 K5 Y( d
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
: f- r5 y- j, r0 Z3 ?9 f
6 J/ Z( T2 h# S- d12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。5 ^1 W' b  _: T9 ^% m

0 o- k) F3 o) j+ P2 j( Q13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
: P0 A4 `: s5 [. j0 N
: ?! \) h0 u/ }$ H3 x14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。; w- q5 r  x. ~+ K" t

+ h  O! t% i7 C" Q# Z! B15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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