首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 记录的减法——EXCEPT 在SQL的世界里,数据的操作不仅仅是简单的增、删、改、查,还涉及到复杂的数据集合并与差异比较。当我们需要从两个或多个数据集中找出独有的记录时,`EXCEPT`操作符便成为了我们的得力助手。本章将深入解析`EXCEPT`操作符的工作原理、使用场景、语法规则以及在实际应用中的注意事项,帮助读者掌握这一强大的数据差异分析工具。 #### 一、`EXCEPT`操作符概述 `EXCEPT`操作符用于返回两个或多个`SELECT`语句查询结果集的差集,即返回第一个查询结果中存在而第二个查询结果中不存在的记录。简单来说,它执行的是记录的“减法”操作。需要注意的是,`EXCEPT`操作符仅返回唯一的记录,即如果第一个查询结果中的某条记录在第二个查询结果中有多条匹配项,该记录仍只会被返回一次。 #### 二、`EXCEPT`操作符的语法 `EXCEPT`操作符的基本语法如下: ```sql SELECT column_name(s) FROM table1 EXCEPT SELECT column_name(s) FROM table2; ``` 这里有几个关键点需要注意: 1. **列的数量和类型必须匹配**:两个`SELECT`语句中选择的列的数量必须相同,且对应列的数据类型必须兼容,以便进行比较。 2. **排序和重复**:`EXCEPT`操作符自动去除结果集中的重复记录,并且不保证结果的顺序。如果需要特定的排序,应使用`ORDER BY`子句在`EXCEPT`操作之后进行。 3. **NULL值的处理**:在`EXCEPT`操作中,`NULL`值被视为不相等。即,如果一个查询结果中的某列为`NULL`,而另一个查询结果中对应位置的列也为`NULL`,则这两条记录不会被视为相同,因此`NULL`值的记录会出现在结果集中(如果它只存在于第一个查询结果中)。 #### 三、使用场景 `EXCEPT`操作符在多种场景下都非常有用,包括但不限于: 1. **找出未匹配的数据**:在数据同步或比对过程中,找出在一个数据集中存在而在另一个数据集中不存在的记录。 2. **清理数据**:识别并删除数据库中不应存在的记录,比如用户列表中的无效用户ID。 3. **审计分析**:分析两个时间点的数据变化,找出新增或缺失的记录。 4. **报表生成**:生成特定条件下的差异报告,如销售数据对比、库存变动等。 #### 四、示例分析 假设我们有两个表:`Employees`(员工表)和`TerminatedEmployees`(已离职员工表),现在我们需要找出所有在职但未被标记为离职的员工。 **Employees 表结构**: | EmployeeID | Name | Department | |------------|-------------|------------| | 1 | Alice | HR | | 2 | Bob | IT | | 3 | Charlie | Marketing | | 4 | David | Finance | **TerminatedEmployees 表结构**: | EmployeeID | TerminationDate | |------------|-----------------| | 2 | 2023-01-15 | | 4 | 2023-02-01 | **查询语句**: ```sql SELECT EmployeeID, Name, Department FROM Employees EXCEPT SELECT EmployeeID FROM TerminatedEmployees; ``` **注意**:这里为了简化示例,我们只从`Employees`表中选择了`EmployeeID`与`TerminatedEmployees`表中的`EmployeeID`进行比较。在实际应用中,你可能需要选择更多的列来确保结果的准确性,但这里的关键是展示`EXCEPT`的基本用法。 **结果**: | EmployeeID | Name | Department | |------------|-------------|------------| | 1 | Alice | HR | | 3 | Charlie | Marketing | 这个查询返回了所有在职(即未在`TerminatedEmployees`表中出现)的员工信息。 #### 五、注意事项 1. **性能考虑**:`EXCEPT`操作可能会涉及大量的数据比较,特别是在处理大型数据集时。因此,在使用`EXCEPT`之前,应考虑查询优化,如使用索引、减少比较的数据量等。 2. **兼容性**:虽然`EXCEPT`是SQL标准的一部分,但并非所有数据库系统都完全支持该操作符。例如,MySQL就不直接支持`EXCEPT`,但可以通过其他方式(如`LEFT JOIN`结合`WHERE`子句)实现类似的功能。 3. **数据一致性**:在使用`EXCEPT`进行数据差异分析时,应确保参与比较的数据集在逻辑上是一致的,比如时间戳、数据格式等,以避免因数据不一致导致的错误结果。 #### 六、总结 `EXCEPT`操作符是SQL中用于执行记录减法操作的重要工具,它能够帮助我们快速找出两个或多个数据集之间的差异。通过掌握`EXCEPT`的语法、使用场景及注意事项,我们可以更加高效地处理数据差异分析、数据同步、数据清理等任务。在实际应用中,结合具体的业务需求和数据特点,灵活运用`EXCEPT`操作符,将极大地提升我们的数据处理能力和工作效率。
上一篇:
选取表中公共部分——INTERSECT
下一篇:
7-2 联结(以列为单位对表进行联结)
该分类下的相关小册推荐:
PostgreSQL入门教程
SQL基础教程(上)
SQL基础教程(下)
高性能的Postgres SQL