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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。6 d7 I# y! a4 Y; s9 }
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
' s, Y+ m( b% M0 g5 |本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。" o7 n2 b( A+ y) M# Z) ]

& g( n+ c: [" h1 f1 m0 D
' w  z  Q, ^# E4 Q( T: x问题
! g; C6 [% J& N& [2 p4 \! q% A1 k+ _
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)7 K+ u- B, o0 _* x' f- s% Y
$ p& p/ G2 i$ }) d
SELECT * FROM MY_TABLE
0 L1 T. L5 e2 D$ ], w& e) \
& n  r& _& B' B6 yA.如果可能,用把查询转换成存储例程
: @) t% x. Q* S, z5 T  |; KB.如果程序允许,给查询指定返回记录的范围
: S* J* T+ O9 NC.如果可能,添加where条件
; K, l  [  g: VD.如果DBMS允许,把查询转换成视图# {5 Q' n1 x: y% d0 b
E.如果DBMS允许,使用事先准备好的语句
* u3 T7 c1 F  T
1 j, B0 ]; m7 r: ?6 t# P7 E! b" f
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
6 d8 C+ A4 c  h( p$ h
* O; @9 j& Q$ H% s答案:____________+ C/ K6 u/ K4 k' N7 Q& U: C

- T) X1 a& Z. ~0 H' r9 J% K: k$ d' W7 Q% l' Q: j
3.内关联(inner join)是用来做什么的?$ N; n0 a) i8 `) A! b2 C$ x
! K/ @8 w2 l& Y6 g! E8 f/ U' t
A.把两个表通过相同字段关联入一张持久的表中( L/ w, T7 g4 N) o5 P0 X
B.创建基于两个表中相同相同行的结果集* d6 L4 H: n( f% n+ k
C.创建基于一个表中的记录的数据集7 j" E  C6 u, I+ _
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集# w8 D- F  J4 w4 o5 U0 V( s
E.以上都不对
* Y$ b5 p( w  z  f5 q6 k
+ _' n% ^1 s$ ?1 A, |2 m; V* t: |) M) X2 @
4.以下哪个DBMS没有PHP扩展库?
* F( V! {( J2 C6 ^4 i6 I+ \7 u  [1 _, I- s' l$ v: i5 Z
A.MySQL
5 L$ h  A' T+ n/ r5 ~; B% l3 ~B.IBM DB/2$ q: o* E/ l  ?2 V
C.PostgreSQL2 y' t! ~$ s' F- R5 F
D.Microsoft SQL Server
9 R+ S# }" f8 ]: u$ qE.以上都不对
1 t' u' I/ C0 B( S8 i
  H: F: ^3 W5 ^0 M8 N) H; v: P3 f& }0 V. w
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)& B8 P% j2 J9 O2 E/ \2 R4 d3 D2 R

0 P8 V% }+ E1 f5 v0 p+ W8 |- B<?php
- H; t/ ^! P( T* C+ [$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
# \% O- k  D/ }/ S% R5 {9 T?>
; x$ t6 I4 O# y: }2 G
8 ?4 I% x, {  t# G& E) G" YA.MYTABLE表中的记录超过1条' I! ~$ u/ }7 P! X# L1 o
B.用户输入的数据需要经过适当的转义和过滤4 F) S! `4 B5 b" I4 j
C.调用该函数将产生一个包含了其他记录条数的记录
1 G& X' N4 m2 `3 VD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除9 O* R- j  v  o5 y
E.查询语句中应该包含数据库名' ?2 m1 x0 ~/ [* j# X
1 [; F# c# V: ?, B/ W3 I

  l# L4 K- z( R  P/ L6.______语句能用来向已存在的表中添加新的记录。4 N  P7 Q7 {& g* y2 Q0 K
0 m" d* n6 ~/ m; z
答案:____________* w: |' q: R% R7 e/ r: G
' ^  W- f7 X8 m! F1 `
! F! V5 c" h$ A/ @
7.以下哪个说法正确?. u1 G' m0 P) Y

" h! _. R3 u1 rA.使用索引能加快插入数据的速度
/ c6 t/ |8 f" J! s! N: VB.良好的索引策略有助于防止跨站攻击6 \" S1 F; M6 L
C.应当根据数据库的实际应用按理设计索引% O3 T2 Q/ x$ H0 p
D.删除一条记录将导致整个表的索引被破坏
! B, Q2 {+ Y5 g3 o) v+ a7 s; K$ i8 ZE.只有数字记录行需要索引
. d/ N/ }6 U; y# u3 I( v  p$ u+ H) u5 d7 L( A& C# i" T- ]6 p) Y! O- j
5 q0 k) j, G, P' X4 [( g, p
8.join能否被嵌套?
6 \4 v6 }; k  t+ A3 b4 e: D7 i5 o& N- T
A.能1 Z1 f4 ?. J- D! C4 w% I
B.不能5 k8 f2 a& ~5 A. p3 j. c

. ^/ X) [( f8 g" i* B/ k2 T
0 M( t9 q( V' J. ?$ ~8 ^9.考虑如下数据表和查询。如何添加索引能提高查询速度?
. M/ k, X+ z: [% a; e
6 q# k- l6 h4 r4 a/ y6 cCREATE TABLE MYTABLE (/ z' ]$ r6 [1 o( X- n( B( `
ID INT,
3 k, I+ q, j: ?3 i/ F( SNAME VARCHAR (100),
2 y# s& E' a1 d, AADDRESS1 VARCHAR (100),
* f4 S0 l, W8 p- a& P' xADDRESS2 VARCHAR (100),- q/ {. x2 j' n; T- c1 f) I% c( v
ZIPCODE VARCHAR (10),6 {0 o" v: N* ]  _. l% D! r' h- r; D
CITY VARCHAR (50),
* T- v; \- A, T+ f' WPROVINCE VARCHAR (2)
5 f- [$ y( @& v+ u- B7 B3 e6 X)
$ M3 Z* f, \$ c5 PSELECT ID, VARCHAR% S. A' X( ?2 Q/ c7 F. Y
FROM MYTABLE
; _7 H" J* [5 `0 i9 k3 R, g  FWHERE ID BETWEEN 0 AND 1005 y: p* l4 Q! C% p
ORDER BY NAME, ZIPCODE
- @# k: J! v+ r  _' m" Y4 d4 X/ w; X; j' m& c, y: A. h
A.给ID添加索引' o. G+ y- Q; [$ @7 [
B.给NAME和ADDRESS1添加索引+ k% m/ \, n& w( e3 O
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
  O) a6 j9 U( b$ o5 \5 C- PD.给ZIPCODE和NAME添加索引
; l+ Z& |3 H0 L. X2 IE.给ZIPCODE添加全文检索
9 p1 E9 K$ i, A4 }( {: \4 A  H& ~; O! G
+ u1 t- G1 b" v' S3 [. O
10.执行以下SQL语句后将发生什么?
/ t3 o! o+ S5 [& B* k5 b
( n. g8 G5 A, G, q3 o9 w: GBEGIN TRANSACTION1 @" v7 N3 C4 t8 L( }
DELETE FROM MYTABLE WHERE ID=1
; T$ L  T7 P5 t5 t, P1 i5 aDELETE FROM OTHERTABLE
+ J: p+ ^. H$ V+ p! rROLLBACK TRANSACTION
0 g3 d# Q, [5 O6 x/ \3 D% @8 E2 U1 ]) X
A.OTHERTABLE中的内容将被删除
8 Q1 h" P/ D+ {( H1 Z& vB.OTHERTABLE和MYTABLE中的内容都会被删除& t4 [7 D/ k9 D4 a1 f& H! O9 b
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
* Y  R. K; H2 B: `D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化% C0 j! F3 k% O5 X) f
E.数据库没用变化7 Z7 b+ K5 R, V$ V6 V5 j, ^" _
/ o+ V# d7 X7 G& W* i
" f+ Q1 @' f( q7 c; S% x, s" {
11.DESC在这个查询中起什么作用?0 \$ @6 L  W. V$ \
6 N" _) X' o0 x8 `8 H; J
SELECT *
0 K7 g; Y! |! x, a( wFROM MY_TABLE) R% x. u8 H8 y" `  \
WHERE ID > 0, x7 b) B/ w1 U% _- h* |! L6 \
ORDER BY ID, NAME DESC( b  Y( B0 r0 [2 I

9 j, u( _1 w6 T2 E% cA.返回的数据集倒序排列9 a' L6 X; q, o) X
B.ID相同的记录按NAME升序排列- [3 K5 g4 k7 ^# F; _6 \+ ?) L
C.ID相同的记录按NAME倒序排列
8 t6 t. L" c$ [$ {0 C7 \( ?: ID.返回的记录先按NAME排序,再安ID排序
3 w+ b" A& v2 k. b& Q7 O' AE.结果集中包含对NAME字段的描述% H/ P1 e( P' G+ e
& e0 I1 [; X' \- e9 k- @" L4 x  ]& [5 G8 }

3 d7 b& i: ~; [, V" C12.以下哪个不是SQL函数?6 U7 x1 \/ k8 u% A  L% T6 F' _
* x0 z# ?. M( \  a. f2 H! ]; p
A.AVG- E) L0 `3 }- _" d
B.SUM
' y. y5 Q9 r4 v7 a- L- SC.MIN
2 {" X" N; R% Z" ]+ L5 ]D.MAX
+ }3 F( @* r) Y% w$ p. @E.CURRENT_DATE()" x) @- |! A" a$ Z$ M' J7 P& Y  B) C
% M2 |! S/ e, @; x0 Y+ r

8 ?9 p+ C& g4 Z/ r13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?& \' U* q7 T9 W* P( V9 `/ m

" `. V6 R" ^7 y; cA.该字段必须有索引
7 }1 }% ~0 t& X+ N8 K; BB.该字段必须包括在GROUP BY条件中
! N  A# ~9 w" bC.该字段必须包含一个累积值
; g" j3 h: x! [4 f  T& G  ED.该字段必须是主键
- g# N' M0 c) D: L/ \+ G) h1 V" xE.该字段必须不能包含NULL值" _' L" a+ K" n; D
8 H8 B1 M5 b# q# c5 S
& x9 N; q) ^2 p- b- J0 K; \
14.以下查询输出什么?* H2 Y& h' n0 l. W) z' Z

' ?7 q& x: ~) S$ C; b/ D2 d) vSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE26 |# Q* ~9 K% L$ L
ON TABLE1.ID <> TABLE2.ID) b) K1 _+ @* ?% k! i8 q0 n
; H/ q/ |7 a7 ~/ w
A.TABLE1和TABLE2不相同的记录) n4 R3 v$ e1 g
B.两个表中相同的记录
9 M9 o8 S, e$ K8 N; T1 y7 iC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数9 O' ^5 D9 V. [$ b
D.两表中不同记录的条数
6 \9 [8 \) C, y, [# A6 jE.数字2
9 I$ r* G1 u/ O; o  j
- @( Z' G! [7 S2 R/ G" N' e
2 m( \2 r( H* m4 T6 p15.______能保证一组SQL语句不受干扰的运行?2 }3 l+ O& ~2 U( l" m6 w- d

3 V2 i* z! p0 }5 n7 q答案:____________3 S* K0 x) ?9 P, e
$ O" c  X# Q" Q, C3 a3 s% p0 I

1 t- h/ F1 a4 n: w6 i4 O7 y# Q/ j+ I5 l( K- \' e7 R
答案速查
5 P+ ]9 }- y# j% v( |) Z8 l1:BC
) G# B3 h3 H5 k2:WHERE+ u0 W7 L0 Q/ I5 A3 u" U# y9 p# l7 ?* e
3:B
& _1 j8 L1 v# J3 M* ~4:E
, E4 ]- p6 p( T+ M1 n7 |, S3 q' _5:BD9 _4 f- o3 Z9 A4 t7 _
6:INSERT
. l* d: p/ D8 P" r7 ?9 Z1 m. D7:C4 `, C! O) k. A6 q+ Q
8:A
" W. g& b' |: W& E5 z9:C
4 \  n0 U* P0 z9 C& b7 r+ x10:E3 o# [$ e& p) `( r
11:C
7 a- U0 N8 ?5 p  r0 J12:E
& L: }9 y! R' U  s; T& U4 m13:BC
! B0 r& M* Y8 w; l1 \14:C1 d5 g0 I4 A; T) C9 O* `$ ~
15:事务
; A1 H' T% x  i. r
- U5 }$ w3 s+ D. Z* T0 j8 ^* A1 z# G
8 @. D0 {# y4 X) }( R
2 z3 r' V2 v& @) S" z. ~2 F答案详解
2 r7 E5 F# {+ Y8 J# }9 A5 d0 m, e3 u5 t  ?$ T
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
7 m5 C/ X$ Q: N  g0 S5 B; B8 i' l% T3 v
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
" l7 j. H8 a" [8 v8 Z* d0 o3 @: ~  u
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。2 ?' |) ?! c  a- }
. U2 j3 T# c+ ]+ A0 D0 V
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。% b" Z3 U; {- T# X& ~

: Z1 o4 }5 q% u' X5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。: b9 M+ U# S% u8 [# h% D, A

- G9 k! K8 W+ H4 L. S! t' F6.答案显然是INSERT。
' l8 d; H5 h( x6 v/ w1 W" e$ ^4 S. I0 F# Q+ l1 l
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。- h7 S; a4 [( v4 g0 S0 P

' U5 t* Y" p3 s3 L) o7 c1 ~8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
6 n8 R: r' _0 p& b! k+ e
; Z" m; u2 _- U" n3 u9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。% u- `5 d5 c7 `7 N

* d  {: Z0 \5 N# A  h) }+ V" N/ A10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
! i: w3 H. W' m( w) h* V0 R
$ F, Q* z8 Y/ e2 T' v11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。- o" b9 k$ J5 i7 b. R( L

5 j8 y+ h/ j' Y12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
$ v4 ]! Q- q1 q$ _1 R/ y2 f8 y1 ~, K" e: C3 v8 _7 b5 v
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。: d4 f0 q; V9 X

* m+ ~# F, t! R+ g' G2 s14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。2 J& q# ]4 \' k
8 c6 |  U+ ?+ V1 R' d! S& B6 W
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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