WHERE
子句
排序检索数据 只是获取数据的第一步
数据库表一般包含大量的数据,很少需要检索表中的所有行,通常只会根据特定操作或报告的需要提取表数据的子集
只检索所需数据需要指定 搜索条件(search criteria),搜索条件也称为 过滤条件(filter condition)
在 SELECT
语句中,数据根据 WHERE
子句中指定的搜索条件进行过滤WHERE
子句在表名(FROM
子句)之后给出
SELECT prod_name, prod_price
FROM Products WHERE prod_price = 4.49;
从 Products 表中检索两个列,但是不返回所有的行,只返回 prod_price 值为 4.49 的行
显示数字 10 和 10.00 是一样的,显示不同只是因为 DBMS 指定了所使用的数据类型及其默认行为
WHERE
子句的位置 :
在同时使用ORDER BY
和WHERE
子句时,应该让ORDER BY
位于WHERE
之后,否则将产生错误
WHERE
子句操作符
!=
和 <>
通常可以互换,但是各个 DBMS 支持的操作还是有所不同,所以具体使用需要根据 DBMS 来确定
匹配检查
示例代码如下
SELECT prod_name, prod_price
FROM Products WHERE prod_price <= 10;
mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE prod_name = 'fuses';
检查
WHERE prod_name= ‘fuses’
语句,返回 prod_name 的值为 Fuses 的一行
MySQL 在执行匹配时默认不区分大小写,所以 fuses 与 Fuses 匹配
不匹配检查
示例代码如下
SELECT vend_id, prod_name
FROM Products WHERE vend_id <> '1001';
上述语句中,使用了单引号
单引号用来限定字符串
如果将值与字符串类型的列进行比较,就需要限定引号
用来与数值列进行比较的值则不用引号
范围值检查
要检查某个范围的值,可以使用 BETWEEN
操作符,需要两个值,分别为范围的开始值和结束值
示例代码
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 and 10;
在使用
BETWEEN
时,必须指定两个值——所需范围的最小值和最大值,两个值必须使用AND
分隔BETWEEN
匹配范围内所有的值,包括指定的开始值和结束值
空值检查
在创建表时,表设计人员可以指定其中的列能否不包括值,在一个列不包含值时,称其包含空值 NULL
NULL :无值(no value),与字段包含0、空字符串或仅仅包含空格不同
确定值是否为 NULL,不能简单地检查是否 = NULL
SELECT
语句使用一个特殊的 WHERE
子句(IS NULL
子句)来检查具有 NULL
值的列
SELECT prod_name, prod_price
FROM Products WHERE prod_price IS NULL;
没有符合条件的列,则没有返回,有则返回
mysql> SELECT cust_id FROM customers
-> WHERE cust_email IS NULL;
NULL
和非匹配:
- 通过过滤选择不包含指定值的行时,有时,可能是希望返回含有
NULL
值的行。但是这做不到- 因为未知有特殊的含义,数据库不知道他们是否匹配,所以在进行匹配过滤或者非匹配过滤时,不会返回这些结果
- 过滤数据时,一定要验证被过滤列中包含
NULL
的行确实出现在返回的数据中
组合 WHERE
子句
为了进行更强的过滤控制,MySQL 允许给出多个 WHERE
子句,这些子句可以有两种方式使用:AND
子句或者 OR
子句
操作符(operator):
用来联结或者改变WHERE
子句中的子句的关键字,也称为逻辑操作符(logical operator)
AND
操作符
SQL 过滤与应用过滤
数据也可以在应用层过滤
为此,SQL的 SELECT
语句为客户端应用检索出超过实际所需的数据,然后客户端代码对返回数据进行循环,提取出需要的行
通常,这种做法不建议采取。优化数据库后可以更快速有效地对数据进行过滤
而让客户端应用(或开发语言)处理数据库地工作将会极大地影响应的性能,并且使所创建的应用完全不具备可伸缩性。此外,如果在客户端过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费