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
相关推荐
sdaxue.com1 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)2 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长2 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui12 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记2 小时前
MHA binlog server
数据库·mysql
lovelin+v175030409663 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
DT辰白4 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
2401_871213304 小时前
mysql高阶语句
数据库·mysql