过滤数据
本文将讲授如何使用SELECT语句的WHERE子句指定搜索条件。
WHERE子句
数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或需要提取表数据的子集。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition )。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出,如下所示:
【示例】找出employees表中员工id为100的员工的所有信息
SELECT *
FROM `employees`
WHERE employee_id = 100;
运行结果:
MySQL在执行匹配时默认不区分大小写。
在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误,后面还会学习其它的子句,在全部学完之后,我会总结一下每个子句的先后顺序。
WHERE子句操作符
上面例子中,我们使用等号对条件进行相等比较,where子句还为我们提供了其它的操作符,让我们能够更加灵活地操作筛选的条件。下表给出这些操作符以及对应的含义
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN A AND B | 在 A 和 B 之间 |
【示例】找出employees表中部门id(department_id)小于等于40的所有员工数据
SELECT *
FROM `employees`
WHERE department_id <= 40;
运行结果:
【示例】找出employees表中job_id不是ST_CLERK的所有员工数据
SELECT *
FROM `employees`
WHERE job_id != 'st_clerk';
如果匹配的是字符串类型,则需要加引号,单引号和双引号都可以
<>
和 !=
都可以表示‘不等于’,我更习惯使用!=
,因为在其他的一些语言中(Java,python)中,它也表示不等于。
【示例】找出employees表中员工id在100和110之间的员工的所有信息
SELECT *
FROM `employees`
WHERE employee_id BETWEEN 100 AND 110;
运行结果:
空值检查
在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为包含空值NULL。
NULL: 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。
SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。其用法如下:
【示例】查询employees表中manager_id 为 NULL的条目信息
SELECT *
FROM `employees`
WHERE manager_id IS NULL;
运行结果:
IS NOT NULL
则可以实现相反的效果,NOT操作符的具体含义,我会在下面讲解
组合子句
为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。
AND操作符
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
【示例】查找employees表中first_name为David且last_name为Austin的条目信息
SELECT *
FROM `employees`
WHERE first_name = 'david' AND last_name = 'austin';
运行结果:
OR操作符
OR操作符指示MySQL检索匹配任一条件的行。
【示例】查找employees表中first_name为David或first_name为John的条目信息
SELECT *
FROM `employees`
WHERE first_name = 'david' OR first_name = 'john';
运行结果:
计算次序
WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。但是,组合AND和OR带来了一个的问题。SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。换句话说,由于AND在计算次序中优先级更高,写多个操作符的话可能会被错误地组合了。
此问题的解决方法是使用圆括号明确地分组相应的操作符。
【示例】查找employees表中first_name为David或John,且salary大于9000的条目信息
SELECT *
FROM `employees`
WHERE (first_name = 'david' OR first_name = 'john') AND salary > 9000;
运行结果:
IN操作符
圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
【示例】查找employees表中salary为2200,2400和3300的条目信息
SELECT *
FROM `employees`
WHERE salary IN (2200,2400,3300);
运行结果;
IN操作符和OR连接多个子句的功能类似,但选择使用它的优点如下:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比OR操作符清单执行更快。
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。后续文章将对此进行详细介绍。
NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
【示例】查找employees表中commission_pct字段不为空的条目信息
SELECT *
FROM `employees`
WHERE commission_pct IS NOT NULL;