过滤数据

使用WHERE子句

1、数据库表一般包含大量的数据,很少需要检索表中的所有数据。通常会根据特定操作或报告的需要提取表数据的子集。只检索所需数据,因此需要指定搜索条件,搜索条件也称为过滤条件

2、在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行进行过滤,WHERE子句在表名(FROM子句)之后给出

例1:

mysql> use demo;
Database changed
mysql> SELECT level,career FROM roleinfo WHERE career = 2;
+-------+--------+
| level | career |
+-------+--------+
|   107 |      2 |
|   101 |      2 |
+-------+--------+

注:
1、这句SQL语句的意思为:从roleinfo表中检索两个列,但不返回所有行,只返回career = 2的行。

2、WHERE子句的位置:在同时使用ORDER BY 和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误

例2:

mysql> SELECT platformName FROM roleinfo WHERE career = 2 ORDER BY platformName;
+---------------+
| platformName  |
+---------------+
| ainjigame_app |
| xinjigame_app |
+---------------+

where子句操作符

在根据条件过滤数据时,一般会有以下的一些过滤操作符

= 等于
<>     不等于
!=     不等于
<     小于
<=     小于等于
>     大于
>=     大于等于
BETWEEN       在指定的两个值之间
is null 值为null
is not null 值不为null

例3:

mysql> SELECT level,career FROM roleinfo WHERE career BETWEEN 2 AND 3;
+-------+--------+
| level | career |
+-------+--------+
|   107 |      2 |
|   106 |      3 |
|   101 |      2 |
+-------+--------+

例3_1:

注:
1、BETWEEN同AND一起搭配使用,表示两个值之间
2、通常value1 应该小于value2。当BETWEEN前面加上NOT运算符时,表示与BETWEEN相反的意思,即选取这个范围之外的值。
3、除了数值类型外,BETWEEN也支持字符串范围,当条件为字符串类型时是不区分大小写的
4、几乎所有的数据库都支持BETWEEN...AND运算符,但不同的数据库对该语法处理方式是有差异的。在MySQL中,BETWEEN包含了value1和value2边界值,而有的数据库则不包含边界值的
5、BETWEEN子句后面跟的数值类型必须要与表中对应值得数据类型一致

空值检查

1、在创建表时,表设计人员可以指定其中的列是否可以不包含值。一个列不包含值时,称其包含空值NULL
2、NULL:无值,它与字段包含0、空字符串或仅仅包含空格不同;可以使用IS  NULL子句来检查表中是否具有NULL值。或IS NOT NULL 来检查是否不为NULL

例4:

mysql> SELECT platformName FROM roleinfo WHERE createTime IS NULL;
Empty set (0.00 sec)/* 无返回值表示表中该列中无NULL值 */

例4_1:

注:
在通过过滤选择出不具有特定值的行数时,可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊含义,数据库不知道它们是否匹配,所以在匹配或不匹配过滤时不反回它们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行

组合WHERE子句

1、为了进行更强的过滤控制,MYSQL允许给出多个WHERE子句,这些子句可以以两种方式使用:以AND子句的方式或OR子句的方式

2、操作符:用来联结或改变WHERE子句中的子句的关键字,也被称为逻辑操作符

3、存在多个过滤条件时就可以使用逻辑操作符来进行过滤

AND操作符

1、AND操作符表示并列关系:多个条件必须同时成立

例5:
mysql> SELECT platformName FROM roleinfo WHERE career = 2 AND  level = 101;
+---------------+
| platformName  |
+---------------+
| ainjigame_app |
+---------------+

注:
1、AND:用在WHERE子句中的关键字,用来检索满足所有给定条件的行(进一步限制返回结果)。可以添加多个过滤条件,每添加一个就要使用一个AND
2、上面的例子例子的意思为:从roleinfo检索platformName列,只返回career列等于2且level列等于101的行。

OR操作符

1、OR操作符与AND操作符不同,它指示MYSQL检索匹配任一条件的行。为"或"的关系,其中一个条件成立即可

例6:

mysql> SELECT platformName FROM roleinfo WHERE level = 107 OR level = 101;
+---------------+
| platformName  |
+---------------+
| xinjigame_app |
| ainjigame_app |
+---------------+

注:
1、ORWHERE子句中使用的关键字,用来检索匹配任一条件的行
2、上面的例子例子的意思为:从roleinfo检索platformName列,只返回level列等于107或level列等于101的行。

计算次序

1、在过滤条件中同时存在and和or操作符时,会先计算AND"且"再计算OR"或"。(先且后或)

2、需要规定计算优先级时,可以使用圆括号来标记

例7:

mysql> SELECT platformName FROM roleinfo WHERE career = 2 OR sex = 1 AND camp = 3;
+---------------+
| platformName  |
+---------------+
| xinjigame_app |
| ainjigame_app |
+---------------+

该SQL语句的意思为:从roleinfo检索platformName列,只返回sex=1且camp=3或career=2的列(先且后或)

例7_1:

mysql> SELECT platformName FROM roleinfo WHERE (career = 2 OR sex = 1) AND camp = 3;
+---------------+
| platformName  |
+---------------+
| ainjigame_app |
+---------------+

该SQL语句的意思为:从roleinfo检索platformName列,只返回career=2或sex=1且camp=3的列(先或后且)

注:
1、SQL(像多数语言一样),在处理OR操作符前会优先处理AND操作符,即AND操作符的优先级更高。所以上面两个例子的意思完全不一样

2、此问题的解决方法是使用圆括号明确地分组相应的操作符,DBMS会首先处理圆括号内的过滤条件

3、任何时候使用具有AND和OR操作符的WHERE子句时,都应该使用圆括号明确地分组操作符,不要过分的依赖默认计算次序。

IN操作符

圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取得合法值是由逗号分隔的清单,全都括在圆括号中

例8:

mysql> SELECT platformName FROM roleinfo WHERE camp IN(1,2) ORDER BY platformName;
+---------------+
| platformName  |
+---------------+
| cinjigame     |
| xinjigame_app |
+---------------+

注:
1、上面的SQL语句的意思是:从roleinfo检索platformName列,只返回camp值为1或2的行(包含两个边界值)。操作符后跟由逗号分隔的合法清单,整个清单必须括在圆括号中
2、IN操作完成与OR相同的功能
3、当IN前面加上NOT运算符时,表示与IN相反的意思,即不在这些列表项内选择。

使用IN操作符的优点

1、在使用长的合法选项清单时,IN操作符的语法更加清楚且更直观

2、在使用IN操作符时,计算的次序更容易管理(因为使用的操作符更少)

3、IN操作符一般比OR操作符执行得更快

4、IN操作符最大的有优点是可以包含其他SELECT语句,使得能更动态的建立WHERE子句

例8_1:

mysql> SELECT platformName FROM roleinfo WHERE camp IN (SELECT career FROM roleinfo WHERE sex = 1 OR sex = 0);
+---------------+
| platformName  |
+---------------+
| xinjigame_app |
| ainjigame_app |
+---------------+

注:
1、更多情况下IN列表项的值是不明确的,而可能是通过一个子查询得到的,然后将查询结果作为IN的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。

2、IN列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列

3、一个IN只能对一个字段进行范围比对,如果要指定更多字段,可以使用AND或OR逻辑运算符

例8_2:

mysql> SELECT platformName FROM roleinfo WHERE camp IN(3,4) OR career IN(1,2);
+---------------+
| platformName  |
+---------------+
| xinjigame_app |
| ainjigame_app |
+---------------+

NOT操作符

WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后跟的任何条件

例9:

mysql>  SELECT platformName FROM roleinfo WHERE camp NOT IN (1,2);
+---------------+
| platformName  |
+---------------+
| ainjigame_app |
+---------------+

注:
MYSQL中支持使用NOT对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。

用通配符进行过滤

LIKE操作符

前面介绍的所有操作符都是针对已知值进行过滤的,但是这种过滤方式并不是在任何时候都是好用的。例如,怎么搜索产品名称中包含文本anvil的所有产品?使用简单的比较操作符肯定是不行的,此时就必须使用通配符。利用通配符可创建比较特定数据的搜索模式。在这个例子中,就可以构造一个通配符搜索模式,找出产品中任何位置出现anvil的产品

1、通配符:用来匹配值的一部分的特殊字符。其本身实际上就是SQL的WHERE子句中有特殊含义的字符
2、搜索模式:由字面值,通配符或两者组合成的搜索条件
3、为在搜索子句中使用通配符,就必须使用LIKE操作符LIKE指示MYSQL后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较

百分号(%)通配符

最常使用的通配符是百分号(%)。在所搜串中,%表示任何字符出现任意次数。

例10:返回channelName值为"g"开头的值

mysql> SELECT platformName,channelName FROM roleinfo WHERE channelName LIKE "g%";
+---------------+---------------+
| platformName  | channelName   |
+---------------+---------------+
| ainjigame_app | ginjigame_app |
+---------------+---------------+
/*表示将检索任意以"g"开头的词,%告诉MYSQL接受"g"之后的任意字符*/

例10_1:返回channelName值为"APP"结尾的值

mysql> SELECT platformName,channelName  FROM roleinfo WHERE channelName LIKE "%APP";
+---------------+---------------+
| platformName  | channelName   |
+---------------+---------------+
| xinjigame_app | xinjigame_app |
| ainjigame_app | ginjigame_app |
+---------------+---------------+/*不区分大小写*/

例10_2:返回channelName值为包含"e"的值

mysql> SELECT platformName,channelName  FROM roleinfo WHERE channelName LIKE "%e%";
+---------------+---------------+
| platformName  | channelName   |
+---------------+---------------+
| xinjigame_app | xinjigame_app |
| cinjigame     | binjigame     |
| ainjigame_app | ginjigame_app |
+---------------+---------------+

例10_3:返回channelName值为以"b"开头以"e"结尾的值

mysql>  SELECT platformName,channelName  FROM roleinfo WHERE channelName LIKE "b%e";
+--------------+-------------+
| platformName | channelName |
+--------------+-------------+
| cinjigame    | binjigame   |
+--------------+-------------+

例10_4:返回channelName值为不以"APP"结尾的值

mysql> SELECT platformName,channelName  FROM roleinfo WHERE channelName NOT LIKE "%app";
+--------------+-------------+
| platformName | channelName |
+--------------+-------------+
| cinjigame    | binjigame   |
+--------------+-------------+

注:
1、%还能匹配0个字符。%表示搜索模式中给定位置的0个、1个或多个字符
2、尾空格可能会干扰通配符的匹配(会无法匹配到对应的值,如WHERE channelName LIKE "%app "),解决这个问题的办法是在搜索模式最后附加一个%,还有就是使用函数
3、虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。无法匹配值为NULL的行
4、MySQL允许将NOT运算符与LIKE运算符组合,以找到不匹配特定模式的字符串

下划线(_)通配符

另一种通配符是下划线(_)。下划线的用途与%一样,但是下划线只匹配单个字符而不是多个字符(只能是下划线处不一致)

例11:查找以T开头以m结尾的值

mysql> SELECT employeeNumber, lastName, firstName
FROMemployees
WHEREfirstname LIKE 'T_m';
+----------------+----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+----------+-----------+
|           1619 | King     | Tom       |
+----------------+----------+-----------+

例12:查找以b_n开头的值

mysql> SELECT platformName,channelName  FROM roleinfo WHERE channelName LIKE "b_n%";
+---------------+---------------+
| platformName  | channelName   |
+---------------+---------------+
| cinjigame     | binjigame     |
| ainjigame_app | bonjigame_bpp |
+---------------+---------------+

总结:
1、百分比(%)通配符允许匹配任何字符串的零个或多个字符。
2、下划线(_)通配符允许匹配任何单个字符。
3、在使用下划线(_)通配符时也需要使用%来指定位置

MySQL LIKE与ESCAPE子句

有时想要匹配的模式包含通配符,例如10%,_20等这样的字符串时。在这种情况下,您可以使用ESCAPE子句指定转义字符,以便MySQL将通配符解释为文字字符。如果未明确指定转义字符,则反斜杠字符\是默认转义字符

例13:查找包含"_pp"的值

mysql> SELECT platformName,channelName  FROM roleinfo WHERE channelName LIKE "%\__pp%";
+---------------+---------------+
| platformName  | channelName   |
+---------------+---------------+
| xinjigame_app | xinjigame_app |
| ainjigame_app | bonjigame_bpp |
+---------------+---------------+

例13_1:

mysql> SELECT-> platformName,channelName-> FROM-> roleinfo-> WHERE-> channelName LIKE "%$__PP%" ESCAPE "$";
+---------------+---------------+
| platformName  | channelName   |
+---------------+---------------+
| xinjigame_app | xinjigame_app |
| ainjigame_app | bonjigame_bpp |
+---------------+---------------+

注:
LIKE操作符强制MySQL扫描整个表以找到匹配的行记录,因此,它不允许数据库引擎使用索引进行快速搜索。因此,当要从具有大量行的表查询数据时,使用LIKE运算符来查询数据的性能会大幅降低。

MYSQL:过滤数据相关推荐

  1. MySQL 学习笔记(1)— 创建/连接/选择/显示数据库(表) 查询单列(多列/所有列)/查询返回特定的行数 各种排序(单列/多列/降序/组合排序) 过滤数据

    本文是对之前学习 MySQL 的一个总结,使用思维导图的方式将涉及到的知识点罗列出来,一方面作为自己对于知识点的归纳,另一方面也便于日后查询. 在该篇文章中将对 MySQL 的基本使用.检索基本数据. ...

  2. MySQL检索数据(过滤+通配符+正则表达式)

    [0]README 0.1)本文部分文字描述转自"MySQL 必知必会",旨在review "MySQL的基础知识": [1]检索数据 1)检索单个列:sele ...

  3. MySQL学习笔记:过滤数据+数据过滤

    本文为本人学习书籍<MySQL必知必会>笔记系列,欢迎收藏学习,有问题随时留言评论,一起探讨. 第六章 过滤数据 SELECT语句的WHERE子句指定搜索条件. 6.1检查单个值:输出性别 ...

  4. 【MySQL基础知识】查询、过滤数据关键字

    MySQL基础知识 一.检索数据 1. SELECT select是使用最广泛的检索数据的语句. 检索要查的表的所有列: select * from (表名称)... 检索要查的表的某一列或多列: s ...

  5. Maatkit工具使用lt;一gt;之mysql主从数据校验工具

    mysql主从数据校验工具       mysql在5.1之前,其replication都是采用的STATEMENT模式,对表的数据是否一致要求并不严格,所以对数据一致性要求比较严格的应用,定期检查数 ...

  6. MySQL:基础—数据分组

    MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...

  7. Mysql动态数据多条件查询

    Mysql动态数据多条件查询 前言 有的时候,我们进行数据的数据查询的时候,我们会加入筛选条件. 例如: select * from user where username = ? // ? 指的是自 ...

  8. mysql 轨迹数据存储_基于Tablestore实现海量运动轨迹数据存储-阿里云开发者社区...

    前言 现在越来越多的人都开始关心自己的运动数据,比如每日的计步.跑步里程.骑行里程等.运动APP与运动类的穿戴设备借助传感器.地图.GPS定位等技术,收集好运动数据以后,通过与互联网社交功能结合,产生 ...

  9. mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据

    MySQL8.0 初级学习笔记(六)查询数据 MySQL8.0 初级学习笔记(六)查询数据 查询有多种方法:单表查询,使用集合函数查询,连接查询,子查询,合并查询结果,为表和字段取别名,使用正则表达式 ...

最新文章

  1. 为什么要参加java培训?有哪些优势?
  2. python【数据结构与算法】武松打虎问题(贪心)
  3. 漫谈中国自主杀毒引擎
  4. HttpClient超时设置
  5. Win8下在Vmware11中安装使用苹果系统OS X 10.10
  6. spring social_Spring Social入门–第2部分
  7. [你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途
  8. esp8266烧录Html文件,实现内置网页控制设备!
  9. Java经纬度坐标与高斯坐标的转换
  10. 如何将字节数组转换为十六进制字符串,反之亦然?
  11. mvn compile遇到的问题:-source1.3 中不支持注释
  12. Atitit 加强学生就业的规划与艾提拉的治学理念 目录 1. 思路的转换 1 1.1. 发展内需为主模型 vs 外贸模式 1 1.2. 批发模式vs 零售模式vs 1 1.3. 天堂模式vs地狱模
  13. PPT文档如何插入超链接
  14. 如何取消excel密码_教你快速设置/取消Excel文件打开密码,工作中经常用到。
  15. html js动态时间轴,jQuery时间轴插件timeline.js
  16. pf与ckf_CKF Kadat——彪悍又带着野性,兼顾强度与尺寸的战术折
  17. 正则表达式(二)验证邮箱、电话号码
  18. ps中如何批量修改图片
  19. 文件系统大目录下的操作性能效率提升
  20. JavaScript函数式编程之函子

热门文章

  1. 影响照片锐度的7个要素
  2. 模拟unity自带地形的grass
  3. JVM学习~第一天~JVM简介
  4. 九龙证券|新三板再现最“壕”分红!北交所公司不遑多让
  5. 前端HTML转PDF生成的PDF上边会有留白,下边截取不全
  6. Springboot 使用 sendgrid发送邮件
  7. 习题3.6 阅读下面程序,分析其执行过程,写出输出结果
  8. 考勤系统(员工打卡)
  9. python用于导入模块或模块中的对象_在 Python 中导入模块中的对象有哪几种方式? (5.0分)_学小易找答案...
  10. duilib 关于wke 控件焦点问题