WHERE 子句

排序检索数据 只是获取数据的第一步

数据库表一般包含大量的数据,很少需要检索表中的所有行,通常只会根据特定操作或报告的需要提取表数据的子集

只检索所需数据需要指定 搜索条件(search criteria),搜索条件也称为 过滤条件(filter condition)

SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤
WHERE 子句在表名(FROM子句)之后给出

SELECT prod_name, prod_price 
FROM Products WHERE prod_price = 4.49;

amp mysql自动过滤 mysql过滤条件_amp mysql自动过滤


从 Products 表中检索两个列,但是不返回所有的行,只返回 prod_price 值为 4.49 的行

显示数字 10 和 10.00 是一样的,显示不同只是因为 DBMS 指定了所使用的数据类型及其默认行为

amp mysql自动过滤 mysql过滤条件_经验分享_02

WHERE 子句的位置 :
在同时使用 ORDER BYWHERE 子句时,应该让 ORDER BY 位于 WHERE 之后,否则将产生错误


WHERE 子句操作符

amp mysql自动过滤 mysql过滤条件_amp mysql自动过滤_03

!=<> 通常可以互换,但是各个 DBMS 支持的操作还是有所不同,所以具体使用需要根据 DBMS 来确定


匹配检查

示例代码如下

SELECT prod_name, prod_price 
FROM Products WHERE prod_price <= 10;

amp mysql自动过滤 mysql过滤条件_mysql_04

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_name = 'fuses';

amp mysql自动过滤 mysql过滤条件_数据库_05

检查 WHERE prod_name= ‘fuses’ 语句,返回 prod_name 的值为 Fuses 的一行
MySQL 在执行匹配时默认不区分大小写,所以 fuses 与 Fuses 匹配


不匹配检查

示例代码如下

SELECT vend_id, prod_name 
FROM Products WHERE vend_id <> '1001';

amp mysql自动过滤 mysql过滤条件_数据库_06

上述语句中,使用了单引号
单引号用来限定字符串
如果将值与字符串类型的列进行比较,就需要限定引号
用来与数值列进行比较的值则不用引号


范围值检查

要检查某个范围的值,可以使用 BETWEEN 操作符,需要两个值,分别为范围的开始值和结束值

示例代码

SELECT prod_name, prod_price 
FROM Products 
WHERE prod_price BETWEEN 5 and 10;

amp mysql自动过滤 mysql过滤条件_经验分享_07

在使用 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;

amp mysql自动过滤 mysql过滤条件_经验分享_08

NULL 和非匹配:

  1. 通过过滤选择不包含指定值的行时,有时,可能是希望返回含有 NULL 值的行。但是这做不到
  2. 因为未知有特殊的含义,数据库不知道他们是否匹配,所以在进行匹配过滤或者非匹配过滤时,不会返回这些结果
  3. 过滤数据时,一定要验证被过滤列中包含 NULL 的行确实出现在返回的数据中

组合 WHERE 子句

为了进行更强的过滤控制,MySQL 允许给出多个 WHERE 子句,这些子句可以有两种方式使用:AND 子句或者 OR 子句

操作符(operator):
用来联结或者改变 WHERE 子句中的子句的关键字,也称为逻辑操作符(logical operator)

AND 操作符

SQL 过滤与应用过滤

数据也可以在应用层过滤
为此,SQL的 SELECT 语句为客户端应用检索出超过实际所需的数据,然后客户端代码对返回数据进行循环,提取出需要的行

通常,这种做法不建议采取。优化数据库后可以更快速有效地对数据进行过滤
而让客户端应用(或开发语言)处理数据库地工作将会极大地影响应的性能,并且使所创建的应用完全不具备可伸缩性。此外,如果在客户端过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费