文章目录
我们对于数据库中数据的常见操作,简单来说可以称为增删改查(CRUD,Create、Retrieve、Update、Delete)。其中,使用最多,也最复杂的功能当属数据查询。根据 SQL 标准,查询语句使用SELECT
关键字表示。
本文以及后续示例使用的表和数据来源于《SQL 从入门到出门 示例数据库》。
如果想要了解 SQL:2016(ISO/IEC 9075:2016)标准,以及六种主流数据库中的实现及差异,包括:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、Db2、SQLite,可以参考系列文章《SQL 从入门到出门》。
我们先从简单查询开始,来看一个示例。
SELECT first_name,
last_name
FROM employees;
基本上不用解释,我们都能知道以上查询语句将会返回员工表(employees)中的名(first_name)和姓(last_name )。
SELECT
后面是要返回的信息,比如字段名或表达式,多个值使用逗号分隔;FROM
表示要查询哪个表;分号表示查询语句结束。
SQL 语句不分区大小写,但是通常将关键字(
SELECT
、FROM
等)进行大写,其他内容使用小写,便于阅读。
如果想要查询某个表的全部字段,可以一一列出字段名称,也可以使用星号(*)表示:
SELECT *
FROM employees;
通常,我们只在快速查询时使用星号;在实际项目中,应该避免使用SELECT *
,因为应用程序可能并不需要全部的字段,而且表结构可能会发生改变,明确指定的字段名称可以减少不确定性。
有的时候,我们可能会遇到这样的查询语句:
SELECT 2 + 3;
也就是省略了FROM
子句的查询,这是 PostgreSQL 的扩展语法。这种查询通常用于返回系统信息,或者当作计算器使用。需要注意的是,并非所有的关系数据库都支持这种写法,因此它并不具有可移植性。
现实生活中,存在许多名字相同的人。在执行数据库查询时,也可能会返回重复的值,例如,以下语句查询员工表中的部门编号:
SELECT department_id
FROM employees;
department_id
---------------
90
90
90
100
100
100
100
100
100
...
(107 rows)
由于一个部门可以存在多个员工,查询结果中包含了大量重复的数据。如果想要知道员工表中存在多少个不同的部门编号,需要针对以上结果进行去重操作。SQL 提供了消除查询结果重复值的DISTINCT
关键字。例如:
SELECT DISTINCT department_id
FROM employees;
department_id
---------------
70
80
20
10
90
100
110
30
50
40
60
(12 rows)
查询结果只有不重复的 12 条数据。DISTINCT
也可以针对多个字段进行去重操作,例如:
SELECT DISTINCT first_name,
last_name
FROM employees;
表示查询姓和名组合不重复的数据。
SELECT ... FROM
返回表中的全部数据(DISTINCT
基于这些数据再进行处理),如果想要返回满足特定条件的结果,比如某个部门的员工,需要使用 SQL 中的条件过滤,即WHERE
子句。当然,这是下一篇的主题。
人生本来短暂,你又何必匆匆!点个赞再走吧!