Mysql 温故知新系列「where 子查询」

「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战

本章主要介绍基本的 where 子查询,学会如何使用基本的比较操作符,以及如何应对日常中最常见的查询需求

where 查询

上一篇文章介绍了基础的查询+排序,这一种是查出来全部数据。有时候我们需要用一些条件来对数据做过滤,这里需要使用关键字 where

where 的条件查询中,我们一般会使用到如下比较符:

  • >,匹配字段里大于某个值的全部记录
  • <,匹配小于某个值的记录
  • =,精准匹配值相等的记录,常见于 id 查询
  • <> 或 !=,判断为不等于某个值的记录
  • between..and.. 判断字段的值位于某个区间,可以拆分为两个条件组合判断,即 column>? and column<?
  • and 多个条件组合判断
  • or 多个条件或判断
  • in 判断字段的值是否位于某个集合中 这个集合通常会有多个候选值
  • is null 判断字段为空
  • is not null 判断值非空

需要 null 判断,是因为我们在建表的时候,有的字段允许为空,且未设计默认值,故此类型的字段则默认未 null

这里列举常见条件查询

根据指定字段查询

以我们最常使用的 id 字段为例

1
sql复制代码select * from rfid_info where id=?

因为 id 在表设计时通常作为主键,上述的操作会查询出唯一的一条记录。有时我们需要多个字段进行筛选,如下 sql

1
2
3
4
5
6
sql复制代码-- 1
select * from rfid_info where type=? and code>? or status=?
-- 2
select * from rfid_info where type=? and (code>? or status=?)
-- 3
select * from rfid_info where (type=? and code>?) or status=?

强烈建议, and, or 两种操作符尽可能的不要同一级进行组合判断,这样的操作可能会匹配不到我们希望的结果。最佳实践是,根据语义,用 () 吧相关的条件包裹起来,这样会减少不必要的失误

根据 id 集合查询多个

我们可以在 java 中查询出全部数据,再使用 Stream.filter() 过滤出满足 id 的数据,但非常不推荐

推荐使用 in 在数据库层面上直接处理好数据进行返回。在 sql 拼接时,需要吧 id 的集合转化为 (1, 2, ...) 的格式,用小括号包裹,用 , 隔开

1
sql复制代码select * from rfid_info where id in (1,2,3)

范围筛选

我们可以使用 >, < 来判断日期类型数据的大小(对于字符串类型,mysql 中使用 ascll 码进行大小的比较)

1
sql复制代码select * from rfid_info where time>? and name<?

对于选取满足区间条件的 sql,可以使用 between 关键字

1
2
3
sql复制代码select * from rfid_info where time between ? and ?
-- 等效于用 大于,小于两个组合条件进行判断
select * from rfid_info where time > ? and time < ?

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%