基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
条件查询
更新时间:2023-07-18 17:25:59
当要查询满足指定条件的数据时,可以通过给 SELECT 查询语句增加一个 WHERE 子句来实现。
条件查询语法
在执行条件查询时,首先通过 FROM 子句之后 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 | 35 |
+---------+--------+
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 |
| ALLEN | 35 |
| JONES | 40 |
| SCOTT | 25 |
| FORD | 45 |
+---------+--------+
5 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno != 30;
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| SMITH | 20 |
| ALLEN | 35 |
| JONES | 40 |
| SCOTT | 25 |
| FORD | 45 |
+---------+--------+
5 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 |
+---------+--------+
| ALLEN | 35 |
| JONES | 40 |
| FORD | 45 |
+---------+--------+
3 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno >= 30;
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| ALLEN | 35 |
| JONES | 40 |
| BLAKE | 30 |
| FORD | 45 |
+---------+--------+
4 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno < 30;
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| SMITH | 20 |
| SCOTT | 25 |
+---------+--------+
2 rows in set
obclient> SELECT empname, deptno FROM emp WHERE deptno <= 30;
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| SMITH | 20 |
| BLAKE | 30 |
| SCOTT | 25 |
+---------+--------+
3 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 |
+---------+--------+------+
| BLAKE | 30 | 2850 |
| SCOTT | 25 | 3000 |
+---------+--------+------+
2 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 |
| ALLEN | 35 | 1600 |
| JONES | 40 | 2975 |
| BLAKE | 30 | 2850 |
| SCOTT | 25 | 3000 |
| FORD | 45 | 3000 |
+---------+--------+------+
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 | 35 |
+---------+--------+
1 row in set
如下示例为查询员工姓名首字母为"A" 的数据。
obclient> SELECT empname, deptno FROM emp WHERE empname LIKE 'A%';
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| ALLEN | 35 |
+---------+--------+
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 | AGE |
+-------+---------+---------+------+-----------+------+------+--------+------+
| 1566 | JONES | MANAGER | 1839 | 02-APR-81 | 2975 | NULL | 40 | 22 |
| 1698 | BLAKE | MANAGER | 1839 | 01-MAY-81 | 2850 | NULL | 30 | 33 |
+-------+---------+---------+------+-----------+------+------+--------+------+
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 | AGE |
+-------+---------+---------+------+-----------+------+------+--------+------+
| 1566 | JONES | MANAGER | 1839 | 02-APR-81 | 2975 | NULL | 40 | 22 |
| 1698 | BLAKE | MANAGER | 1839 | 01-MAY-81 | 2850 | NULL | 30 | 33 |
+-------+---------+---------+------+-----------+------+------+--------+------+
2 rows in set
NULL 值专用查询(IS NULL/IS NOT 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 | AGE |
+-------+---------+---------+------+-----------+------+------+--------+------+
| 1369 | SMITH | CLERK | 1902 | 17-DEC-80 | 800 | NULL | 20 | 22 |
| 1566 | JONES | MANAGER | 1839 | 02-APR-81 | 2975 | NULL | 40 | 22 |
| 1698 | BLAKE | MANAGER | 1839 | 01-MAY-81 | 2850 | NULL | 30 | 33 |
| 1788 | SCOTT | ANALYST | 1566 | 15-JUL-87 | 3000 | NULL | 25 | 33 |
| 1902 | FORD | ANALYST | 1566 | 05-DEC-81 | 3000 | NULL | 45 | 22 |
+-------+---------+---------+------+-----------+------+------+--------+------+
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 | AGE |
+-------+---------+----------+------+-----------+------+------+--------+------+
| 1499 | ALLEN | SALESMAN | 1698 | 20-FEB-81 | 1600 | 300 | 35 | 22 |
+-------+---------+----------+------+-----------+------+------+--------+------+
1 row in set