日常业务中经常需要通过查询条件过滤数据。




mysql中like多个值 mysql like 多个条件_运算符


1 查询条件


mysql中like多个值 mysql like 多个条件_运算符_02


1.1 WHERE

指定查询的过滤条件。以下语句只返回姓名为“刘备”的员工信息:


mysql中like多个值 mysql like 多个条件_运算符_03


mysql中like多个值 mysql like 多个条件_mysql中like多个值_04


WHERE 位于 FROM 之后,指定一个或者多个过滤条件,满足条件的数据才会返回。

WHERE 子句被称为谓词(Predicate)。


mysql中like多个值 mysql like 多个条件_数据_05


2 选择(Selection)


mysql中like多个值 mysql like 多个条件_mysql中like多个值_06


通过查询条件过滤数据的操作在关系运算中被称为选择


mysql中like多个值 mysql like 多个条件_运算符_07


它是针对表进行的水平选择,保留满足条件的行生成的新表


mysql中like多个值 mysql like 多个条件_mysql中like多个值_08


3 比较运算符


mysql中like多个值 mysql like 多个条件_运算符_09


比较两个数值的大小,包括字符、数字以及日期类型的数据。

  • MySQL 的比较运算符

查询员工在 2018 年 11 月 11 日之后入职


mysql中like多个值 mysql like 多个条件_mysql中like多个值_10


mysql中like多个值 mysql like 多个条件_运算符_11


其中,DATE 定义了一个日期类型的常量值。指定日期时也可以省略 DATE


mysql中like多个值 mysql like 多个条件_mysql中like多个值_12


mysql中like多个值 mysql like 多个条件_运算符_13


4 BETWEEN


mysql中like多个值 mysql like 多个条件_运算符_14


想要查找一个范围内的数据。
查询月薪位于 10000 到 15000 之间的员工:


mysql中like多个值 mysql like 多个条件_运算符_15


mysql中like多个值 mysql like 多个条件_运算符_16


需要注意的是,BETWEEN 包含了两端的值(10000 和 15000)。


mysql中like多个值 mysql like 多个条件_数据_17


5 IN 运算符


mysql中like多个值 mysql like 多个条件_数据_18


5.1 查找列表中的值


mysql中like多个值 mysql like 多个条件_运算符_19


查询姓名为“刘备”、“关羽”或者“张飞”的员工:


mysql中like多个值 mysql like 多个条件_mysql中like多个值_20


mysql中like多个值 mysql like 多个条件_数据_21


只要匹配列表中的任何一个值,都会返回结果


mysql中like多个值 mysql like 多个条件_运算符_22


6 空值判断


mysql中like多个值 mysql like 多个条件_mysql中like多个值_23


代表缺失或者未知的数据.

判断一个值是否为空不能使用等于或者不等于.

例如,以下查询尝试找出没有上级领导(manager 字段为空)的员工:

空值判断的错误示例


mysql中like多个值 mysql like 多个条件_运算符_24


该语句没有返回任何结果


mysql中like多个值 mysql like 多个条件_运算符_25


但确实存在这样的数据。错因在于将一个值与一个未知的值进行数学比较,结果仍然未知;即使是将两个空值进行比较,结果也是未知。
以下运算均是非法的,在 MySQL8.0 版本下,会报错


mysql中like多个值 mysql like 多个条件_mysql中like多个值_26


  • [42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘NULL != NULL’ at line 1

6.1 空值判断


mysql中like多个值 mysql like 多个条件_mysql中like多个值_27


mysql中like多个值 mysql like 多个条件_mysql中like多个值_28


expression 的值为空,IS NULL 返回真,IS NOT NULL 返回假

表达式的值不为空,IS NULL 返回假,IS NOT NULL 返回真

查找没有上级领导的员工


mysql中like多个值 mysql like 多个条件_运算符_29


mysql中like多个值 mysql like 多个条件_数据_30


如果仅仅能够指定单个过滤条件,就无法满足复杂的查询需求;为此,SQL 引入了用于构建复杂条件的逻辑运算符。


mysql中like多个值 mysql like 多个条件_mysql中like多个值_31


7 复合条件


mysql中like多个值 mysql like 多个条件_mysql中like多个值_32


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

7.1 AND 逻辑与运算符


mysql中like多个值 mysql like 多个条件_数据_33


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

以下示例使用 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 运算符


mysql中like多个值 mysql like 多个条件_mysql中like多个值_34


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

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

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

7.3 短路运算


mysql中like多个值 mysql like 多个条件_数据_35


对于逻辑运算符 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 运算符


mysql中like多个值 mysql like 多个条件_数据_36


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 ('刘备', '关羽', '张飞');

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


mysql中like多个值 mysql like 多个条件_mysql中like多个值_37


8 运算符优先级


mysql中like多个值 mysql like 多个条件_数据_38


假如我们想要知道人力资源部(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;