MYSQL过滤数据(五)IN | BETWEEN AND

MySQL IN运算符简介

IN运算符允许你确定一个指定字段的值是否在给定列表或子查询中。下面是IN 运算符的语法:

SELECT 
    column1,column2,...
FROM
    table_name
WHERE 
 (expr|column_1) IN ('value1','value2',...);

让我们更详细地检查查询:

  • 您可以在WHERE子句中使用IN运算符。
  • 列表中的值必须用逗号(,)分隔。
  • IN运算符可以用于其他WHERE语句中,如update,delete等。

如果 column_1 或 expr 表达式的结果的值等于列表中的任何值,IN操作符返回1,否则返回0。


MySQL IN示例

我们练习一下使用IN操作符的例子。

MySQL IN示例

如果查找位于美国和法国的办事处,可以使用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运算符经常与子查询一起使用。子查询将查询结果值作为值列表

让我们来看看ordersorderDetails表:

带有子查询的MySQL IN

例如,如果你想要查询那些总金额大于60000的订单信息

SELECT 
    orderNumber, customerNumber, status, shippedDate
FROM
    orders
WHERE
    orderNumber IN (SELECT 
            orderNumber
        FROM
            orderDetails
        GROUP BY orderNumber
        HAVING SUM(quantityOrdered * priceEach) > 60000);

结果如下:

上述整个查询可被分解成 2 个查询。

首先,子查询使用GROUP BY和HAVING对 orderdetail 表排序并返回总额大于 60000 的订单编号列表。

SELECT 
    orderNumber
FROM
    orderDetails
GROUP BY orderNumber
HAVING SUM(quantityOrdered * priceEach) > 60000;

结果如下:


其次,主查询从orders表中获取数据,并在WHERE子句中使用 IN 运算符。

SELECT 
    orderNumber, customerNumber, status, shippedDate
FROM
    orders
WHERE
    orderNumber IN (10165,10287,10310);

结果如下:


MySQL BETWEEN运算符简介

BETWEEN AND判断某字段值是否在给定的范围内。我们经常在SELECT,INSERT,UPDATE和DELETE语句的WHERE子句中使用BETWEEN运算符。

下面说明了BETWEEN运算符的语法:

expr [NOT] BETWEEN begin_expr AND end_expr;

expr 是一个表达式,它用于测试值是否在定义的范围begin_expr 和 end_expr 之间。

expr, begin_expr和end_expr必须具有相同的数据类型。

如果 expr 的值大于或等于(>=)begin_expr 的值并且小于或等于(<=)end_expr 的值则返回 true,否则返回 0 。

在NOT BETWEEN运算符中,如果expr的值小于(<)begin_expr 表达式的值或大于 end_expr 的值则返回 true,否则返回 0 。

如果任何表达式为NULL,则BETWEEN运算符返回NULL值。

如果要指定排除范围,则使用大于(>)和小于(<)运算符。


MySQL BETWEEN与数字示例

请参阅示例数据库中的下products表:

MySQL BETWEEN AND示例

假设你想查找价格在90到100之间的产品,您可以使用BETWEEN运算符。如:

SELECT 
    productCode, productName, buyPrice
FROM
    products
WHERE
    buyPrice BETWEEN 90 AND 100;

结果如下:

您也可以使用大于或等于(>=)和小于或等于(<=)运算符实现相同的结果:

SELECT 
    productCode, productName, buyPrice
FROM
    products
WHERE
    buyPrice >= 90 AND buyPrice <= 100;

要查找购买价格不在20美元和100美元之间的产品,可以使用NOT BETWEEN AND :

SELECT 
    productCode, productName, buyPrice
FROM
    products
WHERE
    buyPrice NOT BETWEEN 20 AND 100;

结果如下:

以上sql语句也可以使用小于(>),大于(>)和逻辑运算符(AND)实现同样的查询结果, 如:

SELECT 
    productCode, productName, buyPrice
FROM
    products
WHERE
    buyPrice < 20 OR buyPrice > 100;

 

MySQL BETWEEN与日期示例

当使用带有日期值的BETWEEN运算符时,为了获得最佳结果,应使用类型强制转换将列或表达式的类型显式转换为DATE类型。

例如,要获取所需日期为01/01/2003至01/31/2003的订单,请使用以下查询:

SELECT orderNumber,
         requiredDate,
         status
FROM orders
WHERE requireddate
    BETWEEN CAST('2003-01-01' AS DATE)
        AND CAST('2003-01-31' AS DATE);

结果如下:

因为日期字段的数据类型是DATE,所以我们使用cast操作符将字符串“2003-01-01”和“2003-12-31”转换为DATE数据类型。


MySQL BETWEEN AND边界值问题分析

mysql的sql语句中可以使用between来限定一个数据的范围,例如:

select * from user where userId between 5 and 7;

查询userId为5、6,7的user,userId范围是包含边界值的,也等同如下查询:

select * from user where userId >= 5 and userId <= 7;

很多地方都提到between是给定的范围是大于等第一值,小于第二个值,其实这是不对的。此前我一直也是这么认为,通过实验,结论是包含两边的边界值,如果实在拿不准,可以采用>= 、<=的方式来指定条件。

另外 not  between的范围是不包含边界值


猜你喜欢

转载自blog.csdn.net/q343509740/article/details/80600792
今日推荐