SQL - SELECT语句



使用SQL SELECT语句检索数据

SQL是一种全面的数据库语言。SQL(发音为Sequel或简称S-Q-L)是一种计算机编程语言,用于以非过程方式查询关系数据库。当您使用SQL从数据库中提取信息时,这被称为查询数据库。

关系数据库是通过使用关系数据库管理系统(RDBMS)实现的。RDBMS执行上述DBMS软件的所有基本功能以及许多其他功能,这些功能使关系模型更容易理解和实现。RDBMS用户通过使用特殊的数据库操作语言来操作数据。数据库结构是通过使用数据定义语言定义的。系统用户为了存储和检索数据而执行的命令可以通过键入命令在带有RDBMS界面的终端输入,或者通过某种类型的图形界面输入。然后DBMS处理这些命令。

SELECT语句的功能

数据库中的数据检索是通过适当和有效地使用SQL完成的。关系理论中的三个概念包含了SELECT语句的功能:投影、选择和连接。

  • 投影:投影操作仅从表中选择某些列(字段)。结果表具有可用列的子集,可以包含从单个列到所有可用列的任何内容。

  • 选择:选择操作选择表(关系)中满足选择条件的行(记录)的子集。从完整结果集中选择行,称为选择。它涉及条件过滤和数据分段。子集的范围可以是从没有行(如果没有任何行满足选择条件)到表中的所有行。

  • 连接:连接操作基于一个或多个公共列值组合来自两个或多个表的数据。连接操作使用户能够处理表之间存在的关系。连接操作非常强大,因为它允许系统用户调查在设计数据库时可能无法预料到的数据元素之间的关系。

Joining scenario of EMPLOYEES and DEPARTMENTS table

考虑上述表结构。从EMPLOYEES表中为单个员工获取first_name名称、department_id和salary是投影。从EMPLOYEES表中获取工资低于5000的员工详细信息是选择。通过连接EMPLOYEES和DEPARTMENTS获取员工的first_name和部门名称是连接。

基本的SELECT语句

下面介绍了SELECT语句的基本语法。

SELECT  [DISTINCT | ALL] {* | select_list}
FROM {table_name [alias] | view_name} 
    [{table_name [alias]  | view_name}]...  
[WHERE  condition]
[GROUP BY  condition_list]
[HAVING  condition]
[ORDER BY  {column_name | column_#  [ ASC | DESC ] } ...

SELECT子句是必须的,它执行关系投影操作。

FROM子句也是必须的。它标识一个或多个表和/或视图,从中检索结果表中显示的列数据。

WHERE子句是可选的,它执行关系选择操作。它指定要选择的行。

GROUP BY子句是可选的。它根据SELECT子句中列出的一个或多个列名称将数据组织成组。

可选的HAVING子句设置有关结果表中要包含哪些组的条件。组由GROUP BY子句指定。

ORDER BY子句是可选的。它按升序或降序对查询结果进行排序。

SELECT语句中的算术表达式和NULL值

可以使用列名、运算符和常量值创建算术表达式,以将表达式嵌入SELECT语句中。适用于列的运算符取决于列的数据类型。例如,算术运算符不适用于字符文字值。例如,

SELECT employee_id, sal * 12 ANNUAL_SAL
FROM employees;

上述查询包含算术表达式(sal * 12)来计算每个员工的年薪。

算术运算符

运算符作用于列(称为操作数)以产生不同的结果。如果表达式中有多个运算符,则运算符优先级决定评估顺序。以下是优先级的基本规则:

  • 乘法和除法先于加法和减法。

  • 相同优先级的运算符从左到右计算。

  • 使用括号可以覆盖运算符的默认行为。

下表显示了这些情况下运算符的优先级,优先级级别运算符符号操作

Description   Operator	Precedence	   
Addition	+	Lowest	   
Subtraction	-	Lowest	   
Multiplication	*	Medium	   
Division	/	Medium	   
Brackets	( )	Highest	 

检查下面的查询 (a)、(b) 和 (c)

  • SQL> SELECT 2*35 FROM DUAL;
  • SQL> SELECT salary + 1500 FROM employees;
  • SQL> SELECT first_name, salary, salary + (commission_pct* salary) FROM employees;

查询 (a) 乘以两个数字,而 (b) 显示向所有员工的薪水中添加 1500 美元。查询 (c) 显示将佣金部分添加到员工薪水中。根据优先级,首先计算薪水的佣金,然后将其添加到薪水中。

列别名

别名用于在显示期间重命名列或表达式。列或表达式的别名作为查询输出中的标题出现。它有助于为SELECT查询中的长表达式提供有意义的标题。默认情况下,别名在查询输出中以大写形式显示,不包含空格。要覆盖此行为,必须将别名括在双引号中以保留别名名称的大小写和空格。

SELECT price * 2 as DOUBLE_PRICE, price * 10 "Double Price"
FROM products;

DOUBLE_PRICE	Double Price
------------	------------
39.9			39.9
60			60
51.98			51.98

连接运算符

连接运算符可用于在SELECT查询中连接两个字符串值或表达式。双竖线符号用作字符串连接运算符。它仅适用于字符和字符串列值,产生一个新的字符表达式。示例

SQL> SELECT 'ORACLE'||' CERTIFICATION' FROM dual;

上述查询显示了两个字符文字值的连接。

文字

SELECT子句中任何未存储在数据库中的硬编码值称为文字。它可以是数字、字符或日期值。字符和日期值必须用引号括起来。考虑下面的SQL查询。使用SQL查询中不同数据类型的文字的示例。

下面的查询使用两个字符文字将它们连接在一起。

SQL> SELECT 'ORACLE'||' CERTIFICATION' FROM DUAL

下面的查询使用字符文字来美化员工的工资。

SQL> SELECT first_name ||'earns'|| salary||' as of '|||sysdate
FROM employees

引号运算符

引号运算符用于指定您自己的引号分隔符。您可以根据数据选择方便的分隔符。

SELECT 	department_name|| ' Department' ||q'['s Manager Id: ]'|| manager_id
FROM departments;

NULL

如果列没有确定的值,则将其视为NULL。NULL值表示未知或不可用。对于数值而言,它不是零,对于字符值而言,它不是空格。

可以在SELECT查询中选择包含NULL值的列,并且可以作为算术表达式的部分。任何使用NULL值的算术表达式都会产生NULL。因此,必须通过使用Oracle提供的函数(如NVL或NULLIF)指定其备用值来以不同的方式处理包含NULL值的列。

SQL> SELECT NULL + 1000 NUM 
FROM DUAL;

NUM
--------

DISTINCT关键字

如果数据预计会有重复的结果,请使用DISTINCT关键字来消除重复项并在查询输出中仅显示唯一的结果。仅验证所选列的重复性,并且行将在逻辑上从查询输出中消除。需要注意的是,DISTINCT关键字必须出现在SELECT子句之后。

下面的简单查询演示了使用DISTINCT从EMPLOYEES表中显示唯一部门ID。

SQL> SELECT DISTINCT DEPARTMENT_ID 
FROM employees;

DEPARTMENT_ID
---------------
10
20
30
40

DESCRIBE命令

可以使用DESCRIBE命令查询数据库以获取组成它的列列表,从而获得表的结构元数据。它将列出使用的列名、它们的NULL属性和数据类型。

语法

DESC[RIBE] [SCHEMA].object name

例如,

DESC EMPLOYEE

将显示EMPLOYEE表结构,即列、它们的数据类型、精度和可为空属性。

广告