Skip to main content

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子查询的名称。

如果运算符的右侧是表的名称(例如, UserID IN users ),这相当于子查询 UserID IN (SELECT * FROM users) . 使用与查询一起发送的外部数据时,请使用此选项。 例如,查询可以与一组用户Id一起发送到 ‘users’ 应过滤的临时表。

如果运算符的右侧是具有Set引擎的表名(始终位于RAM中的准备好的数据集),则不会为每个查询重新创建数据集。

子查询可以指定多个用于筛选元组的列。 示例:

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

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

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