SQL SELECT 语句
SQL SELECT 语句
使用 SQL Select 语句检索数据
SQL 是一种综合性的数据库语言。SQL,发音为 Sequel 或简称 SQL,是一种计算机编程语言,用于按照非过程方法查询关系数据库。当您使用 SQL 从数据库中提取信息时,这称为查询数据库。
关系数据库是通过使用关系数据库管理系统 (RDBMS) 实现的。RDBMS 执行上述 DBMS 软件的所有基本功能以及许多其他功能,这些功能使关系模型更易于理解和实现。RDBMS 用户通过使用特殊的数据操作语言来操作数据。数据库结构是通过使用数据定义语言来定义的。系统用户为存储和检索数据而执行的命令可以通过键入命令在具有 RDBMS 界面的终端输入,或者通过使用某种类型的图形界面输入。然后 DBMS 处理这些命令。
SELECT 语句的功能
从数据库中检索数据是通过适当和有效地使用 SQL 来完成的。关系理论中的三个概念包含 SELECT 语句的功能:投影、选择和连接。
-
投影:项目操作仅从表中选择某些列(字段)。结果表具有可用列的子集,可以包括从单个列到所有可用列的任何内容。
-
选择:选择操作选择表(关系)中满足选择条件的行(记录)的子集。从完整的结果集中选择行的能力称为选择。它涉及条件过滤和数据分段。子集的范围可以从没有行(如果没有行满足选择条件)到表中的所有行。
-
联接:联接操作基于一个或多个常见列值合并来自两个或多个表的数据。联接操作使信息系统用户能够处理表之间存在的关系。连接操作非常强大,因为它允许系统用户调查在设计数据库时可能没有预料到的数据元素之间的关系。
考虑上面的表结构。从 EMPLOYEES 表中获取单个员工的 first_name 名称、department_id 和薪水是 Projection。从 EMPLOYEES 表中获取工资低于 5000 的员工详细信息是 Selection。通过加入 EMPLOYEES 和 DEPARTMENTS 来获取员工的名字、部门名称正在加入。
基本的 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 子句中未存储在数据库中的任何硬编码值都称为 s Literal。它可以是数字、字符或日期值。字符和日期值必须用引号括起来。考虑以下 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 值表示未知或不可用。数值不是零,字符值不是空格。
可以在 SELECT 查询中选择具有 NULL 值的列,并且可以是算术表达式的一部分。任何使用 NULL 值的算术表达式都会导致 NULL。因此,必须通过使用 Oracle 提供的函数(如 NVL 或 NULLIF)指定其替代值来以不同方式处理具有 NULL 值的列。
SQL> SELECT NULL + 1000 NUM FROM DUAL; NUM --------
不同的关键字
如果预期数据有重复结果,使用 DISTINCT 关键字消除重复,只显示查询输出中唯一的结果。仅对选定的列进行重复验证,并且这些行将从查询输出中逻辑删除。需要注意的是,DISTINCT 关键字必须紧跟在 SELECT 子句之后。
下面的简单查询演示了如何使用 DISTINCT 显示 EMPLOYEES 表中的唯一部门 ID。
SQL> SELECT DISTINCT DEPARTMENT_ID FROM employees; DEPARTMENT_ID --------------- 10 20 30 40
描述命令
表的结构元数据可以通过使用 DESCRIBE 命令查询数据库中包含它的列的列表来获得。它将列出使用的列名、它们的空属性和数据类型。
句法:
DESC[RIBE] [SCHEMA].object name
例如,
DESC EMPLOYEE
将显示 EMPLOYEE 表结构,即列、它们的数据类型、精度和可为空属性。