使用WHERE子句
通常会根据操作或报告的需要提取表中的数据的子集。只检索所需数据需要指定的搜索条件, 搜索条件也称为过滤条件
在SELECT语句中, 数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
MariaDB [crashcourse]> SELECT prod_name, prod_price FROM products WHERE prod_price=2.50; +---------------+------------+ | prod_name | prod_price | +---------------+------------+ | Carrots | 2.50 | | TNT (1 stick) | 2.50 | +---------------+------------+ 2 rows in set (0.002 sec) MariaDB [crashcourse]>
这个例子采用了简单的相等测试: 它检查一个列是否具有指定的值, 据此进行过滤。
WHERE子句的位置
在同时使用ORDER BY和WHERE子句时, 应该让ORDER BY位于WHERE之后, 否则将会产生错误。
WHERE子句操作符
MySQL支持表中所有条件的操作符
操作符 | 说明 |
= | 不等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
检查单个值
测试相等的例子
MariaDB [crashcourse]> SELECT prod_name, prod_price FROM products WHERE prod_name=‘fuses‘; +-----------+------------+ | prod_name | prod_price | +-----------+------------+ | Fuses | 3.42 | +-----------+------------+ 1 row in set (0.001 sec) MariaDB [crashcourse]>
MySQL不区分大小写, 所以fuses与Fuses相匹配
测试小于的例子
MariaDB [crashcourse]> SELECT prod_name, prod_price FROM products WHERE prod_price < 10; +---------------+------------+ | prod_name | prod_price | +---------------+------------+ | .5 ton anvil | 5.99 | | 1 ton anvil | 9.99 | | Carrots | 2.50 | | Fuses | 3.42 | | Oil can | 8.99 | | Sling | 4.49 | | TNT (1 stick) | 2.50 | +---------------+------------+ 7 rows in set (0.002 sec) MariaDB [crashcourse]>
不匹配检索
MariaDB [crashcourse]> SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003; +---------+--------------+ | vend_id | prod_name | +---------+--------------+ | 1001 | .5 ton anvil | | 1001 | 1 ton anvil | | 1001 | 2 ton anvil | | 1002 | Fuses | | 1005 | JetPack 1000 | | 1005 | JetPack 2000 | | 1002 | Oil can | +---------+--------------+ 7 rows in set (0.001 sec) MariaDB [crashcourse]>
何时使用引号
单引号用来限定字符串。如果将值与串类型的列进行比较则需要使用单引号, 用来与数值列进行比较的值不用引号
范围值检查
为了检查某个范围的值, 可使用BETWEEN操作符。BETWEEN需要两个值, 即范围的开始值和结束值。
MariaDB [crashcourse]> SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10; +----------------+------------+ | prod_name | prod_price | +----------------+------------+ | .5 ton anvil | 5.99 | | 1 ton anvil | 9.99 | | Bird seed | 10.00 | | Oil can | 8.99 | | TNT (5 sticks) | 10.00 | +----------------+------------+ 5 rows in set (0.001 sec) MariaDB [crashcourse]>
在使用BETWEEN时, 必须指定两个值-所需范围的低端值和高端值。这两个值必须用AND关键字分割。BETWEEN匹配范围中的所有值, 包括指定的开始值和结束值
空值检查
在一个列不包含值时, 称其为包含空值NULL
NULL: 无值, 它与字段包含0、空字符串或仅仅包含空格不同
SELECT语句中有一个特殊的WHERE子句, 可用来检查具有NULL的值, 这个WHERE子句就是IS NULL子句。
MariaDB [crashcourse]> SELECT cust_id FROM customers WHERE cust_email IS NULL; +---------+ | cust_id | +---------+ | 10002 | | 10005 | +---------+ 2 rows in set (0.001 sec) MariaDB [crashcourse]>
这条语句返回没有邮箱(空cust_email字段, 不是邮箱为0)的所有顾客id。
NULL与不匹配
在通过过滤选择出不具有特定值的行时, 可能希望返回具有NULL的值的行, 但是不行, 因为未知具有特殊的含义, 数据库不知道它们是否匹配, 所以在匹配过滤或不匹配过滤时不返回它们。
因此, 在过滤数据时, 一定要验证返回数据中确实给出了被过滤列具有NULL的行