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函数。