返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。; H; h2 ~1 M1 d# Y; D5 S, ]$ k
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
( G- ]: C! N  N& Q/ n本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。8 I# p+ x4 x+ B, A) J9 M
& ?( C5 f  w' h
! j) z2 A+ \2 N6 Z. c. n
问题$ O0 @5 d5 s* {9 L# L$ A1 k1 d
% E+ W+ U1 k5 {  O7 T/ f: C, V' z& N
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
8 B  ~' {, ]7 M+ m+ d, |$ V/ i* a9 H: |0 H
SELECT * FROM MY_TABLE
" z: V/ U0 t5 i$ f5 N3 I% g
% q+ W! V) J# Q9 R2 D' A. rA.如果可能,用把查询转换成存储例程
' [9 z2 m) w3 p- ?B.如果程序允许,给查询指定返回记录的范围5 R) @5 |6 C5 c# p3 v" e
C.如果可能,添加where条件
2 V- ^0 p0 y+ E; S& ^9 X# [$ BD.如果DBMS允许,把查询转换成视图2 X' p* s' R3 t- J) |5 _
E.如果DBMS允许,使用事先准备好的语句
6 }  ]$ Z+ I- l; q* X
' g; X0 n6 p3 ]' r( V
- S. G+ b0 D8 Y' i, `, s2.可以用添加______条件的方式对查询返回的数据集进行过滤?
* |( Y" i4 i) j5 o" q/ ^! ~- B
/ f" r$ z8 \  M3 Z# B4 z答案:____________, Y  V1 X8 d- H2 A

0 H8 l8 }8 F: C+ W0 `, `7 G# @# ^
3.内关联(inner join)是用来做什么的?( N$ l, j# y- k% a3 S9 g  L6 R
3 Y: K8 H2 {7 |& c, X
A.把两个表通过相同字段关联入一张持久的表中
, G  V, L- J) `$ jB.创建基于两个表中相同相同行的结果集) B( B- j$ B: u" @$ @2 Z
C.创建基于一个表中的记录的数据集
. n& X! S  g; e! C6 ~D.创建一个包含两个表中相同记录和一个表中全部记录的结果集* [! a6 o3 \7 R% ~; Y6 x
E.以上都不对- [" R6 S8 @. W5 ^
0 \+ y# l: c! [/ {& p* P$ Q# r
  l6 E- M& N* j3 S0 B
4.以下哪个DBMS没有PHP扩展库?3 G& \8 l& x; n& p/ v
1 _: R8 B( l6 p: t: D% i: d
A.MySQL* N2 m/ f# s4 a0 x+ h8 W2 d: m: q
B.IBM DB/2
; u* c. @* v: I/ \C.PostgreSQL
$ Y3 C( R& `. n% X) N7 N: ^! rD.Microsoft SQL Server
& ]4 k" q' N% O5 S; r& FE.以上都不对0 `3 }& @, ~3 x
& K! s* z% K$ W! k& `0 ^4 D* ^
9 x0 F& G" Q# s% _6 u
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)- @# Z5 Y2 Y9 t" d: n9 k$ N5 Q4 I! k
- l' ^: o& ?6 f0 b
<?php
) w; v1 \6 d3 G. l4 T9 G1 u$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
% g: n6 V$ H! J/ F1 L8 V  P?>
6 _& J3 {0 a/ `1 |( ^7 \" }& z8 s1 R6 A3 z# P$ Y/ O& |! L
A.MYTABLE表中的记录超过1条
: G4 M( ]0 L8 D9 B7 OB.用户输入的数据需要经过适当的转义和过滤
6 J+ r+ j: ?# u' [, k6 nC.调用该函数将产生一个包含了其他记录条数的记录, |  V' x, R" W6 o1 F: x1 c
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除% B1 A: |; n  t! {- g3 o( K
E.查询语句中应该包含数据库名/ }% C9 F+ q/ A. H% g% Q9 Q& Q

( v2 a- O/ J3 T  T4 w& n# G( i+ N0 Y/ D
6.______语句能用来向已存在的表中添加新的记录。) j  ?. L9 ^! a8 c, i& B

) W! `4 q4 Q/ Q, a( X, Z8 u答案:____________
. V1 }3 r5 z# U
' S2 a! X; W& y# a. l/ B( X5 L
5 w8 {* B4 Q1 `( K/ G0 o7.以下哪个说法正确?& T, o% }. \* R1 k
0 p. P! [0 y) P8 e  S0 S' v
A.使用索引能加快插入数据的速度9 d* `/ @$ m* K6 F1 F5 ^, s2 M7 l
B.良好的索引策略有助于防止跨站攻击
- B: C/ F; ^9 {C.应当根据数据库的实际应用按理设计索引# I4 j* s7 G9 s; l6 O
D.删除一条记录将导致整个表的索引被破坏
# ~2 N2 m( V+ yE.只有数字记录行需要索引; S7 c) v9 K, I* H# B0 T5 T

! x$ n4 Z1 j0 X; g5 `7 c& @) S, J4 u* x  f# b# m; Y5 n5 G
8.join能否被嵌套?
, s( F# e5 }. Q% g" S3 N
5 U  i% i+ b& [' F3 @( v* jA.能- _3 _! ^6 g$ U$ H* `1 i
B.不能
% O0 o, r' z0 f! M: O9 R5 B  W$ W7 [; e) U+ |* k; I1 [

) b& b7 J7 e# D7 ?1 e9.考虑如下数据表和查询。如何添加索引能提高查询速度?
, ^! E3 p  m+ v
/ s# G9 O, m# p% \CREATE TABLE MYTABLE (- w- }* M* o4 |! N
ID INT,
, X4 B: a0 r+ S! Z( d* G7 e) x  dNAME VARCHAR (100),
& D5 o/ H: X3 C, I% G; f* lADDRESS1 VARCHAR (100),
$ S3 T3 |2 Y$ g4 K+ C- K, TADDRESS2 VARCHAR (100),: d, j$ v1 f  _* o5 x
ZIPCODE VARCHAR (10),. w. z3 V/ R% F# v4 @
CITY VARCHAR (50),- q! N% j: g. \* B8 L
PROVINCE VARCHAR (2)
" ]% ?/ Y5 w) n! V. Y2 ~3 S- y( s)
4 p4 M- o4 L8 r) O/ fSELECT ID, VARCHAR
" p* T$ [2 [; PFROM MYTABLE3 S8 {& v5 R! R; v
WHERE ID BETWEEN 0 AND 100
2 E2 o8 o$ [  v5 e+ CORDER BY NAME, ZIPCODE+ `7 R1 J9 j/ ?2 l# e- w

1 r( o! G; J/ MA.给ID添加索引4 K$ W7 v# @- r. ~0 \  |* i
B.给NAME和ADDRESS1添加索引
% n! F7 G  l* _& }* ]" @/ L+ ?C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引$ O( C4 [/ j  Y" }  d1 P
D.给ZIPCODE和NAME添加索引
  a6 J9 R" N' xE.给ZIPCODE添加全文检索; F. X, Q8 T, `7 n% U
8 t5 e4 ^; W) M. r; _. o" p6 Q
+ l4 r; m. r" [  C7 J; b
10.执行以下SQL语句后将发生什么?- z  q; D/ \- k3 Z

7 |$ ?3 X, i8 t" Z; n# ]: Y& EBEGIN TRANSACTION
. I7 H! P, j! B. oDELETE FROM MYTABLE WHERE ID=1
  }) F- `* ^& _DELETE FROM OTHERTABLE
0 u, V; C+ ~. e; T) u- p& i+ qROLLBACK TRANSACTION( u2 E% I: A! }4 J" s4 T
% Z3 B+ N: ?2 A8 h$ K
A.OTHERTABLE中的内容将被删除
: u) C0 J; `0 O. ^$ j) oB.OTHERTABLE和MYTABLE中的内容都会被删除
. c5 n0 Q7 n$ J2 H$ aC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除9 B8 i6 E3 N9 x- Y/ M: e9 O0 i
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
& n+ ^& h  Z9 N+ g  X1 c) _E.数据库没用变化5 R% X3 A  E$ s* ]" R6 A7 }) Q
; f6 h4 `9 W" l$ H

3 t. `( Q) S8 X* i( x11.DESC在这个查询中起什么作用?
# W- L+ O* }2 @3 u5 {
$ k3 E7 J" T$ ]" p! m6 HSELECT *8 g( W: C' G, z9 b3 Q6 U
FROM MY_TABLE0 b4 s- [/ X1 r7 ^6 ^; ^6 {
WHERE ID > 0( Q& `$ v4 G  o) Z
ORDER BY ID, NAME DESC
! G% P1 Z  `) f* V  i( }+ ~5 f; W! v
A.返回的数据集倒序排列
( M1 h6 [" G5 p- P0 EB.ID相同的记录按NAME升序排列
) Q# E1 ^) L4 q5 NC.ID相同的记录按NAME倒序排列5 h8 y. D6 Z# [2 G
D.返回的记录先按NAME排序,再安ID排序, R5 |9 w6 M* O6 A' m
E.结果集中包含对NAME字段的描述3 X: S: l8 V8 j
% K; @, ^# D. R& x) p* D2 a
3 u& E) Q" I& Z( `  R
12.以下哪个不是SQL函数?! \' L5 D/ k, {/ ~5 M

( W* P# q  F6 [" j3 {A.AVG
: I$ M, F+ m4 ^: Z* i2 [' gB.SUM& {; t, T- ~" N
C.MIN6 K. l9 m$ w. e4 j5 i6 ?
D.MAX
* F0 Z; F+ @9 b2 p4 S& o8 eE.CURRENT_DATE()
5 d4 a- V* |0 k; }! l' N  _( {8 M' p1 P& U* `4 {. c. G
5 P# @8 H8 J4 p  V2 B' ~
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
; W! K; n) ^9 q3 }  {% _7 Z3 s' y; Z) X% L% j  |
A.该字段必须有索引! I1 l9 l, G! R7 Q6 [
B.该字段必须包括在GROUP BY条件中
! c7 e+ S3 ~8 b2 R: @+ U$ x% nC.该字段必须包含一个累积值+ {3 T1 D: n( S2 ]
D.该字段必须是主键2 U# z, Q4 O- W! s" W7 s
E.该字段必须不能包含NULL值0 _/ h- Z/ h1 |9 M6 b- P1 _

! K1 j) `( L! H8 Y7 H- F
1 H' @# [; O* n' a$ u14.以下查询输出什么?. n  Z; ?* R3 U/ n3 p( \# D% ~

* {* G5 i; g* \5 I3 Z' T5 XSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
) v7 m7 d! X" q4 U! ^( E' iON TABLE1.ID <> TABLE2.ID2 H! N4 e0 `+ |5 n
0 B6 r3 x- k5 V6 o+ w+ i
A.TABLE1和TABLE2不相同的记录' _; i; s  K3 V, x, c
B.两个表中相同的记录; ~/ T9 e8 y( ^) b5 [* |0 H' U( s
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
( H  |. h, F8 ^# ~" W1 R* r# z# |+ YD.两表中不同记录的条数
2 I9 E2 Q9 z/ N) Y( W: {1 y# {0 w. iE.数字2
7 u+ v. x! O7 ]0 K: l$ l! J/ u
0 A" h/ i- ]. \+ ?) y8 i, E* w' ^# q
15.______能保证一组SQL语句不受干扰的运行?$ L* S1 N  A0 k  q4 }; _' J

: G4 h. Z3 n5 ~5 k) t) L答案:____________
9 l/ K' a; s/ G3 M
7 A4 l* \( L) Y8 w$ u# I$ q4 {8 b  N* Y& J0 {9 ~! \
+ ?' q+ w& {# _
答案速查
, v6 ]4 c8 E- y3 g1:BC
) \! n! _7 x9 V2:WHERE5 S' W8 M# X8 e
3:B
) s3 `$ R- v4 q) `, n. ~$ l& V4:E
9 R/ u) a# _+ p' I$ Q, w, q5:BD# U( r9 ]8 b& N0 ~# Z- ?
6:INSERT1 t* C! W, X3 N/ \  i/ ~
7:C# o* x2 R- d. q5 h# |' L8 u- g; F) l
8:A4 n7 f0 u3 f0 v" t& L( j* k( u
9:C
: Y8 H* W4 n0 @1 G9 P9 k( D10:E/ j# s$ a  y4 W
11:C
' T+ b  G. j! q4 c12:E
# y9 ?) M; C1 N% t2 s7 b13:BC
* p8 U$ F( |% o( v14:C( v: k& [. @4 b; C
15:事务8 p9 B1 v2 L, z6 z

7 m  X! O8 y) U" \* O& C: ~9 D  u: \' L7 J" e, q; n

3 q' q7 m; h4 L* U9 F- X- c答案详解
- U1 s  |4 {' k5 }5 T: P8 Y. W5 {
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。0 ?0 H* Z% W( _( w" c$ B7 i, l

) N7 Y3 l5 C) P3 C8 x. }2 I2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
0 O( t' ^9 |3 ^& |8 r- y
* S+ w7 l) v3 I- R" w8 L/ x& _3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。. g; d3 O4 w2 H. j' T

1 G5 l: D1 j4 J* s4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。. Q0 [$ p6 \" o9 Q, e1 y1 H* e+ I9 ]

4 y5 h4 I, }* L, E& a# \- Z1 K5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。7 b. L! S! A* k0 U- M+ ^

* @* ]- B6 o5 j$ I( k, R6.答案显然是INSERT。' i( \. }, c% C+ [0 ~

9 S9 P" e2 }9 x3 r7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。5 w, w1 b" x7 l% W$ f7 s
1 y2 D; f* B0 J3 T+ J
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。* O- F* ^; M8 @% R+ }

& r# P& h, U" |0 ^3 k9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。- H+ p& U3 _7 P

" ?% N# V+ @# Z10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。: [) N' G# I& B) n" s5 |7 u

- K7 i4 b; z8 n2 ^/ Q11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。  V: k) s- v% ~

& q' P; i) s: U0 y/ G  X12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。) W/ ^0 h9 o2 _

  o  k' n. m8 l( V) R' p9 N! c' Z13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# J" _# q9 f  q/ q5 ]+ R- Z/ W5 H$ u6 O' S
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
6 I5 x/ E9 X3 }. [8 a2 U
7 p" W% i( P4 {15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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