where子句用于按照筛选条件过滤结果集,输出满足筛选条件的数据,类似java中的IF语句。基本语法如下

select
	查询列表
from
	表名
where
	筛选条件

条件筛选要求筛选条件返回是或否,那么可以

  • 是单个条件表达式
  • 单个模糊表达式
  • 由逻辑运算符连接的、若干个条件表示式或模糊表达式构成的逻辑表达式。

其执行顺序为

  1. 查表。查询数据库中等于表名的数据表
  2. 过滤。按照筛选条件,逐行过滤数据表中的数据
  3. 格式化。按照查询列表的格式,输出上一步过滤的数据集。

根据筛选条件的不同,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