  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。! K) A6 _2 q _" [8 ?8 m9 q
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
4 l: b' F- h/ }5 O本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
6 o. p6 m! j# Z r( r$ u
+ P9 Y5 O5 x }: f# C8 ~( _9 @( W& `
问题
2 j. p7 |6 G+ F6 f$ r9 S" q6 X0 W4 G
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)2 L$ n G7 q0 x& u; X9 j: K- P1 [
* ^3 [# p+ S6 D6 `0 M2 w
SELECT * FROM MY_TABLE8 q% F( {& H/ S e3 e; B/ h: l
& p+ x1 L b3 r) J: FA.如果可能,用把查询转换成存储例程
+ g+ I5 Q6 R3 I6 @6 i ZB.如果程序允许,给查询指定返回记录的范围5 h2 u- x; Z! g2 `! ~) r9 t. q
C.如果可能,添加where条件
% V- J1 {# E5 w# ^0 Z- x6 WD.如果DBMS允许,把查询转换成视图: }' x& b: c# w" ~- b
E.如果DBMS允许,使用事先准备好的语句
! w: H8 J: w6 ^$ \2 P. c% W s1 {$ B# F
& S7 F- R7 V" U: B5 `- m
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
9 ]- C' d9 z2 ?# n
. W6 I. F6 j5 A答案:____________
: Z1 j2 ^0 I5 j( o/ }
% A0 h t3 l5 W: l) i
. K6 m6 M0 H L6 f3.内关联(inner join)是用来做什么的?; d$ _4 w3 z: T1 k5 x
: t& [4 }6 F3 M5 x6 h m6 H6 j
A.把两个表通过相同字段关联入一张持久的表中
9 ^0 ~; b8 ]5 K5 LB.创建基于两个表中相同相同行的结果集2 N* q! C: P! J* ~) ~3 T
C.创建基于一个表中的记录的数据集: K# J3 ?, ?! J- l q: B
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
% N& P9 }' L3 ~) J- `. GE.以上都不对" a) C4 }( L0 n' V
0 i" Z: `# I: q, g6 J
% W- `8 q' M' t. V& F4.以下哪个DBMS没有PHP扩展库?8 W- x, F2 G- d. ]0 r3 i
# v+ |; n& `0 q9 m! mA.MySQL- t* {8 B' E) U$ d5 T S6 C" n
B.IBM DB/2
! S& V2 X6 N0 N# D' B& z" mC.PostgreSQL( O0 L8 ~" x- {8 h( v- B% q6 v
D.Microsoft SQL Server; p- r$ X+ H, C5 Y+ A/ [
E.以上都不对" ^; s0 ~# m1 L2 S3 M/ g
+ q; r: @5 E) ]! ` A `1 Z( Y4 E2 v- E
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
$ i% d% ^( i. O1 C3 U4 ~ e, l: }% X/ G9 u+ k8 I9 p% j
<?php
1 x. N; \! n0 T: p. A& |$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);% ]6 _6 K5 T. B* [8 C. V1 w
?>; z* S. J$ s: G: }9 o
, u1 q7 R T! C. B
A.MYTABLE表中的记录超过1条3 R* w5 P' p' i' l) j
B.用户输入的数据需要经过适当的转义和过滤
; U7 u) a2 `3 z) v/ m6 n" S) S TC.调用该函数将产生一个包含了其他记录条数的记录
8 s! t& C' e# H2 ?9 a$ y% FD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除- a; Q+ W s, q0 y+ f% \1 j
E.查询语句中应该包含数据库名
: t( g, ~6 p& j3 e) X
7 ?: E6 E1 J0 K
2 r: I1 f0 q: K! u; X& E6.______语句能用来向已存在的表中添加新的记录。8 Y& a4 o* [) w7 R$ M
! }; {. x& D7 W. g
答案:____________
. X9 `% w9 h1 d; a+ e1 s
' p) L4 m& L& Z
. C; I. j. I3 |1 x7.以下哪个说法正确?
/ j( m$ K0 F" L2 j8 |% m4 ]6 M3 V% L& p
A.使用索引能加快插入数据的速度) k5 u8 P5 q/ V, R
B.良好的索引策略有助于防止跨站攻击, h1 L8 ^$ u+ f
C.应当根据数据库的实际应用按理设计索引. N$ X& K/ r' G* d: n `
D.删除一条记录将导致整个表的索引被破坏
: [) m& H* H" _/ aE.只有数字记录行需要索引
! f2 R- ?5 B+ ]. _! n" t$ x3 S5 K( n
6 S4 G; y3 ` b& ?
8.join能否被嵌套?
6 L; ~$ z. ]4 E1 Q4 V9 x; f
) a5 M( N; E0 x# P7 f8 g# I& W4 v9 O, }A.能) t1 i5 O4 F% a8 m1 Q
B.不能
/ M \7 p& v/ o3 @8 [
* ~* j- j5 ^6 c
; r4 q% }* Q/ ]5 N; W9.考虑如下数据表和查询。如何添加索引能提高查询速度?
8 K: C: k' q4 y; y/ d0 p) o' B4 H+ w* r o0 F
CREATE TABLE MYTABLE ($ ^( z" a/ {2 R/ Z* |
ID INT,
/ f" Y0 @# ?3 p) wNAME VARCHAR (100),; x: J% ^% Y: [# s" \ |' @
ADDRESS1 VARCHAR (100),# y. f; W& M* U- i2 X
ADDRESS2 VARCHAR (100),
9 D* r6 }; O# \; ?& c& aZIPCODE VARCHAR (10),' o) v4 l1 D6 G% ~
CITY VARCHAR (50),1 j" v8 X+ n/ \& j
PROVINCE VARCHAR (2)/ ^' b8 d, d; I( d, _
)
0 b) e* H0 j* f4 {( eSELECT ID, VARCHAR
: z }; L6 L( Z+ M$ L# @: IFROM MYTABLE; f" q+ j; l. _! e7 {6 O/ c/ Z5 K: L
WHERE ID BETWEEN 0 AND 100) t4 W% D' G$ h4 a$ e, T
ORDER BY NAME, ZIPCODE' y0 F* Z7 d$ U& o) P6 B, C- J; {
* w9 o: n8 L. q) B( h! L8 q
A.给ID添加索引: ~, g2 N8 U7 I% ^: r4 q3 O
B.给NAME和ADDRESS1添加索引+ P$ f6 m4 @. A. }- R- b0 J; H
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
" v" A* H9 ]9 e- d, p- q$ nD.给ZIPCODE和NAME添加索引( X7 D. ?/ T9 t u
E.给ZIPCODE添加全文检索
* w& P o/ y! v) l" o# t
; k8 y1 g# P8 I" r% D6 k
7 g$ o9 T. s& j. X7 i2 u10.执行以下SQL语句后将发生什么?4 w0 e x/ b. }. E7 p4 l' v; E' Y
- O4 ]. ]/ c7 F8 P9 y" MBEGIN TRANSACTION
1 F, y5 Q! h0 qDELETE FROM MYTABLE WHERE ID=1
; L! C. d- o0 s2 \! |% E* C0 tDELETE FROM OTHERTABLE+ w3 B! v7 U# |6 j. R# P. J4 r. a% [
ROLLBACK TRANSACTION9 _' C% @9 C# g# h. A9 R% n
, Y+ O8 ~# t8 n; W/ OA.OTHERTABLE中的内容将被删除
, g4 B6 p, c/ a5 t( x- P1 \B.OTHERTABLE和MYTABLE中的内容都会被删除
% g! r, B: A$ TC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除5 F; n. K1 @) a2 {- t, Q6 @# x2 v
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化5 U5 w/ z5 D4 _1 a. _
E.数据库没用变化3 x/ [; v; [, c+ P
5 g) Q( Y5 N: d9 u. J& n
/ m4 y; |$ }, j' A, @, s11.DESC在这个查询中起什么作用?
# M% ] w/ o( `8 n5 Q1 o) X# v3 I6 j9 }
SELECT *4 U* a1 F1 f8 k& ]# _- s5 c4 o# I
FROM MY_TABLE
, u, u I' h& @, a- v. }WHERE ID > 07 u: k* V/ G8 s2 g
ORDER BY ID, NAME DESC6 l9 I" d) g% t# s+ [- H1 ]
. ^2 a4 F! D9 C' CA.返回的数据集倒序排列
* N2 t+ i' x PB.ID相同的记录按NAME升序排列1 b) g- _1 E# Q) P7 C5 J0 X. n
C.ID相同的记录按NAME倒序排列
7 l* h3 C; A C: K* D+ P* Z4 |. XD.返回的记录先按NAME排序,再安ID排序
2 N) Y; K! r6 I* P5 E" VE.结果集中包含对NAME字段的描述
' l0 ^: }# a1 j. u4 }& V* E$ F0 C! `8 h A, S) H
/ N7 s* m( U) w: i! ^* c; k- R% V
12.以下哪个不是SQL函数?
- s5 ~/ _2 J1 Y/ n. V7 E% A: d% g' D; n, l7 N! R
A.AVG
: I$ |5 z) f. o$ m. y% I8 JB.SUM
n7 B0 S$ W! ^0 C1 r1 v) R: m% v2 ZC.MIN/ O; r/ V0 c5 s3 {: |, l
D.MAX6 l+ C1 A! ]! |4 A
E.CURRENT_DATE(), V/ J) d4 }+ z$ p4 {* B
/ m; ^9 R( U' W" e( j
0 I2 A! k9 c0 N2 D13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?% a( S t1 [2 O" k- v
1 {$ E) ^& L! |+ @; LA.该字段必须有索引
9 i r, U% f [. i: O1 j# yB.该字段必须包括在GROUP BY条件中$ D- O G* `5 K6 M0 k+ u5 ~
C.该字段必须包含一个累积值
4 ~1 {8 [' t( b$ x: A1 I/ }, b, ]% zD.该字段必须是主键
+ d) @$ [% s0 w# H, ~% I: q; PE.该字段必须不能包含NULL值( [6 g; Y) Q; e
; q9 N" [. _ ]* n
- ~+ b/ b, H4 J& e% a
14.以下查询输出什么?: v" O, Y2 s1 Z, U
. k } Z, J* pSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2% t8 v+ w6 g* v
ON TABLE1.ID <> TABLE2.ID
, n3 J" N3 s8 S* I* O3 D7 j
0 t8 [& c; D5 p% W/ Q. z% B- yA.TABLE1和TABLE2不相同的记录
1 l0 o/ T8 q' Q; ~$ o jB.两个表中相同的记录
+ O5 \4 N9 F" Q8 ]3 gC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
5 `/ r) V* ?7 R8 P4 DD.两表中不同记录的条数0 _( P; ~! f/ ]( b5 V6 e5 ?
E.数字2
$ D) v% v; F! Q; i+ }2 k
1 b* B5 X- S3 l+ _6 S0 k+ j* p3 I" c% K: h* _6 L4 q$ }: E6 m& x+ P
15.______能保证一组SQL语句不受干扰的运行?( T o0 r2 [4 @9 A3 \- S
4 U# z! V- W" @8 G5 q
答案:____________% ~' U! E4 Q% R
3 ]4 B2 M( Z( g$ c% m3 s+ K
+ v$ G) h/ y8 ~& H( g/ @( }3 j5 E' U5 S2 t" b& N. f: }
答案速查
3 G* l J5 I% d4 Q1:BC
: t- n3 |+ F7 ^, i/ p* W. z2:WHERE
7 J" p2 b2 t d+ w$ R( q9 X/ \3:B8 w; y- b' k+ M5 M) {
4:E8 E3 X' F7 h# k0 `7 s
5:BD
5 [0 i; z B5 \8 r! U. `6:INSERT
2 b X x4 e: c7:C9 ?8 T5 e% o6 ~: L: j& `/ z, ?4 y b# H
8:A8 q- q6 X& I t; h
9:C
$ j' O2 Q: l% \* S0 u' ^! ?& r10:E
" K6 w- i+ B" v11:C
$ U1 ]0 H9 N+ X, h4 X) l12:E" K; _1 {* o0 H: |, |! |6 c
13:BC t+ w9 n7 Y( A
14:C" r* c3 a I( Z
15:事务. t" m' {7 I4 v" v( c# m
4 D) `4 s% [$ ?& P
; d H! W4 O2 ]7 r8 E
- v/ t0 f# e2 s7 f$ p" C答案详解
0 O) g* i7 v- T# X4 C6 W. S: A+ n2 b: [4 A3 H0 d
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。* c; P4 Z, j8 F$ H, I
) V9 q- k7 Q/ c" f! I: J7 U
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。& ^6 J }6 B5 ?# \( `0 a
; S/ X: d7 \* ~& T* }5 u
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。. g+ h1 R0 ]- e m* d
% r+ R: z9 c' R) j4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。* }! X: ]: {6 D+ l6 a E
; C7 z6 g$ x# k! p; v5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。% z) ~7 s9 L$ h
4 h. n! A0 Q6 n9 `1 I, l4 z
6.答案显然是INSERT。3 p6 q% N# i% a6 ]
. \5 U$ K( W$ [7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。3 g+ W t7 l7 o* P, ?
! q& C. ?/ I: ]# o7 K C( ^8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。) W( L' p3 l$ d3 e
6 W {" `0 z/ J) j% ^9 F
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
, ]2 ]0 m3 x1 r& c5 ^. S
* h( Z6 m' J4 B) N10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
' q+ ~4 U+ U/ [5 y; q" S% D x3 ~! U1 \' C0 s% C5 U
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。) ^( b' j# { b7 U& D
- s# [1 \+ \2 r$ f( f9 v- J
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。6 K* U2 ]+ K7 k5 x( \) P6 @7 B* }0 N
+ [: z* C: p$ ?; Z2 _13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。5 d Z3 V9 v6 w( @1 q9 G1 y# H
7 O) G/ _3 G* B) N5 v J# g
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。 J( a* g9 |" Z5 ]. C
4 Y: n* p2 o% u9 x, }/ w
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|