注意: 本文案例采用 PostgreSQL 作为案例,与 MySQL 语法有些许不同。
目录
- [1. SQL 完整查询语句](#1. SQL 完整查询语句)
- [2. SQL 执行顺序](#2. SQL 执行顺序)
- [3. 案例](#3. 案例)
1. SQL 完整查询语句
sql
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查询的记录从哪条至哪条
2. SQL 执行顺序
- 先执行
from
、join
来确定表之间的连接关系,获取初步数据 where
初步筛选数据group by
分组- 各组分别执行
having
中的普通筛选或聚合函数筛选 - 将获取到的所有数据和
select
字段进行匹配(如果是聚合函数的查询结果,select 的查询结果会新增一条字段) - 查询结果去重
distinct
- 合并各组的查询结果,按照
order by
的条件进行排序 limit
对结果进行分页处理
3. 案例
-
表:
-
流程分析:
-
from
&join
确定要查哪些表sqlFROM "t_user" AS u INNER JOIN "t_salary" AS s ON u.uid = s.u_id
-
where
对数据进行初步筛选sqlWHERE s.salary > 7000
-
group by
对数据进行分组注意:
- group by 分组的是 where 初步筛选之后的数据
- group by 是根据某一项或多项对数据进行分组
- 由此,其他项的数据会被重合
- 所以,pg 会要求其他项数据 必须出现在 GROUP BY 子句中或者在聚合函数中使用,保证数据的真实性
sqlGROUP BY -- 因为 u.uid = s.u_id,所以只需要写一个 uid 就行 uid,"name", gend, s_id, salary
-
having
筛选数据注意:
- having 筛选的是分组(group by)后的数据
- having 的筛选条件可以是聚合函数,也可以是普通条件,但 where 不能用聚合函数
sqlHAVING gend = '男'
-
select distinct
匹配要返回的字段,并去重sqlSELECT DISTINCT u.uid "人员编号", "name" AS "姓名", gend AS "性别", s_id AS "薪资序列", sum(salary) "薪水"
-
order by
对要返回的数据进行排序注意:
- order by 的字段必须出现在 select 中
- desc------倒序排列,asc------顺序排列(默认)
sqlORDER BY SUM ( salary ) DESC
-
limit
分页显示最终的数据注意:
- pg 中 limit 的用法与 mysql 有所不同
- limit 1 (只写一个数字)代表要取出哪条数据,这里是取出第一条数据
- limit 2 offset 0 (写两个数字)第一个数字代表要取出第几条,第二个表示从哪里开始取,这里是从第一个数据开始取第二条数据
sqlLIMIT 1
sqlLIMIT 1 OFFSET 1
-