SQL 使用 SELECT 语句查询数据,本文比较五种主流数据库基本数据检索功能的实现和差异,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。
️示例表和数据初始化脚本下载。
SQL功能 | MySQL | Oracle | SQL Server | PostgreSQL | SQLite |
---|---|---|---|---|---|
查询指定字段 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
查询全部字段 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
无表查询 | ✔️ | ✔️* | ✔️ | ✔️ | ✔️ |
备注:Oracle 23c 开始支持无表查询语句。
员工表(employee)中存储了关于员工的信息。假设我们现在打算群发邮件,需要找出所有员工的姓名、性别和电子邮箱地址。这个功能可以通过一个简单的查询语句来实现:
SELECT emp_name, sex, email
FROM employee;
其中 SELECT 是 SQL 中的关键字,表示查询数据;FROM 也是关键字,表示要从哪个表中进行查询;emp_name、sex 和 email 表示需要返回的字段,多个字段使用逗号分隔;分号表示 SQL 语句的结束。查询返回的结果如下:
emp_name|sex|email
--------|---|------------------------
刘备 |男 |liubei@shuguo.com
关羽 |男 |guanyu@shuguo.com
张飞 |男 |zhangfei@shuguo.com
...
以上语法在五种数据库中实现相同。
⚠️注意:SQL 语句由不同的子句组成部分,SELECT、FROM 和 WHERE 等关键字都是子句。编写 SQL 语句时,关键字不分区大小写,一般使用大写形式。表名、列名等标识符一般也不区分大小写,通常使用小写形式;但是 MySQL 在 Linux 环境下的数据库名、表名、变量名等区分大小写。
一个特殊的查询操作就是查询表的全部字段。SQL 为此提供了一个简单写法,就是使用星号(*)表示全部字段。例如,以下语句查询职位信息表中的全部字段:
SELECT *
FROM job;
数据库服务器在解析该语句时,会基于表的字段定义将其扩展为如下形式:
SELECT job_id, job_title, min_salary, max_salary
FROM job;
查询返回的结果如下:
job_id|job_title |min_salary|max_salary
------|----------|----------|----------
1|总经理 | 24000.00| 50000.00
2|副总经理 | 20000.00| 30000.00
3|人力资源总监| 20000.00| 30000.00
...
使用星号无法指定字段出现的顺序,由数据库按照表定义时的顺序返回结果。
以上语法在五种数据库中实现相同。
⚠️注意:虽然使用星号可以快速编写查询语句,但是在实际项目中不推荐使用这种写法。因为应用程序可能并不需要全部字段,星号会返回无用的字段;另外,当表结构发生变化时,星号返回的信息也会发生改。
通常来说查询操作的对象是表,但是为了执行简单的计算和快速信息检索,许多数据库管理系统都实现了一种不需要表的查询语句,例如:
SELECT 1+1;
以上查询语句中只有 SELECT 子句,没有 FROM 子句。这种语法并不属于 SQL 标准,而是数据库管理系统的扩展功能。查询返回了一个算术表达式的值:
1+1
---
2
五种数据库都支持这种语法。其中 Oracle 23c 才开始支持,在之前的 Oracle 版本中,我们可以使用以下等价的查询语句:
SELECT 1+1
FROM dual;
其中,dual 是 Oracle 数据库中的一个特殊的表,它只有一个字段并且只包含一行数据。另外,MySQL 也提供了 dual 表。