MySQL 中 IN 和 BETWEEN 的高阶玩法与 SQL 案例

110 阅读5分钟

嘿,各位数据库的小伙伴们!今天咱要来扒一扒 MySQL 里的两个 “低调高手”——IN 和 BETWEEN。这俩家伙,看着好像挺简单,不就是用来筛选数据嘛。但要是你这么想,那可就图样图森破啦!它们可是有着高阶玩法,能让你的 SQL 技能瞬间 “高大上” 起来。

一、IN 操作符的高阶玩法

IN 操作符,平常大家用它,可能就是简单地判断某个字段是不是在一堆值里面。比如:

SELECT * FROM users WHERE age IN (18, 20, 22);

这就是最基础的用法,找出年龄是 18、20 或者 22 岁的用户。但高阶玩法可不局限于此哦!

1. IN 与子查询

想象一下,你有两个表,一个 orders 表记录了所有订单,另一个 customers 表记录了所有客户信息。现在你想找出那些下过订单的客户信息,咋整?这时候 IN 和子查询就派上用场啦!

SELECT * FROM customers WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);

这里面,子查询 SELECT DISTINCT customer_id FROM orders 先找出所有下过订单的客户 ID,然后外层查询通过 IN 操作符,从 customers 表中筛选出对应的客户信息。是不是感觉很巧妙?就像给 SQL 装上了 “透视眼”,能透过一张表看到另一张表的关联数据。

2. 否定形式 NOT IN

IN 还有个 “小老弟” 叫 NOT IN,它的作用和 IN 相反,是找出不在指定值范围内的数据。比如,你想找出年龄不在 18 到 30 岁之间的用户,就可以这么写:

SELECT * FROM users WHERE age NOT IN (SELECT age FROM users WHERE age BETWEEN 18 AND 30);

这里先通过子查询找出年龄在 18 到 30 岁之间的用户年龄,然后用 NOT IN 排除这些年龄,得到我们想要的结果。不过要注意哦,NOT IN 遇到 NULL 值的时候可能会有点 “小脾气”,结果可能不是你预期的,所以使用的时候要小心谨慎。

二、BETWEEN 操作符的高阶玩法

BETWEEN 操作符,一般用来判断某个字段的值是否在指定的范围内,包括边界值。常规用法就像这样:

SELECT * FROM products WHERE price BETWEEN 10 AND 100;

这是找出价格在 10 到 100 之间的产品。但它的高阶用法,能让你对数据筛选更加得心应手。

1. BETWEEN 与日期

在处理日期类型的数据时,BETWEEN 简直就是神器。假设你有一个 orders 表,里面有个 order_date 字段记录了订单日期,你想找出某个时间段内的订单,就可以这么写:

SELECT * FROM orders WHERE order_date BETWEEN '2023 - 01 - 01' AND '2023 - 01 - 31';

这样就能轻松找出 2023 年 1 月 1 日到 2023 年 1 月 31 日之间的所有订单。而且要注意,BETWEEN 对于日期的比较是精确到时分秒的哦,如果你的日期字段包含时间部分,一定要注意时间的准确性。

2. 非数值类型的 BETWEEN

BETWEEN 可不只是能用于数值和日期哦,对于字符串类型的数据,它也能发挥作用。比如说,你有一个 employees 表,里面有个 last_name 字段记录员工的姓氏,你想找出姓氏在字母 A 到 M 之间的员工,就可以这么写:

SELECT * FROM employees WHERE last_name BETWEEN 'A' AND 'M';

这里 BETWEEN 是按照字符的 ASCII 码值来进行比较的,所以可以实现这种字符串范围的筛选。是不是感觉打开了新世界的大门?

三、SQL 综合案例

光说不练假把式,下面咱来个综合案例,把 IN 和 BETWEEN 都用上,看看它们能碰撞出怎样的火花。

假设我们有三个表:students(学生表)、courses(课程表)和 enrollments(选课表)。students 表有 student_id、student_name 和 age 字段;courses 表有 course_id、course_name 和 credit 字段;enrollments 表有 student_id、course_id 和 score 字段。

现在我们要找出年龄在 18 到 22 岁之间,并且选了课程编号为 1、2、3 中任意一门课程,且成绩在 80 分以上的学生信息和对应的课程信息。SQL 语句如下:

SELECT s.student_name, c.course_name, e.score
FROM students s
JOIN enrollments e ON s.student_id = e.student_id
JOIN courses c ON e.course_id = c.course_id
WHERE s.age BETWEEN 18 AND 22
  AND e.course_id IN (1, 2, 3)
  AND e.score > 80;

这条 SQL 语句,先用 BETWEEN 筛选出年龄符合要求的学生,再用 IN 筛选出选了指定课程的记录,最后通过 score > 80 筛选出成绩符合要求的记录,并且通过 JOIN 操作把三个表关联起来,得到我们想要的综合信息。是不是很厉害?

四、总结

好啦,今天关于 MySQL 中 IN 和 BETWEEN 的高阶玩法以及 SQL 案例就讲到这里啦。这俩操作符就像数据库世界里的 “瑞士军刀”,掌握了它们的高阶用法,能让你在处理数据时更加游刃有余。希望大家在以后的数据库开发中,多多运用这些技巧,让自己的 SQL 代码更加简洁高效。

各位小伙伴如果在实际使用过程中有什么有趣的案例或者遇到什么问题,欢迎在评论区留言分享哦!咱们一起在数据库的海洋里 “乘风破浪”!