CC00044.clickhouse——|Hadoop&OLAP_ClickHouse.V16|——|ClickHouse.v16|ClickHouse语法|Distinct|

本文探讨了ClickHouse的DISTINCT子句及其在大数据处理中的应用,同时对比了ClickHouse与Hadoop在OLAP场景下的性能差异。通过LIMIT操作,展示了ClickHouse在查询效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、DISTINCT子句
### --- Distingt子句

~~~     如果 SELECT DISTINCT 被声明,则查询结果中只保留唯一行。 
~~~     因此,在结果中所有完全匹配的行集合中,只有一行被保留。
~~~     # 空处理
~~~     DISTINCT 适用于 NULL 就好像 NULL 是一个特定的值,并且 NULL==NULL. 换句话说,
~~~     在 DISTINCT 结果,不同的组合 NULL 仅发生一次。 
~~~     它不同于 NULL 在大多数其他情况中的处理方式。

~~~     # 替代办法
~~~     通过应用可以获得相同的结果 GROUP BY 在同一组值指定为 SELECT 子句,
~~~     并且不使用任何聚合函数。 但与GROUP BY 有几个不同的地方:
~~~     DISTINCT 可以与 GROUP BY 一起使用.
~~~     当 ORDER BY 被省略并且 LIMIT 被定义时,在读取所需数量的不同行后立即停止运行。
~~~     数据块在处理时输出,而无需等待整个查询完成运行。
~~~     # 限制
~~~     DISTINCT 不支持当 SELECT 包含有数组的列。

~~~     # 例子
~~~     ClickHouse支持使用 DISTINCT 和 ORDER BY 在一个查询中的不同的列。 
~~~     DISTINCT 子句在 ORDER BY 子句前被执行。
### --- 示例表:

┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘
~~~     # 当执行 SELECT DISTINCT a FROM t1 ORDER BY b ASC 来查询数据,我们得到以下结果:

┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘
~~~     # 如果我们改变排序方向 SELECT DISTINCT a FROM t1 ORDER BY b DESC,我们得到以下结果:
~~~     行 2, 4 排序前被切割。
~~~     在编程查询时考虑这种实现特性。

┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘
二、LIMIT
### --- Limit

~~~     LIMIT m 允许选择结果中起始的 m 行。
~~~     LIMIT n, m 允许选择个 m 从跳过第一个结果后的行 n 行。 与 LIMIT m OFFSET n 语法是等效的。
~~~     n 和 m 必须是非负整数。
~~~     如果没有 ORDER BY 子句显式排序结果,结果的行选择可能是任意的和非确定性的。
~~~     LIMIT … WITH TIES 修饰符如果为 LIMIT n[,m] 设置了 WITH TIES ,
~~~     并且声明了 ORDER BY expr_list, you will get in result first n or n,
~~~     m rows and all rows with same ORDER BY fields values equal 
~~~     to row at position n for LIMIT n and m for LIMIT n,m.
~~~     此修饰符可以与: ORDER BY … WITH FILL modifier 组合使用.
### --- 例如以下查询:

hadoop01 :) SELECT * FROM (
            SELECT number%50 AS n FROM numbers(100)
            ) ORDER BY n LIMIT 0,5;
~~~输出参数
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
└───┘
~~~     # 单子执行了 WITH TIES 修饰符后
~~~     cause row number 6 have same value “2” for field n as row number 5

hadoop01 :) SELECT * FROM (
            SELECT number%50 AS n FROM numbers(100)
            ) ORDER BY n LIMIT 0,5 WITH TIES;
~~~输出参数
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值