概述

在实际的业务场景应用中,我们经常要根据业务条件获取并筛选出我们的目标数据。这个过程我们称之为数据查询的过滤。而过滤过程使用的各种条件(比如日期时间、用户、状态)是我们获取精准数据的必要步骤,

这样才能得到我们期望的结果。所以本章我们来学习MySQL中查询过滤条件的各种用法。

关系运算

关系运算就是where语句后跟上一个或者n个条件,满足where后面条件的数据会被返回,反之不满足的就会被过滤掉。operators指的是运算符 ,有如下几种情况:

运算符 说明
= 等于
<> 或者 != 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于

关系运算基本的语法格式如下:

1 select cname1,cname2,... from tname where cname operators cval 

等于=

查询出 列和后面的值严格相等的数据,非值类型的需要对后面值加上引号,值类型的不需要。

语法格式如下:

1 select cname1,cname2,... from tname where cname = cval; 
 1 mysql> select * from user2;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 +----+-------+-----+----------+-----+
9 3 rows in set
10
11 mysql> select * from user2 where name='helen';
12 +----+-------+-----+----------+-----+
13 | id | name | age | address | sex |
14 +----+-------+-----+----------+-----+
15 | 2 | helen | 20 | quanzhou | 0 |
16 +----+-------+-----+----------+-----+
17 1 row in set
18
19 mysql> select * from user2 where age=21;
20 +----+-------+-----+---------+-----+
21 | id | name | age | address | sex |
22 +----+-------+-----+---------+-----+
23 | 1 | brand | 21 | fuzhou | 1 |
24 | 3 | sol | 21 | xiamen | 0 |
25 +----+-------+-----+---------+-----+
26 2 rows in set

不等于(<>、!=)

不等于有两种写法,一种是<>,另一种是!=,意思一样,可随意切换使用,但是 <> 先于 != 出现,所以看很多以前的例子,<> 出现频率比较高,可移植性更强,推荐使用。

不等于的目的是查询出与条件不符和结果,格式如下:

select cname1,cname2,... from tname where cname <> cval;

select cname1,cname2,... from tname where cname != cval;
 1 mysql> select * from  user2;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 +----+-------+-----+----------+-----+
9 3 rows in set
10
11 mysql> select * from user2 where age<>20;
12 +----+-------+-----+---------+-----+
13 | id | name | age | address | sex |
14 +----+-------+-----+---------+-----+
15 | 1 | brand | 21 | fuzhou | 1 |
16 | 3 | sol | 21 | xiamen | 0 |
17 +----+-------+-----+---------+-----+
18 2 rows in set 

大于小于(> <)

一般用于数值或者日期、时间类型的比较,格式如下:

1 select cname1,cname2,... from tname where cname > cval;
2
3 select cname1,cname2,... from tname where cname < cval;
4
5 select cname1,cname2,... from tname where cname >= cval;
6
7 select cname1,cname2,... from tname where cname <= cval;
 1 mysql> select * from  user2 where age>20;
2 +----+-------+-----+---------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+---------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 3 | sol | 21 | xiamen | 0 |
7 +----+-------+-----+---------+-----+
8 2 rows in set
9
10 mysql> select * from user2 where age>=20;
11 +----+-------+-----+----------+-----+
12 | id | name | age | address | sex |
13 +----+-------+-----+----------+-----+
14 | 1 | brand | 21 | fuzhou | 1 |
15 | 2 | helen | 20 | quanzhou | 0 |
16 | 3 | sol | 21 | xiamen | 0 |
17 +----+-------+-----+----------+-----+
18 3 rows in set
19
20 mysql> select * from user2 where age<21;
21 +----+-------+-----+----------+-----+
22 | id | name | age | address | sex |
23 +----+-------+-----+----------+-----+
24 | 2 | helen | 20 | quanzhou | 0 |
25 +----+-------+-----+----------+-----+
26 1 row in set
27
28 mysql> select * from user2 where age<=21;
29 +----+-------+-----+----------+-----+
30 | id | name | age | address | sex |
31 +----+-------+-----+----------+-----+
32 | 1 | brand | 21 | fuzhou | 1 |
33 | 2 | helen | 20 | quanzhou | 0 |
34 | 3 | sol | 21 | xiamen | 0 |
35 +----+-------+-----+----------+-----+
36 3 rows in set

逻辑运算

运算符 说明
AND 多个条件都成立
OR 多个条件中满足一个
NOT 对条件进行取非操作

AND(且)

当需要多个条件进行数据过滤的时候,使用这种方式,and的每个表达式都是要成立,过滤出来的数据就是用户需要的。

下面过滤出年龄和性别两个条件都成立的数据,语法格式如下:

1 select cname1,cname2,... from tname where cname1 operators cval1 and cname2 operators cval2  
 1 mysql> select * from  user2;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 +----+-------+-----+----------+-----+
10 4 rows in set
11
12 mysql> select * from user2 where age >20 and sex=1;
13 +----+-------+-----+---------+-----+
14 | id | name | age | address | sex |
15 +----+-------+-----+---------+-----+
16 | 1 | brand | 21 | fuzhou | 1 |
17 | 4 | weng | 33 | guizhou | 1 |
18 +----+-------+-----+---------+-----+
19 2 rows in set 

OR(或)

当多个条件中只要满足一个条件即进行数据过滤。

下面条件过滤出年龄大于21岁和小于21岁的数据,语法格式如下:

1 select cname1,cname2,... from tname where cname1 operators cval1 or cname2 operators cval2 
 1 mysql> select * from  user2;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 +----+-------+-----+----------+-----+
10 4 rows in set
11
12 mysql> select * from user2 where age>21 or age<21;
13 +----+-------+-----+----------+-----+
14 | id | name | age | address | sex |
15 +----+-------+-----+----------+-----+
16 | 2 | helen | 20 | quanzhou | 0 |
17 | 4 | weng | 33 | guizhou | 1 |
18 +----+-------+-----+----------+-----+
19 2 rows in set 

NOT(取非)

对某个满足的条件进行取反,过滤出来的数据就是用户需要的。

下面过滤不属于年龄大于20的数据,语法格式如下:

1 select cname1,cname2,... from tname where not(cname operators cval) 
 1 mysql> select * from  user2;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 +----+-------+-----+----------+-----+
10 4 rows in set
11
12 mysql> select * from user2 where not(age>20);
13 +----+-------+-----+----------+-----+
14 | id | name | age | address | sex |
15 +----+-------+-----+----------+-----+
16 | 2 | helen | 20 | quanzhou | 0 |
17 +----+-------+-----+----------+-----+
18 1 row in set 

模糊匹配

就像我们上面的那个用户表信息表(包含名称、年龄、地址、性别),当我们要查询名称为s开头的用户时,就可以用到 like 关键字了,他用以模糊匹配数据。

语法格式如下,pattern中可以包含通配符,有两种。%:表示匹配任意一个或n个字符; _:表示匹配任意一个字符。

1 select cname1,cname2,... from tname where cname like pattern; 

%的使用

 1 mysql> select * from user2;
2 +----+--------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+--------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 | 5 | selina | 25 | taiwang | 0 |
10 +----+--------+-----+----------+-----+
11 5 rows in set
12
13 mysql> select * from user2 where name like 's%';
14 +----+--------+-----+---------+-----+
15 | id | name | age | address | sex |
16 +----+--------+-----+---------+-----+
17 | 3 | sol | 21 | xiamen | 0 |
18 | 5 | selina | 25 | taiwang | 0 |
19 +----+--------+-----+---------+-----+
20 2 rows in set 

_的使用

 1 mysql> select * from  user2;
2 +----+--------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+--------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 | 5 | selina | 25 | taiwang | 0 |
10 +----+--------+-----+----------+-----+
11 5 rows in set
12
13 mysql> select * from user2 where name like 's_l';
14 +----+------+-----+---------+-----+
15 | id | name | age | address | sex |
16 +----+------+-----+---------+-----+
17 | 3 | sol | 21 | xiamen | 0 |
18 +----+------+-----+---------+-----+
19 1 row in set 

注意点

1、不要过度使用模糊匹配得通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
2、对大体量的表进行模糊匹配的时候尽量不要以%开头,比如 like '%username',这样会执行扫表,效率较慢。尽量明确模糊查找的开头部分,比如 like 'brand%',会先定位到brand开头的数据,效率高很多。

范围值检查

BETWEEN AND(区间查询)

操作符 BETWEEN … AND 会选取介于两个值之间的数据范围,这些值可以是数值、文本或者日期,属于一个闭区间查询。

and 的左边val1 和 右边 val2 分别表示两个临界值,等同于数学公式[val1,val2] ,属于这两个区间的数据会被过滤出来(>=val1 和 <=val2),所以语法格式如下:

1 selec cname1,cname2,... from tname where cname between val1 and val2;
2 等同于
3 selec cname1,cname2,... from tname where cname >= val1 and cname <= val2;

查询年龄在[21,25]之间的数据:

 1 mysql> select * from user2;
2 +----+--------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+--------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 | 5 | selina | 25 | taiwang | 0 |
10 +----+--------+-----+----------+-----+
11 5 rows in set
12
13 mysql> select * from user2 where age between 21 and 25;
14 +----+--------+-----+---------+-----+
15 | id | name | age | address | sex |
16 +----+--------+-----+---------+-----+
17 | 1 | brand | 21 | fuzhou | 1 |
18 | 3 | sol | 21 | xiamen | 0 |
19 | 5 | selina | 25 | taiwang | 0 |
20 +----+--------+-----+---------+-----+
21 3 rows in set
22
23 mysql> select * from user2 where age >= 21 and age <= 25;
24 +----+--------+-----+---------+-----+
25 | id | name | age | address | sex |
26 +----+--------+-----+---------+-----+
27 | 1 | brand | 21 | fuzhou | 1 |
28 | 3 | sol | 21 | xiamen | 0 |
29 | 5 | selina | 25 | taiwang | 0 |
30 +----+--------+-----+---------+-----+
31 3 rows in set

IN(包含查询)

按照上面得数据,如果我们想查出居住地位于福州和厦门得用户数据,应该使用 IN操作符,因为 IN 操作符允许我们在 WHERE 子句中指定多个值,符合这些值中得某一项,既满足条件返回数据。

语法格式如下,in 后面列表的值类型必须一致或兼容,且不支持通配符:

1 select cname1,cname2,... from tname where cname in (val1,val2,...);
 1 mysql> select * from user2;
2 +----+--------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+--------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 | 5 | selina | 25 | taiwang | 0 |
10 +----+--------+-----+----------+-----+
11 5 rows in set
12
13 mysql> select * from user2 where address in('fuzhou','xiamen');
14 +----+-------+-----+---------+-----+
15 | id | name | age | address | sex |
16 +----+-------+-----+---------+-----+
17 | 1 | brand | 21 | fuzhou | 1 |
18 | 3 | sol | 21 | xiamen | 0 |
19 +----+-------+-----+---------+-----+
20 2 rows in set

NOT IN(对包含查询取反)

我们上面已经学习过了not得用户,对not后面执行得表达式进行取反得操作,测试下:

 1 mysql> select * from user2;
2 +----+--------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+--------+-----+----------+-----+
5 | 1 | brand | 21 | fuzhou | 1 |
6 | 2 | helen | 20 | quanzhou | 0 |
7 | 3 | sol | 21 | xiamen | 0 |
8 | 4 | weng | 33 | guizhou | 1 |
9 | 5 | selina | 25 | taiwang | 0 |
10 +----+--------+-----+----------+-----+
11 5 rows in set
12
13 mysql> select * from user2 where address not in('fuzhou','quanzhou','xiamen');
14 +----+--------+-----+---------+-----+
15 | id | name | age | address | sex |
16 +----+--------+-----+---------+-----+
17 | 4 | weng | 33 | guizhou | 1 |
18 | 5 | selina | 25 | taiwang | 0 |
19 +----+--------+-----+---------+-----+
20 2 rows in set

空值检查

IS NULL/IS NOT NULL

判断是否为空,语法格式如下,这边注意的是,对值为null的数据,各种比较运算符、like、between and、in、not in查询都不起作用,只有is null 能够过滤出来。

1 select cname1,cname2,... from tname where cname is null;
2 或者
3 select cname1,cname2,... from tname where cname is not null;
 1 mysql> select * from user2 where address is null;
2 +----+--------+-----+---------+-----+
3 | id | name | age | address | sex |
4 +----+--------+-----+---------+-----+
5 | 5 | selina | 25 | NULL | 0 |
6 +----+--------+-----+---------+-----+
7 1 row in set
8
9 mysql> select * from user2 where address is not null;
10 +----+-------+-----+----------+-----+
11 | id | name | age | address | sex |
12 +----+-------+-----+----------+-----+
13 | 1 | brand | 21 | fuzhou | 1 |
14 | 2 | helen | 20 | quanzhou | 0 |
15 | 3 | sol | 21 | xiamen | 0 |
16 | 4 | weng | 33 | guizhou | 1 |
17 +----+-------+-----+----------+-----+
18 4 rows in set

有一种关键字 <=>,可以包含对null值得判断,但是目前用的比较少了,有兴趣可以去查查,这边不赘述。

总结

1、like表达式中的%匹配一个到多个任意字符,_匹配一个任意字符

2、空值查询需要使用IS NULL或者IS NOT NULL,其他查询运算符对NULL值无效。即使%通配符可以匹配任何东西,也不能匹配值NULL的数据。

3、建议创建表的时候,表字段不设置空,给字段一个default 默认值。

4、MySQL支持使用NOT对IN 、BETWEEN 和EXISTS子句取反 。

 

MySQL全面瓦解7:查询的过滤条件的更多相关文章

  1. MySQL全面瓦解6:查询的基本操作

    概述 提到查询,就回到我们第四篇的SQL语言分类了,DQL(Data QueryLanguage),也就是数据查询语言,实际就是从数据库中获取数据的一种命令方式.我们给数据库发送一个查询语句的命令,数 ...

  2. MySQL全面瓦解8:查询的正则匹配

    概述 上一章 查询的过滤条件,我们了解了MySQL可以通过 like % 通配符来进行模糊匹配.同样的,它也支持其他正则表达式的匹配,我们在MySQL中使用 REGEXP 操作符来进行正则表达式匹配. ...

  3. MySQL全面瓦解12:连接查询的原理和应用

    概述 MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表.大部分的单表数据查询并不能满足我们的需求,这时候我们就需要连接一个或者多个表,并通过一些条件过滤筛选出我们需要的数据. 了解 ...

  4. 自定义 Azure Table storage 查询过滤条件

    本文是在Azure Table storage 基本用法一文的基础上,介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table storage ...

  5. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  6. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  7. MySQL全面瓦解10:分组查询和聚合函数

    概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位):或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估). ...

  8. MySQL全面瓦解11:子查询和组合查询

    概述 子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询. 先做一下数据准备,这边建立三张表:班级.学生. ...

  9. MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。

    索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...

随机推荐

  1. 001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学

    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学 welcome to Java World 欢迎来到Java世界 一起领略Java编程世界的奥秘与奥妙 ...

  2. Visual C++中各种文件的作用(详细)

    参考:http://blog.sina.com.cn/s/blog_6975d67c0100r3kx.html DSW:全称是Developer Studio Workspace,最高级别的配置文件, ...

  3. P4552 [Poetize6] IncDec Sequence

    Link 题目描述 给定一个长度为 \(n\) 的数列 \({a_1,a_2,\cdots,a_n}\),每次可以选择一个区间 \([l,r]\),使这个区间内的数都加 \(1\) 或者都减 \(1\ ...

  4. 【题解】[USACO07OPEN]Dining G

    \(Link\) \(\text{Solution:}\) 这一题,我们要做到,食物和牛.牛和饮料均为一对一的关系.我们发现这个图不好建立. 经典技巧:将牛拆边,拆成入点和出点,并连容量为\(1\)的 ...

  5. 【linux】基础命令一

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mount dir[] device[]umount devic[]maste ...

  6. vue 组件的封装

    封装的原因 首先封装组件的需求肯定是多个地方要用到同一个东西,他们都有公共的地方,vue的封装 简单来说就是将公共参数封装起来 然后在需要的地方引入 //子组件封装 <template> ...

  7. 原生tab选项卡

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. springboot2.2.2企业级项目整合redis与redis 工具类大全

    1.springboot2.2.2整合redis教程很多,为此编写了比较完整的redis工具类,符合企业级开发使用的工具类 2.springboot与redis maven相关的依赖 <depe ...

  9. 试用 Azure Sql 数据库

    我们的12月试用账号的免费服务里有一个Azure Sql服务,最近正好自己做一个小工具需要一个数据库,正好可以把它当测试库顺便体验一把Azure Sql. 概述 Azure SQL 数据库 Azure ...

  10. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!

    双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...