上一篇我们学习了如何使用 SELECT 和 FROM 查询表中的数据。很多时候,我们并不需要查看全部数据,更多的则是满足指定条件的数据;此时,我们就需要利用 WHERE 子句来实现数据的过滤。
![4fe4c34a3a4c655f2f623b0b74b12967.png](https://i-blog.csdnimg.cn/blog_migrate/1a4644a50d673db62a831e206f60f76d.jpeg)
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, salaryfrom employeewhere salary > 10000; emp_name|salary |---------|--------|刘备 |30000.00|关羽 |26000.00|张飞 |24000.00|诸葛亮 |25000.00|孙尚香 |12000.00|赵云 |15000.00|1234567891011
在 SQL 定义中,WHERE 子句也被称为谓词(predicate)。
以上示例中的大于号(>)是一个比较运算符,用于判断 salary 是否大于 10000。
除了大于号之外,MySQL 还支持以下比较运算符:等于(=)、不等于(<> 或者 !=)、大于等于(>=)、小于(
select emp_name, hire_datefrom employeewhere emp_name = '张飞'; emp_name|hire_date |---------|----------|张飞 |2000-01-01|123456
另外,BETWEEN 运算符可以用于判断数据是否位于某个范围之内。例如,以下查询返回 2002 年入职的员工:
select emp_name, hire_datefrom employeewhere hire_date between '2002-01-01' and '2002-12-31'; emp_name|hire_date |----------|----------|孙尚香 |2002-08-08|孙丫鬟 |2002-08-08|1234567
BETWEEN 运算符包含了两端的值,所以上面的示例查询的是 2002 年入职的员工。
除此之外,IN 运算符可以用于判断数据是否位于某个列表之中。例如,以下查询返回了编号为 1、2 或者 3 的员工:
select emp_name, hire_datefrom employeewhere emp_id IN (1, 2, 3); emp_name|hire_date |---------|----------|刘备 |2000-01-01|关羽 |2000-01-01|张飞 |2000-01-01|12345678
只要数据和 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| | | |1234
只有 null is null 的结果为 True(MySQL 使用 1 表示 True,0 表示 False);null = 0 的结果是未知(Unknown),因为未知数据和 0 比较的结果也是未知;null = null 和 null != null 的结果都是未知。
以下查询返回了没有上级领导的员工:
select emp_name, managerfrom employeewhere manager is null; emp_name|manager|---------|-------|刘备 | |123456
如果想要查询存在上级领导的员工,可以使用 IS NOT NULL 运算符:
select emp_name, managerfrom employeewhere manager is not null;123
除了 IS [NOT] NULL 运算符之外,MySQL 还提供了一个空值判断的函数:ISNULL(expr)。如果 expr 为空值,该函数返回 1;否则,返回 0。例如:
SELECT isnull(0), isnull(null);isnull(0)|isnull(null)|---------|------------| 0| 1|1234
另外,MySQL 还提供了一个支持 NULL 值的比较运算符:<=>。例如:
select 0 <=> 0, null <=> null, 0 <=> null;0 <=> 0|NULL <=> NULL|0 <=> NULL|-------|-------------|----------| 1| 1| 0|1234
对于非空的数据,<=> 相当于普通的 = 运算符;对于两个 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 employeewhere sex = '女'and hire_date >= '2011-01-01';emp_name |sex |hire_date |---------|----|----------|赵氏 |女 |2011-11-10|1234567
以下查询返回了所有女性员工以及 2011 年之后入职的员工:
select emp_name, sex, hire_date from employeewhere 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|...123456789101112
以下查询返回了不是 2002 年入职的员工:
select emp_name, hire_datefrom employeewhere 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|12345678910
NOT 运算符可以对其他运算符的结果取反,例如,NOT IN 运算符返回不在列表中的数据。
对于逻辑运算符,MySQL 使用短路运算(short-circuit)。只要左边的表达式可以决定最终的结果,就不会计算右边的表达式。例如:
select 1 = 0 and 1 / 0;1 = 0 and 1 / 0|---------------| 0|1234
因为 1 = 0 的结果为 False,AND 运算符的结果肯定就是 False;所以不会计算 1 / 0,也就不会返回除零错误。
8.4 排除重复值
DISTINCT 是一个特殊的运算符,可以排除查询结果中的重复记录:
SELECT [ALL | DISTINCT] col1, col2, ... FROM table_name;12
ALL 表示返回全部结果,DISTINCT 表示返回字段组合结果中的不同值。默认选项为 ALL。
例如:
select sexfrom employee; sex|----|男 |男 |男 |男 |男 |男 |...select distinct sexfrom employee; sex|----|男 |女 |123456789101112131415161718
对于 DISTINCT 而言,所有的 NULL 值都相同。例如:
select distinct bonus from employee;bonus |--------|10000.00| 8000.00| | 5000.00| 6000.00| 2000.00| 1500.00|1234567891011
很多员工的 bonus 都为空,但是查询结果中只返回了一个 NULL 值。
DISTINCTROW 是 DISTINCT 的同义词。
如果你在学习过程中遇到任何问题,欢迎留言提问,不用客气!
目前在职Java开发,如果你现在也在学习Java,在入门学习Java的过程当中缺乏基础入门的视频教程, 可以关注并私信我:01。免费领取2020年最新Java基础精讲视频教程,学习手册,面试题,开发工具,PDF文档书籍教程,以下资料截图:
![55a01254af6291818802ed46caa35120.png](https://i-blog.csdnimg.cn/blog_migrate/17fcc21731c1391d8f0e10f57b0327f8.jpeg)
![65e8ecf5b6008110e3288f4d2a09c578.png](https://i-blog.csdnimg.cn/blog_migrate/3e5fff18385c5d29ef9c54f0d3bd3169.jpeg)
![c7f6978dea440b20a74259930145cae5.png](https://i-blog.csdnimg.cn/blog_migrate/8b8f08612cf7662e2bceb0567eb5082b.jpeg)
![297dd7c8f04eec97a0f12d50a4fbc70e.png](https://i-blog.csdnimg.cn/blog_migrate/acf1a209430af270e3a833731db40552.jpeg)
![4bd4ee4c7aa0facc9c3bafbdb37678ba.png](https://i-blog.csdnimg.cn/blog_migrate/d2eee475714bd322e3ea4f436bc44833.jpeg)
![19eb37ca62bcc17fb35004c73b635e7b.png](https://i-blog.csdnimg.cn/blog_migrate/1337a75ac0e38b67b3e4b7418a528e63.jpeg)
![3e80a8449e46fe99d2d355d18e593c2d.png](https://i-blog.csdnimg.cn/blog_migrate/fd27b4b3cf3ece7c04bf6b87adc2be44.jpeg)
![5902241707309bc8c01520953bd71781.png](https://i-blog.csdnimg.cn/blog_migrate/e6e0f1a53688e147eca23091dcd6c912.jpeg)
![ba5c7ac62f13d3f2681ade2d94505042.png](https://i-blog.csdnimg.cn/blog_migrate/5850714c3bf9a2cc126dd33f989c1ccb.jpeg)
![03b57d4789d1ca881b155150e6753876.png](https://i-blog.csdnimg.cn/blog_migrate/70bd1c30a1ea7c4f4af4ce7cd50e614f.jpeg)
![362d8ec5853bb1bfcf6e7e19bbe78fd1.png](https://i-blog.csdnimg.cn/blog_migrate/3be8786ac70befeff5b33c246c4f218c.jpeg)
![eb136941f025918d64ee37633889dc89.png](https://i-blog.csdnimg.cn/blog_migrate/b8944f133116901f48c16faa6c53ebd0.jpeg)
关注并私信我:01。即可领取以上学习资料。