完整的SELECT查询
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …FROM mytableJOIN another_tableON mytable.column = another_table.columnWHERE constraint_expressionGROUP BY columnHAVING constraint_expressionORDER BY column ASC/DESCLIMIT count OFFSET count;
一个查询SQL的执行总是先从数据里按条件选出数据 , 然后对这些数据再次做一些整理处理 , 按要求返回成结果 , 让结果尽可能是简单直接的 。因为一个 查询SQL由很多部分组成 , 所以搞清楚这些部分的执行顺序还挺重要的 , 这有助于我们更深刻地理解SQL执行过程.
查询执行顺序1. FROM和 JOINsFROM 或 JOIN会第一个执行 , 确定一个整体的数据范围. 如果要JOIN不同表 , 可能会生成一个临时Table来用于 下面的过程 。总之第一步可以简单理解为确定一个数据源表(含临时表) 。
2. WHERE我们确定了数据来源 WHERE 语句就将在这个数据源中按要求进行数据筛选 , 并丢弃不符合要求的数据行 , 所有的筛选column属性 只能来自FROM圈定的表 。AS别名还不能在这个阶段使用 , 因为可能别名是一个还没执行的表达式 。
3. GROUP BY如果你用了 GROUP BY 分组 , 那GROUP BY 将对之前的数据进行分组 , 统计等 , 并将是结果集缩小为分组数 , 这意味着其他的数据在分组后丢弃 。
4. HAVING如果你用了 GROUP BY 分组, HAVING 会在分组完成后对结果集再次筛选 。AS别名也不能在这个阶段使用 。
5. SELECT确定结果之后 , SELECT用来对结果col简单筛选或计算 , 决定输出什么数据 。
6. DISTINCT【SQL 查询执行顺序】如果数据行有重复DISTINCT 将负责去重 。
7. ORDER BY在结果集确定的情况下 , ORDER BY 对结果做排序 。因为SELECT中的表达式已经执行完了 。此时可以用AS别名 。
8. LIMIT/ OFFSET最后 LIMIT 和 OFFSET 从排序的结果中截取部分数据 。
结论不是每一个SQL语句都要用到所有的句法 , 但灵活运用以上的句法组合和深刻理解SQL执行原理将能在SQL层面更好的解决数据问题 , 而不用把问题 都抛给程序逻辑 。
推荐阅读
- 数据库,MySQL,实战,优化,多表联合查询排序问题优化
- MySQL高级SQL语句
- SpringBoot通过JdbcTemplate操作MySQL数据库
- MySQL 团队开发规范,太详细了,建议收藏
- SQL去重的三种方法技巧 你知道吗
- 举报电话查询 大全?举报黄色信息有奖励吗
- 为什么百度站长平台关键词查询排名与实际搜索结果不符?
- 新手必须掌握的linux命令
- 为什么阿里巴巴强制不要在 foreach 里执行删除操作
- MySQL中如何生成连续的自然日