大厂都这么使用MySQL8进行条件查询(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 大厂都这么使用MySQL8进行条件查询(下)

7 复合条件

借助于逻辑代数中的逻辑运算,SQL 提供了三个逻辑运算符:

7.1 AND 逻辑与运算符

只有当两边的条件都为真时,结果才为真,返回数据;否则,不返回数据。

以下示例使用 AND 运算符查找性别为“女”,并且月薪超过 10000 的员工:

SELECT emp_name, sex, salary
  FROM employee
 WHERE sex = '女'
   AND salary > 10000;
emp_name|sex|salary  |
--------|---|--------|
孙尚香   |女 |12000.00|
“孙尚香”是女性员工,并且月薪为 12000。
  • OR,逻辑或运算符。只要有一个条件为真,结果就为真,返回数据;否则,不返回数据。
  • NOT,逻辑非运算符。用于将判断结果取反,真变为假,假变为真;空值取反后仍然为空值。


7.2 OR 运算符

使用 OR 运算符查找姓名为“刘备”、“关羽”或者“张飞”的员工:

SELECT emp_name, sex, salary
  FROM employee
 WHERE emp_name = '刘备'
    OR emp_name = '关羽'
    OR emp_name = '张飞';

该查询的结果与前文中 IN 运算符的示例相同。

7.3 短路运算

对于逻辑运算符 AND 和 OR,SQL 使用短路运算(short-circuit evaluation)。也就是说,只要前面的表达式能够决定最终的结果,不执行后面的计算。这样能够提高运算效率。因此,以下语句不会产生除零错误:

SELECT 'AND'
  FROM employee
 WHERE 1 = 0 AND 1/0 = 1;
SELECT 'OR'
  FROM employee
 WHERE 1 = 1 OR 1/0 = 1;

第一个查询由于 AND 左边的结果为假,肯定不会返回任何结果,因此也就不会计算 1/0;第二个查询由于 OR 左边的结果为真,一定会返回结果,同样不会产生除零错误。

7.4 NOT 运算符

NOT 运算符可以结合其他的运算符一起使用,用于对查询条件的结果取反:

  • NOT BETWEEN,位于范围之外
  • NOT IN,不在列表之中
  • NOT LIKE,不匹配某个模式。LIKE 运算符用于字符串的模糊查找,将在下一篇中进行介绍
  • NOT EXISTS,子查询中不存在结果。关于子查询和 EXISTS 运算符,将在第 16 篇中进行介绍
  • NOT IS NULL,不为空。等价于 IS NOT NULL。


以下示例查找除了“刘备”、“关羽”以及“张飞”之外的其他员工:

SELECT emp_id, emp_name
  FROM employee
 WHERE emp_name NOT IN ('刘备', '关羽', '张飞');

该语句的结果如下(显示部分内容):

avatar

将多个逻辑运算符进行组合,可以构造任意复杂的查询条件。不过,需要注意不同的运算符之间的优先级问题。

8 运算符优先级

假如我们想要知道人力资源部(deptid = 2)或者财务部门(deptid = 3)中,哪些员工拥有奖金。如果使用以下查询:

SELECT emp_name, dept_id, bonus
  FROM employee
 WHERE dept_id = 2
    OR dept_id = 3
   AND bonus IS NOT NULL;

获得的结果如下:


avatar


其中有两条数据并不是我们期望的结果(“黄忠”和“魏延”并没有奖金)。那么问题出在哪里了呢?因为 AND 运算符比 OR 运算符的优先级高,所以该查询返回的是人力资源部(deptid = 2)的员工,或者财务部(deptid = 3)中拥有奖金的员工。


如果想要获得我们期望的结果,可以使用圆括号调整运算符的优先级:


SELECT emp_name, dept_id, bonus

FROM employee

WHERE (dept_id = 2 OR dept_id = 3)

AND bonus IS NOT NULL;

正确的结果如下:


avatar


以下是 SQL 中各种条件运算符按照优先级从高到低进行的排列;必要时可以使用圆括号进行调整。


=、!=、<>、<、<=、>、>=

IS [NOT] NULL、[NOT] LIKE、[NOT] BETWEEN、[NOT] IN、[NOT] EXISTS

NOT

AND

OR

除了使用查询条件过滤数据之外,SQL 还提供了一种特殊的数据选择操作:去除查询结果中的重复值。

9 去除重复值

SQL 使用 DISTINCT 关键字去除查询结果中的重复数据。例如,以下查询返回了员工表所有可能的性别:

SELECT DISTINCT sex
  FROM employee;
sex|
---|
男 |
女 |

首先,DISTINCT 位于 SELECT 之后而不是像其他过滤条件一样位于 WHERE 之后;其次,查询结果中重复的记录只会出现一次。


与 DISTINCT 相反的是 ALL,用于返回不去重的结果。我们通常不需要加上 ALL 关键字,因为它是默认的行为。另外,为了消除重复值,数据库系统需要对结果进行排序,然后扫描重复值;因此,大量数据的重复值处理可能会降低查询的速度。


Oracle 中的 UNIQUE 等价于 DISTINCT,MySQL 中的 DISTINCTROW 等价于 DISTINCT。


10 总结

在 SQL 中使用 WHERE 子句指定一个或者多个过滤条件,可以查找满足要求的数据。SQL 查询条件中支持各种比较运算符、逻辑运算符以及空值判断等。另外,DISITINCT 关键字可以去除查询结果中的重复记录。


练习题:查找 2018 年 1 月 1 日之后入职,月薪小于 5000,并且奖金小于 1000(包括没有奖金)的员工。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
存储 算法 关系型数据库
MySQL怎样处理排序⭐️如何优化需要排序的查询?
MySQL怎样处理排序⭐️如何优化需要排序的查询?
|
5天前
|
SQL 关系型数据库 MySQL
MySQL数据库的约束+进阶版新增与查询-2
MySQL数据库的约束+进阶版新增与查询
12 1
|
5天前
|
关系型数据库 MySQL 测试技术
MySQL数据库的约束+进阶版新增与查询-1
MySQL数据库的约束+进阶版新增与查询
15 1
|
5天前
|
SQL 存储 关系型数据库
MySQL查询原理,看这一篇就够了!
MySQL查询原理,看这一篇就够了!
|
8天前
|
SQL 关系型数据库 MySQL
MySQL 基本概念 基础用法 增删改查(特殊查询)语法 详细篇
MySQL 基本概念 基础用法 增删改查(特殊查询)语法 详细篇
|
9天前
|
缓存 关系型数据库 MySQL
为什么MySQL分页查询偏移量越大查询越慢
【5月更文挑战第1天】为什么MySQL分页查询偏移量越大查询越慢
48 4
|
12天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-排序查询-语法&注意事项&可cv例题语句
【MySQL】DQL-排序查询-语法&注意事项&可cv例题语句
|
12天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句
【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句
|
12天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-分组查询-语法&where与having的区别&注意事项&可cv例题语句
【MySQL】DQL-分组查询-语法&where与having的区别&注意事项&可cv例题语句
【MySQL】DQL-分组查询-语法&where与having的区别&注意事项&可cv例题语句
|
12天前
|
SQL 关系型数据库 MySQL
【MySQL-8】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)
【MySQL-8】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)