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
相关推荐
long3164 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
数据库小学妹5 小时前
数据库等保三级和四级有什么区别?从访问控制到备份恢复的完整对比
数据库·安全·数据库安全·三级等保·等保合规·四级等保
隔窗听雨眠6 小时前
AI重塑数据分析:从SQL执行者到智能基础设施构建者
人工智能·sql·数据分析
看浪的路人6 小时前
第3讲:手写第一个 MCP Server(Python SDK)
jvm·数据库·oracle
大眼、不聚光7 小时前
5.mysql--主从同步安装部署
数据库·mysql
Yan_chen6667 小时前
SQL-LABS_Less18-20实战攻略
数据库·sql·web安全·网络安全
oradh8 小时前
Oracle RAC OCR维护操作总结
数据库·oracle·ocr·rac ocr维护·ocr维护·vote disk
snow@li8 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
一个天蝎座的程序猿9 小时前
传统数据库迁金仓KES,空值问题差点让财务报表翻车
数据库
wWYy.9 小时前
Mysql:索引下推
数据库·mysql