概述

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

这样才能得到我们期望的结果。所以本章我们来学习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. 008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字

    008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字 关键字 关键字就是一些有特殊意义的词 之前学习的程序中涉及到的关键字 Java中 ...

  2. Python实现的数据结构与算法之双端队列详解

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  3. centos7卸载mariadb安装mysql

    卸载mariadb 1. 当前安装列表  rpm -qa | grep mariadb 2.卸载 rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 3 ...

  4. golang API 请求队列

    概要 实现思路 使用方法 启动队列服务 使用队列服务 概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP ...

  5. day23 Pyhton学习 昨日回顾.re模块.序列化模块

    一.昨日回顾 #__file__查看当前文件所在的绝对路径 #time 时间模块 time.time 获取当前时间戳时间 字符串->time.strptime->结构化->mktim ...

  6. monolog封装

    做一下基本关于Monolog的基本介绍: Monolog是基于PHP的日志类库. 介绍就到这,言归正传 安装 安装最新版本:(composer 还没安装的~:https://www.phpcompos ...

  7. zookeeper动态添加/删除集群中实例(zookeeper 3.6)

    一,用来作为demo操作的zookeeper集群中的实例: 机器名:zk1 server.1=172.18.1.1:2888:3888 机器名:zk2 server.2=172.18.1.2:2888 ...

  8. allure测试报告

    首先如果你没有安装 pytest 库的话,先使用 pip 安装一下: pip install pytest 另外还需要安装 pytest 支持 allure 报告的插件库: pip install a ...

  9. sql 删除所有存储过程

    1.执行以下sql语句即可删除所有存储过程 --/**********删除所有存储过程*************************/-- use 数据库名 go declare @tname v ...

  10. C++学习笔记---引用的本质

    本质:引用本质上是C++内部实现的一个指针常量 发现是引用的话,自动帮我们转换成指针常量 运行后,发现修改ref的值那么a的值也会一起改变,这就说明了引用的本质就是指针