当要查询满足特定条件的数据时,可以通过给 SELECT 查询语句增加一个 WHERE 子句来实现。
条件查询语法
在执行条件查询时,首先通过 WHERE 子句查询出符合指定条件的记录,然后再通过 SELECT 语句选取指定的列。
条件查询的 SQL 语句格式如下:
SELECT select_list FROM table_list
WHERE query_condition
关键字 WHERE 后面可以带有一个或者多个条件。条件是对前面数据的筛选,只有满足 WHERE 条件的数据才会被返回。
常用的查询条件
WHERE 子句常用的查询条件如下表所示。
| 查询条件类型 | 谓词 |
|---|---|
| 比较查询 | =,>,<,>=,<=,!=,<> |
| 逻辑查询(多重条件) | AND,OR,NOT |
| 模糊查询(字符匹配) | LIKE,NOT LIKE |
| 区间查询(确定范围) | BETWEEN AND,NOT BETWEEN AND |
| 指定集合查询 | IN,NOT IN |
| NULL 值查询 | IS NULL,IS NOT NULL |
比较条件查询
比较条件查询运算符包括 =,>,<,>=,<=,!=,<>。
等于(=)
查询出指定列中和目标值相等的数据。如果值是字符串类型,需要用单引号或者双引号括起来。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE column_name = const_value;
示例如下:
obclient> SELECT empname, deptno FROM emp WHERE deptno = 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN | 30 |
| BLAKE | 30 |
+---------+--------+
2 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno = '30';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN | 30 |
| BLAKE | 30 |
+---------+--------+
2 rows in set
obclient> SELECT empname, deptno FROM emp WHERE empname = 'ALLEN';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN | 30 |
+---------+--------+
1 row in set
不等于(<> 和 !=)
不等于包括 <> 和 != 两种写法。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE column_name <> const_value;
SELECT column_name [,column_name...] FROM table_name WHERE column_name != const_value;
示例如下:
obclient> SELECT empname, deptno FROM emp WHERE deptno <> 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH | 20 |
| JONES | 40 |
| SCOTT | 20 |
| FORD | 40 |
+---------+--------+
4 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno != 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH | 20 |
| JONES | 40 |
| SCOTT | 20 |
| FORD | 40 |
+---------+--------+
4 rows in set
大于(>)和小于(<)
大于(>)和小于(<)将数值按照大小比较。如果比较的是字符,则按照 ASCII 码对应的值进行比较,比较时按照字符对应的位置逐一进行比较。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE column_name < const_value;
SELECT column_name [,column_name...] FROM table_name WHERE column_name > const_value;
说明
大于等于(>=)和小于等于(<=)与之类似。
示例如下:
obclient> SELECT empname, deptno FROM emp WHERE deptno > 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| JONES | 40 |
| FORD | 40 |
+---------+--------+
2 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno >= 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN | 30 |
| JONES | 40 |
| BLAKE | 30 |
| FORD | 40 |
+---------+--------+
4 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno < 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH | 20 |
| SCOTT | 20 |
+---------+--------+
2 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno <= 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH | 20 |
| ALLEN | 30 |
| BLAKE | 30 |
| SCOTT | 20 |
+---------+--------+
4 rows in set
逻辑条件查询
逻辑查询运算符并且(AND)和或者(OR)支持多个条件的查询。
并且(AND)
返回同时满足 AND 两个条件的数据。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE
query_condition AND query_condition;
示例如下:
obclient> SELECT empname, deptno, sal FROM emp WHERE deptno <=30 AND sal>1000;
+---------+--------+---------+
| empname | deptno | sal |
+---------+--------+---------+
| ALLEN | 30 | 1600.00 |
| BLAKE | 30 | 2850.00 |
| SCOTT | 20 | 3000.00 |
+---------+--------+---------+
3 rows in set
或者(OR)
只要满足其中一个条件的数据都会被返回。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE
query_condition OR query_condition;
示例如下:
obclient> SELECT empname, deptno, sal FROM emp WHERE deptno<=30 OR sal>1000;
+---------+--------+---------+
| empname | deptno | sal |
+---------+--------+---------+
| SMITH | 20 | 800.00 |
| ALLEN | 30 | 1600.00 |
| JONES | 40 | 2975.00 |
| BLAKE | 30 | 2850.00 |
| SCOTT | 20 | 3000.00 |
| FORD | 40 | 3000.00 |
+---------+--------+---------+
6 rows in set
模糊查询(LIKE)
谓词 LIKE 可以用来进行字符串的匹配。一般格式如下:
[NOT] LIKE pattern
语法含义是查找对应列值与 pattern 相匹配的数据。pattern 可以是完整的字符串,也可以包含通配符 % 和 _ 。其中:
下划线 (_) 表示匹配任意一个字符。
百分号 (%) 表示可以匹配值中的零个或多个字符。模式"%"不能匹配
NULL。
如下示例为查询员工名前四个字母为"ALLE",最后一个为任意字符的数据。
obclient> SELECT empname, deptno FROM emp WHERE empname LIKE 'ALLE_';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN | 30 |
+---------+--------+
1 row in set
如下示例为查询员工姓名首字母为"A"的数据。
obclient> SELECT empname, deptno FROM emp WHERE empname LIKE 'A%';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN | 30 |
+---------+--------+
1 row in set
注意
当数据库字集为 ASCII 时一个汉字需要两个
_;当字符集为 GBK 时只需要一个_。
区间查询(BETWEEN AND)
操作符 BETWEEN ... AND 会选取介于两个值之间的数据。这些值可以是数值、文本或者日期。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE
[NOT] BETWEEN min_const_value AND max_const_value;
注意
区间查询的两个临界值不要调换位置,只能是大于等于左边的值,并且小于等于右边的值。
示例如下:
obclient> SELECT * FROM emp WHERE sal BETWEEN 2000 AND 2999;
+-------+---------+---------+------+------------+---------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+---------+------+------------+---------+------+--------+
| 1566 | JONES | MANAGER | 1839 | 1981-04-02 | 2975.00 | NULL | 40 |
| 1698 | BLAKE | MANAGER | 1839 | 1981-05-01 | 2850.00 | NULL | 30 |
+-------+---------+---------+------+------------+---------+------+--------+
2 rows in set
指定集合查询(IN)
操作符 IN 在 WHERE 子句指定的多个值,称之为一个集合。IN 表示指定列中的数据只要满足集合中任意一个都会被返回。NOT IN 表示和集合中都不匹配的数据才会被返回。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE
column_name [NOT] IN (const_value,const_value,const_value...);
注意
[NOT] IN集合中的值类型必须一致或相互兼容。[NOT] IN集合中的值不支持通配符。
示例如下:
obclient> SELECT * FROM emp WHERE deptno IN (30,40,50,60);
+-------+---------+----------+------+------------+---------+--------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+----------+------+------------+---------+--------+--------+
| 1499 | ALLEN | SALESMAN | 1698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 1566 | JONES | MANAGER | 1839 | 1981-04-02 | 2975.00 | NULL | 40 |
| 1698 | BLAKE | MANAGER | 1839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 1902 | FORD | ANALYST | 1566 | 1981-12-05 | 3000.00 | NULL | 40 |
+-------+---------+----------+------+------------+---------+--------+--------+
4 rows in set
NULL 值专用查询
由于比较运算符、LIKE、BETWEEN AND、IN、NOT IN 对 NULL 值的查询结果不准确,所以建议使用 NULL 值专用查询语句 IS NULL 和 IS NOT NULL。
IS NULL
IS NULL 用于查询指定的列的值为 NULL 的数据。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE
column_name IS NULL;
示例如下:
obclient> SELECT * FROM emp WHERE comm IS NULL;
+-------+---------+---------+------+------------+---------+------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+---------+------+------------+---------+------+--------+
| 1369 | SMITH | CLERK | 1902 | 1980-12-17 | 800.00 | NULL | 20 |
| 1566 | JONES | MANAGER | 1839 | 1981-04-02 | 2975.00 | NULL | 40 |
| 1698 | BLAKE | MANAGER | 1839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 1788 | SCOTT | ANALYST | 1566 | 1987-07-15 | 3000.00 | NULL | 20 |
| 1902 | FORD | ANALYST | 1566 | 1981-12-05 | 3000.00 | NULL | 40 |
+-------+---------+---------+------+------------+---------+------+--------+
5 rows in set
IS NOT NULL
IS NOT NULL 用于查询指定的列的值为非 NULL 的数据。一般格式为:
SELECT column_name [,column_name...] FROM table_name WHERE
column_name IS NOT NULL;
示例如下:
obclient> SELECT * FROM emp WHERE comm IS NOT NULL;
+-------+---------+----------+------+------------+---------+--------+--------+
| empno | empname | job | mgr | hiredate | sal | comm | deptno |
+-------+---------+----------+------+------------+---------+--------+--------+
| 1499 | ALLEN | SALESMAN | 1698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
+-------+---------+----------+------+------------+---------+--------+--------+
1 row in set
除此之外,还可以使用安全等于(<=>),其既可以判断普通的数值,也可以判断 NULL 值。示例如下:
obclient> SELECT empname, comm FROM emp WHERE comm <=> NULL;
+---------+------+
| empname | comm |
+---------+------+
| SMITH | NULL |
| JONES | NULL |
| BLAKE | NULL |
| SCOTT | NULL |
| FORD | NULL |
+---------+------+
5 rows in set



