暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

条件查询

SQL新手 2022-12-08
402

当要查询满足特定条件的数据时,可以通过给 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 值专用查询

由于比较运算符、LIKEBETWEEN ANDINNOT 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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论