# IN 操作符

IN, NOT IN, GLOBAL IN，和 GLOBAL NOT IN 运算符是单独考虑的，因为它们的功能相当丰富。

SELECT UserID IN (123, 456) FROM ...SELECT (CounterID, UserID) IN ((34, 123), (101500, 456)) FROM ...

SELECT (CounterID, UserID) IN (SELECT CounterID, UserID FROM ...) FROM ...

IN运算符左侧和右侧的列应具有相同的类型。

IN运算符和子查询可能出现在查询的任何部分，包括聚合函数和lambda函数。 示例:

SELECT    EventDate,    avg(UserID IN    (        SELECT UserID        FROM test.hits        WHERE EventDate = toDate('2014-03-17')    )) AS ratioFROM test.hitsGROUP BY EventDateORDER BY EventDate ASC
┌──EventDate─┬────ratio─┐│ 2014-03-17 │        1 ││ 2014-03-18 │ 0.807696 ││ 2014-03-19 │ 0.755406 ││ 2014-03-20 │ 0.723218 ││ 2014-03-21 │ 0.697021 ││ 2014-03-22 │ 0.647851 ││ 2014-03-23 │ 0.648416 │└────────────┴──────────┘

## 空处理​

┌─x─┬────y─┐│ 1 │ ᴺᵁᴸᴸ ││ 2 │    3 │└───┴──────┘

┌─x─┐│ 2 │└───┘

SELECT y IN (NULL, 3)FROM t_null
┌─in(y, tuple(NULL, 3))─┐│                     0 ││                     1 │└───────────────────────┘

## 分布式子查询​

"注意"

SELECT uniq(UserID) FROM distributed_table

SELECT uniq(UserID) FROM local_table

SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34)
• 计算两个网站的受众的交集。

SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34)

SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID = 34)

SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID = 34)

SELECT UserID FROM local_table WHERE CounterID = 34

SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID GLOBAL IN (SELECT UserID FROM distributed_table WHERE CounterID = 34)

SELECT UserID FROM distributed_table WHERE CounterID = 34

SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID GLOBAL IN _data1

1. 创建临时表时，数据不是唯一的。 要减少通过网络传输的数据量，请在子查询中指定DISTINCT。 （你不需要为正常人做这个。)
2. 临时表将被发送到所有远程服务器。 传输不考虑网络拓扑。 例如，如果10个远程服务器驻留在与请求者服务器非常远程的数据中心中，则数据将通过通道发送10次到远程数据中心。 使用GLOBAL IN时尽量避免使用大型数据集。
3. 将数据传输到远程服务器时，无法配置网络带宽限制。 您可能会使网络过载。
4. 尝试跨服务器分发数据，以便您不需要定期使用GLOBAL IN。
5. 如果您需要经常使用GLOBAL IN，请规划ClickHouse集群的位置，以便单个副本组驻留在不超过一个数据中心中，并且它们之间具有快速网络，以便可以完全在单个数据中心内处理查询。