where子句用于按照筛选条件过滤结果集,输出满足筛选条件的数据,类似java中的IF语句。基本语法如下
select
查询列表
from
表名
where
筛选条件
条件筛选要求筛选条件返回是或否,那么可以
- 是单个条件表达式
- 单个模糊表达式
- 由逻辑运算符连接的、若干个条件表示式或模糊表达式构成的逻辑表达式。
其执行顺序为
- 查表。查询数据库中等于表名的数据表
- 过滤。按照筛选条件,逐行过滤数据表中的数据
- 格式化。按照查询列表的格式,输出上一步过滤的数据集。
根据筛选条件的不同,where字句可分为以下
- 按条件表达式
大于(>)、小于(<)、等于(=,注意不是java中的赋值符)、不等于(推荐标准写法是’<>‘,也支持’!=’)、大于等于(>=)、小于等于(<=)、安全等于(<=>,可判断是否是null) - 按逻辑表达式
- 逻辑运算符连接多个条件表达式,构成逻辑表达式
- 与(推荐标准写法’and‘,也支持’&&’)、或(推荐标准写法’or‘,也支持’||‘)、非(推荐标准写法’not’,也支持’!’)
- 按模糊表达式
- 通配符
%表示任意多个字符,_表示任意单个字符
当目标字符包含通配符时,使用反斜杠(\)或自定义实现转义
转义的实现也可以使用 escape关键字自定义转义符,注意 escape后的字符需用引号包裹。其用法如下
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_#_%' ESCAPE '#' //设置'#'为转义字符
- like
一般和通配符连用。 - between…and…
该关键字是对 >= 和 <= 的简写方式,注意包含了临界值的情况
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120
#上下两种方式查询结果一样,但between更简洁
SELECT
*
FROM
employees
WHERE
employee_id >=100 AND employee_id <=120
between的取反操作,表示小于操作数1 或者 大于操作数2的数据集合,有两种方式
# not在字段前面
SELECT last_name, salary
FROM employees
WHERE NOT (salary BETWEEN 8000 AND 17000) //这种情况也可以不加括号,说明mysql的not的优先级低于 between...and...
ORDER BY salary DESC
#字段在not前面
SELECT last_name, salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC
- in
判断某字段是否属于有限集合,是 对or连接的多个等于条件表达式的简写。
有限集合内的数据类型一致或者可以类型对齐。
SELECT
*
FROM
employees
WHERE
job_id IN ('AD_VP','FI_MGR')//有限集合的元素是字符时,要用引号包裹,否则被识别为变量
#上下两种方式结果一样,in是简写
SELECT
*
FROM
employees
WHERE
job_id = 'AD_VP' OR job_id ='FI_MGR' //or链接的两个等于条件表达式
- is null / is not null
由于 = 和 <> 不能用于判断null值,mysql提供is null 和 is not null实现null判断。
字段 is null 的功能等价于安全等于 字段 <=> null
SELECT
*
FROM
employees
WHERE
commission_pct IS NOT NULL