标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
/ x4 E) F- X( Y6 ]
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
4 n3 G& N" N5 _. }+ X
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
' n( H: J! T# W+ V
6 \: ~7 k0 Q1 q2 A* v% B
; G# U/ F+ H: ~8 k
问题
* u$ z3 |$ C* [$ h9 ?' g9 q' Z
, E. J. I0 t, E- J
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
6 x1 j+ ^" G# `* q5 G# C
3 h D. a, H: G1 J* s
SELECT * FROM MY_TABLE
U5 z; }6 w5 b& W( K; N* D& u
) z2 g8 {. [6 [4 t t7 k3 U
A.如果可能,用把查询转换成存储例程
: x! s; C }2 T! p& a0 }1 P% n+ B& A
B.如果程序允许,给查询指定返回记录的范围
& q( c9 n5 y7 A
C.如果可能,添加where条件
+ T/ C6 r& Q/ d+ { @4 \
D.如果DBMS允许,把查询转换成视图
, |' e: [0 s7 L% E2 ~
E.如果DBMS允许,使用事先准备好的语句
- z# @' q* W! S/ C2 S8 g9 l5 Q. `
8 ]( R0 z' y1 \4 N
" I1 W8 r6 p! u
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
% w+ d+ ^9 n; k/ E( n% J9 B2 d
6 G4 Q8 p7 t6 A
答案:____________
! B. M/ w# X# |! Q0 Q
* Y4 |2 j2 G. t3 X) Q( A: V# }
# Y: a% \) x: P$ d
3.内关联(inner join)是用来做什么的?
1 z' v0 _/ {5 v* U7 H- f7 u
3 U$ q3 E+ w5 V" j2 `5 X$ a
A.把两个表通过相同字段关联入一张持久的表中
, q1 Q! ?! s& s- V7 G
B.创建基于两个表中相同相同行的结果集
7 r! O& q" }4 j! k/ y( D- M
C.创建基于一个表中的记录的数据集
0 L' d( u0 @& ]: @2 z# o
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
" I9 P4 K) p" k x3 Z* e
E.以上都不对
_; z4 h! F2 A/ _( v
: d& `) J, u& a
" u4 B2 A8 p# Y8 Q
4.以下哪个DBMS没有PHP扩展库?
0 G" Z1 [$ F/ k# `2 ]/ C
) E$ {8 E5 r( O( I2 M. D
A.MySQL
0 d0 x! S9 J9 w! k% {
B.IBM DB/2
. U% b7 H8 F S1 q( N4 V7 g
C.PostgreSQL
4 h* ]$ r! R& W$ Z# n9 @, q' X$ c
D.Microsoft SQL Server
3 V; u/ R( q- A' `/ x
E.以上都不对
$ C! d9 S& R" k# k
, [* F1 M `* g7 V% `
5 m" m" r4 o! g+ h1 t/ \& J) D; L& U
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
2 O6 Z5 W% ?) c* d
" p! G( I1 b/ P4 y$ ^
<?php
1 V* v7 i0 @+ S9 h3 i1 A' `+ ^0 B
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
" D; U& x4 c6 j$ p- S4 g
?>
& ^6 x: Q; S# K$ {# @
5 ]5 d2 c3 C& E2 E; q
A.MYTABLE表中的记录超过1条
6 _- e3 @+ w+ Y' F. Y
B.用户输入的数据需要经过适当的转义和过滤
+ W3 C4 G7 x9 o9 l) u
C.调用该函数将产生一个包含了其他记录条数的记录
, W% W4 [; {! x
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
5 q6 i5 ~7 }" v( g# w
E.查询语句中应该包含数据库名
$ B9 t' N% F9 ~( a
* @' b) W1 l N
( w5 W* J8 d# B7 R
6.______语句能用来向已存在的表中添加新的记录。
; ~# A Y$ n. T$ R
$ ]0 N' L5 {* n+ |
答案:____________
0 r. E* p/ K: {2 P9 O
/ A# n% N+ i$ {0 P5 G- _* S: x9 I
0 F) L& R4 J9 g4 x
7.以下哪个说法正确?
; O' N" n1 J( R5 d
0 Z+ t5 L) {+ O. }; j1 h
A.使用索引能加快插入数据的速度
- l8 Z8 V- o' u
B.良好的索引策略有助于防止跨站攻击
6 _ }0 @( K- H* f9 o, h
C.应当根据数据库的实际应用按理设计索引
3 A# Z- G3 r \8 c2 z4 }
D.删除一条记录将导致整个表的索引被破坏
+ v7 G) Q7 W2 _) n0 _7 Q" t
E.只有数字记录行需要索引
( X% J. }' t/ a- I& m
; e- A! p, J* G. i- H
: f7 {; i( b* S k9 P9 x) l I$ T
8.join能否被嵌套?
6 `) a' o5 Q7 d2 t
- P) D c% E9 r- ~, |
A.能
8 P' @/ A% \' L4 S& y
B.不能
' U2 e3 x0 Z& y, }
/ _0 l2 x: b& K/ t4 x
0 n D C4 X7 R! m9 e. J3 {2 [- {, n
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
3 Y {9 V. G: H) R4 m4 R3 K" D
7 P1 ]6 D5 l- [ ^
CREATE TABLE MYTABLE (
0 [* t% ]; @1 ]. f' y& a
ID INT,
% ]* \# e# C8 G
NAME VARCHAR (100),
2 e3 q @- o8 l* M! x3 j! c8 y
ADDRESS1 VARCHAR (100),
) y, K. ~% F2 c- H8 q8 l
ADDRESS2 VARCHAR (100),
7 D) U: u. u+ r6 q1 Q
ZIPCODE VARCHAR (10),
; R4 K. S2 l/ z. W2 L7 x3 A
CITY VARCHAR (50),
/ E& {4 [' p* j+ V1 y8 m: P6 q }4 h
PROVINCE VARCHAR (2)
& F3 t/ ]% V$ [) X9 w
)
& _7 |4 j) p0 a
SELECT ID, VARCHAR
" s7 _& ^9 f+ a
FROM MYTABLE
) g& n1 \8 ?$ _9 p9 `% c: ^
WHERE ID BETWEEN 0 AND 100
# G) }/ V' V; C: w) x1 W
ORDER BY NAME, ZIPCODE
4 G0 _3 L7 L# U S8 d$ v
( s, h, R0 W: v! g4 u, \9 Z
A.给ID添加索引
$ p, U* y- \& b, e0 `- T3 V
B.给NAME和ADDRESS1添加索引
; f; X. L; e& b( ?, \
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
: i# ?) N, R U
D.给ZIPCODE和NAME添加索引
* m. |- y* B4 C6 s/ L. r6 g
E.给ZIPCODE添加全文检索
4 |. |+ b# B0 m' y4 W" p
* O- q# m# P1 k- [4 Y: D6 E
/ k$ U1 Y' t; n
10.执行以下SQL语句后将发生什么?
+ s( m7 W! a% @
- y. a8 |! p- X9 Q. n5 p6 h
BEGIN TRANSACTION
2 A+ ?9 Z. A& T6 A
DELETE FROM MYTABLE WHERE ID=1
( ^9 R/ [% v4 E* u
DELETE FROM OTHERTABLE
" z" j: l0 |. K, i2 ?
ROLLBACK TRANSACTION
; Q i; H3 c/ z6 m9 S8 u
: v9 y; v" ^! i, i* E9 C; R! {
A.OTHERTABLE中的内容将被删除
* j$ _; H% r+ f! X# M$ ~8 }6 }% [
B.OTHERTABLE和MYTABLE中的内容都会被删除
! ]0 f4 p6 t9 W: n
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
/ Z9 w9 Q6 h6 ]- n, c+ ?+ b% \
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
; }1 [& @; B1 [6 @# a& ?* o
E.数据库没用变化
! J" K/ v; O9 G1 G' w
. i) A! K8 Q# t9 z, v/ U8 G
0 j- e% K3 Q' v6 q( r
11.DESC在这个查询中起什么作用?
# C F& M& g4 v: h8 D: F
* F) R) |$ M( ]
SELECT *
3 r& q& q5 ]: A8 ` r5 Y) L& j
FROM MY_TABLE
$ f" r9 Z1 M: m. O. |' }4 H$ r9 Q) L
WHERE ID > 0
9 L8 ?; f' D( I; m4 I' ]
ORDER BY ID, NAME DESC
6 m7 J* }/ M6 @9 @
8 d' m- d/ Z I4 q
A.返回的数据集倒序排列
. {6 c2 s0 e6 { J- w6 D
B.ID相同的记录按NAME升序排列
' H/ ^- C0 ~ S0 Y( D5 b
C.ID相同的记录按NAME倒序排列
& a2 S1 I9 y) A& T6 o7 H
D.返回的记录先按NAME排序,再安ID排序
# L/ a. i8 }$ p6 ?5 ?: m" I
E.结果集中包含对NAME字段的描述
) A8 G) w) B" g- W+ @
6 e4 j( E! g+ r5 X5 K
' i! G' j x0 }5 V
12.以下哪个不是SQL函数?
# y( j1 ?5 Q2 [4 L" q. f, X
' N6 s$ R# {$ c. r
A.AVG
# A' b- D, O3 O% G$ g0 W! ~
B.SUM
1 L# R; m. {% U2 Z
C.MIN
. a3 H. g! _! R; u
D.MAX
# y3 Y8 q$ F- i
E.CURRENT_DATE()
- Q$ d7 Y5 P' ^1 ?* T1 y
. P- [, J U3 h
3 b# P- I+ C2 V- ~. a. _
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
. @* O$ T5 i7 `1 R
) I3 y0 i8 N% s4 T: w1 R0 N5 T7 u
A.该字段必须有索引
1 i/ k, U# ?) }8 r( {
B.该字段必须包括在GROUP BY条件中
8 L* T; h7 A; i k
C.该字段必须包含一个累积值
8 j K6 U; d/ G+ N
D.该字段必须是主键
' M9 F) u( w# i+ R; u( b
E.该字段必须不能包含NULL值
- @* I) J, ~8 G0 h/ H
- C% R0 G' u( _9 @ z0 A7 L
) @3 r7 y* z! w4 q
14.以下查询输出什么?
0 g7 t5 Z! t1 C! d# ]
& |/ g) G2 ^ _# s8 R; {
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
- C% T: {. H* }
ON TABLE1.ID <> TABLE2.ID
+ K; D Z$ d+ E; }, h' ~
" l, g Q- [5 ~( h
A.TABLE1和TABLE2不相同的记录
7 w1 j. i, ]$ l+ x/ p
B.两个表中相同的记录
1 e4 C. s. Z" l C5 h8 y
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
$ q, h* E0 L3 B+ |- X. x2 d
D.两表中不同记录的条数
$ ]! W/ _+ v1 p
E.数字2
" K' U! m# k9 x% K( Z) j
4 o8 z: ]2 B9 j" _; H: k
- f) X- D- R* [2 x
15.______能保证一组SQL语句不受干扰的运行?
: ?- [' ~2 l0 y! W4 M
0 e* C- @% U0 L! N8 Z2 E* j6 g4 u
答案:____________
/ ^1 l0 m2 r8 M
( x- C2 v" {6 [$ H# J. L. H
* H, y0 L: s) X/ W1 A1 h$ \) \
/ g0 _1 U/ l$ \3 H8 T
答案速查
+ `! r8 p$ x0 N
1:BC
8 f- B3 p7 M; d& M
2:WHERE
7 @ j8 m: \0 i) O
3:B
K# b; M3 @! l
4:E
2 l5 _6 M; W) D& A6 V
5:BD
R" x5 c5 b1 F( \/ ~+ }* R; n" }
6:INSERT
# N. k3 n6 |# t
7:C
( t+ c k7 `, @* T- H, `
8:A
! }8 q9 d. x/ a# ?% g/ S
9:C
- N+ [1 [, D7 @& t* P, b( U
10:E
: _0 J* ~8 l$ ]) {" ^
11:C
2 s( i3 G/ g, p' u& h: k
12:E
* l" Y: {# V$ H
13:BC
) g1 v6 S. H( K+ b
14:C
j1 i* w& t% O( C
15:事务
% h* z8 ^' [, m# h5 p, P$ D
: B- \; O7 D2 a0 W5 \3 R1 @- |+ W
3 E0 ^# \. w, Z4 m
1 P! Y: u9 j2 M/ _
答案详解
' g) L) f& m6 V% w
! f, t6 C( P& U8 }3 J
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
1 a2 p. F( T) C; y5 k
. b! K# K; u& C* x( u3 e
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
! D& O8 g6 ]+ b0 O. t' r4 p) K
, c" n& G/ k, }9 o
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
/ y% f1 n7 [. a( s
/ N1 I" K6 [9 E, p1 w v* G* s' x
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
Q4 P) o5 c( c; P+ Y3 h: t! e
3 S3 k2 K$ }9 X6 W
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
! c/ {+ E5 _' W
6 \+ t* P# O# R8 o
6.答案显然是INSERT。
5 Z# }+ D6 U1 l, m+ K
+ @8 \- e/ ]! f+ P; ?' U
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
; D( R' @) _; s* l4 T6 h' d% H
% c( g# q9 a R. Y1 v' x
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
2 a. v' S5 B& R' v
/ y# `: |7 f( W, g z
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
7 k& Q8 G5 `. |) x$ t5 |
$ Q( y! |5 ?- ?7 F. ~5 v( R
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
3 _$ k) Y8 y. t+ [0 B6 h* }1 M+ j0 k
- }% d, J: M F# c" }$ E
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
0 e7 D7 A5 |: ^- ~
# A8 U2 s# O5 q' i
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
+ O3 p1 P5 e. D: a6 C6 E
9 N0 U) n; {8 ?. Q$ P# r
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
: G* ^9 E8 A3 j
) s8 Q8 x# B, H4 u: L- }
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
3 X8 J8 {: G9 F7 o$ j9 K
8 Y( K8 c. m* ^: |1 E
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2