返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。7 N  M6 Y& L( T6 M  p) q) D- L
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。% l& e2 u6 E( l+ V  n
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
0 c7 U! s2 h) m; J  S: j, ^. f
3 X& z) N9 d+ o/ V- }3 D
9 |0 o5 b: o% r& k问题
5 y, H4 r; x- V2 n$ y6 _  o5 {( E! Q( T- m: L  N
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)" E& c8 G" [- \- N9 M

6 y' y5 K. ~$ P4 ^/ X/ d5 oSELECT * FROM MY_TABLE
' G/ e% T+ o' l
  ?7 t' M9 _* l9 ]A.如果可能,用把查询转换成存储例程
% d3 M5 z' Q9 E6 o0 v4 \+ jB.如果程序允许,给查询指定返回记录的范围, }7 w: f% g" o' }7 E" f. U
C.如果可能,添加where条件
8 U! y# I, \4 Y, t- o& GD.如果DBMS允许,把查询转换成视图/ m& i; O+ D) y$ U( r' [9 U
E.如果DBMS允许,使用事先准备好的语句8 @0 e5 _2 D0 A5 ^( W* [

$ E" F; Y& t6 A2 }: d3 J( f4 d/ b/ ^- s2 I
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
! a: o' y" K; \0 a$ Y
. c/ \( u' ^( ]( g" p答案:____________6 d1 w( }/ h2 N8 g( z4 f

/ m; K$ F6 A9 t0 p4 V. {7 I
/ ]0 D7 S, e$ Q- I% h. ?3.内关联(inner join)是用来做什么的?
' w5 P% L9 r, Q+ _  H' `; u$ r! t  @  {0 `$ [/ {( t! J- e) O
A.把两个表通过相同字段关联入一张持久的表中6 D1 u$ }  K: q
B.创建基于两个表中相同相同行的结果集4 H# x& K/ m5 x1 B7 Z* N
C.创建基于一个表中的记录的数据集
# D( r2 y, _* Y' H) wD.创建一个包含两个表中相同记录和一个表中全部记录的结果集& T- v/ h' R! l. b
E.以上都不对
. q0 P+ p9 C' V9 V
9 a2 N8 w! F2 T9 s9 c) c  Y2 P$ H  r  _/ n" d8 Y
4.以下哪个DBMS没有PHP扩展库?& ?+ k2 A2 [% z5 H0 e/ A/ ]

$ B! U$ n2 _  ~/ ~7 E3 _  K4 ^$ t1 kA.MySQL. D5 {+ d- \, U) I, v
B.IBM DB/2& _% S: `5 j7 D) `
C.PostgreSQL( z* T5 j3 S1 V5 P% H- [! N/ |. Y
D.Microsoft SQL Server
  d: j, z  P6 p' m: n, G" _. RE.以上都不对, y$ B1 F) q! ]& d2 O$ q7 Q. H
% l8 ?2 @+ x3 W% U( U0 C7 O/ F
0 i* ]; b8 R' T/ p  A
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)# K7 T2 l+ V+ J7 k% U2 [& p" L

2 f" Z/ j) |4 T4 g! t0 ~. N; H<?php
5 @) w+ f' Q. G) ~3 k$ P1 W$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);: |* N/ o) q- ^* R8 S+ N- }6 r
?>
3 S) B+ M$ X. t2 h8 \$ L1 x, A
3 X: J2 ^3 l: K. r: E5 aA.MYTABLE表中的记录超过1条4 t' d1 W; _/ h# L& W& s) z
B.用户输入的数据需要经过适当的转义和过滤- O. ^5 ~6 y& O- Z! N
C.调用该函数将产生一个包含了其他记录条数的记录- c/ B; X% X4 L& T8 Q  a
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
) Y" X# r/ i5 \E.查询语句中应该包含数据库名
* w! o2 C4 W3 o. b" j% a; i# ?# J

& k; u  f$ W7 V6 _  g* ]6.______语句能用来向已存在的表中添加新的记录。: _7 R1 h+ v' C; t! V4 O: Y1 f

2 D0 f6 w0 O/ m2 [答案:____________
3 t- b- {2 l: N6 v. Z4 V( `
6 `. W) r* ]" n7 r% m/ B% _# x. w8 h, o: K$ Z" P+ ^2 I8 G7 h! i
7.以下哪个说法正确?" ~+ m$ R" S* c

4 f7 O9 M8 v7 W! QA.使用索引能加快插入数据的速度
: h# F0 h3 B+ nB.良好的索引策略有助于防止跨站攻击$ g$ }# @5 [$ q* O
C.应当根据数据库的实际应用按理设计索引
: ]9 Q( J7 k. Y  Q3 `8 f) xD.删除一条记录将导致整个表的索引被破坏. o/ g6 ?, {! N* a2 D5 J/ P1 h% [8 `" f
E.只有数字记录行需要索引
5 \% ?% y8 V/ [9 }0 I8 c' l5 G6 L; ]5 A. p8 p

  k, \3 V5 d. W8.join能否被嵌套?" _& P+ v( r, K! Y

0 Z9 Y) d& ?+ x+ d- g: WA.能
( X& G9 B: j  c4 L& F8 x: |+ `B.不能  F0 f# H6 w4 i- w; O! A

9 H% f3 X8 q. h$ a/ X0 E2 e2 J, K) H$ l- y
9.考虑如下数据表和查询。如何添加索引能提高查询速度?- Q0 j, z1 ]2 D8 s; _) i
$ s9 f5 c$ P$ O: [' n$ H: {* ^. n
CREATE TABLE MYTABLE (
6 }5 U# {7 \5 c/ {7 v- H# r" HID INT,+ b% F" \4 e2 Z) O% i
NAME VARCHAR (100),
4 H6 ]( X. X' H: |" @ADDRESS1 VARCHAR (100),
. R; Q* O0 f( e& Y0 {4 N) SADDRESS2 VARCHAR (100),( q* l$ b/ v+ g2 C! ?/ Y9 ^& l7 {; h
ZIPCODE VARCHAR (10),' m. H: k1 `5 x/ `9 D3 r- a: B
CITY VARCHAR (50),8 i6 G- }% ?- X
PROVINCE VARCHAR (2); S+ d5 k& |0 p" E/ k2 m# d, y
); n4 _  F" {: [+ ~! z; X
SELECT ID, VARCHAR
: d* K" j. L* W5 w- UFROM MYTABLE( Y' ?. {1 j" ?2 T; c8 r
WHERE ID BETWEEN 0 AND 100- g4 u8 J1 r' C. ^( B! t
ORDER BY NAME, ZIPCODE
% v8 ]. `, i! c) f# s$ r% J- O; L5 C/ M, b- l$ v
A.给ID添加索引
& J  }5 V7 x# R0 u- SB.给NAME和ADDRESS1添加索引
1 N9 \( M- Z* C( S3 g% f. h; uC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
& s. B1 B  S3 |! s  ]D.给ZIPCODE和NAME添加索引
5 [- v- g* o2 y3 Y* [E.给ZIPCODE添加全文检索
& d0 n0 `8 U2 y; \* _" w8 L4 r5 I. \$ z+ S) K* |+ m8 Q' @& x
% h0 y2 y0 d. b9 q
10.执行以下SQL语句后将发生什么?
: Y; B/ h- s/ s" r2 }; X% l& x% O; Q4 z8 ~
BEGIN TRANSACTION
  g+ d  [4 |& C- V% r: L) e( j* YDELETE FROM MYTABLE WHERE ID=11 t3 z1 g5 M# j  P
DELETE FROM OTHERTABLE4 {- K# R# l3 u" e, e( p
ROLLBACK TRANSACTION
. i9 s$ r3 W- M- K- a/ e( A+ P. K* m
A.OTHERTABLE中的内容将被删除, O/ o% G4 v" R" \% T+ X5 d
B.OTHERTABLE和MYTABLE中的内容都会被删除8 K( Y  f- d& Y1 n) z
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
  R, m  a9 j. s  dD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化& |7 }% j7 d9 `" {+ E' U6 v
E.数据库没用变化
+ O/ W3 c/ M, A5 r
$ K9 x/ `) V! s0 n$ I* X
: x# r, u- i3 \4 B/ ^6 ]3 x; H11.DESC在这个查询中起什么作用?
; P6 k' G* W0 V/ `$ @, p* O5 Q+ f) [3 X/ k, q* ]. X+ X0 @
SELECT *8 G8 s  n1 v' w0 Y! a
FROM MY_TABLE
0 ?) C* |! T6 G& X  k0 h; N8 u# yWHERE ID > 0. ]3 R  z& T- b  c
ORDER BY ID, NAME DESC" s1 ~( X' R4 T4 a

- m. u/ A0 l+ ^) H& ]6 k1 X9 NA.返回的数据集倒序排列; A& A) f) t/ o
B.ID相同的记录按NAME升序排列
2 X  k; ~) j* u$ y& K! ?C.ID相同的记录按NAME倒序排列+ [8 H# [8 l7 c) E: W% H
D.返回的记录先按NAME排序,再安ID排序
, {7 o" ~3 `# ~* ^  ~2 v) k6 n$ M# SE.结果集中包含对NAME字段的描述' H8 n3 j  L; P! M* X6 Q

2 T% v% o1 g! e! B) B, |) J9 g0 m4 {: o8 f
12.以下哪个不是SQL函数?
$ m8 Z+ C7 h% c7 S8 I
3 m( t) b- }, @3 T/ r+ ]- BA.AVG; n. ^- \0 `4 ?
B.SUM
' e9 Z7 U+ ?+ o2 N& `C.MIN
! x0 R9 n$ [+ R% d0 r0 fD.MAX( `  n5 T. H  w. Y
E.CURRENT_DATE()% n7 I5 I# `% Q$ e, J

4 i2 V  `* }7 q0 D; @+ q; D: ^0 r: _. w' j5 Q
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?/ y/ l/ ~2 \; f' ]/ j' ^2 z
( i  y9 _9 c& J
A.该字段必须有索引
6 n3 X( M) i# \2 A) }* o9 CB.该字段必须包括在GROUP BY条件中
& ^/ x% r! p% V1 w' vC.该字段必须包含一个累积值0 z, j/ ]" K, T  m, @) |
D.该字段必须是主键3 T6 [2 x# W$ |% |# U, v4 [2 J
E.该字段必须不能包含NULL值  I" S. i% o! F$ b

/ e5 d* N$ s& g+ Z5 M0 c& h  t; \" G+ ?+ x# q
14.以下查询输出什么?4 u' ?7 W6 `3 }6 }5 y  k* s

* S# c& u; g8 }9 n/ sSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2# e  @& |! m. P0 e0 [
ON TABLE1.ID <> TABLE2.ID
( e2 J5 q/ s' i" E( g& @# a9 h- |0 j6 Z
A.TABLE1和TABLE2不相同的记录
* X' j0 n1 K' r: RB.两个表中相同的记录
; |/ g, J( W8 V$ U" {: E! i$ j0 SC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数; e, L# @) G& k
D.两表中不同记录的条数
) l* B% `/ }& Z4 O! v! kE.数字2
5 _7 b, d+ `! S* k7 e/ d
  o# ]/ w2 u0 W3 M
+ e. {3 ]1 v) f15.______能保证一组SQL语句不受干扰的运行?" o: u, j* s  }3 N
! X, X8 f8 Q3 R, z" N4 q
答案:____________- ^2 W: k5 o: u2 _3 T; G! g% `

8 j& ]: I. `( Z4 b$ k, s5 m" U* L8 d% ^* h4 ?
3 ?  j! y; P3 m( z( }& s
答案速查
- I4 `, \* u. ?" h' {3 s$ `2 x1:BC& k) w, W% {+ i& ~1 y9 r
2:WHERE. ]) b* M* |! ~+ g! G* d
3:B' d9 F/ J9 G* ]4 [
4:E5 k1 G0 G1 E. s6 u- ]# |  g
5:BD7 r) u4 j! N0 C: O- T4 N
6:INSERT% p3 k* U; a% _
7:C! T- w; _; |. l$ m6 k
8:A+ w' B! U$ ^, v9 M: V8 \; c0 G
9:C6 `6 D* a; F" m' M5 D/ }2 J
10:E6 J9 G% N- \# [% \! D
11:C7 W- X$ u. {! M5 i5 D; p+ B6 R) ]
12:E0 v  P0 v0 {$ b/ L2 O* Q, a9 N( V
13:BC: `6 w3 }% F2 z& U3 c1 b" A
14:C! Q9 a: K. \7 _) W9 _) E1 h
15:事务8 O3 A3 l2 [- _% n

4 j2 I% u* _  d: W# Z+ f9 ~, \8 R6 Y% R2 L# F/ c: d
9 V9 D& I% b8 |6 T# T! E$ |
答案详解, J# ~) |. o) A/ \3 I- u: z$ g

6 ]+ a' m4 O9 J* U0 @1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
* h% ?0 M, O2 {7 _$ {4 B6 K+ J. X! g" \: }! u2 c7 c+ o+ j' h
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! p9 t- ?7 f+ v7 }: X9 E! G

3 O  E+ H' b+ `! y; p' H: E3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。) N- c/ T; Q" x" C1 |0 e( P% Y
: t2 p6 ~" ]- ~7 K1 s- J1 t% e
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
3 M3 B3 C) j7 E" P4 P
, D+ J( B: _1 q, @* J5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。! w3 G+ Z8 s! `8 t# t

  d/ n! X6 i- Z6.答案显然是INSERT。3 D7 |& e2 L4 j0 {  A' `" Q- j

7 ~5 F1 z/ b  d3 B$ [7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
* r3 S( i3 F; }) O4 |
& p+ U& i8 P: Q6 @9 E8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
" A. _5 Q/ n3 {: |# Z  f
- g* j% `" L- i; F* {& z5 M9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。! o8 g- U, G6 V$ J# r5 W
8 C- z' g  R* N' v
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。+ P0 O3 n2 ~# x8 G( b
: e8 [8 q% A0 f, F/ Q
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。2 K& I$ t4 V1 X1 C' G' D
/ e: F; u* `' D$ b1 W( Z8 R
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
9 I  V5 Y+ K) Y6 u. G
3 c" _" G: u0 G+ d* {+ k13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。" r% ~2 _% f* X( B* E$ J2 M$ ^, j

( g$ f! Z- `/ _( d* V7 Y14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。" h# k, d$ r% I& J) T
+ a. c* x7 A% d
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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