|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14447
- 金币
- 2509
- 威望
- 1647
- 贡献
- 1457
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。# }. ^( R5 C$ z
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
# M3 b! A& g# C6 w; t本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。- k f. i& v0 h! D' q5 j9 j. l: q
, M* t+ ^2 S4 U; ^2 J
0 B2 q u6 Y) A+ T1 g问题5 n; j8 x" o( U9 D7 J! ^& x
- S/ D: q* E6 I; P" K$ `
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
! p3 J2 |! N) e2 L, {- f, S0 I& \( m! G+ \6 @2 }% s3 E9 L
SELECT * FROM MY_TABLE
. @9 d/ R" r3 O: |
9 `+ G2 B) r9 OA.如果可能,用把查询转换成存储例程
! T' g2 q# h6 ]( a. g: @% ]B.如果程序允许,给查询指定返回记录的范围
- q4 ?7 `3 Q1 L# ^! a9 j: _3 B& fC.如果可能,添加where条件; e+ M* i: B* E2 O5 W
D.如果DBMS允许,把查询转换成视图& `7 z8 t, A* Q! d
E.如果DBMS允许,使用事先准备好的语句
& n! }. t% I* m) ^9 A" H- N0 J/ E' B
; G+ q4 |+ ~" i0 w# R, R1 e7 p- T* N' l" f B5 X
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
: Y2 H% L0 }2 V1 S3 T |- e
0 }. ~1 ~ f/ z( K+ N) U答案:____________
, Z7 y% L% E3 i- k
$ m, o! H2 S! ?+ K3 b1 D- d# p
! X3 ^/ q' f9 X. D3.内关联(inner join)是用来做什么的?& j' B" t9 _& t" o9 Z
0 D. N, M2 K, w+ [3 @9 L" f
A.把两个表通过相同字段关联入一张持久的表中
! o$ \1 n. y" ?' c, G( R" B/ v# bB.创建基于两个表中相同相同行的结果集4 |" S2 h% U4 {+ O$ f8 h
C.创建基于一个表中的记录的数据集
9 Y/ p* y/ L, j$ D, r. vD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
9 y) Z; m" z0 j4 Z: Q+ VE.以上都不对
2 P! p. {4 z: ~! G: u; W1 r$ C! n! d# g6 G( |; R8 ~' j
& Y2 Q8 ?: M# N' j& l" Y: t
4.以下哪个DBMS没有PHP扩展库?
, n6 I1 ^: W8 P% B% H }- Q1 s/ p
) Y x5 O4 B* W7 `A.MySQL" {. S, b' a2 x* Q. X- X
B.IBM DB/2
6 f9 Z0 f7 m5 x( K! w! ~; OC.PostgreSQL
J& t% B t t* b9 i5 u7 TD.Microsoft SQL Server5 U7 h8 W0 |4 M
E.以上都不对
! N' g0 R; d+ X) r. b5 H6 h8 W: W
% l7 h( G' M8 E" _0 f
$ l) s. S0 n4 y5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)5 K0 G# g6 m R9 b' ^
6 p* E: K) i. r) p<?php s5 V2 Y F! R; u6 f `' X! |
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
4 o. _$ e3 [7 G+ L6 ]" {6 l?>
2 p k2 P& O8 U" I2 H# w: x. r, U! g w4 p
A.MYTABLE表中的记录超过1条1 ?$ q: p3 `) A& }4 H4 E" \
B.用户输入的数据需要经过适当的转义和过滤
. i0 b6 P; q6 @3 K5 kC.调用该函数将产生一个包含了其他记录条数的记录
( F$ q& e1 n7 ^3 v. `7 cD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
" O; D% f7 M2 ~E.查询语句中应该包含数据库名2 T* V3 \" v" b. B& w
& c9 O" N4 a/ D U. v# s
3 q3 c6 y- [* N" g1 y1 s
6.______语句能用来向已存在的表中添加新的记录。
; {6 P- J; |- N5 i7 _& d( F E, T6 q% z' s% c6 v
答案:____________
0 R Z% u; D) w7 G% p6 @1 P0 R2 k; \/ @. @
. h6 j" t; V' H6 Q# P6 \; M
7.以下哪个说法正确?% y7 | [0 i4 u2 w2 Y5 i
3 _3 F* n7 v% X' u/ X; t( u! X
A.使用索引能加快插入数据的速度: v! Z1 C3 z* C! V2 z5 m
B.良好的索引策略有助于防止跨站攻击9 `: ?5 v1 F0 w$ R3 v$ R
C.应当根据数据库的实际应用按理设计索引
u" T& Q# W) |! m: GD.删除一条记录将导致整个表的索引被破坏
' R0 w3 v, P5 C5 `7 I" ]E.只有数字记录行需要索引
8 f$ q8 k3 v: J$ T: s$ a; W/ a2 P/ A$ y, B: ^# e$ t& ?9 w
2 ]9 F. m$ ]+ \, ~- C8.join能否被嵌套?
- @5 ?5 J# S) i! s; V) D. c) }9 {; h0 ]
A.能
2 j+ Y" _4 W6 ]) u* _1 _- @B.不能1 N0 N6 T( o; i9 V: P& H
& `7 I4 X7 y. w. K' d9 J8 Z i2 \ |( X2 ]* |& {
9.考虑如下数据表和查询。如何添加索引能提高查询速度?0 I* {7 U9 R. m; ?
/ @) `1 G, s5 @- l5 K. C8 ]CREATE TABLE MYTABLE (
, v' V, k! Q+ gID INT,
! d7 T* ~3 A: k2 C6 u* gNAME VARCHAR (100),1 x$ _* g; Q7 k
ADDRESS1 VARCHAR (100),+ R" L7 \( b' H. f
ADDRESS2 VARCHAR (100),
" L' i: c7 a( }8 E" V2 sZIPCODE VARCHAR (10),
6 s) _% A* q5 C2 WCITY VARCHAR (50),
) Q% J8 K: e, ^ p7 IPROVINCE VARCHAR (2)
5 `! Y# `: [0 l1 ?)- w$ K3 W/ `4 d% p5 Z8 \
SELECT ID, VARCHAR6 `2 g \0 A' _/ X+ X* s
FROM MYTABLE
- Q1 K& }. o% B- m9 J9 ^, ^, k" D1 B! }, CWHERE ID BETWEEN 0 AND 100- b! s. l: ?2 a; J" L9 A3 |- Y
ORDER BY NAME, ZIPCODE
n4 [( B. c; ?+ j" w% ~6 n% A$ y& v
A.给ID添加索引
+ l( k' Z, U8 ~' N% h$ \# H( |B.给NAME和ADDRESS1添加索引* n9 M: { S- h" k
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引) l+ R* k0 c+ {; N3 m) U* y
D.给ZIPCODE和NAME添加索引
. f$ @' m$ T! Q1 \7 e6 mE.给ZIPCODE添加全文检索
! W$ K" v2 ~& |2 K
" M: W& M- }3 `7 M* l' c- r3 F5 i) W; c1 h- E
10.执行以下SQL语句后将发生什么?# y5 Z: r% ^: p" L6 v: [
# a, a; u2 f6 U6 O! y$ @
BEGIN TRANSACTION
@7 S8 D1 z% QDELETE FROM MYTABLE WHERE ID=1
) {- T& z' w4 {: C8 }; C8 q4 LDELETE FROM OTHERTABLE* X% y3 p) J3 w8 u F! s
ROLLBACK TRANSACTION
3 O& q( `0 b. G3 [# Q; Z; u7 E# Z! I
/ C* Z0 i' W, x6 W: d% BA.OTHERTABLE中的内容将被删除9 R1 x8 [' J- a" j3 {: `
B.OTHERTABLE和MYTABLE中的内容都会被删除
- X: V( x- U" ~$ ]& b+ QC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
* G, p' i7 @! {0 t6 G- `D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化3 x$ ^- P6 W6 T1 @5 ] M: o
E.数据库没用变化# t `' d8 ? P f
) i0 G+ t; v% A% S7 f, r; f; t8 L/ K
11.DESC在这个查询中起什么作用?1 I% c+ ]4 n4 O2 }0 g+ }
; R% ^5 O$ X7 V& e. D9 hSELECT *
1 m( H) l. }% Z: lFROM MY_TABLE
$ t$ W' B' ]! k0 [# d2 sWHERE ID > 0
& N" K+ u4 `* {( e+ h) uORDER BY ID, NAME DESC3 v$ G, F6 {3 P; g% |6 r
% s: j7 N! Y, b' j- L' G$ z' L# LA.返回的数据集倒序排列 T( ?2 _1 ~" J$ X7 q; y3 N
B.ID相同的记录按NAME升序排列; i) L2 {/ x. M0 u; Q( B
C.ID相同的记录按NAME倒序排列: x9 h# B; f. ]' j$ X* S$ Q- J
D.返回的记录先按NAME排序,再安ID排序) g1 z0 i4 H I8 ~
E.结果集中包含对NAME字段的描述; B( i" n+ x1 G. V% e! d" Z
" ~& Z4 ^# M8 M# g
% z- C- q7 n" _ E% w12.以下哪个不是SQL函数?
. ]- k# c# p$ [1 i9 A/ r" [7 Y0 t7 c2 Z
$ _; T- b& ]2 r7 _" RA.AVG
8 B" U% @& P# ]B.SUM
6 Z5 ]0 }% X. i2 O, `$ x2 sC.MIN* B+ Y( e7 F5 t, t/ r1 \
D.MAX) s+ y- X6 K3 k. Q
E.CURRENT_DATE(): K" d, V9 K3 ~' Z
0 o' b `; S7 E9 t
- X/ Y6 Z6 y4 E: ^: q1 g9 `' o% E! f
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
3 U: e$ H' w/ _/ U3 x9 j1 _1 X6 z- C2 X- L
A.该字段必须有索引( a* N0 A. C2 J5 f* `8 g
B.该字段必须包括在GROUP BY条件中. i& D6 R- _7 q' [9 Q& O
C.该字段必须包含一个累积值5 a; D( F, a& \: V/ ~( J
D.该字段必须是主键" a8 g& C% q! I6 Z
E.该字段必须不能包含NULL值. r/ O \+ h. Y( v- f& R# O6 C/ x" X
% f& X# j e$ h, `* [* g
' ~6 t4 W m, g0 P8 n) x: w2 o9 o5 Q! @14.以下查询输出什么?) d! G# M) f3 p) y# b' i z+ }% n
5 D( {6 C- Q7 B1 U* n' B
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
* l% K6 G$ s i* y. G. EON TABLE1.ID <> TABLE2.ID
3 _! z, c# F+ R
p2 ^+ g9 {" Y' y. jA.TABLE1和TABLE2不相同的记录" L% h" [5 n' B- e- j
B.两个表中相同的记录
# O7 ]; U m- ^/ b/ SC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数% [2 O9 m$ {$ i# d
D.两表中不同记录的条数
; I7 U/ @; b8 n5 D5 sE.数字2
2 c8 C0 K3 I. v( m, |4 H
& \0 d) U! d( l j% y. {( D u1 R$ P2 Y% r* Q% H. S* ]6 _
15.______能保证一组SQL语句不受干扰的运行?) ^8 ^0 `0 R7 G* _ \% q; o
3 g5 ?2 J7 c# o& T8 j8 O4 b答案:____________
+ U$ N J' m0 j9 x% r5 I
# \9 B1 g1 `& [: _, M" m: y: ?; W' m. ~' X9 G; ^. ?2 t2 M1 S
3 l! @+ R" s! {
答案速查1 _% u$ j" ]0 c8 \/ m& y8 r% Z6 @
1:BC
/ t* g! Y# I7 T# `; C* g2:WHERE
" O9 `+ g7 N+ z- I0 U" t3:B! p9 I! Q) h* {* R) e6 O7 m
4:E
) K$ h [* ~3 p6 K9 x5:BD
- z5 L) h3 ?. l* b W- L' Z6:INSERT" W2 L. e/ p9 y3 Y
7:C
. N: ?0 e2 T; j, {, G1 A9 O8:A
) o' b4 S n m( E7 `9:C3 E- d$ t! H9 L* w5 V& `$ s! z
10:E3 D0 W' }# |; W2 E- K* a" E
11:C7 x; Y+ ^8 I9 \( Y+ V
12:E6 k( n) r. o1 r. x: B
13:BC/ _6 I: c, c0 Y# x/ H, H# o
14:C
. w- G3 G/ }2 ]15:事务% f# K/ o; t2 h7 N, Y% q
/ s I3 N# r2 G6 k1 e( o A, N" E& [9 d1 r& g
4 k+ T6 v7 b/ e5 M+ h答案详解
2 N+ ]2 [7 F+ p3 ?. a2 u3 g* l( U' T, D- `
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
; J4 N2 X! N" h) F9 E7 d9 d8 {4 b8 `7 v$ e- Z8 P# w. t
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
8 i/ @" b# [0 H5 N: `% N
$ \( B S3 p' H7 {0 t3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。8 V( G" j8 e6 i
9 _+ O) W! R# N4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。+ {* S! {0 T5 L- `) @6 G
, r6 ^; n7 f J7 L, |: ^, u5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
7 E4 m( X: q2 t5 F8 U3 \2 S3 w5 I$ v1 N$ E2 p1 X) b
6.答案显然是INSERT。
9 g o4 F- c2 \2 \
* U& s/ g8 L1 K; k8 j9 v5 x3 f* |7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
' {1 r% `: K& ?# D
( J# N8 I# w, t; U5 v3 {8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
f" U! s# N* _
; y7 h) V% \' A M, J2 D( e! Z/ r9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。3 i& R4 p" I0 Y1 f& O: O" i
+ b! F+ j2 v/ E, T! U2 `10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。: M( P4 k2 a; h/ i: I* Z1 Y) ]! v
/ X1 n$ B8 s1 _: `11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。! k; D6 X/ V2 u% b/ q3 x) T3 E
* k8 v$ ]1 L1 O; h2 W5 R12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
2 K, N: d+ F& Q, g6 V: K
) r9 \# ^& [* v- p& n5 C3 n& A13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。' ~+ G( O7 s) ~1 a3 r
5 r, [8 I: a) Q
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
0 N; a8 r+ |7 k. R5 F5 |3 l
7 Z5 w7 i* N+ v/ J9 [$ ^/ p {& c15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|