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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
: x1 k. F+ |+ F6 e2 {PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。3 e* L* ^  B1 S1 ]4 p
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。+ t: o$ q: x" T; c0 @$ N- ^! W

1 K/ _4 Z, R* T" H2 l7 t  d7 W  {* Z+ v2 D0 i
问题) w  m, \2 d/ K  E& _
) d; }( ~1 F9 I0 A' x% G1 F: ^5 l% v
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选). s! {* N& k+ c0 O. ]3 ?7 J* D% R3 K
* ^) v/ B6 O3 x# P
SELECT * FROM MY_TABLE
9 |: A4 w9 T9 D& A% T. |
3 w5 o' X/ c# W: a2 m; [$ T0 JA.如果可能,用把查询转换成存储例程. G; s( I- s0 O. W! ^3 f
B.如果程序允许,给查询指定返回记录的范围% r5 m5 W' R5 N
C.如果可能,添加where条件
1 Z; g* h1 [* GD.如果DBMS允许,把查询转换成视图
# f) z- Z5 M7 }3 |8 BE.如果DBMS允许,使用事先准备好的语句
5 y0 [' {, v4 H$ M0 o
; O4 d6 C5 h  p$ ]! q) v! r+ S5 E7 H! ~
2.可以用添加______条件的方式对查询返回的数据集进行过滤?; h, f0 x$ f% C3 v  ^7 z: @
: k3 `* c" @4 J: ]" W! R- F
答案:____________
( j( t- S7 l+ e
# g1 @0 K# C# A; q* o8 u" u$ [* J5 H% t0 X" v
3.内关联(inner join)是用来做什么的?" f4 W, n& @' Q1 X
$ y3 z/ g' _5 ]6 |" C9 {. [( @
A.把两个表通过相同字段关联入一张持久的表中1 z. m, Q! Q1 g: G1 y2 @
B.创建基于两个表中相同相同行的结果集
, P$ ~5 h( y1 tC.创建基于一个表中的记录的数据集7 P8 @& W2 @4 d+ v( Y
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
: v9 j2 \' a: o9 Z3 T  u( {5 ]/ dE.以上都不对% [: d4 _7 p  E) S6 H, ~2 q9 H
! o9 D& {7 L8 m  ?% U: l1 m
7 a/ R! \$ q, Y2 T
4.以下哪个DBMS没有PHP扩展库?
8 t& ?+ B$ ~* I5 G$ s2 H4 @+ y% A. m( A% J- j
A.MySQL
: H2 B2 n0 Y9 x8 _5 |B.IBM DB/2
' p! K8 e! P, Y' s0 ]C.PostgreSQL
( s  t) o  b$ F$ t. X$ `3 h& ]; YD.Microsoft SQL Server
) Y  a( k7 Q# Y7 s' s, CE.以上都不对4 d5 d' ^. c0 A0 F/ ]

' t# {) _5 d. @/ v  ?1 Z& [
; i/ n% F+ @: r2 n) U2 r5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)2 B1 f) V2 W) F8 I9 C

5 j9 p: i. |0 U* a4 P5 `9 @! n<?php
) U1 E/ |/ B1 V) T* o$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);/ r7 P7 u( s( R  R7 C0 Z
?>3 n, a8 T# v8 J3 t
) T" |, _' q* q# ]2 n
A.MYTABLE表中的记录超过1条
# j& q6 X( o- ?+ [; i/ E/ MB.用户输入的数据需要经过适当的转义和过滤
- M4 C9 G3 q3 s1 C1 FC.调用该函数将产生一个包含了其他记录条数的记录
: @, p& J# a4 f& G- ID.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除, b3 M2 P. h% I) }1 ^/ N
E.查询语句中应该包含数据库名3 |- y$ t8 E1 @* @8 v( _( }5 ~
- y' W2 W; A9 t3 _$ C1 R

- F+ y; q- u' Y* x$ w6.______语句能用来向已存在的表中添加新的记录。
* L: b9 H6 }5 `% r* m2 g' `" I( K2 A: ~) T3 R
答案:____________
" t7 }  s# ]! \  I0 E7 A7 w4 {
5 S; {% e9 W+ `3 C
: |# a4 o. G6 I' y7.以下哪个说法正确?! J; d) p" G2 O7 s" w9 E8 \

& o8 d6 G: e( m3 W9 R. F2 ZA.使用索引能加快插入数据的速度* n9 ]" d, K$ m. [
B.良好的索引策略有助于防止跨站攻击: w3 }6 s& o! u3 Z+ |
C.应当根据数据库的实际应用按理设计索引
: S. T+ |  R% x* y" }( ~! [D.删除一条记录将导致整个表的索引被破坏' i2 u2 P! C1 m
E.只有数字记录行需要索引1 R3 M( ]5 X8 \9 y7 c; J6 J

6 l6 Y0 W8 j& h. Q9 v2 u- e4 S1 k/ S7 n9 L0 W$ s
8.join能否被嵌套?
! h: {# [4 ^3 Z4 k4 s5 n; ]% C8 \2 Z/ X0 f
A.能
3 w$ o2 O+ L8 `B.不能/ t+ V8 e4 @+ R8 C2 ^( f( [! x/ ?

6 w. i' C5 E! W% \' `8 G" U/ ~9 C" d9 ?5 `2 g& `
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
! w7 w* m0 }* s  {3 q3 m9 p: _7 ?: [6 f; n7 ~2 a
CREATE TABLE MYTABLE (
$ Q, f4 p4 |9 W; a5 Y$ M; Q; XID INT,
  p$ f; L  S, n1 k& W9 aNAME VARCHAR (100),8 _6 @' n  h, C3 a1 p7 o1 a! `/ G
ADDRESS1 VARCHAR (100),
3 Q0 s+ n/ E, j3 u% wADDRESS2 VARCHAR (100),7 _/ W1 F) [7 f9 N
ZIPCODE VARCHAR (10),
" J; l3 ^8 C9 [" RCITY VARCHAR (50),# m0 M5 J& _3 `5 ~+ j# `+ t& r
PROVINCE VARCHAR (2)
* H$ o8 m) H) E) q- u)$ }  A# S3 J, Q- G) h2 Y$ }0 c4 ^
SELECT ID, VARCHAR
0 N. ?# E" w& R* J: |FROM MYTABLE0 L7 }" ^* P  A6 ]$ e; o
WHERE ID BETWEEN 0 AND 1001 f8 x# x% Y5 x
ORDER BY NAME, ZIPCODE
6 Q; H: \4 F4 N/ U2 n) E* I
0 v! }$ X7 ^- u" r1 HA.给ID添加索引
3 X& i' _5 A5 b& yB.给NAME和ADDRESS1添加索引* N7 ~+ j$ w9 ^9 E# ]; A7 g; K
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
! u" N# [* @& K4 t% @3 f* dD.给ZIPCODE和NAME添加索引2 ^) J, v' V! }8 C4 R+ I
E.给ZIPCODE添加全文检索* V0 E- a9 _6 I. W, h! Z
7 ]! R# B0 M1 W! ~; I& {! s
9 i* ?4 ^7 S& B" Z" o3 D; O
10.执行以下SQL语句后将发生什么?
$ m, r( i1 @5 I# D& b
5 S" k, L6 H! g6 o4 A7 b4 F# NBEGIN TRANSACTION
* Q& r8 `& N% d9 V3 TDELETE FROM MYTABLE WHERE ID=1
/ g' `9 Q7 g2 G- m1 R+ XDELETE FROM OTHERTABLE
" w- x1 R% T& c' {% y( I2 ~ROLLBACK TRANSACTION
2 i/ d4 R4 V- R$ a$ O& d* W- w4 l2 F/ y7 H
A.OTHERTABLE中的内容将被删除
) ^2 E8 J- z1 S% dB.OTHERTABLE和MYTABLE中的内容都会被删除
% h3 e7 i: l; w* XC.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
) X6 C1 ^7 \( vD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
% R3 Q+ _% a3 WE.数据库没用变化) b  Q8 j6 _& N9 b- d6 T

8 a( ]) u# n+ o9 G! _' |6 s3 l
, c6 E3 E1 j/ _11.DESC在这个查询中起什么作用?
5 c8 A* k+ r* `3 |5 R3 `. M  Z2 ^" V1 {1 o! Y
SELECT *5 P: ?' D, l" j
FROM MY_TABLE
) K$ W% L. g, P/ m  ]* ZWHERE ID > 0
' z* W1 d1 w$ G) Q" l: B8 s. q. yORDER BY ID, NAME DESC
1 K( b( T+ k+ f- e( |0 [% ]: @0 p* `1 U% n
A.返回的数据集倒序排列( U5 i: ~: A( m5 b+ K+ q
B.ID相同的记录按NAME升序排列/ U/ e( A( c3 [# A- B9 N) ~% q
C.ID相同的记录按NAME倒序排列1 b" q" j  @) m: t
D.返回的记录先按NAME排序,再安ID排序# Q' s8 N1 l9 T/ |* p
E.结果集中包含对NAME字段的描述$ C* ^8 e1 r( ?3 z7 \: s
* p9 H: G# E% }

- H/ o- M1 z: u. ^12.以下哪个不是SQL函数?
/ c* h- P1 \$ G' u  e: B3 H6 w1 T, h! T; n$ R" ?
A.AVG2 M  P8 M" d0 [& |  c1 {- ^
B.SUM
5 N4 W# \0 r6 c! S4 |8 YC.MIN3 z# @$ u1 c! n( o
D.MAX, u$ l+ @: d3 v: [* g
E.CURRENT_DATE()! ?! D0 y! T: \6 }4 a% k

  O  u! _" J' b9 b' i# H- K
7 L/ F8 D* b5 X* H3 q% s) ^13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
& x5 _0 n. `* ^9 }! N! ~' U* {( w0 W2 C+ ]  ]1 H* V
A.该字段必须有索引3 J0 ^$ X  v% v- @) J8 H
B.该字段必须包括在GROUP BY条件中5 z4 V; `( X6 K
C.该字段必须包含一个累积值
! ~+ u* y3 W, ~" f7 Z9 ]* o; g& k# RD.该字段必须是主键
& y1 z9 y0 }% G! wE.该字段必须不能包含NULL值; q& y1 H0 `' H) R4 k  n0 X

( l8 T, e+ u& H
  p7 Z) Q! R4 z( H14.以下查询输出什么?
6 c7 q9 F, Q: F5 p8 u5 \9 [
0 p" D; n3 p! R; B( s" USELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2# a4 f) n* V* b. b/ F$ N7 h2 e
ON TABLE1.ID <> TABLE2.ID
  _$ E* K1 F/ W) \& u/ M; F- h0 ~/ Q) @1 f; W6 O# a& C
A.TABLE1和TABLE2不相同的记录) h* a5 w8 l' Y- p  p: W! x8 i& B
B.两个表中相同的记录
# F/ {8 A$ N& R6 C( rC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
2 a) r& ?+ |3 x8 L# }6 nD.两表中不同记录的条数/ s) y8 x8 d% z$ H
E.数字23 s5 G& K$ d: E( K, @. B
% |  R8 N: G  d: A9 e
6 Z# z! `  D6 f' G' a
15.______能保证一组SQL语句不受干扰的运行?
9 W% d: n5 c9 c: {
; ~9 N# S! Q( x* H% ]7 d( j答案:____________
4 J) l7 X$ ~2 @0 [' S
; E* `' v# D; y7 j1 k- z- E" E5 Q4 B/ f3 f$ }

3 q! S6 ~$ N0 z8 u, w: ?+ f答案速查
! q/ i: l$ D. E, d# g+ o1:BC$ @+ g4 S, p4 j% W
2:WHERE& l/ _( H& F- m$ d9 i1 H
3:B2 ^. H8 ~' ^* M9 g. ]5 u  c8 M
4:E0 @2 |, j9 O4 ~$ Q
5:BD8 K' }( @2 y5 U
6:INSERT
" c3 t0 U' f& o7:C
8 Z$ D2 \: s% v8:A, v! I7 u$ s- M( ]1 }2 S
9:C( _: u* _8 ~* }+ H- I/ q
10:E; ~3 }( S8 J. u' \4 O  ~3 P' r
11:C
! j: _% A" o; `12:E. ~8 W7 b+ h: C; a: ?. m
13:BC
7 J9 B1 V  U6 W* z) O# `4 E14:C! J: |! R8 ^4 X
15:事务; X. |( Q$ ~) k% m! S+ @% ]1 o% `5 k

& I: b0 t2 F. G; r5 S  o5 r
* A6 r! T4 s3 e
5 U. u$ y  m, G' {答案详解) g; ?* |$ I7 d
" T/ ~: E* a$ H+ H  [  @
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。9 m% [2 y" k: i" X7 ?

& i( |7 a4 l- V6 C2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
1 J3 Z9 F# W7 G, w) I7 i5 H8 g
$ [' Y5 `8 j. H# y- Q. s- x1 I3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
: Y& d0 G/ @* I; }, O& u* }/ e8 I' g7 y. s0 f4 T
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
0 b8 ~7 ?+ G5 |6 L3 w" l& }0 f7 K1 w; F; c' s; ^" W. t* h
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。. j7 o% `9 ?8 z* B1 l# y3 G

5 O, [# s& J9 F' ]. I! y7 g6.答案显然是INSERT。( x: G4 f  R% ~; d
6 {+ N5 |$ i6 J" W1 z6 M& {# t
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。" |: B2 k* E2 R' t0 {2 o- }

$ v2 w; S& ^9 \6 v8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
( |8 k$ P4 x* g1 @, \7 ^$ V
7 y8 N! p5 \" @% ?. N* ^$ J9 h9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
- K8 y1 ^, l/ K9 \9 b/ ^- C9 c7 k/ y0 h/ J. S2 x6 b0 |
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
# s) n3 g" G" t2 \* h$ w* U" J3 C  R" @# |/ Q, B8 ?" w5 j
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
+ M# O1 N7 h- R* b' H- l$ {! r9 |5 Z* g
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
' A$ ^7 l* |! t
7 U+ S  J3 J* {13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。+ @8 l; `' N5 Q- c
1 u3 ~. s( n8 A9 l  l
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。, p# N' N+ n0 E. S

% ]5 |, c! K8 a9 {3 t15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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