|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。- } j" L) ~3 v# S) B: M
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: a! S/ k( G" u6 i! z! w! Z5 l8 v2 c$ t本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。0 ~, F/ U& i5 x. E
8 O1 A' k, \. R1 Z% _
8 Y0 {+ c/ Z" z( H
问题
; t. y3 }+ c; [; Y: z( N) ^3 U9 F/ ~8 q2 Q) P
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)& U {8 t3 e& F! f- |3 h
$ c9 {! q6 u4 E3 d% G, ^- {
SELECT * FROM MY_TABLE- G0 S! T9 G, } {. i
8 B9 y( Y: o7 w- g. nA.如果可能,用把查询转换成存储例程
2 r! k) d& e8 _4 V+ C7 J& } t1 EB.如果程序允许,给查询指定返回记录的范围( J- U0 i5 u8 N2 f1 e" U' s
C.如果可能,添加where条件
0 y3 ^ W. x6 \4 r8 t! P/ QD.如果DBMS允许,把查询转换成视图9 E5 O/ }" M6 H; y! h
E.如果DBMS允许,使用事先准备好的语句
7 u ?; \. Y" E% q. R# _2 p1 E/ [
% c1 z1 X7 i0 z M8 L8 s+ p6 y. V+ ?
2.可以用添加______条件的方式对查询返回的数据集进行过滤?1 S& n% c8 I+ W' e# S# {
6 }' M$ Y2 A+ I0 L
答案:____________
p0 O; |1 }0 P2 [, O6 T8 I- J6 t' `* D0 L
! l: f9 o# @: {2 y. D$ z
3.内关联(inner join)是用来做什么的?% I/ A. h2 v+ {9 J3 T
- p: i6 A E8 e6 c0 b
A.把两个表通过相同字段关联入一张持久的表中
) x# a/ l7 W$ a$ q' {% q$ F {) kB.创建基于两个表中相同相同行的结果集
* [- L" Y/ y! @2 R3 hC.创建基于一个表中的记录的数据集1 B, }6 r B! R* Q3 D- r
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
, C, `/ V5 R" KE.以上都不对
! u& E- x. H' b2 x6 Z7 R' Q; G3 w( Q. v. p5 {( L% t4 c
, _8 ]5 P) ~/ L, U5 e8 V# W! K4.以下哪个DBMS没有PHP扩展库?* D1 q! F( f. L
4 B7 r' Z8 p. c7 c! `
A.MySQL
6 f/ u d. r I ]B.IBM DB/2; j2 t1 h/ c) p: A4 g8 X5 f
C.PostgreSQL' N9 `6 z+ w+ ]7 W8 |+ e; T7 p
D.Microsoft SQL Server
' g+ f8 \6 J) C# U! iE.以上都不对
0 r! O! U# i& l \' X8 \
; Y* `1 ^- ?: F: X3 [; d- I
; m4 K0 ?2 |4 s( m! W1 E5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选). C# o( y' M, ]* O
$ K/ g3 j0 |, o6 C% M
<?php8 d5 N- r& v* n( x
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);! m; x: |) L4 S' d' u- S' O
?>- j" O4 ^* A- x6 C
9 g7 h( S, n* } k! nA.MYTABLE表中的记录超过1条- Y6 L: a C9 |( ]8 `" x
B.用户输入的数据需要经过适当的转义和过滤
, E- J7 x+ b4 [, a. EC.调用该函数将产生一个包含了其他记录条数的记录- w4 }- t {' d5 N7 t6 t
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
' D4 ?# l; Y B/ g! I- b% J% S0 x# zE.查询语句中应该包含数据库名
u, i, [6 k# x0 x2 _
+ ~: C1 h: r1 d, U4 [
% _9 F6 ^' q& r/ O7 p6 a- Y6.______语句能用来向已存在的表中添加新的记录。3 G* ~- {/ G( \/ Q o8 O
% j8 ?2 L2 \" t ]
答案:____________
. T7 D x- ?; E' H4 T9 Z2 Z3 G9 ~. |
- O2 I# j; e1 |) P6 ~5 n) l+ t2 W
7.以下哪个说法正确?
; c- ~# ], \$ y4 L( W; `. P$ m7 V G7 Q
A.使用索引能加快插入数据的速度
/ e& z- b" B( e$ FB.良好的索引策略有助于防止跨站攻击. X$ B* y; w8 L" z- ]: h/ F& ?
C.应当根据数据库的实际应用按理设计索引
$ {6 j- F6 {1 M: ID.删除一条记录将导致整个表的索引被破坏
& ?; V k0 H) z; h: S( uE.只有数字记录行需要索引) X1 b9 H" i" {) U; n9 t3 ]
3 \% t3 H5 T& ^3 W1 O. R
0 P+ V) _, G2 _+ w) K- j+ h. K8.join能否被嵌套?
) C" h0 Q* K3 V% o, [( @
- V* s3 N$ a' {$ D( \& W; gA.能9 d: X# s+ t* Q5 h
B.不能
) w! @ \ F0 c& E7 G! q; G
8 Q- |7 y8 L: N1 w, ^3 j/ e7 T0 G* q3 k! {9 V( F, ]
9.考虑如下数据表和查询。如何添加索引能提高查询速度?. S9 N( v6 G+ b! u9 f& v! W
( A" |/ w( S6 i) B
CREATE TABLE MYTABLE ($ M, Y' R$ u# @0 U# @
ID INT,9 T; S8 W6 g) }
NAME VARCHAR (100),
3 A9 m" f3 |8 l# v$ CADDRESS1 VARCHAR (100),) ?( j1 S2 b7 ^
ADDRESS2 VARCHAR (100),
+ p8 a) l8 C5 _5 i# E( }; PZIPCODE VARCHAR (10), x9 n& f8 W( ]( x7 g* y
CITY VARCHAR (50),
4 n! x+ k! F3 K; p5 ~0 B, xPROVINCE VARCHAR (2)
9 T& Q* G' |: H5 {# s% g. u)3 r* |9 I- D1 v. p) i& ^
SELECT ID, VARCHAR j4 H6 C; b: S) @* {
FROM MYTABLE' T) L% B |/ s- b2 ?5 @2 Z4 x
WHERE ID BETWEEN 0 AND 100
- P' l9 Q9 ~3 y/ P8 _% k' R; `ORDER BY NAME, ZIPCODE3 I" Q7 E5 K p3 H
) K: S7 E) @! C' G" l) AA.给ID添加索引
1 O S- p0 v0 X/ {5 s3 `B.给NAME和ADDRESS1添加索引
. |1 `1 ]3 s0 J ^1 PC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引6 X) V3 Y& n |; z1 F ]
D.给ZIPCODE和NAME添加索引
0 G& [9 u" b9 f: i- ME.给ZIPCODE添加全文检索1 y& l* ]" N/ [3 h* H4 E
' X5 ?# y" | J8 b& |
) @- Q& B& a; c2 ]$ \! A
10.执行以下SQL语句后将发生什么?; Z# z% a( l% V$ h
- V7 `0 g( |3 l( iBEGIN TRANSACTION" u# C; |/ {1 e) | z% P& s9 v+ g
DELETE FROM MYTABLE WHERE ID=1! h# X- T) K1 }' x+ R
DELETE FROM OTHERTABLE
# ^5 h" L! {" zROLLBACK TRANSACTION7 v9 _5 l/ s7 E9 G2 Q) o
* e; e1 J/ \/ }
A.OTHERTABLE中的内容将被删除
3 o% M( J3 l& {B.OTHERTABLE和MYTABLE中的内容都会被删除7 @& u; u+ q6 c; J% P1 `/ ` L
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
$ e" g5 {. E0 Z% X/ L; ?, B6 F- GD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
. @% r6 q) N: f" n, z E U/ AE.数据库没用变化
7 D% F- D% n/ y y7 n3 }) H- |, ] `! p- @ \0 }
7 u0 z( h2 M. g& ~! `11.DESC在这个查询中起什么作用?
9 w# P8 }& R$ }( g( ^$ ?4 Z2 r7 T, K0 w- o. a. m2 @# O4 X N6 L
SELECT *6 f- ?& G8 O- a7 M7 s8 O9 [( L
FROM MY_TABLE1 a! M: k6 }; G! B7 P) D+ r- [
WHERE ID > 0
# N$ o) z( s3 d7 F0 vORDER BY ID, NAME DESC- l0 c$ ?. _3 b, a n% L' H! c1 _
9 f! X/ T2 Z. ]# @9 k& c
A.返回的数据集倒序排列
& h: a5 L5 F/ LB.ID相同的记录按NAME升序排列5 ` _( w s9 t7 p9 g6 Y& c: Q
C.ID相同的记录按NAME倒序排列 y1 X% w# x# J& V& i E, L
D.返回的记录先按NAME排序,再安ID排序
* ]; s# ?9 _6 P* ]) `1 XE.结果集中包含对NAME字段的描述* D( G4 v! V! L& M
, ^0 o! b; ~( m3 D: u1 k4 t8 q5 P, c& z/ I/ g; u
12.以下哪个不是SQL函数?' ]+ F6 g5 n$ q+ s- e2 z
( V. n% U- O/ n- B* }
A.AVG6 X9 \- h7 q ?8 z% v- w8 J
B.SUM
' p9 z( B6 q; ]) fC.MIN* x1 r1 }& G# D
D.MAX
8 q+ K* H, h1 e8 U* D# \E.CURRENT_DATE(); l l# d$ ^1 Q5 V+ Q- A- y
% y1 q' w6 Z3 b: X0 ^- N/ {: \5 ], Z$ }* V6 b4 q
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
; x( Z+ E+ e7 e
( u* u% Z D, F9 ~: m, ]5 |A.该字段必须有索引8 V) M7 V# }, {
B.该字段必须包括在GROUP BY条件中
- T% K* E% C/ N( C$ Q6 J0 r" NC.该字段必须包含一个累积值/ k: w0 M' _9 T' ?
D.该字段必须是主键. p d0 N6 |) C; x1 M8 f; m( Y" v) G
E.该字段必须不能包含NULL值
: T3 t( A: i1 c9 k" ?% X
3 \% k" W6 n; [; w. }
& v+ |9 i* O# H# ]6 ~* z$ @14.以下查询输出什么?
: b. z- Q) f1 a- h; S# |- v. l3 A3 f/ F; x' D3 d$ q' W) F
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
3 _8 h% J" a3 C& X: \0 P8 SON TABLE1.ID <> TABLE2.ID$ n- }. x1 U- w( T; I* i: r4 M
, N q' x& {1 K# e% bA.TABLE1和TABLE2不相同的记录
) W4 _0 o! z: V' z1 ?" o3 Q/ bB.两个表中相同的记录2 O% V; `- R* ?$ }8 M/ v
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
8 v5 A/ c# q: s( ?. BD.两表中不同记录的条数
) n" J$ O7 O r" E" G7 R. tE.数字2
, l% q6 g: ?3 ] k% v" X6 I, F y+ ]1 J
; L" P, `8 k' n0 }9 S0 V7 P$ J15.______能保证一组SQL语句不受干扰的运行?
$ ]7 @4 g! P$ a8 S3 r! q" s( W
- m$ N$ S0 G% [4 F1 l7 y1 M) K答案:____________4 H p6 W2 z, h5 t# s A
8 L( ?/ A. x- s+ ~
" M7 n" S1 p5 N+ N+ B
: u4 _% U$ v/ n8 m: z; b答案速查
# ?0 m7 z! g8 F' C8 \1:BC
3 @3 m" b: C4 w7 V2:WHERE2 P7 K, A3 c" y- Y; E. V# r8 s# {
3:B7 T8 G& Y. M6 q; Y1 f
4:E
& Q- {: Z! x1 W9 L' s. {5:BD
: b8 s/ s: U( }9 p! Z6:INSERT; j! }, H0 `- V- f3 \5 I; H
7:C1 J9 I. K6 K0 K4 B; o
8:A
5 c j9 Y; |+ a/ D0 j2 E1 b9:C
( s4 o: x0 I( D+ z3 r: l( c10:E
8 G D5 h8 V4 Y/ T- M11:C
$ Q% Q4 \/ f; H$ e12:E
0 |/ W; V% T# X$ i13:BC
+ o; z8 Q2 P! }& B, w! Y( u' w# Y14:C
# L+ |6 F0 v/ w% t8 h' o( N' J2 f15:事务
3 Z% l9 K3 o9 l) q& |" x8 ?$ W6 f
# P- B9 ~; t, d2 z; q/ d
9 N1 J1 _9 t3 J+ B
/ ?9 m1 g9 V+ T1 K5 k( h答案详解+ Z5 i# b7 v) }. D* S
" C$ x3 I2 I! U
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
8 i8 e/ S! V" K* F; b; k
' z2 K/ x. U4 u" ~- A# p2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。4 v$ s6 V1 N) |3 o! y
% L' I2 @9 g9 s1 v2 A( t2 ]0 K
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
# Q9 `2 V1 J$ {) k: [" x
E% x) l- v# m& G/ _4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
) @$ C6 G3 F* o0 u K: j- M; x" N$ Z+ o9 J. P
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。' n5 m. b7 e* B
$ X5 C- X: w' w- y- x5 V6.答案显然是INSERT。) i5 ~( {6 r/ H& ?& o: j. R% h
: [; u7 q& P5 I, F7 R+ \$ a
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
7 d1 P- a2 f9 T f) |- u& O+ P6 W/ w; `2 }: [
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
/ E; p) C2 [# w' B U
3 l" q3 t' L/ V* M5 C9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。# T9 a1 ~& I! M- X/ v& B
: v$ r7 f# t0 T, f/ C" i
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
" k4 d8 ]+ f+ ^! [0 j; c$ |6 p3 k% t. F# g/ c8 J1 a
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
4 X, Q+ f) V' F1 D( E2 m9 A) l' _( D3 x! l: b% p* Y
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。8 B0 } j5 Y, R) T- t: ?
& q5 X$ @6 z, g" e' {8 N" L13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。2 q8 v. r) E0 w
) w1 b; m. K% l& T/ c; P14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。+ n, {$ J9 o* j" g, y
3 ~/ c1 [+ ~. s7 ]; X9 X3 m% r4 S15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|