数据过滤
1. WHERE子句
1.1 WHERE子句基础语法
-
数据库表中一般会包括大量数据,我们很少会检索表中所有的行。通常只需要根据特定条件提取需要的行即可。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
-
语法
SELECT colName
FROM tableName
WHERE filterCondition;
# 例
SELECT prod_name,prod_price
FROM products
WHERE prod_price = 2.50;
- WHERE子句的位置:应位于ORDER BY子句之前
1.2 WHERE子句操作符
- WHERE子句操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
1.2.1 单个值/不匹配检查
# 单个值检查
SELECT prod_name,prod_price
FROM products
WHERE prod_name = 'fuses';
# 不匹配检查
SELECT vend_id,prod_name
FROM products
WHERE vend_id <> 1003; # <>与!=是等效的
- 使用单引号:在将值与字符串比较时,需要将字符串用单引号来限制。
1.2.2 范围值检查
- BETWEEN操作符:使用时需要指定最大和最小两个值,且需要使用AND关键字分隔。BETWEEN会匹配范围内所有值,包括指定的最大和最小值。
# 范围值检查
SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
1.2.3 空值检查
-
NULL:无值(no value),与字段0、空字符串、空格不同。
-
IS NULL子句:检查具有NULL值的列
-
不匹配检查与NULL值:在进行匹配过滤或不匹配过滤时,数据库不会返回具有NULL值的行。因此在过滤数据时要验证返回数据中是否给出了被过滤列具有NULL的行。
SELECT cust_id
FROM customers
WHERE cust_email IS NULL;
2. 高级搜索——NOT 和 IN操作符
2.1 连结WHERE子句
- 为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以通过两种方式使用:以AND子句或OR子句方式
- 操作符(operator):用来连结或改变WHERE子句中的关键字,也称逻辑操作符(logical operator)
2.1.1 AND 操作符
- AND :用在WHERE子句中的关键字,用于添加检索条件,并指示返回满足所有给定条件的行
SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <> 10;
2.1.2 OR操作符
- OR : 用在WHERE子句中的关键字,用于添加检索条件,表示检索满足任一给定条件的行
SELECT prod_id, prod_price
FROM products
WHERE vend_id = 1003 OR vend_id = 1002;
2.1.3 操作次序
- AND 与 OR的操作次序:像大多数语言一样,SQL会优先处理AND操作。因此,在使用复杂筛选条件的时候,应该尽可能使用圆括号()来分组操作符。
# 列出价格为10美元(含)以上且由1002或1003制造的所有产品
SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
2.2 IN操作符
- IN:WHERE子句中用来指定要匹配值清单的关键字,功能与OR相当
- IN操作符用来指定条件范围,范围中每一个条件都可以进行匹配
- 使用圆括号来创建清单,并将每个匹配值用逗号分隔开
- IN操作符的优点
- 在使用长的合法选项清单时,IN操作符语法清楚且直观
- 使用IN时,计算次序更容易管理(使用操作符次数减少)
- IN操作符一般比OR执行更快
- IN可以包含其他SELECT语句,可以更动态地建立WHERE子句。
SELECT prod_name, prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name DESC;
2.3 NOT操作符
- NOT: WHERE子句中用来否定跟在其后面条件的关键字
- 在复杂的子句中,NOT是十分高效的,如在与IN结合使用时,找出与条件列表不匹配的行非常简单
- MySQL中的NOT: MySQL支持对IN、BEWTEEN、EXISTS子句取反
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name DESC;