SQL执行顺序

注意: 本文案例采用 PostgreSQL 作为案例,与 MySQL 语法有些许不同。

目录

  • 1. SQL 完整查询语句
  • 2. SQL 执行顺序
  • 3. 案例

1. 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}]; -- 指定查询的记录从哪条至哪条

SQL执行顺序_第1张图片SQL执行顺序_第2张图片

2. SQL 执行顺序

SQL执行顺序_第3张图片

  1. 先执行 fromjoin 来确定表之间的连接关系,获取初步数据
  2. where 初步筛选数据
  3. group by 分组
  4. 各组分别执行 having 中的普通筛选或聚合函数筛选
  5. 将获取到的所有数据和 select 字段进行匹配(如果是聚合函数的查询结果,select 的查询结果会新增一条字段)
  6. 查询结果去重 distinct
  7. 合并各组的查询结果,按照 order by 的条件进行排序
  8. limit 对结果进行分页处理

3. 案例

  • 表:
    SQL执行顺序_第4张图片SQL执行顺序_第5张图片

  • 流程分析:

    • from&join 确定要查哪些表

      FROM
              "t_user" AS u
              INNER JOIN "t_salary" AS s ON u.uid = s.u_id
      
      SQL执行顺序_第6张图片
    • where 对数据进行初步筛选

      WHERE
              s.salary > 7000
      
      SQL执行顺序_第7张图片
    • group by 对数据进行分组

      注意:

      • group by 分组的是 where 初步筛选之后的数据
      • group by 是根据某一项或多项对数据进行分组
      • 由此,其他项的数据会被重合
      • 所以,pg 会要求其他项数据 必须出现在 GROUP BY 子句中或者在聚合函数中使用,保证数据的真实性
      GROUP BY
              -- 因为 u.uid = s.u_id,所以只需要写一个 uid 就行
              uid,"name", gend, s_id, salary
      
      SQL执行顺序_第8张图片
    • having 筛选数据

      注意:

      • having 筛选的是分组(group by)后的数据
      • having 的筛选条件可以是聚合函数,也可以是普通条件,但 where 不能用聚合函数
      HAVING
              gend = '男'
      
      SQL执行顺序_第9张图片
    • select distinct 匹配要返回的字段,并去重

      SELECT DISTINCT
              u.uid "人员编号",
              "name" AS "姓名",
              gend AS "性别",
              s_id AS "薪资序列",
              sum(salary) "薪水"
      
      SQL执行顺序_第10张图片
    • order by 对要返回的数据进行排序

      注意:

      • order by 的字段必须出现在 select 中
      • desc——倒序排列,asc——顺序排列(默认)
      ORDER BY
              SUM ( salary ) DESC
      
      SQL执行顺序_第11张图片
    • limit 分页显示最终的数据

      注意:

      • pg 中 limit 的用法与 mysql 有所不同
      • limit 1 (只写一个数字)代表要取出哪条数据,这里是取出第一条数据
      • limit 2 offset 0 (写两个数字)第一个数字代表要取出第几条,第二个表示从哪里开始取,这里是从第一个数据开始取第二条数据
      LIMIT 1
      
      LIMIT 1 OFFSET 1
      

你可能感兴趣的:(数据库,sql,数据库)