文章来源:《MySQL 入门教程》第 08 篇 过滤条件

原文作者:不剪发的Tony老师

来源平台:CSDN

上一篇我们学习了如何使用 SELECT 和 FROM 查询表中的数据。很多时候,我们并不需要查看全部数据,更多的则是满足指定条件的数据;此时,我们就需要利用 WHERE 子句来实现数据的过滤。

8.1 简单条件

MySQL 中的 WHERE 子句可以用于指定一个查询条件,只有满足条件的数据才会返回。指定 WHERE 子句的语法如下:

SELECT col1, col2, ...

FROM table_name

WHERE conditions;

其中,conditions 是一个逻辑表达式,它的结果可能为 TRUE(1)、FALSE(0)或者 UNKNOWN(NULL)。对于表中的数据行,只有表达式为 TRUE 的才会返回。例如,以下查询只返回月薪大于 10000 的员工姓名:

select emp_name, salary

from employee

where salary > 10000;

emp_name|salary |

---------|--------|

刘备 |30000.00|

关羽 |26000.00|

张飞 |24000.00|

诸葛亮 |25000.00|

孙尚香 |12000.00|

赵云 |15000.00|在 SQL 定义中,WHERE 子句也被称为谓词(predicate)。

以上示例中的大于号(>)是一个比较运算符,用于判断 salary 是否大于 10000。

除了大于号之外,MySQL 还支持以下比较运算符:等于(=)、不等于(<> 或者 !=)、大于等于(>=)、小于(

select emp_name, hire_date

from employee

where emp_name = '张飞';

emp_name|hire_date |

---------|----------|

张飞 |2000-01-01|

另外,BETWEEN 运算符可以用于判断数据是否位于某个范围之内。例如,以下查询返回 2002 年入职的员工:

select emp_name, hire_date

from employee

where hire_date between '2002-01-01' and '2002-12-31';

emp_name|hire_date |

----------|----------|

孙尚香 |2002-08-08|

孙丫鬟 |2002-08-08|

BETWEEN 运算符包含了两端的值,所以上面的示例查询的是 2002 年入职的员工。

除此之外,IN 运算符可以用于判断数据是否位于某个列表之中。例如,以下查询返回了编号为 1、2 或者 3 的员工:

select emp_name, hire_date

from employee

where emp_id IN (1, 2, 3);

emp_name|hire_date |

---------|----------|

刘备 |2000-01-01|

关羽 |2000-01-01|

张飞 |2000-01-01|

BETWEEN 运算符包含了两端的值,所以上面的示例查询的是 2002 年入职的员工。

除此之外,IN 运算符可以用于判断数据是否位于某个列表之中。例如,以下查询返回了编号为 1、2 或者 3 的员工:

select emp_name, hire_date

from employee

where emp_id IN (1, 2, 3);

emp_name|hire_date |

---------|----------|

刘备 |2000-01-01|

关羽 |2000-01-01|

张飞 |2000-01-01|

只要数据和 IN 列表中的任意值相等,就表示满足条件。IN 运算符中除了直接给出列表之外,还可以使用子查询返回一个结果集,这种用法我们在后面的子查询中进行演示。

8.2 空值判断

在数据库中,空值(NULL )表示缺失或者未知的数据,它不等于 0 或者空字符串。对于空值的判断,不能使用普通的等于或者不等于,而需要使用特殊的 IS NULL 和 IS NOT NULL 运算符。例如:

select null is null, null = 0, null = null, null != null;

null is null|null = 0|null = null|null != null|

------------|--------|-----------|------------|

1| | | |

只有 null is null 的结果为 True(MySQL 使用 1 表示 True,0 表示 False);null = 0 的结果是未知(Unknown),因为未知数据和 0 比较的结果也是未知;null = null 和 null != null 的结果都是未知。

以下查询返回了没有上级领导的员工:

select emp_name, manager

from employee

where manager is null;

emp_name|manager|

---------|-------|

刘备 | |

如果想要查询存在上级领导的员工,可以使用 IS NOT NULL 运算符:

select emp_name, manager

from employee

where manager is not null;

除了 IS [NOT] NULL 运算符之外,MySQL 还提供了一个空值判断的函数:ISNULL(expr)。如果 expr 为空值,该函数返回 1;否则,返回 0。例如:

SELECT isnull(0), isnull(null);

isnull(0)|isnull(null)|

---------|------------|

0| 1|

另外,MySQL 还提供了一个支持 NULL 值的比较运算符:<=>。例如:

select 0 <=> 0, null <=> null, 0 <=> null;

0 <=> 0|NULL <=> NULL|0 <=> NULL|

-------|-------------|----------|

1| 1| 0|

对于非空的数据,<=> 相当于普通的 = 运算符;对于两个 NULL 值,返回 1;对于一个 NULL 值,返回 0。MySQL 中的 <=> 运算符等价于 SQL 标准中的 IS NOT DISTINCT FROM 运算符。

8.3 复合条件

除了使用单个查询条件之外,MySQL 还支持利用逻辑运算符将多个查询条件进行组合:AND,逻辑与运算符。当两个表达式的值都为真时结果才为真;

OR,逻辑或运算符。只要有一个表达式的值为真结果就为真;

NOT,逻辑非运算符。如果表达式的值为真,结果为假;如果表达式的值为假,结果为真;如果表达式的值为 NULL,结果为 NOT NULL;

XOR,逻辑异或运算符。只要有一个表达式的值为 NULL,结果就为 NULL;如果一个表达式的值为假,另一个表达式为真,结果就为真;否则结果为假。

以下查询返回了 2011 年之后入职的女性员工:

select emp_name, sex, hire_date

from employee

where sex = '女'

and hire_date >= '2011-01-01';

emp_name |sex |hire_date |

---------|----|----------|

赵氏 |女 |2011-11-10|

以下查询返回了所有女性员工以及 2011 年之后入职的员工:

select emp_name, sex, hire_date

from employee

where sex = '女'

or hire_date >= '2011-01-01';

emp_name |sex |hire_date |

----------|----|----------|

孙尚香 |女 |2002-08-08|

孙丫鬟 |女 |2002-08-08|

关平 |男 |2011-07-24|

赵氏 |女 |2011-11-10|

关兴 |男 |2011-07-30|

...

以下查询返回了不是 2002 年入职的员工:

select emp_name, hire_date

from employee

where hire_date not between '2002-01-01' and '2002-12-31';

emp_name|hire_date |

---------|----------|

刘备 |2000-01-01|

关羽 |2000-01-01|

张飞 |2000-01-01|

诸葛亮 |2006-03-15|

黄忠 |2008-10-25|

NOT 运算符可以对其他运算符的结果取反,例如,NOT IN 运算符返回不在列表中的数据。

对于逻辑运算符,MySQL 使用短路运算(short-circuit)。只要左边的表达式可以决定最终的结果,就不会计算右边的表达式。例如:

select 1 = 0 and 1 / 0;

1 = 0 and 1 / 0|

---------------|

0|

因为 1 = 0 的结果为 False,AND 运算符的结果肯定就是 False;所以不会计算 1 / 0,也就不会返回除零错误。

8.4 排除重复值

DISTINCT 是一个特殊的运算符,可以排除查询结果中的重复记录:

SELECT [ALL | DISTINCT] col1, col2, ...

FROM table_name;

ALL 表示返回全部结果,DISTINCT 表示返回字段组合结果中的不同值。默认选项为 ALL。

例如:

select sex

from employee;

sex|

----|

男 |

男 |

男 |

男 |

男 |

男 |

...

select distinct sex

from employee;

sex|

----|

男 |

女 |

对于 DISTINCT 而言,所有的 NULL 值都相同。例如:

select distinct bonus

from employee;

bonus |

--------|

10000.00|

8000.00|

|

5000.00|

6000.00|

2000.00|

1500.00|

很多员工的 bonus 都为空,但是查询结果中只返回了一个 NULL 值。DISTINCTROW 是 DISTINCT 的同义词。

如果你在学习过程中遇到任何问题,欢迎留言提问,不用客气!

mysql怎么滤空_《MySQL 入门教程》第 08 篇 过滤条件相关推荐

  1. WMI 使用教程_.NET 入门教程

    WMI 使用教程_.NET 入门教程 先介绍一下WMI 相关知识:  什么是WMI 呢? Windows 管理规范 (Windows Management Instrumentation ),它的主要 ...

  2. 蘑菇云「行空板Python入门教程」第七课:舒尔特方格小游戏

    注意力是一切学习的根本,是大脑进行感知.学习.思维等认知活动的基本条件.然而,无论是孩子还是成年人,我们常常会因开小差.注意力无法集中而困扰.此时,找到一个合适的方法来训练我们的注意力势在必行. 舒尔 ...

  3. 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏

    在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...

  4. 蘑菇云「行空板Python入门教程」第九课-智慧农业物联网系统2

    5G元年的列车早已驶出,人工智能.大数据的浪潮还在涌动,云办公.云问诊成为防疫期间的热词. 现如今,物联网技术正处于时代发展的风口,相较于传统的硬件设备,物联网技术使得各种硬件设备能够通过信息传输设备 ...

  5. 蘑菇云「行空板Python入门教程」第八课:智慧农业可视化系统

    在过去,我国农业自动化程度较低,与发达国家存在着较显著的差距.现如今,随着现代科技的不断进步,农业自动化水平日渐提高,越来越多的传感器.显示屏等电子设备被应用在农业中,随时随地监测农作物的生长,以便在 ...

  6. 九宫怎么排列和使用_广告视频配音剪映零基础入门教程第二十三篇:剪辑之九宫格教程...

    朋友圈最火九宫格视频你们知道是怎样制作的吗?我们常常在玩朋友圈的时候想用九宫格照片,但是你们有没有遇到这种情况,想玩九宫格却发现找不到那么多能用的照片,那这时候怎么办呢?玩腻了平常图片的发法,今天我们 ...

  7. Linux Capabilities 入门教程--进阶实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

  8. Systemd 入门教程:实战篇

    Systemd 入门教程:实战篇 原文出处: 阮一峰(@ruanyf)   http://blog.jobbole.com/98671/?utm_source=blog.jobbole.com& ...

  9. Linux Capabilities 入门教程--基础实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

最新文章

  1. thinkpad重装系统不引导_重装系统时,如何判断Windows的启动方式是Legacy还是UEFI?...
  2. 05Observer/Event(观察者)模式
  3. MyBatis-22MyBatis缓存配置【一级缓存】
  4. r语言 整理、处理数据步骤_R语言之数据处理(一)
  5. Unity Mono脚本 加密
  6. [美丽的烦恼] SQL删除某些字段重复的记录(只保留一条)
  7. throw 、throws 简介
  8. 前 k 条最短路径算法
  9. Android Studio 自定义字体显示英文音标
  10. 国产WMS仓库管理系统排名
  11. 三极管9013 9014 跟8050之间有什么区别,
  12. 判断单链表是否中心对称算法
  13. 添加打印机,本地打印后台处理程序服务没有运行
  14. arch linux u盘安装,如何把ArchLinux安装到U盘上
  15. MU-MIMO和SU-MIMO分别表示什么?
  16. 使用最大似然估计对NFL球队排名
  17. LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)
  18. 2021章节练习基础(案例精选)20-30
  19. 【CSS】css 获取从第n个元素开始,之后的所有元素 :nth-of-type(n)与:nth-child(n)
  20. java读取excel2010文件_java的poi技术读取Excel[2003-2007,2010]

热门文章

  1. 自定义用户控件,实在数据动态提示
  2. 北京奥运会和上海世博会广告登上巴士 亮相纽约
  3. Flutter Dart 安装在window系统
  4. 并发编程(CountDownLatch使用)
  5. [sql]sqlite3板子上安装运行报错
  6. 缓存框架OSCache部分源码分析
  7. C#Excel文件读取问题及解决办法
  8. 定制CentOS 6.3 自动安装盘
  9. 【翻译】Programming Ruby——数组,哈希表和控制结构
  10. SDN的实现思路—Vecloud微云