返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
+ }) n* C8 F$ h8 R9 C/ DPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。; J; `' J. |+ O3 Z) j& w
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
! e+ g) J4 E# V8 |( ?' P$ i3 l, u. _2 @# k3 C4 d

4 ~- L) t  l1 D# }问题" ^6 `! c* ]+ F: K  s

7 S" c5 s$ v7 Y) q) D/ t0 x1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)) t( b2 z, o# ~7 H- A3 D
7 |8 v4 O8 d$ M! C% G* ]: k
SELECT * FROM MY_TABLE) ~& N) h( Z- b# W- {. ]4 u7 d

7 B; }1 p  i2 S$ F" j6 k  AA.如果可能,用把查询转换成存储例程5 ~& t4 R1 B7 f0 ^% ^
B.如果程序允许,给查询指定返回记录的范围# r6 a) U( n1 ~4 i9 o0 p
C.如果可能,添加where条件
1 \, r- f4 ?$ D: A+ wD.如果DBMS允许,把查询转换成视图
' G* v: r7 a- c/ u" a5 XE.如果DBMS允许,使用事先准备好的语句1 M  L3 }- z/ H

' \& b) l+ K* H
* [, P& x: e. L7 a% ]* E2.可以用添加______条件的方式对查询返回的数据集进行过滤?2 {7 ?5 N( |0 I7 }
$ E! R7 Z5 R6 q* `7 ^# `
答案:____________
6 [$ Y& b7 s& P% Y6 R  X1 e9 c5 }7 X8 S0 T
( V/ o+ m" w# C  ~8 K+ _9 _
3.内关联(inner join)是用来做什么的?1 T1 D; Q0 G# J9 A
# \! j$ C7 b6 ^, m, r6 G7 \
A.把两个表通过相同字段关联入一张持久的表中
! X7 h. j' N- D' P4 R' h6 UB.创建基于两个表中相同相同行的结果集
+ O- d" R, L! l  q  F4 ]0 G* k  N. [C.创建基于一个表中的记录的数据集' n9 L: j% L+ D5 l
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集3 ?$ s, U: f/ Q9 c
E.以上都不对( F3 `' N% T: A) ]3 ]+ B! S

+ i+ e4 @" r% ?4 r$ x: \" e# ?5 n: R, s% I" b& k
4.以下哪个DBMS没有PHP扩展库?2 A3 j+ q) B  v5 Z
: I9 _. C  u: g' s
A.MySQL
. n* n) A9 W" f. r* S( tB.IBM DB/2
* i* L; O9 {) X. ~! r9 q# m5 U1 ?5 C$ UC.PostgreSQL1 T! g& s: G! x' K
D.Microsoft SQL Server
. }4 p5 u; `  K& u# A1 {, EE.以上都不对4 h. }7 v  ]: l! ~* `" h1 U
4 _# A2 @8 ~! O5 d  k
% n& M+ \6 Y/ l5 w* _) D, |
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
8 f5 @/ Y( B, z, Z; P! g  s6 C% j8 k4 ?
<?php
( ?9 |, R' b6 X$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
/ W- S0 v# Q0 y$ B6 _?>
6 |  I& K% X' ]
) A1 S; t4 y: z! p4 ]A.MYTABLE表中的记录超过1条
+ b1 r& m: l  e+ }$ t, |9 VB.用户输入的数据需要经过适当的转义和过滤
( y5 h5 C5 Y/ w4 f  }2 y/ LC.调用该函数将产生一个包含了其他记录条数的记录; a! @0 p" v+ i* F
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
1 t2 [% {9 U8 `# x* [6 t/ ]E.查询语句中应该包含数据库名4 J" C" x: E; W" u( C' V: W! E  X

" e8 q! l5 v' _6 r. P0 e% s, p: ]# r6 q$ @; p* }7 p8 H: i
6.______语句能用来向已存在的表中添加新的记录。
! j6 `' U4 j: R$ l% \; p7 N: e. k5 a0 x$ r: M& G$ Z2 M" R/ i
答案:____________
! f# g% W2 S) t0 F9 g
1 Q; s. e/ ~( V; A2 A7 g
4 \$ ?$ `, x% r0 h- ?7.以下哪个说法正确?
1 E( q. s+ ]0 Z4 |+ k" `. v
* C3 {7 ?, R: {# t2 AA.使用索引能加快插入数据的速度0 ]* N$ t3 X4 T- b
B.良好的索引策略有助于防止跨站攻击
) z, z2 u/ O" \& uC.应当根据数据库的实际应用按理设计索引
3 c3 D+ d% P5 r& \/ J* c5 c) ~D.删除一条记录将导致整个表的索引被破坏
4 T; \  q( g7 X4 O; F, z6 zE.只有数字记录行需要索引
4 p* P. L) y( @1 H8 a" c6 i2 ?% c4 z; \$ \) s

/ b+ S7 C3 }" B8 ^# ~" b3 n8.join能否被嵌套?
' p) @$ u6 G9 a; B' m/ K7 n' r- V3 k1 U- x% ^1 L0 q
A.能+ W, _4 E8 J- U+ k) ?6 ]
B.不能
! D& z# `9 L8 R" q+ }
+ |% v0 k/ z8 ]* V$ Z0 A" }' @4 k) L5 ]
9.考虑如下数据表和查询。如何添加索引能提高查询速度?' y/ k! z+ ^" i7 t; n/ c6 |7 Z
) d8 e' F+ R& t, I
CREATE TABLE MYTABLE (
" [/ E, g! U) V0 W0 ^ID INT,
; C3 d( G. \& ?8 mNAME VARCHAR (100),& O; H; a% z  T$ O+ D% ?7 X1 a9 i
ADDRESS1 VARCHAR (100),% {/ I$ ^7 P5 H: N) Q
ADDRESS2 VARCHAR (100),1 _; {; K& @1 u. c3 w
ZIPCODE VARCHAR (10),
4 s# D0 e2 b$ s; ?CITY VARCHAR (50),3 k- P+ `) x! w: L
PROVINCE VARCHAR (2)& ?; \& [4 W. n, V4 }/ W/ X# @
)
1 `4 [+ Q: |% j( R' i" kSELECT ID, VARCHAR- s9 p# Y! H; S  ?: D2 j5 e& E, w
FROM MYTABLE
( S) p: ~0 h) o; \: m5 hWHERE ID BETWEEN 0 AND 100
0 O- M- ]$ c" K7 }# TORDER BY NAME, ZIPCODE
3 [1 g5 I$ x3 M  S1 W
$ H, u& n' }+ UA.给ID添加索引
; H& `" {0 P) M" nB.给NAME和ADDRESS1添加索引
8 ?1 ]! ]7 y. S& KC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
8 e' m. C' Q" U( l- XD.给ZIPCODE和NAME添加索引4 l- K. d1 i# s
E.给ZIPCODE添加全文检索0 w7 }. s' |; Q" u7 a# L
' E( J2 F* ^+ ^! L% R6 Z% M

5 O4 v# s; A3 c% [( l10.执行以下SQL语句后将发生什么?
1 e& o( U3 ^5 V; S( \- W6 \4 G5 a
$ ^! @. s) |/ B* _, s/ W1 {% ZBEGIN TRANSACTION
6 @8 z1 L# \3 x  C6 y! U9 |DELETE FROM MYTABLE WHERE ID=1
/ r5 M  O9 b0 ~, z- HDELETE FROM OTHERTABLE2 r! c- \3 e, O; m
ROLLBACK TRANSACTION
; h3 q) }' D7 \" @0 ^6 n4 u+ \/ [  u
A.OTHERTABLE中的内容将被删除
% @. X! _* H$ z& d3 e# c& CB.OTHERTABLE和MYTABLE中的内容都会被删除
- r+ _9 ~7 b5 u! f- O% ~C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除4 _: S$ f' i2 l! r: e
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
6 Q6 z( l- S- p' x9 QE.数据库没用变化4 w7 k3 Z' j0 q+ _2 ~
& E: D; E& H6 b6 B- h

6 Y& ?" S3 k+ J& b6 u( I! }  S11.DESC在这个查询中起什么作用?
6 P, V9 a8 @- d9 Z) c  K& w7 p: X
SELECT *4 N9 ]& [; m! a
FROM MY_TABLE0 b/ D! p  v/ o3 l8 Q, q/ V- Q( T
WHERE ID > 0* J) l' B6 P) o5 V/ n1 E
ORDER BY ID, NAME DESC
( B. _! N* |3 ?) t! G, [! T) i* p* R
A.返回的数据集倒序排列; s9 H# I: b5 W& e" F7 l( j
B.ID相同的记录按NAME升序排列6 ^- F3 b  H* i6 W
C.ID相同的记录按NAME倒序排列
: o7 ~- h4 i8 P' U3 ]5 fD.返回的记录先按NAME排序,再安ID排序8 ]6 c" B1 J: q5 g
E.结果集中包含对NAME字段的描述
! R( o5 M0 v% f) b
) V" z( Y$ K( q7 j: X
: C6 p& j1 |  U; O2 q/ e  r7 l12.以下哪个不是SQL函数?1 `7 R7 A) R- r: Y( {. y5 n  e
2 z& O; [1 x* {% G5 q8 y
A.AVG& Z4 `5 T- L* O6 R1 F
B.SUM, A' `+ w; p% _5 s3 K+ J, Z
C.MIN
5 X4 B/ Y1 M6 @: q5 R, qD.MAX6 ]( @! J; h1 d5 ~! ~4 Z8 w3 |
E.CURRENT_DATE()0 `: N. l2 R3 r* u

- s6 H0 b# K- c
- @! j3 u- `- s4 u. N2 u! \13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?) G0 e& |# Q. B6 r

0 o( n' H& }2 E) G( n/ |A.该字段必须有索引( p) w5 c! m$ k/ r5 }
B.该字段必须包括在GROUP BY条件中. {+ W9 g. d8 {/ m  v
C.该字段必须包含一个累积值7 P7 v0 C# s9 s
D.该字段必须是主键
1 w& C, |. U- t$ |1 PE.该字段必须不能包含NULL值" |6 M- e# F6 }$ ]; i6 \
- }: g) b) |2 }  Z
1 j& \! ^& \6 J  A
14.以下查询输出什么?
# E5 l1 ]' V  ]9 E- ?2 q; x; @( }1 }8 i. `5 Y4 s
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE23 B! T! G4 B  A7 A5 G( }- R; p
ON TABLE1.ID <> TABLE2.ID+ o  h: _3 c. E3 z- M2 c6 f. m% ^
. L' Y! K2 S+ i. s
A.TABLE1和TABLE2不相同的记录
! C) W5 f. j: r5 QB.两个表中相同的记录  O& }* Z6 ]+ r9 n/ i' Q& O( p7 j: H1 R2 v
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数( I- U7 D* ?' t& V3 s
D.两表中不同记录的条数
) h" w4 N$ c7 e# xE.数字2
4 ?' E: c; S) s3 H
: V) c' |. L/ y( B; a! g+ a0 y/ o( w! A, W
15.______能保证一组SQL语句不受干扰的运行?9 @% Q9 o( k4 Q; p- I+ z
& R0 K' K; l; P) L
答案:____________& H2 U& \1 h: L6 M& y: @

, O/ a$ ]4 b" ^4 t4 ~" S( S# o! q, u
5 n4 d0 S+ [4 M; x/ o) x: C
答案速查& h9 Q+ f: @( P3 Q/ p
1:BC
3 d0 j$ _) A4 }1 Z' B# K& }2:WHERE+ ^/ }; x# i. j7 y0 Y: j
3:B8 f6 y/ o! `8 G% Q( p0 A
4:E# D: z: @+ O: t' }4 g, y
5:BD2 S1 ?6 \& j/ r$ N
6:INSERT, Z+ \5 ?1 j/ E# Q+ g: g+ m& ?! r7 s
7:C& e" ]" D! I4 k0 V0 b0 r" H
8:A8 }0 T  R6 K( [
9:C
% n" n' u$ o4 w7 {10:E4 U  b1 j  c1 v6 L
11:C3 f& o) _; M) i+ o- @0 ]$ L
12:E
2 \3 |8 d# U: y% n( |; _: i13:BC
) F' L2 M2 S5 m) o# H9 }1 S/ w14:C/ K$ z2 H( P' L" g: G1 H- n
15:事务8 @, M: @9 x0 h+ {2 ]

1 g* Z# K4 H" D; Z; y4 [
* b/ K; _/ h/ a9 Q& w$ r. Y4 D! n6 z5 _2 {, ~
答案详解
1 L/ j5 C( q+ V. j; _% f2 J( F
- n( Z- P/ i- e' h* {8 l/ L) J1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。+ x8 M# ^- p4 l, }' r$ K- W6 a

5 ?7 Z# P' C# m2 P2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。' x* |; Y7 t3 q' j) [
" p3 i! p: m& H% v3 a( u
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。6 w' n1 J5 s% e- T' Y
. @; ?: P1 ^* A- B
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。  f) z& A  g- ?  [
- x" t7 H: i& D) s; ~! \& t- h
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。* \8 w9 [' N0 \/ K' d& N9 F

& J! T; s3 D2 N, s( X/ `6.答案显然是INSERT。
4 Z" `& u% F1 v, m' O
8 K) w  |% C/ O* z" N* a7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
" |9 f+ r+ I) {$ B  C6 ^$ u( d! g; x# h  B
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。9 D# G6 B1 d+ H6 [& H7 T

) n% V, ?" \: z  [) [9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。! W( b; I) y0 ~* x2 Z7 ]
; d/ W- y  u1 S! R9 k# ^6 y
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。; U( {5 F2 c! |, S& W- N* b1 h

* L$ {# s; c0 g9 w% E11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
  n" `, m: h8 v) G+ w2 K1 S9 e
0 Z7 o0 r) |1 ]/ ^) u2 t8 R. ~12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。7 X; H1 U* N7 g7 q3 U- Z
: o, k* I& f* z3 R+ _
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# T* ?% z3 e: n- n) l  b5 N
' b" ^2 s6 w  {2 d$ I% M+ _14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。" b$ B6 r! K+ Y6 J; a

' |/ P: ~: X0 b, T( y* e2 D15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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