标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
- h' c s. o, m" ^. Y& V7 {8 f
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
# r9 m& l- ~! `+ _5 v+ \
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
/ Q4 H, U3 ^2 g2 [
+ R. A. _; ~9 Q; E) j/ y" M* c# k
* i# j. ]6 H& H4 V+ E! @' \
问题
, S9 X/ |) `- [3 m# J* y! w
3 J( v+ ^' j/ C% B
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
2 P3 A0 w& ~ w- D" l
4 y o/ _$ Z8 s
SELECT * FROM MY_TABLE
" L! D7 A( ?4 f& m( \3 N5 x; G! ^
* ^ R3 k6 k4 W5 Q9 w
A.如果可能,用把查询转换成存储例程
2 I' n3 M9 M H0 W; x4 [( V8 S
B.如果程序允许,给查询指定返回记录的范围
4 f1 s2 J9 `2 Y. ^2 s5 Y
C.如果可能,添加where条件
l9 j* f7 v; S2 V* h* b
D.如果DBMS允许,把查询转换成视图
6 m8 Y l$ ]6 T3 F5 K0 D) M
E.如果DBMS允许,使用事先准备好的语句
! P7 I3 W1 p/ q9 f
' f3 l, d8 W/ e* e
5 W/ k+ O) x9 r0 J$ q5 |
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
! g- V) C- Y) J& ]2 Q8 A
7 i8 l- s% e9 _; R4 x% D1 u
答案:____________
9 t# x7 \+ e0 ]) ^& N1 \
6 J2 d; \6 w2 P# D0 T
0 N: ]3 U4 ?4 R) ]) V1 n
3.内关联(inner join)是用来做什么的?
" T* P0 V5 [0 O- M) N. x
8 s- d9 X% u$ j7 j } n( N
A.把两个表通过相同字段关联入一张持久的表中
7 ~ j! P' P" r+ T6 ^; R3 _/ I, W
B.创建基于两个表中相同相同行的结果集
- p6 Z0 c, L% p/ s4 a
C.创建基于一个表中的记录的数据集
% x$ _3 ~* r2 U$ m0 H% i8 Q5 v
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
" A9 g5 H3 h7 r5 c
E.以上都不对
4 r+ Z+ K- F1 Q+ w/ d+ i/ }; Z
0 `( E. Z0 T- R- E4 x: T7 W
% ?5 i! H3 J( H% S' [) G' c
4.以下哪个DBMS没有PHP扩展库?
6 O4 V0 I5 v# Q! `: ]
5 X1 h6 G; v. k
A.MySQL
N' l2 k ~# T% ^4 i2 v1 E3 ^
B.IBM DB/2
. h9 j4 f3 I' u% ?
C.PostgreSQL
Z1 c: V) Q3 s6 A/ g* e0 }. N6 `) T
D.Microsoft SQL Server
" Z3 H9 ~4 @# U2 `
E.以上都不对
. A: P6 D i+ i8 Y$ l/ \; N& {' {
; T1 g7 [( r2 e/ ~% @
, D/ @7 R5 y7 C" `
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
, E! L: N# {0 b# P! s: |: U: c
! g) y3 V5 u$ T4 J9 `
<?php
, N$ Z0 r0 e* S6 t, ^ |6 s# ~) N* W5 A1 P
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
Z( m1 p# \% ^; q& L- E/ |
?>
& ^9 ~6 W3 [+ \$ x4 D. m0 h
I( L$ C- t- F
A.MYTABLE表中的记录超过1条
- `4 x6 u9 G, L: ]; z3 b
B.用户输入的数据需要经过适当的转义和过滤
7 H( K+ `4 s0 q ]! w2 h, X% _% C
C.调用该函数将产生一个包含了其他记录条数的记录
) L9 `: p- r. h2 S% q
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- A! h2 u; a; p0 J3 m
E.查询语句中应该包含数据库名
7 }4 F6 ~1 c: V
% W7 g7 f ]& }3 ~ M5 ?* X
; O1 h n9 s) u o5 @% b$ j
6.______语句能用来向已存在的表中添加新的记录。
, M! B0 d7 D- B7 q
3 M3 E7 w( N2 W! h
答案:____________
: e$ R2 n7 F! K0 e+ U& y
. S( I' L3 D3 z5 e# j
( W a1 Q8 u0 O$ |* b9 S" l
7.以下哪个说法正确?
+ O: {7 r. c; d8 {2 v4 h6 O
) u3 z9 T: Q) A, J
A.使用索引能加快插入数据的速度
4 G- T* ]2 k5 t f: p
B.良好的索引策略有助于防止跨站攻击
' J- n* A0 S, W) o" A- E' l: L! F
C.应当根据数据库的实际应用按理设计索引
; f: g' D0 H; V5 @( u1 l) F( r& }
D.删除一条记录将导致整个表的索引被破坏
4 v0 G/ P& Z; D2 q( n
E.只有数字记录行需要索引
f. ^) K3 [, n5 ^. }, C1 C7 ^
+ n7 u1 g2 @9 x# Y( s
- b) a/ M# ~) R/ K5 l
8.join能否被嵌套?
) h/ {5 [7 H. G# T# m( J8 ^
/ P; n$ B% O( g- h8 f4 _/ J
A.能
* n7 G9 j6 ?* D4 ~& }3 o
B.不能
; N2 f: C0 M( p$ f0 w- V! \8 U
a# H8 g8 n8 _" J4 }
( Z+ d2 k& g4 U9 ?+ Z5 a/ f4 e6 {
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
0 B* V# Y' C. \' }$ j( q
: R' i6 w# F7 t' W
CREATE TABLE MYTABLE (
% C5 [1 e/ R% L
ID INT,
" `+ b& { V+ ~' w% {
NAME VARCHAR (100),
; y( S6 | ]5 c2 u8 L# z& O
ADDRESS1 VARCHAR (100),
- W% p/ i2 X1 u
ADDRESS2 VARCHAR (100),
; _$ q! t/ R* C1 U3 Y: X" ?9 R+ ?
ZIPCODE VARCHAR (10),
( k; S+ g& v. O' E# w
CITY VARCHAR (50),
- R! g, O/ `, S
PROVINCE VARCHAR (2)
# U7 u; ?: M$ b0 K9 A
)
3 c1 b! E4 Z x) D6 n
SELECT ID, VARCHAR
' h! l) S0 G, s
FROM MYTABLE
" A' T% c# u7 t7 B! m
WHERE ID BETWEEN 0 AND 100
: n6 S' {: [3 c, E2 @
ORDER BY NAME, ZIPCODE
/ ^: O3 W$ N. ~8 Y& o
/ F0 t+ l0 [( _4 F
A.给ID添加索引
8 t: w4 }0 V) P; }; }% f) e
B.给NAME和ADDRESS1添加索引
4 @9 L$ K2 C1 d( p
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
1 A/ I% G4 E- H; M" f- t; s% b
D.给ZIPCODE和NAME添加索引
& m8 } P) P3 b, Q3 Q& c* `
E.给ZIPCODE添加全文检索
% U; N6 W! `/ C
0 d! G4 H4 M: {8 u7 d* Q
8 x, b8 t/ \' e% I. o' e& e
10.执行以下SQL语句后将发生什么?
, ^7 ]5 U! L/ o- r6 f9 N
, ^/ J+ a0 m0 q4 ]& i
BEGIN TRANSACTION
0 H& e5 Q2 K5 y: o+ o! ^
DELETE FROM MYTABLE WHERE ID=1
0 \( I% V$ \ U; f7 F- n9 ?7 _
DELETE FROM OTHERTABLE
/ |2 W* b) y6 d' n/ W0 u; a8 N: c
ROLLBACK TRANSACTION
. M- u* l. O- l
" S& a' m4 k* I0 z7 X, O
A.OTHERTABLE中的内容将被删除
* [5 [: ]9 v% i" |' H: q6 i [. ~& q
B.OTHERTABLE和MYTABLE中的内容都会被删除
& V1 o/ M8 w. c4 m, W9 J( \- j& k& y
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
/ m; ]- Q+ V6 {% p
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
1 m- `! ~: l2 K! U0 M9 g
E.数据库没用变化
7 Z5 u3 j M* m
! e8 l. h, s: a0 O
4 T* t4 b; |& N
11.DESC在这个查询中起什么作用?
8 r5 e* {: N! T* N, V0 E/ t
0 G6 V. C( U* G6 h& N& _+ p2 W
SELECT *
+ o1 }' v* R+ p9 u( K& x
FROM MY_TABLE
1 w* l5 d6 b8 ?
WHERE ID > 0
2 Z& q: n7 _$ q# G
ORDER BY ID, NAME DESC
1 Z( A& h5 ^. i5 v" S
A* W+ X( _& x7 \4 [
A.返回的数据集倒序排列
+ W p# J8 U( f" Z1 A9 E
B.ID相同的记录按NAME升序排列
! m2 [7 `7 A5 U- R, E* W" X# P0 D
C.ID相同的记录按NAME倒序排列
( W, E' @6 b8 ]
D.返回的记录先按NAME排序,再安ID排序
) `+ s5 T" _( K% k( w6 G
E.结果集中包含对NAME字段的描述
; w, C( W4 \# @( ^" }: _/ S
! a; v0 G/ B9 r" ~3 o( C1 s
$ D7 f6 X: ^7 M6 q# q% s6 C
12.以下哪个不是SQL函数?
# s2 N& \! s, z1 s) c. L9 O
3 p% E) l# M+ H; j: [3 [7 x& n
A.AVG
9 `) G9 `* d3 M
B.SUM
2 P" p Z8 ?6 L$ \# j& j! j
C.MIN
$ ^9 E, `1 x# q# G: Y7 }( n7 d
D.MAX
( y" _ S: m8 C. Z* Z
E.CURRENT_DATE()
* c$ C: f2 w/ V+ p7 {& G" s
+ Q8 M8 n2 a* r# z7 I) k/ N% C
5 q0 l. H6 L7 r4 G: K* V
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: v* M: f( c2 H! `( R
1 ?5 X' ~3 V7 z, T# z/ K
A.该字段必须有索引
) l: H) F- K& ]4 f& q( O
B.该字段必须包括在GROUP BY条件中
' O1 ^+ v% ?- B J A: I a9 e
C.该字段必须包含一个累积值
1 q5 Z* Z) { A, A
D.该字段必须是主键
% A- T9 F) f0 K0 E0 q" W8 i
E.该字段必须不能包含NULL值
! P# Q1 z* S4 y! G" a
0 S3 q' X! a9 K+ e( [. z5 o
3 Y4 ^: ^( ?' s" _+ `
14.以下查询输出什么?
+ T: h7 Y' ?7 H
7 s1 ?) M; j3 Y2 F# O
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
z; G1 ~% \2 ?# }
ON TABLE1.ID <> TABLE2.ID
6 Y( |) `( B+ T2 R0 m/ B7 I
, J$ U9 b1 v$ `6 c7 B, z
A.TABLE1和TABLE2不相同的记录
- O' j. @- n6 K7 s
B.两个表中相同的记录
$ I9 E8 h; X/ s0 t& x
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
+ f! w) n2 V; p X$ d7 ~. ]4 O
D.两表中不同记录的条数
- B) M2 }! n4 @4 b+ y5 F
E.数字2
" x2 j `7 d9 t' N8 [
, Y7 V9 L' G/ w5 }
# _ {% s4 I! }4 l
15.______能保证一组SQL语句不受干扰的运行?
$ ^, n) z3 x+ h. Y$ r$ n
7 z0 a- q, ^. E7 k! T
答案:____________
/ ]3 S9 H! l8 _# n( d& q+ [
! U7 l) y7 R9 j
% T. e* \- w% g
" A$ z0 g5 M0 Y
答案速查
# f/ d- q9 n) [! J p- f; j
1:BC
( R& \* _ `' y$ q" e* O
2:WHERE
! P: f9 e* x' f$ R: s' Z& C. d1 q* K
3:B
1 ]$ `$ }( @4 c e* f$ c% h
4:E
8 f n: _& D4 ?9 v, W
5:BD
8 q( X# a* E4 V1 W
6:INSERT
# o( R$ L! }1 J9 d* f
7:C
2 M! X# v- v- ]1 I
8:A
4 ^) ]& a/ o+ i2 S2 s5 T9 G
9:C
, `) @, `5 S# G3 e
10:E
) w A `% w T# E6 O
11:C
7 h5 ]9 p: w3 Q) O. v
12:E
- R6 N d7 B. r8 ^' b, p3 | I5 V
13:BC
' p, M+ i6 `9 U7 }6 R# f9 [9 o; N
14:C
# V2 G+ E" ?' ]1 _
15:事务
# O6 ]- b& Y5 w( u8 A! s
1 G. r( Z) s# F, d
' k( ^; B8 J9 K3 @) U ^$ h
/ `& ^" V4 M# I7 u$ d0 F0 D
答案详解
2 I2 w% U5 D O& Z# t
. P/ o. C1 C/ v) i" E
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
( A( z0 J, f0 `2 ~+ O- f- ]
2 Y4 `0 j, m- s% e
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
6 n. N9 n; s* V. d* \. h1 d
. [) c1 a5 ?- D$ |
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
% q% w# ?3 }7 P' I+ C7 D
" N7 ~. ]7 Q6 Z9 v m: [3 K" G
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 \* h7 p7 m) R9 P2 D: k/ N2 }! t7 |
8 a5 C$ D4 S- h- n/ }
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
; p, s$ W) t9 c9 J9 `
* P( Y' {# s0 e
6.答案显然是INSERT。
: Q+ E `7 _2 U" Y- D* k6 A+ Z
/ D: p4 C Q+ q8 c( I
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
6 g2 T0 F2 W" a+ p& T W) b
7 h8 n3 ^$ r2 H7 _+ Z9 B' f# G! g
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
; L/ e1 z9 [6 C5 r
8 M2 n8 E( N6 j, T) S
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
( l1 i( Y- C8 @- q% W: o
8 g. W0 j4 P. O- d# l4 _" B3 c3 i+ H
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
& M, F4 b" ?# b) {# u2 H1 K
, v3 _( w) V! G8 E
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ s0 z2 ?% ]9 n) Y- ^
0 ?6 G6 r }5 ?
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
$ J3 `3 K2 ]2 K/ d6 P0 w/ H, Z
8 [9 t( Q" ^% A; c
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
- a' x6 D3 h4 O3 ^; R# U
. f! B& Y2 N$ d& \
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
* Q/ k+ N7 G$ Q" J( H# {2 R, X7 U
0 d! R5 P+ b, S0 T) p( ]% L6 N3 q
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2