sql隐式连接_应该如何设计SQL GROUP BY –就像Neo4j的隐式GROUP BY

sql隐式连接

最近,我们已经解释了SQL GROUP BY子句的句法含义。 如果您还没有,请阅读我们的文章“ 您真的了解SQL的GROUP BY和HAVING子句吗? ”。

本质上,在查询中添加GROUP BY子句可以在非常隐含的级别上转换查询。 以下提醒总结了上一篇文章:

  • 只有GROUP BY子句中引用的列表达式或其他列表达式的集合才可以出现在SELECT子句中
  • 没有显式GROUP BY子句的聚合意味着“总计” GROUP BY ()子句
  • 某些数据库( 例如MySQL ,在某种程度上:SQL标准)不遵循这些规则,并且在SELECT子句中允许使用任意列表达式(或至少在功能上依赖于列的表达式)

还有另一种查看GROUP BY ,它已由Neo4j图数据库支持的同样引人入胜,美丽而怪异的Cypher查询语言 (那些是很好的属性)实现。 这种替代(但仍受SQL启发)查询语言可能值得单独撰写整个博客文章系列,但让我们关注聚合。 因为聚合是分组的主要用例。

快速总结以了解Cypher:

考虑以下简单的Cypher查询:

MATCH (me:Person)-->(friend:Person)
                 -->(friend_of_friend:Person)
WHERE me.name = 'A'
RETURN count(DISTINCT friend_of_friend), 
       count(friend_of_friend)

此外

  • 暗号
    (me:Person)-->(friend:Person)
               -->(friend_of_friend:Person)

    大致对应于SQL

    Person AS me 
    JOIN Person AS friend 
      ON [ implicit equi-join predicate ]
    JOIN Person as friend_of_friend
      ON [ implicit equi-join predicate ]

Cypher编写JOIN的方式实际上非常有用,也可以应用于SQL。 直到有人编写实现该语法的Cypher-to-SQL转换程序只是时间问题,至少是等效的ANSI等值连接表示法的语法糖。

让我们研究Cypher中的聚合

再次是查询:

MATCH (me:Person)-->(friend:Person)
                 -->(friend_of_friend:Person)
WHERE me.name = 'A'
RETURN count(DISTINCT friend_of_friend), 
       count(friend_of_friend)

因此,用SQL术语来说,这与以下内容完全相同:

SELECT count(DISTINCT friend_of_friend), 
       count(friend_of_friend)
FROM   [ Persons ... ]
WHERE  me.name = 'A'

换句话说,隐含相同的隐式总计GROUP BY () ,并且所有值都汇总到单个行中。

Neo4j文档下一个示例更有趣。 这将计算连接到name = 'A'的节点n的节点数:

MATCH (n { name: 'A' })-->(x)
RETURN n, count(*)

这是写的较短形式:

MATCH (n)-->(x)
WHERE n.name = 'A'
RETURN n, count(*)

此示例还将执行聚合,但是这次使用隐式GROUP BY n子句。 在SQL中,您将编写如下内容:

SELECT   n.id, count(*)
FROM     n
JOIN     x
  ON     [ implicit equi-join predicate ]
WHERE    n.name = 'A'
GROUP BY n.id

Cypher的GROUP BY n.id是隐含了明显的GROUP BY子句(只能是GROUP BY n.id )。 它不必显式编写。

SQL外卖

我们已经看到了一些不错的Cypher语言功能,尤其是编写“ JOIN”(或者说Neo4j中的图形遍历)的一种非常好的方法。 但是,要使它成为SQL标准的一个更明显的,容易实现的结果是使SQL GROUP BY子句成为可选的,并使用以下规则依赖SELECT子句:

  • 如果SELECT包含聚合函数,则不应包含隐含的GROUP BY子句
  • 如果SELECT包含1-N个聚合函数,则剩余的列应构成隐含的GROUP BY子句
  • 如果SELECT仅包含聚合函数,则应使用“总计” GROUP BY ()
  • 一个明确的GROUP BY子句将始终优先于任何隐含的GROUP BY子句

如果您有任何ISO / IEC委员会成员正在阅读此书,那么这是我希望用于将来SQL标准的清单。 还有,PostgreSQL。 立即实施。

喜欢这篇文章吗?

以下是有关SQL GROUP BY子句和聚合的更多信息:

翻译自: https://www.javacodegeeks.com/2015/05/how-sql-group-by-should-have-been-designed-like-neo4js-implicit-group-by.html

sql隐式连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值