第1章 简单查询、限制性查询和 数据的排序 练习题和解答
1.ACCOUNT表包括了如下的列:
ACCOUNT_ID NEW_BALANCE PREV_BALANCE FINANCE_CHARGE
NUMBER(12) NUMBER(7,2) NUMBER(7,2) NUMBER(7,2)
如果要用最简单的方法显示ACCOUNT表中所有的记录,则应该使用以下哪个查询语句?
A.SELECT * FROM account; B.SELECT any FROM account; C.SELECT all FROM account;
D.SELECT account_id, new_balance, prev_balance ,finance_charge FROM account;
练习题解释:这一题主要是测试对*和投影操作的理解。在查询语句中*表示所有的列,只要理解了*的用法,就可以确定答案是选项A。而在Select列表中并未包括any和all,有关这一点可以参阅本章1.9节中Select语句的定义。由这个定义可知SELECT关键字之后可以跟*,也可以跟Select列表。这个列表可以是列名,也可以是表达式,但是并未包括any和all。
其实,选项D也可以获取与选项A完全相同的结果,但这一问题要求使用最简单的方法,显然选项A比选项D简单。如果没有选项A,选项D就是正确的答案了。
练习题的答案是:A。
2.TEACHER表包括了如下的列:
ID LAST_NAME FIRST_NAME SUBJECT_ID
NUMBER(9) Primary Key VARCHAR2(25) VARCHAR2(25) NUMBER(9)
如果要显示每位老师的全名,同时显示每位老师所负责教授的科目(subject)号,则应该使用以下哪个查询语句?
A.SELECT * FROM teacher;
B.SELECT last_name, subject_id FROM account;
Oracle数据库管理与开发习题集(适用于OCP认证) C.SELECT last_name, first_name FROM account;
D.SELECT last_name, first_name, subject_id FROM account;
练习题解释:这一题还是测试对*和投影操作的理解,只要理解了*的用法,就可以确定选项A不可能是正确答案,因为在这个查询结果中将包括ID列,而按照题目的要求,这一列是不应该显示的。所以答案只能是选项D,因为在选项B中缺少first_name列,而在选项C中缺少subject_id列。
练习题的答案是:D。
3.EMPLOYEES表包括了如下的列:
EMPLOYEE_ID LAST_NAME FIRST_NAME DEPARTMENT_ID POSITION MANAGER_ID SALARY
NUMBER VARCHAR2(25) VARCHAR2(25) NUMBER(3) VARCHAR2(30) NUMBER NUMBER(6,2)
Primary Key
如果使用了如下的查询语句,请问哪个选项是正确的?
SELECT DISTINCT department_id, manager_id FROM employees;
A.某一特定的部门号(DEPARTMENT_ID)只能显示一次
B.某一特定的经理号(MANAGER_ID)可能显示不止一次(多次) C.MANAGER_ID和DEPARTMENT_ID可能会显示不止一次
D.查询语句将失败,因为DISTINCT关键字只可以使用在单一列的SELECT列
表中
练习题解释:这一题主要是测试对本章1.8节DISTINCT运算符的理解。在本章的例1-20中,读者已经看到了DISTINCT可以作用于多列,而此时显示的结果为每一种列组合只显示一行。因此这一查询语句是MANAGER_ID和DEPARTMENT_ID的每种组合只显示一行(一次),而不是DEPARTMENT_ID只显示一次,所以选项A肯定是错的。而基于同样的理由,选项C也肯定是错的。由于DISTINCT关键字可以作用于多列,所以选项D的“DISTINCT关键字只可以使用在单一列的SELECT列表中”的这一陈述显然是站不住脚的,因此选项D也是错的。由于查询语句是MANAGER_ID和DEPARTMENT_ID的每种组合只显示一行(一次),所以经理号(MANAGER_ID)是可能会显示多次的,即选项B是正确答案。
练习题的答案是:B。
4.以下是表INVENTORY中的内容:
2
第1章 简单查询、限制性查询和数据的排序
如果使用如下的SQL语句查询这个库存(INVENTORY)表,哪一个值会第一个显示?
SELECT FROM WHERE ORDER BY
id_number inventory
price BETWEEN 5.00 AND 15.00 description, manufacturer_id;
A.25023 B.25026 C.32096 D.45025
练习题解释:这一题首先测试对WHERE子句中使用BETWEEN AND比较运算符(在本章 1.11节中)的理解,其次是测试对ORDER BY子句的理解。Oracle服务器将首先选择出价格(price)在5.00~15.00之间的所有记录,之后按照description和manufacturer_id组合按升序排序——首先按description以升序排序,当description相同时,再按manufacturer _id升序排序。由于在满足WHERE条件的记录中,Cable是description列中的最小值,而这个记录的ID_NUMBER是25023,所以选项A是正确的。要注意的是,在查询的这个表中只有一条记录的description列的值是Cable,所以已经没有必要再考虑manufacturer_id了,否则还要考虑manufacturer_id的排序顺序。
练习题的答案是:A。
5.在一个SELECT语句中,应该使用WHERE子句来完成以下的哪些工作? A.指定INVENTORY表的位置(地址)
B.将MANUFACTURER_ID 的值与897898进行比较 C.仅显示MANUFACTURER_ID的值 D.限制SUM(price)函数的输出
练习题解释:这一题主要测试对WHERE 子句用法的理解。在本章的1.10节中有关WHERE子句的解释是这样的:WHERE是关键字,其后跟限制条件;而条件是由列名、字符串、算术表达式、常量和比较运算符组成的。理解了这段解释就不难看出选项B是正确的。因为WHERE 子句无法指定一个表的位置,所以选项A肯定是错误的。WHERE 子句没法限定显示列表中的列,显示特定的列是投影操作(见本章的1.2节),是SELECT子句的工作,而WHERE 子句完成的是选择操作(见本章的1.10节),因此选项C不可能是正确答案。WHERE 子句不能限制分组函数,如SUM、AVG或MAX等,所以选项D
3