SQL执行顺序

注意: 本文案例采用 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 执行顺序

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

3. 案例

  • 表:

  • 流程分析:

    • from&join 确定要查哪些表

      sql 复制代码
      FROM
              "t_user" AS u
              INNER JOIN "t_salary" AS s ON u.uid = s.u_id
    • where 对数据进行初步筛选

      sql 复制代码
      WHERE
              s.salary > 7000
    • group by 对数据进行分组

      注意:

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

      注意:

      • having 筛选的是分组(group by)后的数据
      • having 的筛选条件可以是聚合函数,也可以是普通条件,但 where 不能用聚合函数
      sql 复制代码
      HAVING
              gend = '男'
    • select distinct 匹配要返回的字段,并去重

      sql 复制代码
      SELECT DISTINCT
              u.uid "人员编号",
              "name" AS "姓名",
              gend AS "性别",
              s_id AS "薪资序列",
              sum(salary) "薪水"
    • order by 对要返回的数据进行排序

      注意:

      • order by 的字段必须出现在 select 中
      • desc------倒序排列,asc------顺序排列(默认)
      sql 复制代码
      ORDER BY
              SUM ( salary ) DESC
    • limit 分页显示最终的数据

      注意:

      • pg 中 limit 的用法与 mysql 有所不同
      • limit 1 (只写一个数字)代表要取出哪条数据,这里是取出第一条数据
      • limit 2 offset 0 (写两个数字)第一个数字代表要取出第几条,第二个表示从哪里开始取,这里是从第一个数据开始取第二条数据
      sql 复制代码
      LIMIT 1
      sql 复制代码
      LIMIT 1 OFFSET 1
相关推荐
islandzzzz33 分钟前
三表查询SQL怎么写?----小白初学+案例引入
数据库
卡布奇诺-海晨1 小时前
MySQL的MVCC机制
数据库·mysql
hao_wujing2 小时前
攻击模型的恶意行为检测
网络·数据库·php
秃头摸鱼侠3 小时前
MySQL查询语句(续)
数据库·mysql
MuYiLuck3 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机3 小时前
6. MySQL基本查询
数据库·mysql
qq_408413393 小时前
spark 执行 hive sql数据丢失
hive·sql·spark
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩4 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift