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
相关推荐
Polar__Star1 小时前
如何结合计划任务实现自动定时备份任务配置_全自动化运维管理
jvm·数据库·python
weixin_580614006 小时前
如何提取SQL日期中的年份_使用YEAR或EXTRACT函数
jvm·数据库·python
2301_813599556 小时前
SQL生产环境规范_数据库使用最佳实践
jvm·数据库·python
a9511416427 小时前
Go 中通过 channel 传递切片时的数据竞争与深拷贝解决方案
jvm·数据库·python
qq_189807037 小时前
如何修改RAC数据库名_NID工具在集群环境下的改名步骤
jvm·数据库·python
aXin_ya7 小时前
Redis 高级篇(最佳实践)
数据库·redis·缓存
zhangchaoxies7 小时前
如何检测SQL注入风险_利用模糊测试技术发现漏洞
jvm·数据库·python
zhangchaoxies8 小时前
CSS如何实现响应式弹性网格布局_配合media query修改flex-wrap属性
jvm·数据库·python
霖霖总总8 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
Polar__Star9 小时前
C#怎么操作Chart图表控件 C#如何用WinForms Chart控件绑定数据绘制统计图表【控件】
jvm·数据库·python