sql - 何时在(Postgre)SQL 语句中使用/不使用子句顺序
问题描述
(首先,我发誓我尝试搜索这个,甚至检查了 PostgreSQL 文档,但是该ORDER BY
子句的存在使得找到关于任何其他类型排序的答案变得困难。)
每个人都知道 SQL 语句有顺序,并且您将(例如)您的子句放在您的FROM
子句之后SELECT
。PostgreSQL SELECT 文档页面本身甚至按顺序列出了所有可能的 a子句SELECT
。
但是,我认为(也许这是基于其他 SQL 数据库?)子句的顺序只对程序员很重要,或者至少大部分只重要,而且数据库本身并不关心你是否把你放在你的LIMIT
前面ORDER BY
, 或相反亦然。
所以,一个简单的问题:子句顺序是否总是重要的,必须严格遵循 PostgreSQL 页面上的列表,还是子句顺序根本不重要(但如果你搞砸了,你的同事会觉得你很有趣),还是仅在某些时候才重要(如果是,那么它的“规则”是什么)?
解决方案
是的,SELECT
语句中子句的顺序很重要。
您链接到的文档以强制的特定顺序显示它们。这些子句中的每一个都是可选的,但如果它们在那里,它们必须以正确的顺序编写。
部分原因可能是 SQL 语言被建模为听起来像自然语言的想法,虽然它是语法上说
SELECT items FROM shelf WHERE level > 3;
说不合语法
SELECT items WHERE level > 3 FROM shelf;
当然 SQL 在自然语言意义上不是语法的,但我认为这是动机的一部分。
另请注意,(逻辑)执行顺序与语句的编写方式不同:
首先计算 CTE,然后是FROM
子句,然后WHERE
应用过滤器,GROUP BY
然后是HAVING
,然后是SELECT
列表,然后是窗口函数,然后ORDER BY
是 ,然后是OFFSET
和FETCH FIRST n ROWS ONLY
/ LIMIT
(我可能忘记了一些东西)。
推荐阅读
- postgresql - 我怎样才能将此sql转换为sequelize funciton
- css - 如何使三个图像内联显示?
- python-3.x - 如何在列表中找到素数最多的数字?
- reactjs - 如何缩小 SVG 元素联合的类型
- wordpress - 在短代码插件中注册时的 Wordpress AJAX 400
- javascript - 在数组中查找对象
- c - 如何使用 ICMPv6 套接字接收 vlan 标头/l2 标头
- java - 当方法在基类中并且测试方法类扩展它时,如何在 JUnit 中模拟方法调用?
- javascript - 未捕获的类型错误:google.script.run.doSomething 不是函数
- django - 自动字段列未显示在管理数据库中