  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
[Zend权威认证试题讲解]第九章 - PHP与数据库
如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。 n8 y5 `! R9 ^7 L( e f
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
+ v: @& P/ ^3 Q2 X7 B4 ~本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
7 e$ P6 i& G' V: j7 \
8 C& t, L. y+ M: o: L, _, W9 j6 ~: ~- b7 X) H
问题
+ w8 w4 w+ q# f }( j/ i2 E- U
- [8 }6 @; B& m' a1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)2 k0 s7 u( |. {- d" `4 t) u
) K8 h; b: R3 V2 h4 v% NSELECT * FROM MY_TABLE8 y7 U( q$ L/ J' ]/ y. v9 l; `
/ `6 W5 v: P% P7 oA.如果可能,用把查询转换成存储例程5 c) ~* h9 B2 f+ k @
B.如果程序允许,给查询指定返回记录的范围
7 \3 `4 T* R ~4 rC.如果可能,添加where条件
0 G6 H0 q" b/ d+ [" B& S& x) c+ mD.如果DBMS允许,把查询转换成视图7 L! {9 x' Y+ F: r& q4 J6 L' Z
E.如果DBMS允许,使用事先准备好的语句
. s& F* r6 g9 G8 i0 x
+ T9 H2 s+ ~5 s$ X1 m2 c
! \9 ^1 ~6 J* i7 k9 V' j$ F2.可以用添加______条件的方式对查询返回的数据集进行过滤?
* B9 ~& V4 O" I% p2 A" j" D; f1 U3 y- k
答案:____________5 A- ~" d: A: \1 I6 K
2 o1 D" {/ Z/ O+ J7 `
& i- C+ a) S; t3.内关联(inner join)是用来做什么的?
+ V1 F6 ?0 B# r
! F8 c- f6 M# Z a$ t8 GA.把两个表通过相同字段关联入一张持久的表中
5 X8 l6 _% p& v4 ]6 _ D/ @! S6 CB.创建基于两个表中相同相同行的结果集
* C8 \* _7 p" v, a" K" QC.创建基于一个表中的记录的数据集8 U2 \2 n3 z9 w2 C0 M7 ?/ A
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
7 t; F0 q; `6 ^" h) T3 `" ~; V& tE.以上都不对
! i5 S% I1 i0 _+ m8 M( i8 H6 T7 r2 Q" V& E* K, p; O
2 ?4 T, g% a0 O; [* }. ]4.以下哪个DBMS没有PHP扩展库?7 Q1 W+ R# E r' c0 o
8 r5 d5 k$ O7 h( L7 v* ?+ sA.MySQL
. y; A9 J4 a7 v+ rB.IBM DB/2
K% V4 D# t' CC.PostgreSQL3 p! C2 ?8 p2 b) t4 Q
D.Microsoft SQL Server
$ O* ? t' S1 o8 c4 ]7 sE.以上都不对
3 p) w6 y! P, c0 T8 A
+ M% |9 c& r7 D1 b9 ^8 R$ `5 n5 l) j( y7 a0 W3 j3 U
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
) s$ E [0 U1 j! v
/ k1 i3 C. [6 ~2 C<?php
7 q# l" H3 @' Y5 d" L$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
8 M' [* e/ ]9 c( g?>8 E8 ^: |& T9 Z0 | z7 B d2 O
9 O5 w# l* k- f' y
A.MYTABLE表中的记录超过1条2 C1 L: R+ |" M
B.用户输入的数据需要经过适当的转义和过滤, e0 q( m9 u" R8 u/ j
C.调用该函数将产生一个包含了其他记录条数的记录6 ?/ Z9 l9 w2 I6 k! W6 i3 ?7 _ ^
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除. G( N1 Y) O: v
E.查询语句中应该包含数据库名
) x$ u" ]) Z, \+ y" ]$ X; ]3 c# u% V6 J6 ]+ O
' I% ?! v; D9 u# F5 |* @& U0 A, L6.______语句能用来向已存在的表中添加新的记录。
0 [+ W6 C9 _8 ~ ~' ?+ H; y5 t8 ~! b0 n1 q0 ~" P, {
答案:____________
; M* H2 t- E' \' L5 T$ ]6 c: |; }0 ]
5 K+ E1 ~$ _: |
7.以下哪个说法正确?/ c$ v1 i5 @5 I! H2 ?3 V( S
- F# Y: d3 d! s. T; sA.使用索引能加快插入数据的速度2 a1 u' x7 k$ U# K- P. i! a
B.良好的索引策略有助于防止跨站攻击
6 \+ g2 r) O( [; T' tC.应当根据数据库的实际应用按理设计索引+ ?" f) I7 l- h) ]4 L+ R8 [: p+ j
D.删除一条记录将导致整个表的索引被破坏' {7 c' D( K" f. m2 m
E.只有数字记录行需要索引
8 z# u, B$ L' ]( ` \1 k8 J' W ?
9 I* c* k% z- x2 A& b+ Z1 @! [7 H) h/ h5 q/ t5 X
8.join能否被嵌套?
0 h& v L8 y3 t: _* ?' V2 @/ x0 X5 ~9 `+ w) |3 l8 k. L! u { } C
A.能
: S5 w/ Q9 x: i! X6 D5 }B.不能
. N9 X: {, O9 Y8 X: P$ |, M8 R$ U K( e/ Q! t
0 k- Z# O: b! i: h* _& ?9.考虑如下数据表和查询。如何添加索引能提高查询速度?1 y" H0 W% @: a! ~; Q% M. x: t6 g' M
' i5 K$ l5 z j7 }CREATE TABLE MYTABLE (
2 M U& m" m$ p# aID INT," `# @8 ~3 ?) Y3 O( Z" W4 ~
NAME VARCHAR (100),% E+ T6 t1 D5 A
ADDRESS1 VARCHAR (100),
! A! Z" [! b, g9 UADDRESS2 VARCHAR (100),, u. h2 H) m E( _
ZIPCODE VARCHAR (10),
. J9 B: f" y' K5 K7 b+ fCITY VARCHAR (50),4 `- a+ \6 H) j
PROVINCE VARCHAR (2): H% j3 c' Y. j$ k
) V ~9 ] E3 k
SELECT ID, VARCHAR
- ?$ C1 k& c/ g! }& u" pFROM MYTABLE6 v. H1 A k V9 A
WHERE ID BETWEEN 0 AND 100
: ^2 z! c* H3 b3 CORDER BY NAME, ZIPCODE" f$ ? \2 o R( Y/ q5 D; S
0 s! e( x: g& J5 }A.给ID添加索引% l% s9 [, C, K& k
B.给NAME和ADDRESS1添加索引
* m' a; ~8 d/ S/ [C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引) I& n9 b0 t. W$ D. F8 @
D.给ZIPCODE和NAME添加索引
4 [; y; T' s2 b* w- x( V+ XE.给ZIPCODE添加全文检索% y$ [4 z7 h* \$ H# I, E
, a8 c+ L2 h! x ?
6 V' U G; p: w10.执行以下SQL语句后将发生什么?
0 \5 G* ^9 \$ |1 _- a; s) \- }6 |* g8 v2 Q: C
BEGIN TRANSACTION
% T3 [8 D& C! d% [& UDELETE FROM MYTABLE WHERE ID=19 G/ e) w7 K: Z7 O/ Z( j
DELETE FROM OTHERTABLE# `& L9 y+ D- U8 J
ROLLBACK TRANSACTION. F* N2 L* d6 i& n* \
: ^! f# n; A+ V6 B3 E2 o
A.OTHERTABLE中的内容将被删除2 N+ ?. C/ k0 P
B.OTHERTABLE和MYTABLE中的内容都会被删除) H9 y9 I( \5 `2 D8 I
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
$ M8 \; `0 t y" V$ dD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化! ]3 Q B; B! q8 [( F s
E.数据库没用变化7 Z$ J8 o3 Y z
+ ?% b- g5 v7 \+ @7 n
$ Y' c( o8 P1 h; x11.DESC在这个查询中起什么作用?9 `: h8 g. S+ ^0 `7 W* E' X' V+ M
V9 z+ H# j& d8 A% _1 U& x4 h
SELECT *4 g8 Z7 x2 I# O0 x9 @
FROM MY_TABLE
) e7 C, M8 }8 U1 a/ q" N2 }; a! EWHERE ID > 0
8 D- c( ~" V0 u) E0 Z+ a# ~ORDER BY ID, NAME DESC
( g9 K) S7 C% |8 W, p/ X$ c
' O9 F+ `& v; R) I. h9 eA.返回的数据集倒序排列* k7 w4 K+ q0 l$ M( U5 x: T
B.ID相同的记录按NAME升序排列" _! l/ X) c. ]! K* {2 G
C.ID相同的记录按NAME倒序排列/ ?& {4 i5 T9 L4 r: }1 j
D.返回的记录先按NAME排序,再安ID排序
0 D" O p z% t/ X9 JE.结果集中包含对NAME字段的描述: {1 H' H/ c3 O+ G; n
! D2 T3 b- N5 g, m
! D5 u, \' }( E6 ^
12.以下哪个不是SQL函数?
4 }' H0 [% j( `. I8 F1 z* U# b5 d& C% s4 J
A.AVG' ]* ?: D7 L; C2 F! n
B.SUM
* ~6 k/ D& }4 K n' \" }3 R0 f7 KC.MIN4 i' E% k$ o. R* @! J
D.MAX
3 G' Z% Z$ ?& z8 t5 v8 o2 hE.CURRENT_DATE()$ n2 H' ~' F$ w, R6 Z# r
( C* X2 o$ m% e% O
& r7 U% [. u* G; X6 u13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
$ w' N" a1 u3 `6 m' K0 v7 ?/ H }& T* f2 q5 h7 T& y
A.该字段必须有索引 V, \( ]8 c" L! }& N" }" K }
B.该字段必须包括在GROUP BY条件中
0 e/ l( E: v+ a0 h# g8 o: S5 IC.该字段必须包含一个累积值
7 @ `4 i/ A9 E3 E& i: s9 bD.该字段必须是主键* P [+ p9 O' b+ }
E.该字段必须不能包含NULL值) ]" Z, Z$ f- g6 T( ^( I2 K* r9 z
- e% r8 z$ @/ E7 M) v }/ |' j. R& U# ~$ J! G2 P1 W
14.以下查询输出什么?
\" Y( b$ i, W# L, f5 @4 q3 D$ b, a
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE28 u, u$ Q* c& c7 f" k
ON TABLE1.ID <> TABLE2.ID
5 h5 \& \' `0 n: S7 {/ l+ O; U/ j; w" g+ C j
A.TABLE1和TABLE2不相同的记录/ W' I( ?9 x2 h# N
B.两个表中相同的记录
3 c# B% I1 X5 {: b) W0 _# [4 T" g! ~( gC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
U4 r1 s) `2 g3 {/ Z( E1 _D.两表中不同记录的条数: x, C$ C3 n/ y( N1 j+ {
E.数字2
- j) ]6 @% K/ ]- [" W0 r$ e% e' n, Q0 n, r$ h3 a
" C- r. [# ^: N. A) n7 G6 C15.______能保证一组SQL语句不受干扰的运行?
" U x8 @2 {+ r& R( H' h) D1 j4 ]6 G- }+ x
答案:____________
0 m+ s; q9 _/ t$ S, r0 f$ h
$ K1 m ?( O4 A" ^
( G6 C% V+ T0 Q9 j" u+ k' i2 ]' c2 y* F7 Y6 S% @, p2 b$ U, I- a- ^3 r
答案速查! t. n' J" ]" h4 F' t+ |3 G, M0 x% T
1:BC& c' Q2 K+ W+ Z* K$ \+ N- U! |: A7 Q
2:WHERE
% x# ?2 p& N# h- e# N7 {2 i, A/ I( ?3:B
" g: L7 f. G, _$ Q: l4:E
+ F3 v$ ?/ X7 A, T2 X U' A5:BD
( N% K l2 y+ F8 Q' k9 y( n S3 d }* H6:INSERT
/ i9 \& `& T# i/ W: o o7:C
' l/ I* K0 A3 J) s, S, ^8:A
$ [8 t9 V# w1 I$ z) Z' ]9:C
7 F/ K, `" n) u: Z2 i# h; d10:E$ Q9 S* P& G1 |
11:C f+ l1 w8 v; A% m# A4 {8 x
12:E F6 R6 A# K& v: V! O5 U
13:BC
0 M$ }1 Q/ J- Y14:C
6 h9 _3 h6 b! T- B6 w( l/ i5 Y- r15:事务& H n! n g9 `+ X% A) H8 o. h
4 m' b4 o1 E, H9 m! l
' k/ Z1 c {) i# x8 Q8 Y8 ^) F9 ~ w7 G' `5 [& o
答案详解! t V% D: a3 r0 ?0 ^
( Y5 Q$ b k3 w( o/ i! f1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。) g% h' V1 v7 ?5 } O# {! j' u$ x
& I0 {. o, O1 B3 L" ?0 G
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。! J: O4 }! D4 v( e! P9 O! r& y
+ d3 Z2 k' E- Z. k4 h# G7 d3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。% F: g& e' j' P2 B9 [
: ^5 z: j* J# K% @5 P! t" P) f3 L
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。- R; S3 t @( w) V
% T+ B4 `/ s2 l: g* T3 q
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。" G; k) H) S# w+ j! j0 m
! ^7 t" G6 E# r6.答案显然是INSERT。, E3 N+ P& ^' i+ O, s1 w0 m
6 @" m4 w, T: s2 y. f. c$ s
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
5 J- r2 f1 k( ^$ D1 Q% v2 r4 j6 B( v1 t& R0 @1 q9 y. s
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。% W# l7 A& ^6 A2 J/ H
, w8 L4 z2 V, u9 G0 w: q9 S
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
& V% }. S3 s, i0 C8 l0 |* D9 A$ l- ?- w, J* W' y6 p% w' M& g- F7 X7 m7 E" P
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
: z" h. y" I* k. M. W: q
" }# Z& A* _) O% W11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
' R$ b# r, w; g* l5 M
, v8 m3 ?4 U' g5 s12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。8 p- Q3 F1 o9 ?
# f7 k" a8 i) A, L. \13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
0 L+ U$ g9 r9 y8 L. B
5 A% x9 j1 ~+ N# S, S14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
( R/ T e) v* x- y4 ]6 W# P2 x! B7 v1 E3 x2 O- M2 \
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。 |
|