标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
[打印本页]
作者:
admin
时间:
2008-4-17 14:44
标题:
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
( y- B$ Z7 A" c
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: P1 ?3 _+ g: e* l" J& Y8 ^/ V; ]( L
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
$ A. M) ^% {/ g1 G/ e6 E5 ~
, Q2 \5 e0 r U* G$ D* S$ B
- Q7 {0 m3 m( M! W k# ]+ G
问题
$ K3 O& R$ P5 l0 P& h) X
& y; N# ^. D: v7 C
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
% i: |8 F& @5 n. p8 {: ]1 H# H
& M- B3 D# [) t x3 D/ I
SELECT * FROM MY_TABLE
3 Q# R" L6 f T* J
( M0 z8 z, @3 p$ a z
A.如果可能,用把查询转换成存储例程
" n: N" f$ r& ]% B8 z. y# ^* t
B.如果程序允许,给查询指定返回记录的范围
( Y! Q1 e0 ?% h. o
C.如果可能,添加where条件
! K. N5 y( m2 b5 r
D.如果DBMS允许,把查询转换成视图
# y5 |" p! D" p1 U
E.如果DBMS允许,使用事先准备好的语句
+ E: q8 A9 ]/ G8 o' _
$ u0 x" k9 Q3 ~' e1 ~. {* E
' J2 T2 J2 t+ g s
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
7 S# L% t9 U j9 }
b2 k7 s5 P' V; h/ _4 q7 z
答案:____________
8 i d! S! y9 l7 c0 t
8 | B2 ?" |3 |8 S
^6 Q! w. G* ^9 B
3.内关联(inner join)是用来做什么的?
. k# }' L) x* k4 G, `/ ?8 r1 v( [$ u/ |
5 c& Q" I* H! w, k; g b) A6 g7 `9 E) f" E
A.把两个表通过相同字段关联入一张持久的表中
Y* V: L% L" \4 Y
B.创建基于两个表中相同相同行的结果集
5 J. g3 x( a4 v, e
C.创建基于一个表中的记录的数据集
3 M3 N. l* K* L: I) w; H; `
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
5 @: `4 I$ W% U9 d' ~0 Z/ ]: W* f
E.以上都不对
* O0 G" L4 ?" r" B+ v
# R! G( Y. P! l" C) Z- g
% I! y/ [4 k6 S& E+ i& X$ P, G/ O
4.以下哪个DBMS没有PHP扩展库?
4 |+ b$ G6 i( N; i/ E6 x# y( M
$ o5 `" S3 j) x5 M! o
A.MySQL
, H. w% d3 k# m. _) e: F: Z
B.IBM DB/2
9 B4 w: B1 d4 E- \5 M# a
C.PostgreSQL
8 F) R. @0 z3 O( ?
D.Microsoft SQL Server
: c( C' T0 J R' g& ^9 X& F
E.以上都不对
$ a. \2 `5 q+ O: w' n+ c
# i0 j9 n; F% b. v
1 p9 @7 G8 `& D7 y6 B7 f
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
9 F3 q1 m' S! z8 G3 d! E) s& R
) A2 `6 R2 b5 n/ D
<?php
' T* O8 \( u' v
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
1 M# ?* q* g8 ]. Y$ r, U
?>
1 [$ X* \$ t& A" I9 [& O; O% N
' {; u+ r7 t9 n% }, P" t
A.MYTABLE表中的记录超过1条
8 G) ?6 Y7 G$ f6 `
B.用户输入的数据需要经过适当的转义和过滤
/ H- P8 ?9 E b
C.调用该函数将产生一个包含了其他记录条数的记录
! S" t" O; O b3 N6 l+ q
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
- ^( J( R: N" G( v9 e0 S( f) h( O" {5 s
E.查询语句中应该包含数据库名
6 M& P" G4 i8 F U
! x+ C. b% f# S, w& c
' z1 \: S5 `9 `* H$ C; j
6.______语句能用来向已存在的表中添加新的记录。
8 r% P( E; I1 q* f, \
9 ^ j+ Z7 \, V) I1 I8 ^+ y
答案:____________
; L* b- |, W8 y' w* m$ o' q3 z
+ K& K3 e9 z7 i' C; \: e4 b& V
- H9 P$ T3 M: \- f% K9 u
7.以下哪个说法正确?
2 l& S8 X! g3 M+ z1 d( G' l
9 R9 Z- c! ^/ _% ^/ j
A.使用索引能加快插入数据的速度
8 e9 S% i' U b; Z, }
B.良好的索引策略有助于防止跨站攻击
" E; `$ N A: k3 l: v% K
C.应当根据数据库的实际应用按理设计索引
; d+ F6 t# c3 E
D.删除一条记录将导致整个表的索引被破坏
- d3 J/ |; h. x# I: w+ a4 g
E.只有数字记录行需要索引
5 Q) V. { a; @/ e4 O, j0 ~
4 B& E% Q+ ^; V2 ~; |" a+ D3 \
% O. r( i$ g6 n5 d, m- D0 V
8.join能否被嵌套?
- q( P( B9 n* ]) B
1 J: J% b( \1 \6 M3 \/ O0 j9 K
A.能
- h8 d4 z2 n$ m. s) ^8 N0 W) z
B.不能
9 j# W, f: R8 K! ~
7 ^, w) |9 M0 Y7 b
8 N7 Q& P) H7 f
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
6 H/ {! Q! |; S) r/ |9 A. @( T
R" [5 x) d1 p8 G, ]& l
CREATE TABLE MYTABLE (
; |+ |" n8 ~: h) H; P
ID INT,
& S/ @, R( A( |1 p) C
NAME VARCHAR (100),
f3 ~9 v5 m" o: p. J. D
ADDRESS1 VARCHAR (100),
, {1 Q) g7 G( b$ Z& L2 M) e% v
ADDRESS2 VARCHAR (100),
- }2 U1 R9 @* A+ o- t6 F! {1 \
ZIPCODE VARCHAR (10),
; d/ N6 S$ A3 E: |) T) h
CITY VARCHAR (50),
7 p+ N! a/ C7 L/ Y X$ {$ |) }4 o
PROVINCE VARCHAR (2)
) D- C! C/ A# H* i9 t# Z
)
* E- c! N0 l/ ` s3 J( F
SELECT ID, VARCHAR
' ~$ d$ N/ h+ P7 t7 d! Y3 L
FROM MYTABLE
4 g; c, ^9 b, B5 s ^9 q) f
WHERE ID BETWEEN 0 AND 100
& I7 g0 c2 t' ~8 u0 Z' v& U
ORDER BY NAME, ZIPCODE
# M$ [1 f6 ]; k# v5 ?7 b! T3 x: b) `
( F1 e$ J; C3 u1 g$ F( G' i
A.给ID添加索引
) u6 r2 |) S+ z F
B.给NAME和ADDRESS1添加索引
+ }5 Y# _+ k* X. t$ T0 {5 T
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
( E1 i8 x' v# b R. W3 s R
D.给ZIPCODE和NAME添加索引
4 N5 H* Q3 }8 _" Z9 O
E.给ZIPCODE添加全文检索
9 d) A/ F$ F' V' u" _" i
7 X$ G* t+ ^0 w2 R" \; P2 X c e" g/ j* `
# D4 q$ Z( G7 d; i ^
10.执行以下SQL语句后将发生什么?
% B Q4 l" g* {& m
& }0 U6 z6 W- n5 y1 R( ?4 Y B
BEGIN TRANSACTION
/ {7 _! W7 o: s; `% [, _% p
DELETE FROM MYTABLE WHERE ID=1
/ d" \* {. o: D- T
DELETE FROM OTHERTABLE
/ y) m7 e: I0 Y+ w& n0 M7 c
ROLLBACK TRANSACTION
0 w6 _2 A/ g" F" m! S3 w1 w
7 ~) B/ d7 w1 q' \' z5 M3 Z
A.OTHERTABLE中的内容将被删除
( ~' U9 B& A8 \3 g+ z Z
B.OTHERTABLE和MYTABLE中的内容都会被删除
S: [* S9 C6 w9 C5 D
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
$ ~+ r4 P; y0 t* W
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
' i( [& O$ Y6 r6 T* ^
E.数据库没用变化
7 v8 B! }; T$ K. N( W
9 E/ K2 q8 w. B+ d E
8 O1 Q% [% J2 O5 l4 J
11.DESC在这个查询中起什么作用?
; }7 m7 l+ g' k- P- v/ I; t
, F" e5 B2 N" s
SELECT *
5 z4 M! j) F9 o
FROM MY_TABLE
/ U% A' I" S2 {
WHERE ID > 0
9 B* W: _$ v+ q& R0 Z' ~
ORDER BY ID, NAME DESC
7 I2 W# w1 b8 q
1 X- [2 o+ i8 v+ K
A.返回的数据集倒序排列
8 H# A( E* [( N: ]8 @# {7 o
B.ID相同的记录按NAME升序排列
% d# s- Q9 c4 c3 ?2 K
C.ID相同的记录按NAME倒序排列
" f2 n( E" H/ n* T$ B# O% [! P
D.返回的记录先按NAME排序,再安ID排序
1 [ j* ~$ c& p4 }0 {; z9 _
E.结果集中包含对NAME字段的描述
, N) x3 A% ~; U- z5 D
1 V8 O7 D6 c1 S. Z- }" ~
- g. b* f; x* l& |
12.以下哪个不是SQL函数?
1 r" M4 B& x3 R+ g
7 w2 b) y+ _9 a
A.AVG
. u% {/ p$ @/ @; e
B.SUM
, g8 I3 ?" M2 i: d6 \* ~
C.MIN
0 l/ p( s9 y+ Y* M/ k+ e# Y
D.MAX
( X. K3 Y9 A Q$ z; }8 P
E.CURRENT_DATE()
/ ?6 \2 I" b& ?. L2 s
! V/ g9 D; P( ?/ t$ {& d
4 y5 b" [8 f, \$ n) @, [0 p
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& Q& ~ @2 b* g# K8 A, w3 X
& H3 ]1 e" S0 r/ E
A.该字段必须有索引
, y5 k5 r6 Q2 Q* i$ X6 o
B.该字段必须包括在GROUP BY条件中
* n, J5 P" U% \& Y( G: v
C.该字段必须包含一个累积值
) w; _6 G5 Y) P8 |3 P6 Y" _: N( u
D.该字段必须是主键
( r* C9 Y' W( d1 Q! H: m
E.该字段必须不能包含NULL值
3 e* c( L; K/ \& e. Q
3 v! J* z7 G( u
: N1 m2 e0 y1 W0 E+ ], N' q
14.以下查询输出什么?
# F0 B/ h; }% C4 j) r( _8 B
9 Q# @6 R" k* i i+ a5 k4 a6 G6 f
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
4 P d+ u2 p- C5 o
ON TABLE1.ID <> TABLE2.ID
) s+ ]' l# o+ N7 f+ |
$ _; @' V$ P" C2 L
A.TABLE1和TABLE2不相同的记录
8 [0 _# E0 r; @# R1 h" I) L$ t
B.两个表中相同的记录
7 R) W1 G8 h: f
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
# C$ w9 b3 Y! I/ X
D.两表中不同记录的条数
) c+ x' ^2 b. T1 q
E.数字2
p' j! G8 ~7 G9 D6 k4 x
0 Y( I9 \( y, C2 i$ B! q
" J; [7 W& L0 n* ?9 d( z3 z
15.______能保证一组SQL语句不受干扰的运行?
/ v8 s. o. t) e. b7 @7 ~( `
7 o$ `8 f. _8 z5 G' D8 H' v* l
答案:____________
$ `- T# M$ q) \% m
- B9 H* I! m1 I2 p/ Y7 r
: d2 a3 ] H: t/ o3 X
) H$ x5 `9 L6 {; g# h
答案速查
( A/ v7 g7 H6 A9 i0 D5 \5 @
1:BC
, B- b" D( {5 m/ S/ ]- a' p3 T
2:WHERE
, j* P7 C# a7 n5 |) d
3:B
; J6 T( X0 ^9 t* B, N" V% j: U
4:E
# j; @$ F5 t+ y# |% W
5:BD
' n% C6 r% z' i0 v; ~$ w( l
6:INSERT
" _; {& h* q( V& V2 e, \! h. O- O
7:C
1 |: D1 l( A$ e4 S- z. D7 @" @6 L
8:A
u$ c( d) @; U6 O( a. d
9:C
- v0 X6 Y- `- v) o
10:E
0 k; ^2 U7 ?/ C- K2 ]9 Q
11:C
% W! D% n8 O; h; K8 A! L
12:E
: g' d5 @) X* u/ q) e) L
13:BC
: N5 e* C$ U$ x9 H# Z3 D
14:C
' _! e3 _5 A( g+ W# n2 _
15:事务
, e6 L+ {! V' U. Q1 v- Z
7 Z r, P8 d( `6 k
6 n/ s f2 x" I6 F% ]$ B5 j
8 @: c) e h/ D, @1 F8 g
答案详解
$ R+ ]" K5 n [# b
2 m5 j/ k; L3 l3 q% y3 P5 [8 i
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
, [- R+ h. A3 \. }
/ C& G, y, N" G, X4 ~
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
; e! X5 Z/ u9 m3 ]" p# v& n$ D4 _9 i
2 a" T5 s& j3 }6 M4 D# y% C0 o o9 c: b
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
8 y/ |- U8 s' s+ e
, D2 r4 |7 t! }& y0 n2 Z
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 k( @' a/ Y7 Q* K" b% ^
+ r( i9 ~$ R4 h1 C4 ~6 y/ _
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
. i% ^7 x. H6 `7 O( d2 f
+ ^3 a9 h# ~3 k! ?+ U+ {
6.答案显然是INSERT。
7 z9 e, G# l6 |
M, p. u* I# Y u- D$ r7 a
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
- f A/ N0 t8 Z! u8 d+ @4 W
4 } \- ]5 O9 \6 @& G1 m$ j, q& k
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
$ o0 G$ V% D) S+ o. T
9 A5 q5 ~. [; [6 F; A
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
( [0 z1 z8 `) K3 }- f6 Z
7 Y/ ~' r. L+ W: ?5 g: t9 G
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
! @) H- c) h" ?% c
' n2 k9 X. N8 _! j/ i; Z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
/ Y* _3 c: A$ @! i- K. ]& Z0 [3 C6 \' Q% B
0 g+ ?/ k" h% Q6 v) [
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
+ d2 F( n) ^( c/ [% u! a
4 d& G& j( E* A9 l( {
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
; b. v6 R p3 f0 I5 _
) p) n- Z+ A8 D; I, Y( x# z* D3 F
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
* u1 j9 ~$ J( m$ R
- o5 n5 m& U7 W0 u/ D; C
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2