如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
问题
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)
SELECT * FROM MY_TABLE
A.如果可能,用把查询转换成存储例程
B.如果程序允许,给查询指定返回记录的范围
C.如果可能,添加where条件
D.如果DBMS允许,把查询转换成视图
E.如果DBMS允许,使用事先准备好的语句
2.可以用添加______条件的方式对查询返回的数据集进行过滤?
答案:____________
3.内关联(inner join)是用来做什么的?
A.把两个表通过相同字段关联入一张持久的表中
B.创建基于两个表中相同相同行的结果集
C.创建基于一个表中的记录的数据集
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
E.以上都不对
4.以下哪个DBMS没有PHP扩展库?
A.MySQL
B.IBM DB/2
C.PostgreSQL
D.Microsoft SQL Server
E.以上都不对
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
<?php
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
?>
A.MYTABLE表中的记录超过1条
B.用户输入的数据需要经过适当的转义和过滤
C.调用该函数将产生一个包含了其他记录条数的记录
D.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
E.查询语句中应该包含数据库名
6.______语句能用来向已存在的表中添加新的记录。
答案:____________
7.以下哪个说法正确?
A.使用索引能加快插入数据的速度
B.良好的索引策略有助于防止跨站攻击
C.应当根据数据库的实际应用按理设计索引
D.删除一条记录将导致整个表的索引被破坏
E.只有数字记录行需要索引
8.join能否被嵌套?
A.能
B.不能
9.考虑如下数据表和查询。如何添加索引能提高查询速度?
CREATE TABLE MYTABLE (
ID INT,
NAME VARCHAR (100),
ADDRESS1 VARCHAR (100),
ADDRESS2 VARCHAR (100),
ZIPCODE VARCHAR (10),
CITY VARCHAR (50),
PROVINCE VARCHAR (2)
)
SELECT ID, VARCHAR
FROM MYTABLE
WHERE ID BETWEEN 0 AND 100
ORDER BY NAME, ZIPCODE
A.给ID添加索引
B.给NAME和ADDRESS1添加索引
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引
D.给ZIPCODE和NAME添加索引
E.给ZIPCODE添加全文检索
10.执行以下SQL语句后将发生什么?
BEGIN TRANSACTION
DELETE FROM MYTABLE WHERE ID=1
DELETE FROM OTHERTABLE
ROLLBACK TRANSACTION
A.OTHERTABLE中的内容将被删除
B.OTHERTABLE和MYTABLE中的内容都会被删除
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
E.数据库没用变化
11.DESC在这个查询中起什么作用?
SELECT *
FROM MY_TABLE
WHERE ID > 0
ORDER BY ID, NAME DESC
A.返回的数据集倒序排列
B.ID相同的记录按NAME升序排列
C.ID相同的记录按NAME倒序排列
D.返回的记录先按NAME排序,再安ID排序
E.结果集中包含对NAME字段的描述
12.以下哪个不是SQL函数?
A.AVG
B.SUM
C.MIN
D.MAX
E.CURRENT_DATE()
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?
A.该字段必须有索引
B.该字段必须包括在GROUP BY条件中
C.该字段必须包含一个累积值
D.该字段必须是主键
E.该字段必须不能包含NULL值
14.以下查询输出什么?
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2
ON TABLE1.ID <> TABLE2.ID
A.TABLE1和TABLE2不相同的记录
B.两个表中相同的记录
C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
D.两表中不同记录的条数
E.数字2
15.______能保证一组SQL语句不受干扰的运行?
答案:____________
答案速查
1:BC
2:WHERE
3:B
4:E
5:BD
6:INSERT
7:C
8:A
9:C
10:E
11:C
12:E
13:BC
14:C
15:事务
答案详解
1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
6.答案显然是INSERT。
7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。
9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。
12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。