|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14433
- 金币
- 2502
- 威望
- 1647
- 贡献
- 1450
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。/ a, s' O8 D; b* R3 u. | j
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
1 f* k" y" P. i本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
+ R; _ h7 ]: d8 V2 H- Y6 E% B; x/ ]3 M6 A
, {/ H3 C- g) `
问题9 a9 |; C& i. @1 |, i: L
8 f" Y" q/ O% }; A; G1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)+ y E5 r. H/ P% u7 C
% g) L' f: `* J& l6 N8 PSELECT * FROM MY_TABLE Z6 h# r2 W+ j( g' d
: o5 _& K9 p4 o# n0 O( i+ J! s* O" `' xA.如果可能,用把查询转换成存储例程
& k. Z7 c4 G4 V' fB.如果程序允许,给查询指定返回记录的范围
5 ^: H! k A. B0 aC.如果可能,添加where条件& P9 @# G* D5 @! c* _- z; \
D.如果DBMS允许,把查询转换成视图, }, T8 R* x. V8 |2 j7 l- u+ _' t
E.如果DBMS允许,使用事先准备好的语句 u, U+ C1 I' q/ P
% T! K/ D- C1 o# {0 y. d& L9 d @
1 t z5 I* _2 Z2 i" {; g* }# O$ v2.可以用添加______条件的方式对查询返回的数据集进行过滤?# `2 c4 z; J3 _0 S' b
& ?3 T# B: J- q' |" {答案:____________3 S5 s( p. z& N" n. K1 a/ C. x
5 B2 d6 Q9 B4 u' c0 p3 l" V# x# U
- _" x0 h- M" t9 ?" I3.内关联(inner join)是用来做什么的?; ^1 q9 @: o' r6 p7 Z8 X
2 o: n; |$ S+ m/ c, t. _4 `6 |A.把两个表通过相同字段关联入一张持久的表中
: O4 R* B. x6 \5 T& lB.创建基于两个表中相同相同行的结果集5 {) y+ b3 v& ?8 D0 { Z. K3 p
C.创建基于一个表中的记录的数据集
' h8 @7 F+ ?9 J# ^2 m' L9 `D.创建一个包含两个表中相同记录和一个表中全部记录的结果集, ?+ w$ I; |: Z/ a0 l
E.以上都不对3 ]4 L3 C" ~9 \1 p
& d7 J* d7 x" `+ R
, ]5 y, x& q8 H( r+ A* f8 o4.以下哪个DBMS没有PHP扩展库?
. `/ @7 |7 A! w- B n3 V l! g" s1 B; k( h/ a- y. M1 Z
A.MySQL1 X% t% {- Q' E- y. Y3 }
B.IBM DB/2
: J. S) A Z/ f7 T% z% x: vC.PostgreSQL
/ Z. O8 w9 s1 eD.Microsoft SQL Server
A3 e; S s, e+ x$ M y" vE.以上都不对
( J: b+ c, G6 V. J6 @3 p7 | E* w
/ v( P* @5 n/ J [% f% i3 ^
1 Z! {7 J; {- C5 j! g5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
8 s! K$ V% @5 g
- {/ L2 t# I! Q# b. K; ~+ ? P3 V1 z<?php
5 u4 p2 @0 @, S6 E$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
/ Y; L' q; \7 O# S" R?>
, ]% p8 t% H3 A1 Q2 P. G! M& n& i/ G6 l; {" m1 p
A.MYTABLE表中的记录超过1条- B3 W4 ]2 l1 k0 M* X/ i& `
B.用户输入的数据需要经过适当的转义和过滤* u# \+ ~) H, L: f+ Y
C.调用该函数将产生一个包含了其他记录条数的记录
6 \' }! O+ I+ I, fD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除/ K2 d: \$ F" K0 x
E.查询语句中应该包含数据库名1 y# Q& D( i7 ~ I
% X) e8 N8 P: I, e w F. O8 A9 o. ]& P, R5 D& l4 O
6.______语句能用来向已存在的表中添加新的记录。
" L5 P; r' ~8 e7 a0 H3 e0 K* f+ F! J. A3 n y* D
答案:____________8 E& q4 E" A" h& g4 B. q
# q. f* B; C* \& d2 ~
4 p# a* Q% [; |2 r" D' ?& t8 {* d
7.以下哪个说法正确?
& n9 ]/ q5 e# b5 t3 T: N- ?) }! W2 T) I/ F
A.使用索引能加快插入数据的速度5 @: n0 |2 D/ a$ B$ F
B.良好的索引策略有助于防止跨站攻击# H/ z7 T3 N! M' V9 \& l/ |
C.应当根据数据库的实际应用按理设计索引; g* _/ G9 P5 ] K, Y
D.删除一条记录将导致整个表的索引被破坏
. u6 F$ K) H _E.只有数字记录行需要索引
$ \. X: B7 o6 F- Z) F% I T4 R9 {
' E T1 n/ h, r3 \+ H
8.join能否被嵌套?
7 l+ g3 |! i2 U
2 A% |; V' f5 [5 e' t2 U& LA.能4 C' r$ x& S( _# R
B.不能
# s" |1 _8 t5 M/ O: r6 y% v0 o2 a, u6 B- J. q# H
( ?6 r: ^! A2 s8 R5 w9.考虑如下数据表和查询。如何添加索引能提高查询速度?
, N s* v4 {8 T* v1 V G# y5 K' u8 G K* ^; Z. h( H3 |9 F" |3 b
CREATE TABLE MYTABLE (
7 ^: W. `7 Q) z; R" X; VID INT,+ @) y: g# \: {( t, n
NAME VARCHAR (100),/ A/ a6 A0 O: S' A
ADDRESS1 VARCHAR (100),* Q3 b, @' z8 w7 H( G4 o& S* E
ADDRESS2 VARCHAR (100),
: ?5 _- F9 ~2 u6 p5 [' \ZIPCODE VARCHAR (10),! a9 D: S: a+ C! d- n" ]5 h) X
CITY VARCHAR (50),
, ]9 U |5 z d# _6 T6 aPROVINCE VARCHAR (2)( q/ O* K( k, V9 @ R
)
: D6 |6 y; N3 ~. NSELECT ID, VARCHAR6 s0 l) N4 ?) x& g: ~" K( R
FROM MYTABLE
2 U' M' v. T+ zWHERE ID BETWEEN 0 AND 1004 c+ |6 m3 {! L. D
ORDER BY NAME, ZIPCODE0 z: I k+ e7 t* a) X
1 D- J# x Z) z2 d; k
A.给ID添加索引! M; T# D* ^- D( n7 z4 B3 V
B.给NAME和ADDRESS1添加索引6 t: _5 F% F1 N* H8 _
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引% l N5 B3 b! v+ ~6 c7 s6 t! X; s) y
D.给ZIPCODE和NAME添加索引
( H! e1 {# |0 K9 x k! tE.给ZIPCODE添加全文检索
" |$ A. W- ]0 Q1 J) G# X7 \' [+ m3 Y- L7 ~
" C0 |3 ~3 S: V+ o9 U& A10.执行以下SQL语句后将发生什么?8 k$ s# p9 y' b2 d* e
4 b; R& R9 i9 n4 {& ], P3 ]
BEGIN TRANSACTION
6 |. G+ _- ^7 JDELETE FROM MYTABLE WHERE ID=1
: W: s# _; j2 K" RDELETE FROM OTHERTABLE
3 U1 c' H, l! H# h8 N) v7 S( {0 vROLLBACK TRANSACTION. `6 T" [( d* V Q3 k
7 k1 j+ r& h* xA.OTHERTABLE中的内容将被删除
- I# i) G. I% q. Q% |' D2 d. @B.OTHERTABLE和MYTABLE中的内容都会被删除. w" }8 w9 a* ?& ` R
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除& T) {4 Y9 T- L. {5 P
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化: y/ k( \0 M6 H# F {! [
E.数据库没用变化$ Z$ ~+ l- a) u
4 k0 U& g8 ?7 N) g. ~
; y" Q# `* t# A8 C, E11.DESC在这个查询中起什么作用?8 v3 s+ ~7 e% k' J
* x: K$ A" |% \# }! }SELECT *
) h+ w/ M9 q7 A: MFROM MY_TABLE
; x$ o! x4 X' [WHERE ID > 0
9 X+ r y% @+ { m; q! V L8 YORDER BY ID, NAME DESC. \: _" l* }; J; Y: C/ W
& K( l. T- ~. g8 K2 C3 X$ LA.返回的数据集倒序排列* Y! K& d. W9 a+ w" x0 W! V+ g6 q
B.ID相同的记录按NAME升序排列3 b F; E9 e) Z) y
C.ID相同的记录按NAME倒序排列
6 K: a$ ?; A& z0 v$ LD.返回的记录先按NAME排序,再安ID排序2 d" S# ]6 L6 n9 }8 L/ `" t
E.结果集中包含对NAME字段的描述" r# D J0 y/ u( |8 w' @2 H+ L
! h" X' m6 ], @
6 M3 Y! v/ E) [8 P; C12.以下哪个不是SQL函数?
# X) G+ D+ _/ a5 ~% r1 Y, j. [ n
: _3 x( N2 Z U: r' HA.AVG5 K+ k0 ^# ?0 B0 G$ Z
B.SUM D; m: n) e( u/ \7 e
C.MIN4 e. b9 v/ [ {% z% j1 o
D.MAX% {* M- O* i1 M3 M! D
E.CURRENT_DATE()
/ @2 V" g) d( [; h8 k+ I7 E2 a8 {6 e6 m0 F/ \
; v# f+ C2 b2 e% `8 h, c) y
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?* i2 S# x O5 H9 u7 @
" Z$ e* @8 r: C. Y; d' e+ o" FA.该字段必须有索引2 y, c! p0 n& _
B.该字段必须包括在GROUP BY条件中
8 |& |' A! q) E. z' F; rC.该字段必须包含一个累积值3 F6 ^ f6 ^" V# F
D.该字段必须是主键
9 |3 _' r0 k* k9 xE.该字段必须不能包含NULL值
% t4 K! @3 n- q+ r/ i$ c( N
) o+ z: A/ B5 D8 x* x$ Z% H9 }* z# ?% V4 \% P0 J7 c
14.以下查询输出什么?
' t9 @, C& O( @' U1 R
' z) J; C8 y. mSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
' O$ y. l2 W' S& m3 RON TABLE1.ID <> TABLE2.ID F$ y0 V+ ?8 }7 c/ k
5 r% y2 s5 _7 L, R; U4 l, s: g
A.TABLE1和TABLE2不相同的记录* V. H- ?! ~4 Q. {4 R3 @
B.两个表中相同的记录
* j- k' m8 B* N* O8 EC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
( E# x2 f& k1 GD.两表中不同记录的条数9 \6 \$ M2 _" Q3 U& x
E.数字2
- y! m) }0 {- W) e3 z
. K; U: e( j) I0 h& r2 F, {; ]
b) n+ m6 l% [, T; P" r15.______能保证一组SQL语句不受干扰的运行?
% b" ^- I' q$ ?: Z) v
0 v, j) r- K( b8 R答案:____________8 q8 E) c) M/ T) g# A
9 \& @9 _! B; A# l6 S
3 n5 @' E( {4 Q1 {9 g, Z. i$ ]
- c" {6 A0 d) l% M5 h$ |6 p
答案速查
3 [( c F; h; H7 J$ M0 c1:BC y/ f0 |! M% i+ E
2:WHERE
9 I3 V0 S e' o8 L" P3 N* ^. J( B7 c3:B" G+ J# z+ H( D# [% H
4:E
5 k1 n" \# I4 g5:BD
T3 C" E1 T1 Z2 b& K8 U, W& Y8 h6:INSERT
" u9 |; }& J9 m7 N" [7:C
4 S# X( A1 \ e [- p7 h; E8:A
9 }$ o# d+ ]5 l) u$ w9:C5 T. i+ C, @) B* h. \2 L/ S' i5 _
10:E
- L1 t. H% k; w; ~11:C
2 a* ?$ ]; F- C$ t h12:E
3 Y8 H& \: @) Q9 |8 `1 e5 V13:BC
, t* h d5 x4 P, x# W, `14:C
: O7 \7 K+ c7 l! L$ i) `3 A15:事务2 v- S% H' s, g. P+ K* W: z
$ V6 R8 M/ ~* V/ y$ U/ T
3 @* D7 q/ j, t8 g7 Z2 v1 N" W
5 x. }6 t7 _$ @* X( O6 {7 Y答案详解
" Z9 H) A/ ^: ?/ N3 Z% A7 I. E
" t# D0 H1 ^. M8 v6 D1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
1 b0 O1 J' E/ L
+ c7 l3 |/ ^9 M1 _$ d4 y$ ]2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
/ N! R; G7 [2 \. Y# v! Y8 I0 R$ k! l& f& c8 E y9 G
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
( n5 c0 g( q& L9 l& @) Z7 _( }& u+ g
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
# I- `( x H$ c" D q" w K' c2 q6 l0 E a; D+ O8 [
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。: b$ _1 J C5 B2 d0 P! }, y/ ?# U- U
# L- V0 C* H% ]
6.答案显然是INSERT。
0 Y& F) f# }' y# b4 f9 `6 }$ m8 @, N6 `1 J+ v: L2 G
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。0 K, e+ h" k5 ]0 R+ X4 z' o3 T
1 Z# N0 S$ i1 \ j
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。# D2 J4 e" E4 y& b$ w8 z, \
( a, \+ `" l) B& F- M& [: T, R
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
- |( y7 | I/ c( C& ^
) }; H9 Y; c2 ^# Y10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。/ k2 y4 X- d) D/ a7 f. x* {
( `* D$ E8 ~1 w# ?6 j. X2 b11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
; Z% a( l4 M; t: d3 J1 W# O7 |: k' B l" I' y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 ^4 m1 s) n/ d) a1 p
4 m! U4 t- D- C. Z0 {13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。( L' r T! E' U3 k& S
( r" h4 l' S& p# S; P( z
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。% L6 D7 g. [) y( U, U8 K
/ n/ i/ [. K, Q
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|