7.1 列出SQL SELECT语句的功能
知道如何使用查询语言以设定的格式检索数据是理解SELECT语句的第一步。对所涉及关系的描述提供了说明数据如何存储在表中的理论和实际可视化的表结构之间的链接。这些主题是讨论SELECT语句功能的重要前提。这里主要讨论下面三个内容:
● SQL SELECT语句的介绍
● DESCRIBE表命令
● SELECT语句的功能
7.1.1 SQL SELECT语句的介绍
结构化查询语言(Structured Query Language, SQL)中的SELECT语句是一种最强大的非言语语言结构。它是一种优雅、灵活和高度可扩充的机制,可用来从数据库表中检索信息。如果不能查询数据库来回答各种有趣的问题,那么这个数据库就没有多大用处。例如,可能有一个数据库,它包含个人财务记录,例如银行账单、公共事业账单、薪水表。可以方便地查询数据库,获得过去6个月的电费账单列表,或者查询银行账单,获得过去某段时间向某个账户的付款列表。SELECT语句的优点在于其采用类似于英语的格式,可以让人们采用自然的方式向数据库询问问题。
7.1.2 DESCRIBE表命令
要得到寻求的答案,就必须提出正确的问题。理解关系表对于表达正确的问题至关重要。表的结构化描述对于确立可以对它提出什么问题非常有用。Oracle服务器在一组特殊的关系表(称为数据字典)中存储每个表的信息,目的就是为了管理它们。数据字典非常类似于通常的语言字典。它以集中、有序和结构化的格式存储数据库对象的定义。第2章详细讨论过数据字典。
在存储定义和表内容之间必须划清界限。表的定义包含一些信息,如表名、表所有者、组成它的列的细节以及它在磁盘上的物理存储大小。这些信息也称为元数据。而表的内容存储在行中,称为数据。
使用DESCRIBE命令在数据库中查询组成表的列,就可以获得表的结构元数据。该命令的语法的一般形式如下:
DESC[RIBE] <SCHEMA>.tablename
应系统地理解这个命令。DESCRIBE关键字可以缩写为DESC。所有表都属于一种模式或者所有者。如果描述的表属于已经连接的模式,就可以省略命令的<SCHEMA>部分。图7-1显示了在作为HR用户连接到数据库之后,如何使用DESCRIBE EMPLOYEES命令从SQL*Plus中描述EMPLOYEES表,以及如何使用简略表示法DESC HR.DEPARTMENTS描述DEPARTMENTS表。HR.前缀可以省略,因为DEPARTMENTS表属于HR模式。HR模式(以及其他所有模式)都能访问称为DUAL的特殊表,DUAL属于SYS模式。从结构上说,这个表可以使用下面的命令进行描述:DESCRIBE SYS.DUAL。
图7-1 描述EMPLOYEES表、DEPARTMENTS表和DUAL表
描述表会产生有趣并且有用的结果。可以知道能够选择表的哪些列,因为结果中提供了它们的名称。还可以知道包含在这些列中的数据的本质,因为提供了列的数据类型。第5章详细讨论了列的数据类型。
强制列(要求每行都必须保存数据)由“Null? ”列输出提供,这些输出来自包含值NOT NULL的DESCRIBE命令。在创建表时,要确保由NOT NULL约束限制的任何数据列都必须包含数据。重要的是,NULL对于Oracle服务器有特殊含义。NULL表示没有数据。空格不算NULL,因为它们在行中,并且有长度,虽然它们不可见。
7.1.3 SELECT语句的功能
关系数据库表构建在称为关系理论(relational theory)的数学基础之上。在这一理论中,关系(或者表)由称为关系代数(relational algebra)的形式语言进行运算。关系代数使用一些专门的术语:关系包含元组,而元组又有特性。在Oracle术语中,即表包含行,而行又有列。SQL是关系代数结构的商业解释。来自关系理论的三个概念——投影、选择和联接概括了SELECT语句的功能。
投影表示对从表中选择的列的限制。当从表中请求信息时,可以要求查看所有列。例如,可以使用简单的SELECT语句检索HR.DEPARTMENTS表中的所有数据。这一查询会返回表中存储的每个部门记录的DEPARTMENT_ID、DEPARTMENT_NAME、MANAGER_ID和LOCATION_ID信息。如果只需要包含DEPARTMENT_NAME列和MANAGER_ID列的列表,该怎么办呢?应该只请求表中的这两列。对列的这种限制称为投影。
选择表示对从表中选择的行的限制。通常不希望检索表的所有行。表可能包含许多行,选择提供了一种方式来限制返回的行,而不是请求所有行。也许要确定属于部门30的员工。使用选择就可以将结果集限制为那些DEPARTMENT_ID值为30的数据行。
联接作为一种关系概念,表示查询中表之间的交互。第三范式提出了一种概念,即使用主键和外键关系,将不同类型的数据分离到自治表中,以避免重复和维护异常,并关联相关数据。这些关系提供了联接表的机制。
假设需要检索Sales部门所有员工的电子邮件地址。EMAIL列属于EMPLOYEES表,而DEPARTMENT_NAME列属于DEPARTMENTS表。来自DEPARTMENTS表的投影和选择可以用来获得对应Sales部门的DEPARTMENT_ID值。EMPLOYEES表中匹配的行可以依据这个公共DEPARTMENT_ID值联接到DEPARTMENTS表,然后可以从该结果集中投影EMAIL列。
从数学上说,SQL SELECT语句由这三条原则控制。投影、选择和联接的无限组合可以让该语言提取所需的关系数据。
考点:
投影、选择和联接这三个概念是SELECT语句功能的基础,考试中总会考到它们。你可能会被要求选出这三个正确的基本概念,或者选择能够演示其中一个或者多个概念的语句。