《Oracle 入门教程》第 05 篇 数据过滤

文章目录

        5.1 过滤条件
        5.2 模式匹配
        5.3 空值判断
        5.4 复合条件
        5.5 去除重复数据

上一篇介绍了如何使用 SELECT 语句查询表中的数据,查询返回了全部的数据行。本篇我们讨论如何利用WHERE子句返回满足条件的数据,以及使用DISTINCT去除查询结果中的重复值。
5.1 过滤条件

在实际应用中,我们通常不需要查看表中的全部数据,而是返回满足指定条件的数据;例如找出某天入职的员工,某个用户未完成的订单等。此时,我们就可以利用WHERE子句来实现数据的过滤。

SELECT column1, column2, ...
FROM table_name
WHERE conditions;

其中,WHERE 子句位于 FROM 子句之后,conditions 用于指定一个或者多个逻辑条件。对于表中的数据行,如果满足该条件就会返回,否则将被忽略。例如:

SELECT emp_name, hire_date, salary
FROM employee
WHERE hire_date = DATE '2018-11-11';

EMP_NAME|HIRE_DATE          |SALARY|
--------|-------------------|------|
邓芝     |2018-11-11 00:00:00|  4000|

其中,WHERE 子句中的等于号(=)是一个比较运算符,只有比较的结果为真(True)时才返回对应的数据行。因此,以上语句返回了 2018 年 11 月 11 日入职的员工。

除了等号运算符之外,Oracle 还提供了很多其他的比较运算符,如下表所示:
 

以上这些运算符的作用都比较容易理解,需要注意BETWEEN包含了两端的值,等价于>=加上<=。例如:

SELECT emp_name,
       salary
FROM employee
WHERE salary BETWEEN 11000 AND 12000;

EMP_NAME|SALARY|
--------|------|
孙尚香   | 12000|

运算符IN可以实现一次和多个数据的等于比较,例如:

SELECT emp_name,
       salary
FROM employee
WHERE salary IN (10000 ,12000, 15000);

EMP_NAME|SALARY|
--------|------|
孙尚香   | 12000|
赵云     | 15000|
法正     | 10000|

以上查询返回了月薪为 10000、12000 或者 15000 的员工。该查询也可以使用ANY或者SOME运算符实现:

SELECT emp_name,
       salary
FROM employee
WHERE salary =ANY (10000 ,12000, 15000);

EMP_NAME|SALARY|
--------|------|
孙尚香   | 12000|
赵云     | 15000|
法正     | 10000|

    📝SOME 和 ANY 是同义词,可以互相替换。

运算符ALL表示和列表中的所有数据比较,例如:

SELECT emp_name,
       salary
FROM employee
WHERE salary >ALL (10000 ,12000, 15000);

EMP_NAME|SALARY|
--------|------|
刘备     | 30000|
关羽     | 26000|
张飞     | 24000|
诸葛亮    | 24000|

查询返回的是月薪大于列表中所有数据的员工,也就是大于 15000 的员工。

    📝ANY/SOME 以及 ALL 通常和 =、!=、>、>=、 <、<= 等一起使用。同时,IN、ANY/SOME 以及 ALL 中还可以使用子查询语句,我们在后续文涨中进行介绍。

5.2 模式匹配

Oracle 提供了字符串的模式匹配功能,也就是LIKE运算符。例如查找名字中包含“飞”字的员工:

SELECT emp_name,
       salary
FROM employee
WHERE emp_name LIKE '%飞%';

其中,百分号(%)是一个通配符,表示匹配零个或者多个任意字符。另外,也可以使用下划线(_)匹配一个任意字符。例如:

    “%飞”匹配以“飞”字结束的字符串;
    “诸_亮”匹配“诸葛亮”、“诸云亮”等;
    “SQL”匹配“SQL”,但是不能匹配“sql”,因为 LIKE 运算符区分大小写。

如果查找的模式自身包含这两个通配符(% 或 _),可以通过ESCAPE子句指定一个的转义字符。例如:

SELECT 'OK'
FROM dual
WHERE '完成进度 25%。' LIKE '%25\%。' ESCAPE '\';

'OK'|
----|
OK  |

语句中的反斜线被定义为转义字符,\% 表示匹配百分号,而不是任意字符。

另外,NOT LIKE运算符执行 LIKE 相反的操作。例如:

SELECT emp_name,
       salary
FROM employee
WHERE emp_name NOT LIKE '%飞%';

EMP_NAME|SALARY|
--------|------|
刘备     | 30000|
关羽     | 26000|
诸葛亮   | 24000|
...

以上语句返回了名字中不包含“飞”字的员工。
5.3 空值判断

在数据库中,空值(NULL)是一个特殊值,代表了未知数据或者不适用的场景。Oracle 中的 NULL 不等于数字 0,也不等于空字符串。如果使用常规的比较运算符进行 NULL 值进行比较,结果总是未知。

NULL = 0; -- 结果未知
NULL = NULL; -- 结果未知
NULL != NULL; -- 结果未知

我们既不确定 NULL 等于 NULL,也不确定 NULL 不等于 NULL,因为任何值和未知数据比较的结果总是未知。如果在 WHERE 子句中使用这种查询条件,将不会返回任何结果。

对于 NULL 值的比较,需要使用特殊的运算符:IS NULL。例如:

SELECT emp_name, manager
FROM employee
WHERE manager IS NULL;

EMP_NAME|MANAGER|
--------|-------|
刘备     |       |

以上查询返回了没有上级领导的员工,也就是公司的最高领导。

另外,IS NOT NULL运算符执行与IS NULL相反的操作,返回取值不为空的数据。例如:

SELECT emp_name, manager
FROM employee
WHERE manager IS NOT NULL;

更多请见:http://www.mark-to-win.com/tutorial/51503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值