获得本站免费赞助空间请点这里
返回列表 发帖

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
! d2 {6 w: f% ?6 ]PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
; o) M) D2 ~# w* R本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
- L7 G% O# g8 d; K( S- a+ L! h6 D' T0 C1 Q: c, d' D
5 J5 S& I* p% B5 ~6 V
问题7 [4 J; |# \1 j  m: ]! Y6 T

' K  R) D1 e* B  ^' o" X( l% n: o1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)* ?! M! Z1 \3 ]6 P

6 u/ M* O, u0 D: wSELECT * FROM MY_TABLE: C) \  P1 v: A  G. q
' v. ~# D7 c0 ^# s* ~# r6 b* E3 u
A.如果可能,用把查询转换成存储例程, z$ F1 F) L2 K+ N' Y7 ~4 [4 c
B.如果程序允许,给查询指定返回记录的范围( D% @6 \# t) B2 u7 C  A, ?4 A
C.如果可能,添加where条件
' Q# o7 u- B: Q  r/ m; BD.如果DBMS允许,把查询转换成视图- s% E/ H# r$ P3 O
E.如果DBMS允许,使用事先准备好的语句3 W# y, e  ?3 q# p' T' [) R

8 |- K3 \& b; k/ L+ x7 p* {0 i* n+ ~6 |* C# g5 C
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
/ v, I  M/ v% a4 K' W4 _) O7 }1 X) O" [
答案:____________
7 T0 B4 X8 u! @' A8 l4 i2 @- G9 f/ M7 x
0 {& J& ^/ z; M* U
3.内关联(inner join)是用来做什么的?$ ?+ V6 j+ Z4 E9 t
; E, U* u0 v8 `7 ?' L
A.把两个表通过相同字段关联入一张持久的表中, d$ z4 L0 ]1 L
B.创建基于两个表中相同相同行的结果集
/ Q) ~* t0 Y8 z+ zC.创建基于一个表中的记录的数据集
8 d% K2 o# y0 U" E( vD.创建一个包含两个表中相同记录和一个表中全部记录的结果集
) |) u8 Z+ @& C" NE.以上都不对
8 F, p7 w7 ?, ^# r, D- [. X, j3 w! ^* ]$ {
; w% y/ a) V3 f' b. w7 W; ]
4.以下哪个DBMS没有PHP扩展库?+ L6 {4 j3 A0 h6 X$ D4 z: L

" O1 Q6 p5 m0 N) }+ pA.MySQL
, a  K( U" F  V( Q: TB.IBM DB/27 V" b6 A$ E3 g7 k/ U5 X
C.PostgreSQL; z; T# q" Q1 ^: N) m
D.Microsoft SQL Server
& {( R  L4 a! @  vE.以上都不对
$ ^/ @% l# Q" m- U/ |& e
1 U1 J* a; d2 V2 J& C1 N4 h# G: t0 w; o+ F6 k# _
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
& {. q. I0 S4 _9 M4 |  L/ w
3 z$ G1 T, b) v8 u. o7 |8 o: {: X" N<?php
, Q2 }) A' Z' U7 k7 g. ~3 x9 b$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);2 w6 ~4 T2 _! q. e& ]1 X
?>
7 `. j7 ]" y4 S) o; c# {) d1 F" p* i2 e" @9 K& y8 ]" f9 {: ?% B% i
A.MYTABLE表中的记录超过1条, ]' r  J- G9 B  E
B.用户输入的数据需要经过适当的转义和过滤: u7 m. E/ W4 v4 `! e2 [- V6 L
C.调用该函数将产生一个包含了其他记录条数的记录, ^5 f/ y+ w$ T# `: P6 {, r
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
% m4 U# t- Y5 |; r. H  k) |E.查询语句中应该包含数据库名
4 U. R8 {& i- v) }$ E: L7 D  W7 w) P9 `1 [0 ^
1 \+ A1 `; F0 y: J, U( v2 m, R% N5 @
6.______语句能用来向已存在的表中添加新的记录。
% Q1 {4 ]$ O: q8 Y/ h4 s; ]1 o( \# {6 c; E2 {7 e
答案:____________
6 t2 u  T) d3 O6 g% p
" s) s% ~0 V# {& x- z& _" Q2 g
# Y, P' G2 A! l- U- f. u" Q9 |7.以下哪个说法正确?
. c) B! W. p1 K1 f
/ Q! q7 c/ A) V% [; n! iA.使用索引能加快插入数据的速度
1 q5 F5 q, m$ L# C' u/ ~B.良好的索引策略有助于防止跨站攻击+ u& {4 m" S) }7 @
C.应当根据数据库的实际应用按理设计索引
3 K! x* y# M# c! ?  lD.删除一条记录将导致整个表的索引被破坏# v. X: H7 ~3 W* Z1 _
E.只有数字记录行需要索引9 F9 D) N) t8 a3 x6 P1 Q# Y+ ^

" J6 M3 t( F% J+ M8 h& H) G3 C, B; V& i$ U: l
8.join能否被嵌套?
1 X6 T$ c% q; \) N$ E
- g/ [3 B( x" Y. Q+ N6 [1 }% W( e  u% oA.能
; m  t; K1 ~1 p- i# Y9 uB.不能
9 {- i4 a$ f  Q; n* x: q! W/ _- c, v
/ z( D' G- l. n9 z3 B- C
  x4 s3 `, n9 S% D) Q* r9.考虑如下数据表和查询。如何添加索引能提高查询速度?: C: G7 D/ i4 z% ]3 x

" s$ |8 F1 ?" C" y0 l$ i: t9 F6 T1 MCREATE TABLE MYTABLE (8 L6 H2 c; e/ t
ID INT,
: R& V+ y' P8 Q$ T  h# p5 J) w8 ~& hNAME VARCHAR (100),  k1 u; `0 \3 f: V
ADDRESS1 VARCHAR (100),
  v9 D/ F3 A$ y  R5 GADDRESS2 VARCHAR (100),5 t; C) G0 e, s- ?/ P3 J
ZIPCODE VARCHAR (10),2 X% R3 a" F1 \  G
CITY VARCHAR (50),% n9 ~1 R+ Z4 n! ~4 j
PROVINCE VARCHAR (2)
5 c# e4 Q2 F9 `1 n* c# X)
) B3 t" p# |$ u$ eSELECT ID, VARCHAR( I# _; F5 C3 C$ f
FROM MYTABLE' G- Y& X7 n( G/ _5 {
WHERE ID BETWEEN 0 AND 100
; Z1 f7 n/ L$ T- U4 ?  T. {ORDER BY NAME, ZIPCODE$ \2 a/ k5 T$ j+ l
7 v& `% q, H  r0 |
A.给ID添加索引
, p, E+ ]7 U, s- tB.给NAME和ADDRESS1添加索引
! C1 y# z  Y$ v0 [8 s) |C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引0 z- M+ i! A5 w- Z+ G
D.给ZIPCODE和NAME添加索引0 r9 i5 Y( B. c( A# ]
E.给ZIPCODE添加全文检索
% V$ H" I9 K4 i- Y- G; T
2 e+ m- b) @; t! J6 J( Q% H) n3 _  p( A8 q
10.执行以下SQL语句后将发生什么?  x' g1 h# \: [+ B$ R! j* W, g4 l5 f- c3 H

6 p3 l0 F+ H/ ?" f% n7 HBEGIN TRANSACTION
; C7 O  F8 ]8 K, S! K# Q5 `DELETE FROM MYTABLE WHERE ID=11 n' {, H/ b3 h6 t! i
DELETE FROM OTHERTABLE
! t( G8 ~& \4 x! E1 e% d$ ?0 a1 ~ROLLBACK TRANSACTION0 T7 `  u0 i6 E& l4 M4 X# I: ^

7 x, W, n7 N! h8 VA.OTHERTABLE中的内容将被删除  z0 }  m/ _1 x) h
B.OTHERTABLE和MYTABLE中的内容都会被删除0 |; k# ~' h$ y( u
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除0 o: f0 o" |" Y
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
3 ^/ L6 M9 i: s" _E.数据库没用变化! w" o, p0 X# y

# F4 m4 m$ u/ Q- _4 `. Q5 A$ \" J, T! {! q
11.DESC在这个查询中起什么作用?
) i: q6 f; q4 r0 m9 x; A! x6 k) Q& T" Y% T' l& y( q
SELECT *
% a( U& }4 N% g! a- IFROM MY_TABLE
5 H3 \4 J/ U0 NWHERE ID > 0
6 ]6 E$ k( A0 [7 o+ zORDER BY ID, NAME DESC
6 j1 o+ |6 i$ Q# c! y! t
7 W+ G$ r4 ~$ U  t% \$ @. EA.返回的数据集倒序排列, O6 N, L" c6 a6 c
B.ID相同的记录按NAME升序排列
  [& J0 D- J6 F- |. `C.ID相同的记录按NAME倒序排列, F# w+ K: R$ i
D.返回的记录先按NAME排序,再安ID排序( ]; `" k( G) ~+ {' o+ o  j
E.结果集中包含对NAME字段的描述9 ~, I: f7 D4 @

" V7 j" b6 Q# Z* O) y2 J. U1 N
+ C* Q; ~- M$ z' F/ u* Q( g% k12.以下哪个不是SQL函数?
1 s6 w6 a' x7 u7 u: d  ~
: l+ y- w6 j! dA.AVG$ L; H% s# M# ^& C$ G% e9 m8 N+ e' C
B.SUM2 C. Q1 F7 Z, P
C.MIN
4 i2 q: K" w5 q' ^2 `4 dD.MAX
/ f: K/ d3 I1 UE.CURRENT_DATE()
2 P6 J7 Y9 Y3 x, @+ w) W! x
/ X4 F; ?  M2 B% r* D* l
7 D+ U* V+ ]) u- c6 M; w13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
% n. c; }/ Y/ C1 J& t6 l
+ S" v: x- E; `1 QA.该字段必须有索引" J. d$ e. o6 y) q4 U
B.该字段必须包括在GROUP BY条件中: F: a- j% U# ], b5 Y9 q
C.该字段必须包含一个累积值
9 q% [# b2 H! {5 uD.该字段必须是主键
% ^# k+ ?9 m* \5 @" GE.该字段必须不能包含NULL值
  h$ A" a  Q5 `6 M/ ^* b" C  A2 Q
7 ~( M1 q3 q9 e# u: F; [* ~6 c
; F3 M# I6 a, n14.以下查询输出什么?
$ H. O' u/ T9 b  z2 w2 y7 T) S: \, @; @% |1 K+ Z) G0 A
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
' E$ [3 B, r/ m" }. ?& E! C/ V4 N2 lON TABLE1.ID <> TABLE2.ID
- i: P4 t( u) v4 B2 n: e
1 I; b" N1 x2 S4 d- o* B: dA.TABLE1和TABLE2不相同的记录# r( O( t/ `2 O* [" N8 I1 z
B.两个表中相同的记录
; o1 d4 {4 Q; V9 _; xC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
3 ~$ F9 J9 L+ I# aD.两表中不同记录的条数
2 I! w  D8 W! i6 tE.数字2. D, B7 q5 j/ t; M- l0 N) |/ q( A

' X) p5 q3 Q- Q. {! w4 U$ y
- t/ B( X+ j5 x0 i6 K; h. A  E15.______能保证一组SQL语句不受干扰的运行?
4 S" F/ @0 @* U2 |) e" W9 d! c3 d, s4 b. l3 I
答案:____________& r5 `4 U, O, T- I' M
# A  f- H; u: k; q- M" d4 v3 `" x

( M) ^* u  i2 Y7 A6 D* \
+ @& D8 i% F) O) z答案速查
9 n+ p6 _7 Z* J" j1:BC: [& v3 E" U- A9 S+ `
2:WHERE1 ]0 M" R6 x% @0 s9 G' g, k* e" J
3:B6 C0 Y3 c& v" E% _, f
4:E
. b1 d: V# j! p* k2 Z5:BD% L8 n& W2 u( T6 k, H
6:INSERT
+ ?5 h8 ?; c+ _6 v7:C
8 l: h$ d, O  f7 W. O8:A6 l0 `) g9 k" C" ~3 Z
9:C
) B% S. n3 `! @, ]: x2 w3 b10:E' E7 _  y1 _1 D5 Y. [
11:C+ c) \( V; o( R" h6 ~3 t
12:E
$ A0 O. ?/ }+ j1 W0 C13:BC4 q. |: w+ d1 l
14:C1 S' C% P2 _6 W# P( Y
15:事务) B& ?) l3 D5 a1 V. @% Z
: F& a4 t  y0 Q

. a1 H4 ~1 C: z2 h+ a" `% g* N; K0 f; V! s3 u
答案详解/ E: s. l" Q" `8 q+ x% i+ r! C& r
, d* B5 |# R, z/ |$ x- F
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
, }+ K% P" v7 c5 {
5 t4 z( }6 L& N( Y6 E2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。* x7 E" @& z: Q
  v& x. S% \1 p  ~) g
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
) W! |6 x- `7 k7 }$ f# Y# s3 ~/ `8 n1 t: `  ]
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
2 i9 U5 E. v1 p& a; }7 b* y8 J( ~# _8 I9 I
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
+ W  ~1 i* f- G) T  x6 t# }8 K; g  u5 Z  v7 C: D# V9 l4 a
6.答案显然是INSERT。( A8 [8 k5 R8 g* ^

/ p6 R4 ?$ x2 t/ g* ]& W2 t( _+ r: u( K7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。9 g; ~! ?- K9 q* X, K

- d1 J- L$ G9 v2 A9 B5 y8 s8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
  N7 ^* w  O3 F" f1 O0 \1 m$ p8 K' ?$ s- R; ^" C5 i
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。* V* L- F  y; j. r
8 R) D( Q6 l' z8 M& n3 {5 q' d
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
* t* ?  t/ Q' e/ |! a) q. k7 N7 U" b1 ~2 J3 A2 V# }
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
9 p& ^# a2 z1 f0 S2 \5 K5 S  B+ ?( U/ a5 U$ m* p( F
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。7 a( J8 x3 k; t" J$ z0 K  ^

/ x2 `) Y, |( Q13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。8 l6 D3 Z/ S# o; ?) s3 S) Z

" E" z  d5 o: H14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。' M, ?2 b" V$ e. v
1 c. B8 k* y! E6 l4 J
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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