返回列表 发帖

[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
3 ?8 g, N7 v/ R7 K5 `8 XPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
: j9 C! R8 |# @9 S1 z2 y7 W本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。8 @5 F" R2 d$ l( L
( L+ b- J$ ^/ X
" w$ ^7 E9 q6 J# j# r8 r/ [
问题
1 j, C1 M" K! q' ~/ G$ U0 l0 w* N' W
! P0 v4 V& [9 W$ V% L1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)) `! Q5 G1 A9 Q+ f
, D! I# W9 D: O8 X
SELECT * FROM MY_TABLE
' c8 }2 y, e6 Q3 k+ y. v, _& R0 J1 ~, |! T; X
A.如果可能,用把查询转换成存储例程1 Q) m0 {5 [! w& r$ d* ?0 E0 T- \
B.如果程序允许,给查询指定返回记录的范围" Z7 h$ P% G& v, K) ^; @' R" ?, \
C.如果可能,添加where条件
& V9 `  O! ]& M% N, {9 BD.如果DBMS允许,把查询转换成视图9 f9 K. N0 y1 r  J
E.如果DBMS允许,使用事先准备好的语句4 h9 G+ g% a1 |1 y# u
+ o, \! d+ k3 v; e3 y- B: l) g

! s2 G9 t& p0 I) g+ G' W2.可以用添加______条件的方式对查询返回的数据集进行过滤?; ~+ g( T: Y. ~, _4 q# E( G

2 G, P# a5 C% c1 Y# x! L, B6 C* ^答案:____________; \3 P* p1 }% z# g3 d( N- Q& `2 X
  t: l; l, c1 R: i3 P& z8 Y2 |

$ c5 {7 x) T; T6 }- w1 A0 d* V) X3.内关联(inner join)是用来做什么的?
0 J, A/ O# K1 H- u) ^
- P* E9 Y' \% K# pA.把两个表通过相同字段关联入一张持久的表中
3 j8 a, F! }. C8 T$ y; O9 }B.创建基于两个表中相同相同行的结果集
+ f) O8 t+ j) h! I- o+ s& mC.创建基于一个表中的记录的数据集
4 X; z; B& `: Z+ e' p0 KD.创建一个包含两个表中相同记录和一个表中全部记录的结果集8 m; D# x2 K# Z/ N
E.以上都不对
( \. |2 B6 }% C4 O* p
4 N( T$ N& ^  u& W7 Y
. |5 t2 F3 Q. v4.以下哪个DBMS没有PHP扩展库?
$ j" J; T* k0 y4 E! `$ _  m1 E7 ]# t% s9 J) K/ i7 _
A.MySQL6 K1 |. `' f1 }3 `2 L8 K6 t! p
B.IBM DB/2. j: b. o5 D3 {0 ^, R  S6 H
C.PostgreSQL/ P; D! j* M. \% D. h: \4 _$ f
D.Microsoft SQL Server
  f' M% h/ u1 AE.以上都不对8 s% p# M* r9 o( z6 u3 e2 G" e3 `

1 l7 }; @, D6 H, Y4 v$ C# Y4 ~7 m
9 D. X" ~+ S6 }" m5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
$ q" H0 W9 P& k( q; d! }1 @
; Z, W1 W6 D3 @. B<?php( C+ `  k' M$ t9 J5 s3 a' z/ c
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
; M& o3 r7 W' U( h) n# y?>
1 f3 \9 y9 a& N; M+ J
+ X! I" o8 k) k4 h1 i1 TA.MYTABLE表中的记录超过1条8 F: T, L! j5 ]- F& H' V( u
B.用户输入的数据需要经过适当的转义和过滤( K3 L& u" z% G- P8 S# h4 n, q/ L- N
C.调用该函数将产生一个包含了其他记录条数的记录/ @: {- J4 `% j, m* U; \
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
( S* o) ?% x9 O1 S& _9 OE.查询语句中应该包含数据库名
( Q; ?5 C8 S6 U4 o2 ^7 q# i$ u0 G  r6 [/ O- ^# L) q
/ l" ?1 ~# e& w8 ^+ v
6.______语句能用来向已存在的表中添加新的记录。
0 H1 L, Z% T2 |" W$ S5 @; S( u# _. A0 \" m) S, P
答案:____________
* \! o0 O5 [( l/ o- y0 t7 ?+ D: H! b& k! I$ g! ?

1 h! B( s2 h# O( }# Q$ @, M7.以下哪个说法正确?" i; t1 t8 q. Y: l  G. [

6 @! I6 T( i; V, _% X% ~A.使用索引能加快插入数据的速度! V1 b$ |$ l% v( E
B.良好的索引策略有助于防止跨站攻击
# E" h+ I; y- O. e( a; nC.应当根据数据库的实际应用按理设计索引
& ?! g5 C) d1 g5 w5 F- AD.删除一条记录将导致整个表的索引被破坏
$ X* U5 _$ I# L. q. E: i9 kE.只有数字记录行需要索引
2 h2 C- ]! v6 Y0 ~
3 \+ s' v8 H$ E4 Z
7 Y4 [+ E2 z# [3 R/ c8.join能否被嵌套?
, `4 _5 ]4 V( O3 {% F  g3 H- M8 B2 I8 H. c6 D
A.能' m) o# _6 p/ I: Z0 a+ l( `
B.不能/ Z6 U4 j% b2 J4 d
! K, d9 u+ r9 {) c- x1 t" l
! Z( @. Z. r6 w. r) x! D/ E2 e
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
% n9 j6 w, I# {. x' C% i
! f$ W0 T) W9 J' E- fCREATE TABLE MYTABLE (; c( `" D) y6 A, U: c- K6 _
ID INT,- F& h3 U/ n$ ]' F
NAME VARCHAR (100)," [7 i$ Q( m3 |2 k0 l$ z) V: W
ADDRESS1 VARCHAR (100),- R" n$ _$ X# d% Z! r
ADDRESS2 VARCHAR (100),9 R5 f8 B" q, ]# v
ZIPCODE VARCHAR (10),* z5 O+ u9 ?" G, s. k
CITY VARCHAR (50),) Q! s9 Q- d' s9 j& |) v) z3 D2 G
PROVINCE VARCHAR (2)
9 S1 Z# z; ?9 S5 p0 d)$ M8 t0 I: @. @% I1 f! m
SELECT ID, VARCHAR
. i4 [, Y# d3 f  k9 C0 S8 w( H! ZFROM MYTABLE1 i/ \. n1 n& f2 ^# l9 i! I
WHERE ID BETWEEN 0 AND 100
% w0 ~4 q% a/ U5 p* z8 qORDER BY NAME, ZIPCODE
  u0 w. q" U% g9 D7 _' O' u! K/ n$ i8 H% M' `
A.给ID添加索引% ~+ z0 V$ }5 X
B.给NAME和ADDRESS1添加索引
# Y4 v4 q/ k  R, h0 XC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
) U! }5 x+ t9 P+ Y: X' JD.给ZIPCODE和NAME添加索引& F2 a* u3 c: p
E.给ZIPCODE添加全文检索+ E  \% m! w% {6 B' u% K* K
) o! f6 I( N7 V; R
5 w4 }0 ]5 s$ |7 F3 [6 v- o( x
10.执行以下SQL语句后将发生什么?7 H+ q; O3 t# v+ j6 ?

, K# C  X& w0 \" x) aBEGIN TRANSACTION  ^4 P0 |; @8 U3 X4 w( }: l
DELETE FROM MYTABLE WHERE ID=1
* J9 R0 u& H2 ~2 A* ~, {! JDELETE FROM OTHERTABLE
+ A* |5 m+ @7 t0 RROLLBACK TRANSACTION/ M4 {% q$ Y/ A: `; E* `
* j# W8 f2 I5 `5 N# a8 z4 p6 o
A.OTHERTABLE中的内容将被删除
( R/ e& q( b3 T+ [+ u$ [5 tB.OTHERTABLE和MYTABLE中的内容都会被删除! s" }0 g0 n* C6 B5 L: t8 ?2 ~
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
5 m# p. i9 \; @3 w! W2 kD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化* ?. q' b; E% ~0 t
E.数据库没用变化5 V& `' v8 {2 c' a" r
* k6 A9 w" O* \; `
# C) A. ~; Q" I  ^" `
11.DESC在这个查询中起什么作用?7 `% Q$ z  F1 Y0 i
- O, E' h$ \7 O" k% E
SELECT *# B0 F% U  w" ^! A2 I
FROM MY_TABLE! J( x  I5 ~, {5 R# g# J9 W$ ]
WHERE ID > 0+ g, b& W: ]* s: Y; Z
ORDER BY ID, NAME DESC1 j  z0 Z* ^* l# j

. W  N7 x* C% |$ fA.返回的数据集倒序排列+ T! Y* {5 C/ ~# U
B.ID相同的记录按NAME升序排列$ E4 x- F* y. `
C.ID相同的记录按NAME倒序排列
3 ^- i* ~$ y) x; N6 [4 c  U4 eD.返回的记录先按NAME排序,再安ID排序
( u2 X/ Y9 U$ m; p" e1 e" NE.结果集中包含对NAME字段的描述
, \) n5 U! ]$ R7 b# ^. g3 W5 F$ o3 I7 K# T' _  t* p

2 |9 X, q* k5 X12.以下哪个不是SQL函数?: r0 ]4 e$ x4 E% w" g+ T

) G, q9 `) c8 HA.AVG
5 ~* t) m+ Z1 Z8 pB.SUM
" W& ]5 R( w1 X! v' k' gC.MIN. w4 M' i% a/ R  {- V' h
D.MAX! ]# s, R# f: W  Q5 ^2 ]' y
E.CURRENT_DATE(): @8 e; `* q, \9 W  W
/ o" |- y2 Q0 A2 [( {4 d0 k

# a2 |) Q- q9 c, A) s/ {; _4 i13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
6 P% ]  f0 k& g3 y+ s/ U3 j  d9 a9 M  s3 k, v/ U, G
A.该字段必须有索引
4 t, I+ \# `. {/ q( pB.该字段必须包括在GROUP BY条件中
  F) _" E7 X2 Q/ G; W4 ?C.该字段必须包含一个累积值
# M& @8 N3 f8 r5 GD.该字段必须是主键
* H* c) i; t1 Y1 I' P/ ^( O5 B% w" }E.该字段必须不能包含NULL值& n; t+ e# c6 ~6 v4 x
$ U; m- B' `8 M4 Z

: g' W, [  g/ o2 B: s) F14.以下查询输出什么?
5 d, [/ E4 r! m" Q% O
3 }3 K" M% P$ w9 x' Q: p. G% XSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
/ V% p. [" P1 Z+ J# Q( CON TABLE1.ID <> TABLE2.ID9 t, f0 r+ t1 B! ~6 W
2 p* C. `$ {9 Z+ G3 a9 ^2 S
A.TABLE1和TABLE2不相同的记录
( m* o- G8 C/ z# I$ U1 N& y  qB.两个表中相同的记录# X8 z9 i' b; u
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
6 L' F3 A" i! k! i6 y! a9 fD.两表中不同记录的条数3 A* X5 b; |# T4 r; G3 j  u$ a1 {
E.数字2/ A9 P7 Q0 C8 A: p+ R

- P: t* i4 H7 ^
3 s9 w: _; y+ s5 r8 o7 x; H6 i6 ~15.______能保证一组SQL语句不受干扰的运行?$ t6 [  ]# s+ B6 q$ h
$ y3 M& Q  x' N& l) f2 }
答案:____________
6 A) G* w' W$ I) ?$ N1 p/ H
  n2 |" a, ?+ j7 @
1 Z4 ~1 a2 c! j9 K; _% ^7 L0 ]& U# _! G
答案速查% l5 ]+ T0 r$ ~8 H
1:BC7 }$ ^6 [1 {% m. z, Z+ o
2:WHERE
8 Q( L( A) c9 P+ {6 `2 J1 _& v3:B* f1 A. }# @; t) ~) ^9 _- L- _  f
4:E2 _$ T- _" S- E* W. H$ V# z% e$ r6 d
5:BD
! K- C4 ?/ e$ J& C6:INSERT: U/ `4 E& J" }" V0 F7 B, n
7:C
/ v+ O# @* a- w( R& z8:A
) F+ S- g1 N1 N  P9:C0 ^+ @% @* a6 }0 _
10:E2 n3 w! v2 R" a( Z; ^
11:C
2 l, C* V5 S' r+ j12:E# F4 a' ?7 R6 k5 P
13:BC  A# G3 x: y) w; r, _
14:C
! G* D5 U; e: W! s" @1 t15:事务
: G4 e9 B9 O* H# r6 g
1 r4 B9 h; f" i, L
4 e) F% c4 H& B7 S* W" h9 C! B+ G2 ]2 o5 w* t
答案详解6 [' h+ z: Q, v+ f/ F) O* K) ]- F
, x2 G% f& o2 E+ x3 J
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
. o1 V' D0 k; t# r6 F1 c/ D' P: g
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。  ?8 S8 \- V' {3 q% I7 _3 n4 {

( G* k9 E1 H8 ]/ W3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。& b2 V. U; `. j. q3 d( v2 F+ N0 G

% k' J) A$ ]' a; E4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
* O1 S: G+ z2 B+ ?' b# d! \& O/ Z8 v8 g8 r! ~( y" D
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。, m- F' Y; A) A% d: O9 q8 r* r
, C. c/ X- @2 D3 F) m, [( F
6.答案显然是INSERT。
* f7 ~- p( N" H. V' \+ m# T/ c  q" Y( H
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
$ ]: h1 J' ?4 @* K" F2 B+ B$ w+ Z) t6 N2 B$ a" H  ?
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
. W  K6 H$ B$ W  L$ k1 M1 L
: R4 ^  ?/ |2 V& l  q8 g9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。1 Y1 Y8 w' w7 {

# O; @  Y  ], C. i10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
3 ^  a. K) N6 l  N$ ^9 L, ^( L* b6 T, t: c0 N4 _$ s
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
7 i: Z" b! c4 P* D' o; W! p' d$ l3 N% K
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
+ Z5 m& E7 q( _/ T7 P
% h4 }& O+ ]) D1 H; @! w13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
% }' X9 h" D3 B3 y5 Y- {$ I% N6 ?+ B* F# l! L! [
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。2 N0 S# ~" f, Y; ]
( z! m$ M6 n2 C! V
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

返回列表
【捌玖网络】已经运行: