MySQL IN运算符
简介:在本教程中,您将学习如何使用MySQL IN运算符来确定指定的值是否与列表或子查询中的任何值匹配。
MySQL IN运算符简介
IN运算符使您可以确定指定的值是否与一组值中的任何值匹配或由子查询返回。
以下说明了IN运算符的语法:
SELECT column1,column2,... FROM table_name WHERE (expr|column_1) IN ('value1','value2',...);
让我们更详细地检查查询:
在WHERE子句中使用带有IN运算符的列或表达式(expr)。
列表中的值用逗号(,)分隔。
如果column_1的值或expr表达式的结果等于列表中的任何值,则IN运算符将返回1,否则将返回0。
当列表中的值都是常量时,MySQL执行以下步骤:
首先,根据column_1的类型或expr表达式的结果评估值。
其次,对值进行排序。
第三,使用二进制搜索算法搜索值。
因此,将IN运算符与常量列表一起使用的查询的执行速度非常快。
请注意,如果expr或列表中的任何值为NULL,则IN运算符将返回NULL。
您可以将IN运算符与NOT运算符结合使用,以确定一个值是否与列表或子查询中的任何值都不匹配。
您还可以在其他语句的WHERE子句中使用IN运算符,例如UPDATE和DELETE。
MySQL IN运算子范例
让我们通过一些使用IN运算符的示例进行练习。
请参阅示例数据库中的以下office表:
如果要查找位于美国和法国的办公室,则可以使用IN运算符作为以下查询:
SELECT officeCode, city, phone, country FROM offices WHERE country IN ('USA' , 'France');
您可以使用OR运算符获得与以下查询相同的结果:
SELECT officeCode, city, phone FROM offices WHERE country = 'USA' OR country = 'France';
如果列表包含多个值,则需要使用多个OR运算符构造一个很长的语句。
因此,IN运算符使您可以缩短查询并使之更具可读性。
要获得不在美国和法国设有办事处的办事处,请在WHERE子句中使用NOT IN如下:
SELECT officeCode, city, phone FROM offices WHERE country NOT IN ('USA' , 'France');
将MySQL IN与子查询一起使用
IN运算符通常与子查询一起使用。
子查询不是提供文字值列表,而是从一个或多个表中获取值列表,并将其用作IN运算符的输入值。
让我们看一下示例数据库中的order和orderDetails表:
例如,如果要查找总值大于60,000的订单,请使用IN运算符,如以下查询所示:
SELECT orderNumber, customerNumber, status, shippedDate FROM orders WHERE orderNumber IN ( SELECT orderNumber FROM orderDetails GROUP BY orderNumber HAVING SUM(quantityOrdered * priceEach) > 60000 );
上面的整个查询可以分为两个单独的查询。
首先,子查询使用GROUP BY和HAVING子句返回值大于60,000的订单号列表:
SELECT orderNumber FROM orderDetails GROUP BY orderNumber HAVING SUM(quantityOrdered * priceEach) > 60000;
其次,外部查询使用WHERE子句中的IN运算符从订单表中获取数据:
SELECT orderNumber, customerNumber, status, shippedDate FROM orders WHERE orderNumber IN (10165,10287,10310);
在本教程中,您学习了如何使用MySQL IN运算符确定值是否与值列表中的任何值匹配。