Board logo

标题: [Zend权威认证试题讲解]第九章 - PHP与数据库 [打印本页]

作者: admin    时间: 2008-4-17 14:44     标题: [Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。( y- B$ Z7 A" c
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: P1 ?3 _+ g: e* l" J& Y8 ^/ V; ]( L本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ A. M) ^% {/ g1 G/ e6 E5 ~
, Q2 \5 e0 r  U* G$ D* S$ B- Q7 {0 m3 m( M! W  k# ]+ G
问题
$ K3 O& R$ P5 l0 P& h) X& y; N# ^. D: v7 C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
% i: |8 F& @5 n. p8 {: ]1 H# H
& M- B3 D# [) t  x3 D/ ISELECT * FROM MY_TABLE3 Q# R" L6 f  T* J

( M0 z8 z, @3 p$ a  zA.如果可能,用把查询转换成存储例程
" n: N" f$ r& ]% B8 z. y# ^* tB.如果程序允许,给查询指定返回记录的范围
( Y! Q1 e0 ?% h. oC.如果可能,添加where条件
! K. N5 y( m2 b5 rD.如果DBMS允许,把查询转换成视图# y5 |" p! D" p1 U
E.如果DBMS允许,使用事先准备好的语句+ E: q8 A9 ]/ G8 o' _

$ u0 x" k9 Q3 ~' e1 ~. {* E' J2 T2 J2 t+ g  s
2.可以用添加______条件的方式对查询返回的数据集进行过滤?7 S# L% t9 U  j9 }
  b2 k7 s5 P' V; h/ _4 q7 z
答案:____________
8 i  d! S! y9 l7 c0 t8 |  B2 ?" |3 |8 S
  ^6 Q! w. G* ^9 B
3.内关联(inner join)是用来做什么的?. k# }' L) x* k4 G, `/ ?8 r1 v( [$ u/ |
5 c& Q" I* H! w, k; g  b) A6 g7 `9 E) f" E
A.把两个表通过相同字段关联入一张持久的表中  Y* V: L% L" \4 Y
B.创建基于两个表中相同相同行的结果集
5 J. g3 x( a4 v, eC.创建基于一个表中的记录的数据集3 M3 N. l* K* L: I) w; H; `
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
5 @: `4 I$ W% U9 d' ~0 Z/ ]: W* fE.以上都不对* O0 G" L4 ?" r" B+ v
# R! G( Y. P! l" C) Z- g

% I! y/ [4 k6 S& E+ i& X$ P, G/ O4.以下哪个DBMS没有PHP扩展库?4 |+ b$ G6 i( N; i/ E6 x# y( M

$ o5 `" S3 j) x5 M! oA.MySQL
, H. w% d3 k# m. _) e: F: ZB.IBM DB/2
9 B4 w: B1 d4 E- \5 M# aC.PostgreSQL8 F) R. @0 z3 O( ?
D.Microsoft SQL Server
: c( C' T0 J  R' g& ^9 X& FE.以上都不对
$ a. \2 `5 q+ O: w' n+ c# i0 j9 n; F% b. v
1 p9 @7 G8 `& D7 y6 B7 f
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
9 F3 q1 m' S! z8 G3 d! E) s& R
) A2 `6 R2 b5 n/ D<?php
' T* O8 \( u' v$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);1 M# ?* q* g8 ]. Y$ r, U
?>
1 [$ X* \$ t& A" I9 [& O; O% N
' {; u+ r7 t9 n% }, P" tA.MYTABLE表中的记录超过1条8 G) ?6 Y7 G$ f6 `
B.用户输入的数据需要经过适当的转义和过滤
/ H- P8 ?9 E  bC.调用该函数将产生一个包含了其他记录条数的记录
! S" t" O; O  b3 N6 l+ qD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- ^( J( R: N" G( v9 e0 S( f) h( O" {5 sE.查询语句中应该包含数据库名
6 M& P" G4 i8 F  U! x+ C. b% f# S, w& c

' z1 \: S5 `9 `* H$ C; j6.______语句能用来向已存在的表中添加新的记录。8 r% P( E; I1 q* f, \
9 ^  j+ Z7 \, V) I1 I8 ^+ y
答案:____________; L* b- |, W8 y' w* m$ o' q3 z

+ K& K3 e9 z7 i' C; \: e4 b& V
- H9 P$ T3 M: \- f% K9 u7.以下哪个说法正确?2 l& S8 X! g3 M+ z1 d( G' l
9 R9 Z- c! ^/ _% ^/ j
A.使用索引能加快插入数据的速度
8 e9 S% i' U  b; Z, }B.良好的索引策略有助于防止跨站攻击
" E; `$ N  A: k3 l: v% KC.应当根据数据库的实际应用按理设计索引
; d+ F6 t# c3 ED.删除一条记录将导致整个表的索引被破坏
- d3 J/ |; h. x# I: w+ a4 gE.只有数字记录行需要索引
5 Q) V. {  a; @/ e4 O, j0 ~
4 B& E% Q+ ^; V2 ~; |" a+ D3 \
% O. r( i$ g6 n5 d, m- D0 V8.join能否被嵌套?- q( P( B9 n* ]) B

1 J: J% b( \1 \6 M3 \/ O0 j9 KA.能
- h8 d4 z2 n$ m. s) ^8 N0 W) zB.不能9 j# W, f: R8 K! ~
7 ^, w) |9 M0 Y7 b

8 N7 Q& P) H7 f9.考虑如下数据表和查询。如何添加索引能提高查询速度?6 H/ {! Q! |; S) r/ |9 A. @( T
  R" [5 x) d1 p8 G, ]& l
CREATE TABLE MYTABLE (; |+ |" n8 ~: h) H; P
ID INT,
& S/ @, R( A( |1 p) CNAME VARCHAR (100),  f3 ~9 v5 m" o: p. J. D
ADDRESS1 VARCHAR (100),
, {1 Q) g7 G( b$ Z& L2 M) e% vADDRESS2 VARCHAR (100),- }2 U1 R9 @* A+ o- t6 F! {1 \
ZIPCODE VARCHAR (10),
; d/ N6 S$ A3 E: |) T) hCITY VARCHAR (50),7 p+ N! a/ C7 L/ Y  X$ {$ |) }4 o
PROVINCE VARCHAR (2)
) D- C! C/ A# H* i9 t# Z)* E- c! N0 l/ `  s3 J( F
SELECT ID, VARCHAR
' ~$ d$ N/ h+ P7 t7 d! Y3 LFROM MYTABLE4 g; c, ^9 b, B5 s  ^9 q) f
WHERE ID BETWEEN 0 AND 100& I7 g0 c2 t' ~8 u0 Z' v& U
ORDER BY NAME, ZIPCODE
# M$ [1 f6 ]; k# v5 ?7 b! T3 x: b) `( F1 e$ J; C3 u1 g$ F( G' i
A.给ID添加索引) u6 r2 |) S+ z  F
B.给NAME和ADDRESS1添加索引
+ }5 Y# _+ k* X. t$ T0 {5 TC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引( E1 i8 x' v# b  R. W3 s  R
D.给ZIPCODE和NAME添加索引4 N5 H* Q3 }8 _" Z9 O
E.给ZIPCODE添加全文检索9 d) A/ F$ F' V' u" _" i
7 X$ G* t+ ^0 w2 R" \; P2 X  c  e" g/ j* `
# D4 q$ Z( G7 d; i  ^
10.执行以下SQL语句后将发生什么?
% B  Q4 l" g* {& m& }0 U6 z6 W- n5 y1 R( ?4 Y  B
BEGIN TRANSACTION/ {7 _! W7 o: s; `% [, _% p
DELETE FROM MYTABLE WHERE ID=1/ d" \* {. o: D- T
DELETE FROM OTHERTABLE/ y) m7 e: I0 Y+ w& n0 M7 c
ROLLBACK TRANSACTION0 w6 _2 A/ g" F" m! S3 w1 w

7 ~) B/ d7 w1 q' \' z5 M3 ZA.OTHERTABLE中的内容将被删除
( ~' U9 B& A8 \3 g+ z  ZB.OTHERTABLE和MYTABLE中的内容都会被删除  S: [* S9 C6 w9 C5 D
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除$ ~+ r4 P; y0 t* W
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
' i( [& O$ Y6 r6 T* ^E.数据库没用变化
7 v8 B! }; T$ K. N( W9 E/ K2 q8 w. B+ d  E

8 O1 Q% [% J2 O5 l4 J11.DESC在这个查询中起什么作用?
; }7 m7 l+ g' k- P- v/ I; t, F" e5 B2 N" s
SELECT *5 z4 M! j) F9 o
FROM MY_TABLE
/ U% A' I" S2 {WHERE ID > 0
9 B* W: _$ v+ q& R0 Z' ~ORDER BY ID, NAME DESC7 I2 W# w1 b8 q
1 X- [2 o+ i8 v+ K
A.返回的数据集倒序排列8 H# A( E* [( N: ]8 @# {7 o
B.ID相同的记录按NAME升序排列% d# s- Q9 c4 c3 ?2 K
C.ID相同的记录按NAME倒序排列" f2 n( E" H/ n* T$ B# O% [! P
D.返回的记录先按NAME排序,再安ID排序1 [  j* ~$ c& p4 }0 {; z9 _
E.结果集中包含对NAME字段的描述, N) x3 A% ~; U- z5 D

1 V8 O7 D6 c1 S. Z- }" ~- g. b* f; x* l& |
12.以下哪个不是SQL函数?1 r" M4 B& x3 R+ g

7 w2 b) y+ _9 aA.AVG. u% {/ p$ @/ @; e
B.SUM, g8 I3 ?" M2 i: d6 \* ~
C.MIN
0 l/ p( s9 y+ Y* M/ k+ e# YD.MAX
( X. K3 Y9 A  Q$ z; }8 PE.CURRENT_DATE()/ ?6 \2 I" b& ?. L2 s
! V/ g9 D; P( ?/ t$ {& d

4 y5 b" [8 f, \$ n) @, [0 p13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?& Q& ~  @2 b* g# K8 A, w3 X

& H3 ]1 e" S0 r/ EA.该字段必须有索引
, y5 k5 r6 Q2 Q* i$ X6 oB.该字段必须包括在GROUP BY条件中
* n, J5 P" U% \& Y( G: vC.该字段必须包含一个累积值
) w; _6 G5 Y) P8 |3 P6 Y" _: N( uD.该字段必须是主键
( r* C9 Y' W( d1 Q! H: mE.该字段必须不能包含NULL值3 e* c( L; K/ \& e. Q
3 v! J* z7 G( u
: N1 m2 e0 y1 W0 E+ ], N' q
14.以下查询输出什么?
# F0 B/ h; }% C4 j) r( _8 B
9 Q# @6 R" k* i  i+ a5 k4 a6 G6 fSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
4 P  d+ u2 p- C5 oON TABLE1.ID <> TABLE2.ID
) s+ ]' l# o+ N7 f+ |
$ _; @' V$ P" C2 LA.TABLE1和TABLE2不相同的记录8 [0 _# E0 r; @# R1 h" I) L$ t
B.两个表中相同的记录
7 R) W1 G8 h: fC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
# C$ w9 b3 Y! I/ XD.两表中不同记录的条数) c+ x' ^2 b. T1 q
E.数字2
  p' j! G8 ~7 G9 D6 k4 x
0 Y( I9 \( y, C2 i$ B! q" J; [7 W& L0 n* ?9 d( z3 z
15.______能保证一组SQL语句不受干扰的运行?
/ v8 s. o. t) e. b7 @7 ~( `
7 o$ `8 f. _8 z5 G' D8 H' v* l答案:____________
$ `- T# M$ q) \% m- B9 H* I! m1 I2 p/ Y7 r
: d2 a3 ]  H: t/ o3 X
) H$ x5 `9 L6 {; g# h
答案速查( A/ v7 g7 H6 A9 i0 D5 \5 @
1:BC
, B- b" D( {5 m/ S/ ]- a' p3 T2:WHERE, j* P7 C# a7 n5 |) d
3:B; J6 T( X0 ^9 t* B, N" V% j: U
4:E# j; @$ F5 t+ y# |% W
5:BD
' n% C6 r% z' i0 v; ~$ w( l6:INSERT" _; {& h* q( V& V2 e, \! h. O- O
7:C
1 |: D1 l( A$ e4 S- z. D7 @" @6 L8:A
  u$ c( d) @; U6 O( a. d9:C- v0 X6 Y- `- v) o
10:E
0 k; ^2 U7 ?/ C- K2 ]9 Q11:C% W! D% n8 O; h; K8 A! L
12:E: g' d5 @) X* u/ q) e) L
13:BC
: N5 e* C$ U$ x9 H# Z3 D14:C
' _! e3 _5 A( g+ W# n2 _15:事务
, e6 L+ {! V' U. Q1 v- Z
7 Z  r, P8 d( `6 k
6 n/ s  f2 x" I6 F% ]$ B5 j8 @: c) e  h/ D, @1 F8 g
答案详解$ R+ ]" K5 n  [# b
2 m5 j/ k; L3 l3 q% y3 P5 [8 i
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。, [- R+ h. A3 \. }
/ C& G, y, N" G, X4 ~
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
; e! X5 Z/ u9 m3 ]" p# v& n$ D4 _9 i
2 a" T5 s& j3 }6 M4 D# y% C0 o  o9 c: b3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
8 y/ |- U8 s' s+ e, D2 r4 |7 t! }& y0 n2 Z
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 k( @' a/ Y7 Q* K" b% ^+ r( i9 ~$ R4 h1 C4 ~6 y/ _
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。. i% ^7 x. H6 `7 O( d2 f
+ ^3 a9 h# ~3 k! ?+ U+ {
6.答案显然是INSERT。7 z9 e, G# l6 |

  M, p. u* I# Y  u- D$ r7 a7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
- f  A/ N0 t8 Z! u8 d+ @4 W
4 }  \- ]5 O9 \6 @& G1 m$ j, q& k8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。$ o0 G$ V% D) S+ o. T

9 A5 q5 ~. [; [6 F; A9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。( [0 z1 z8 `) K3 }- f6 Z
7 Y/ ~' r. L+ W: ?5 g: t9 G
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。! @) H- c) h" ?% c
' n2 k9 X. N8 _! j/ i; Z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ Y* _3 c: A$ @! i- K. ]& Z0 [3 C6 \' Q% B
0 g+ ?/ k" h% Q6 v) [12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
+ d2 F( n) ^( c/ [% u! a4 d& G& j( E* A9 l( {
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
; b. v6 R  p3 f0 I5 _) p) n- Z+ A8 D; I, Y( x# z* D3 F
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
* u1 j9 ~$ J( m$ R- o5 n5 m& U7 W0 u/ D; C
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2