返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
' W& y  W" X& q5 P. X9 d) L( jPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。4 u) b/ `0 D& `& W' ^! M. j4 R
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。/ T1 ^' u/ q! D3 R- d
5 s" B/ e; a" I0 {% l, D9 _
# r, ]$ h! ^5 J2 v6 M! @
问题2 h4 A, o  t' g, }( T5 i: D6 _
9 g9 H  v! @2 g: ~2 O1 y" E# L
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
  h/ @: a3 J: q3 v3 g" |( y
/ R  I( t0 Y  S4 @, z- LSELECT * FROM MY_TABLE
5 s" s% M% M9 m3 h5 n9 m2 P9 ?2 O% _6 Y
A.如果可能,用把查询转换成存储例程, _* }7 K( l: T  l# A
B.如果程序允许,给查询指定返回记录的范围
" M; N$ |1 _! o9 B" z! T- \C.如果可能,添加where条件
( N) H* R( X0 x  UD.如果DBMS允许,把查询转换成视图
; [: a) F6 c4 vE.如果DBMS允许,使用事先准备好的语句0 Q6 ?( y0 V% X/ c4 E, E- L- ?1 p
9 x: v# A' R" y6 a( g3 K
  t( \# i( H6 }( r
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
% S$ Y4 K) Z5 t( ]$ }8 }8 [0 h
5 Z4 F) K( m8 \# R, S答案:____________0 u4 k* g" m3 ~6 P# g( m! E

  Z1 l/ \8 D/ ^/ a( c5 l
8 S+ r% D  ]3 }* F+ V3 {3 d3.内关联(inner join)是用来做什么的?
8 W3 F1 O" k. R6 u+ U5 d$ k" w% d  y
A.把两个表通过相同字段关联入一张持久的表中: J  S0 l* ~5 d1 g
B.创建基于两个表中相同相同行的结果集) \: g0 M% l% s1 l1 C
C.创建基于一个表中的记录的数据集) w( p8 D) v5 P& G, F; y+ q$ b
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
6 G/ C0 W1 [+ \- I/ PE.以上都不对( H# A! }/ a2 D8 t. b% g- Z& s
' I4 `, M  s9 V  Q: B
+ v0 `  K; c% f% s' ]% w5 U
4.以下哪个DBMS没有PHP扩展库?& M2 p$ o& N0 T7 A$ @0 C/ p6 M

% S% C7 c# c& R4 J% L3 QA.MySQL
5 K% {0 Y4 ?. w- Y$ H" MB.IBM DB/2
$ L( A5 S( X4 c* yC.PostgreSQL' |3 a; f1 A1 ?+ p) O7 t1 ^
D.Microsoft SQL Server
: O9 R: e8 n, k* rE.以上都不对
. l6 A; v+ ~: y/ f: ~. @
4 A6 a% s2 V6 n7 C" Z
3 k- q' I2 @( w- H9 @+ E) _% i+ s5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)! H4 W. l9 l" j! G
* h0 l7 Q1 h  Z5 s
<?php
; F; l  Y; Y! p  y/ g/ P& Q$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
5 U1 w( n0 Z6 N?>
( n* D) `* u) m% q( l. w
  B( N( D: P7 {' w4 HA.MYTABLE表中的记录超过1条
% ~) I" F) ^6 c" v, X7 z3 L& E/ MB.用户输入的数据需要经过适当的转义和过滤5 c! {: e( @0 k% F, y
C.调用该函数将产生一个包含了其他记录条数的记录& \- |$ }% n4 P" C1 D+ i9 d1 S
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
: `) g! T+ k( PE.查询语句中应该包含数据库名! g- H" C- |% k4 C
* W; d& ~/ s/ J: P! y. {5 I
8 `& c- x0 a: H$ ]9 _4 g
6.______语句能用来向已存在的表中添加新的记录。
& [9 z# Z3 }9 r; Q; w8 v7 @* r& n: x- }9 s9 e
答案:____________% K7 d2 r$ Q* I) Z( V2 T( Q; L# @
4 Y8 M$ w& ?* d" Q& j1 P

" [2 N" V! L2 [" [. V7.以下哪个说法正确?3 g2 L$ C1 H7 j& B2 Y* H

+ X/ g8 R7 J+ [2 JA.使用索引能加快插入数据的速度. P, k& c/ a3 g4 u
B.良好的索引策略有助于防止跨站攻击" M, w1 s- W# a: X; E/ E4 S( R
C.应当根据数据库的实际应用按理设计索引7 M$ j1 H0 q0 d: ]2 t
D.删除一条记录将导致整个表的索引被破坏) C; a9 B* b' q3 q$ q, z
E.只有数字记录行需要索引9 x" M  b- B4 J1 o% m# t- x

( w  H5 j# S2 N9 [* w- a7 q# d+ `! t$ e% H: r  \, V' S' H
8.join能否被嵌套?' ?0 M7 m4 ?2 s; I2 Z: f% b

. B  v3 @- |. |+ F8 f; JA.能
0 ^# ?) R  y  }/ w. T* z9 ~B.不能
; z0 ?8 i/ I9 g; R
8 i; w; h7 T, m
1 x, q5 w* m9 L% Y, L# ?  k9.考虑如下数据表和查询。如何添加索引能提高查询速度?
( q/ s' b5 Y" U( V# Y1 r9 f5 @
, u  C5 z+ a; m- t, O8 l8 `$ lCREATE TABLE MYTABLE (
+ W& o; i% P" c  ]ID INT,( `; [1 k9 \7 ^! ?
NAME VARCHAR (100),$ l' A: e! ]+ J; h) ?3 o; \& g+ T
ADDRESS1 VARCHAR (100),
. s: U9 _6 N# c. ?0 _. e# yADDRESS2 VARCHAR (100),
5 B# i- T! m6 `$ E. ^4 B1 @$ P- jZIPCODE VARCHAR (10),9 i$ l5 r# d1 e7 T- G4 O; Q% |" D
CITY VARCHAR (50),
- ^1 ?$ O) n- c& y: ]5 ^) {: kPROVINCE VARCHAR (2)
8 b6 ~6 F3 O* R) q- r/ [! k)# ]- N9 f2 `( F$ E# w8 c
SELECT ID, VARCHAR. Y- e" r7 j3 {! V
FROM MYTABLE
, ~( p- f# p1 a0 y7 N8 h# v% K: A+ YWHERE ID BETWEEN 0 AND 1001 p1 j; c" S9 q: n5 n' z
ORDER BY NAME, ZIPCODE
6 v- N8 f; M+ V8 y. S! M( @
0 C% c) Q( e: w& \$ T. e: F* m( pA.给ID添加索引1 B4 ~8 }" o- g6 a  Y; i
B.给NAME和ADDRESS1添加索引
7 C# c/ U# D7 p3 yC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
/ [; h, \/ k; D6 w, ]5 j/ y% q# MD.给ZIPCODE和NAME添加索引/ U* ]3 i, ]: u  q5 h
E.给ZIPCODE添加全文检索
4 R. [  O1 @+ U4 |
. C# m( `) T6 f3 H: T0 ]& |5 r" g- K8 E2 o
10.执行以下SQL语句后将发生什么?: N  J. {% D' q8 s! h8 ^+ ?
( G$ T( }9 s  K5 I# u
BEGIN TRANSACTION
4 b9 z, ]7 ~7 i. l! s7 uDELETE FROM MYTABLE WHERE ID=19 `3 [4 W9 `8 {
DELETE FROM OTHERTABLE
( o( B; U3 t6 }ROLLBACK TRANSACTION' X5 E; o+ _+ Y8 {1 u

; @4 B8 M5 I, C3 Y3 L7 \A.OTHERTABLE中的内容将被删除& O% B, X$ w5 ?
B.OTHERTABLE和MYTABLE中的内容都会被删除
4 ^; X1 w# E) Y: O$ m/ A2 Q+ ?1 wC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
9 @- W& N3 o3 g0 Q  U  yD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
9 G. x9 C( w0 |( ?8 X9 U# FE.数据库没用变化
" E7 u9 }9 A0 P8 h% n
$ L$ c6 O8 O4 Z7 H' k! O+ q( ~: _. Z% `7 [6 }, H8 L
11.DESC在这个查询中起什么作用?
0 ^( J+ ~6 D. B
0 `0 {( ^5 O, ~, gSELECT *
8 T5 a" Z( [# F9 y6 ?7 \  TFROM MY_TABLE1 P# T3 b! q. S/ v% u
WHERE ID > 00 p9 {1 ]% f  r0 H: @  j. O
ORDER BY ID, NAME DESC- J5 `4 d# P/ o: W1 ]
9 H0 g* K4 @/ x( v$ E
A.返回的数据集倒序排列
* h' O$ B; r' G9 {# w# h6 `B.ID相同的记录按NAME升序排列# U" f' c# j: J( e' h7 Y: S
C.ID相同的记录按NAME倒序排列+ H9 u9 N1 Z5 }! q6 A8 C
D.返回的记录先按NAME排序,再安ID排序4 z$ r4 }4 m( Q  D1 i% W2 E* O9 k
E.结果集中包含对NAME字段的描述
. b# z6 x6 S$ S5 k
- _# u4 V( O, K+ x9 _- {3 T! Z
# o5 O' F) y/ t% ^9 N: [$ K12.以下哪个不是SQL函数?
: p3 w# y: I$ e& e, K9 B0 i5 A3 H
! a! \$ ~0 B0 W* q# m- u* I- N# j$ SA.AVG5 v2 r- o5 n4 o  K
B.SUM
1 {' f! J: O) B: |) `; LC.MIN' j3 K; r+ v0 ^6 K/ X
D.MAX3 }1 \8 m4 M- V. v& B2 K- R
E.CURRENT_DATE()' p- V6 |* i0 v8 N8 ]4 U

5 i7 u1 r( o' l5 J3 Z, K7 ]8 Q6 _* ^3 @+ |/ X+ n
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
: [0 u- ?: O. l
/ u7 q( p6 P& d( `' Y: Z, K( D. VA.该字段必须有索引
+ x$ @3 z0 D7 V+ P/ bB.该字段必须包括在GROUP BY条件中
2 Z4 n3 d) r6 y0 U7 F6 }3 L' AC.该字段必须包含一个累积值
; W3 U9 h( @# F# V9 u! sD.该字段必须是主键' @* J  O6 w2 y: Q
E.该字段必须不能包含NULL值
1 x; r+ M6 `) y- Z4 h- `$ M: t% U1 g, T" S

) W" e  Z6 T2 K0 W& T: Y14.以下查询输出什么?
3 K& t4 D( N, X: f2 f6 [. J, |! R7 e% ~  V- Y+ B
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
7 M5 Z' x1 I& R$ l: vON TABLE1.ID <> TABLE2.ID0 ^$ p! u: f! {" P7 O# U+ n6 y

6 J) h" o* s* u' c0 _. cA.TABLE1和TABLE2不相同的记录
% h8 {/ ?7 @  b8 q, P+ {B.两个表中相同的记录- U! ]" M# p6 @
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数2 H- {) W$ L" L# d( C. j0 w/ R" v0 F
D.两表中不同记录的条数1 k/ K+ j/ ^: B0 U
E.数字2- t8 r  F  u! d4 s9 _9 w. u! k5 q
6 `" T$ R$ m. G
$ I: t  P3 }9 x: x2 |
15.______能保证一组SQL语句不受干扰的运行?% n3 X: W4 E# f3 G  r/ @6 s
% p0 s9 A. R2 ]8 N
答案:____________9 K+ ~. M$ l8 b& T/ a3 F+ J

- X/ E8 R$ {+ a* q- \% W: Z; Y3 O" [& x, |" b3 o, f1 X
2 Z" V# D* v( `* M
答案速查6 U/ j* K1 m& L. [% M+ |2 x
1:BC
' @% [* `; k$ V3 U. C$ W, Q2:WHERE
1 ]- i% R8 C* ?2 b  s- e3:B
, D' r$ R9 v) b$ Z" n! l6 w4:E
2 U, x6 W6 u& I6 n& Y% W5:BD
6 |, e0 w( g! L* u8 ]2 g6:INSERT+ `, o& K, x4 R0 ]$ ~% [9 J& L9 w1 w
7:C
& g, y4 k" D% d" U, x; R8:A3 Q* K/ m  I! r
9:C' n' ]" e. |/ H1 X, p/ A" W5 ~& F
10:E
1 [; ^' q6 m/ f% M11:C8 d8 z& _: n& \* Q; u" m* }* {3 r5 x
12:E( m" H/ p; S2 ]. j" U
13:BC) U/ l, F4 j* A( M- e6 u
14:C; L+ X/ N! O5 f( I, a! ^
15:事务% v  R9 D/ F: e: Z1 O

$ d' A, E6 u5 A8 E" W7 Y" q3 p) n+ I6 [5 G) n# W% h

1 p! s, r3 z0 p5 t0 i答案详解: _/ d+ J' v4 b; c, \4 u
" X" ]' e) P. _( ~  X+ x; i" D2 o
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
4 `6 C$ p4 v+ h9 {/ R+ m2 ~2 ~! v" B# e; K
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
7 \) g3 s. a) E( V$ _8 @
( ^" q; i# W. w4 O0 x% [3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。4 F* X% j- Q4 `/ B
0 w1 X6 \) v) G& P  E9 m
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
6 w: M+ h% c# F* t2 }" Y
: p  ]- y! u6 D! V5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。. Q: J; Y+ y+ k4 D# v9 a* m

6 E" a0 e8 S& A, P# k6.答案显然是INSERT。/ k: A. i( e* Q" J8 R* R6 q  A0 V
8 Q  e  N+ {8 n2 s4 t
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。$ G0 D. p8 D3 y* p3 L
0 C, _+ @; Q! Q8 Z5 p
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。1 x: t; j6 }% @6 ~1 f6 j/ s

* v. J8 U) s& s5 r9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
" G6 M9 n/ S0 A& s+ P/ u6 l; t$ {- H5 ^9 U
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。3 F) P2 a- X1 w& p# d' l5 H, [

- A' j0 w; c; U! x1 O$ N( E11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
2 O5 k# g! |/ j4 }8 w) p4 i! @! C
: G) v% c# v% ~# y12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。9 H8 T& [2 [2 z; W2 l
# Z, K# }; }( b, w. y
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
" g0 P" a1 `* y5 |. {8 e- B3 K
; }# p, m- ]4 j3 B$ J14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
& _2 _5 c  m; \! \* M
  X0 a6 X: X$ i8 O4 m+ O15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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