MySQL IN运算符

时间:2019-11-20 08:52:04  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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运算符确定值是否与值列表中的任何值匹配。