[讲解]sql except和intersect运算符(比拟两个或多个select语句的结果并前去非重复值)

图 1 UNION 中若有重复的行,会被移除,只留下一个

1.简介

EXCEPT和INTERSECT运算符使您可以比较两个或多个SELECT语句的结果并返回非重复值。

2.区别

EXCEPT运算符返回由EXCEPT运算符左侧的查询返回、而又不包含在右侧查询所返回的值中的所有非重复值。

INTERSECT返回由INTERSECT运算符左侧和右侧的查询都返回的所有非重复值。

3.注意事项

(1).使用EXCEPT或INTERSECT比较的结果集必须具有相同的结构。它们的列数必须相同,并且相应的结果集列的数据类型必须兼容

(2).INTERSECT运算符优先于EXCEPT

(3).SELECT INTO必须是包含INTERSECT或EXCEPT运算符的语句中的第一个查询,用来创建容纳最终结果集的表

(4).ORDER BY子句中的列名或别名必须引用左侧查询返回的列名

4.例题:

--建立3个表,分别插入数据

create table TableA(col1 int)

insert into TableA select 1

insert into TableA select 1

insert into TableA select 2

insert into TableA select 3

insert into TableA select 4

insert into TableA select 4

insert into TableA select 5

insert into TableA select null

insert into TableA select null

create table TableB(col2 int)

insert into TableB select null

insert into TableB select 1

insert into TableB select 2

insert into TableB select 3

create table TableC(col3 int)

insert into TableC select 1

insert into TableC select 5

insert into TableC select 6

--利用EXCEPT

--找出TableA表的col1列不存在Tablec表col1列的所有非重复值

SELECT col1 FROM TableA

EXCEPT

SELECT col3 FROM Tablec

结果如下:

col1

-----------

NULL

2

3

4

--sql 2000的版本,用not exists实现EXCEPT的功能 SELECT col1

FROM TableA as a

where not exists(SELECT col3 FROM Tablec where a.col1=col3)

group by col1

--sql 2000,not in是得不到上述结果的

--空值表示值未知。空值不同于空白或零值。没有两个相等的空值。

--比较两个空值或将空值与任何其他值相比均返回未知,这是因为每个空值均为

未知。

--使用IN或NOT IN比较后返回的所有空值都将返回UNKNOWN。 --将空值与IN或NOT IN一起使用会产生意外结果。 SELECT col1

FROM TableA

where col1 not in(SELECT col3 FROM Tablec)

group by col1

结果如下:

col1

-----------

2

3

4

--INTERSECT运算符优先于EXCEPT --运算步骤是:先运算TableB和TableC的INTERSECT,再和TableA运算EXCEPT

SELECT col1 FROM TableA EXCEPT

SELECT col2 FROM TableB INTERSECT

SELECT col3 FROM TableC

结果如下:

col1

-----------

NULL

2

3

4

5

--SELECT INTO的应用

--SELECT INTO必须是语句中的第一个查询 --我记得SELECT INTO与UNION运算符的使用也是这样的规则

SELECT col1

into #tem

FROM TableA

EXCEPT

SELECT col3

FROM Tablec

select * from #tem drop table #tem

结果如下:

col1

----------- NULL

2

3

4

原文地址:https://www.cnblogs.com/jijm123/p/9102999.html

时间: 2024-08-25 05:54:32

[讲解]sql except和intersect运算符(比拟两个或多个select语句的结果并前去非重复值)的相关文章

UNION操作用于合并两个或多个 SELECT 语句的结果集。

大理石平台价格 使用示例: $Model->field('name') ->table('think_user_0') ->union('SELECT name FROM think_user_1') ->union('SELECT name FROM think_user_2') ->select(); 数组用法: $Model->field('name') ->table('think_user_0') ->union(array('field'=>

SQL Server里PIVOT运算符的”红颜祸水“

在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很快你就会知道为什么.在我们进入特定问题和陷阱前,首先我想给你下使用SQL Server里的PIVOT能实现什么的一个基本概述. 概述 SQL Server里PIVOT运算符背后的基本思想是在T-SQL查询期间,你可以旋转行为列.运算符本身是SQL Server 2005后引入的,主要用在基于建立在实

SQL AND & OR 运算符

AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤. AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 假设第一个条件和第二个条件都成立,则 AND 运算符显示一条记录. 假设第一个条件和第二个条件中仅仅要有一个成立,则 OR 运算符显示一条记录. 原始的表 (用在样例中的): LastName FirstName Address City Adams John Oxford Street London Bush George Fifth

SQL server 2005 PIVOT运算符的使用

原文:SQL server 2005 PIVOT运算符的使用 PIVOT,UNPIVOT运算符是SQL server 2005支持的新功能之一,主要用来实现行到列的转换.本文主要介绍PIVOT运算符的操作,以及如何实现动态PIVOT的行列转换. 关于UNPIVOT及SQL server 2000下的行列转换请参照本人的其它文章. 一.PIVOT的语法 SELECT [non-pivoted column], -- optional [additional non-pivoted columns]

20150328晚,不使用乘号运算符实现两个数相乘

//20150328晚,不使用乘号运算符实现两个数相乘 #include <stdio.h> #include <stdlib.h> #pragma warning(disable:4996) //using namespace std; int main() { int m, n, t; long long ll, absn, absm; while (scanf("%d %d", &m, &n) != EOF) { absn = n; abs

SQL Server 批量插入数据的两种方法

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. [c-sharp] view plaincopy --Create DataBase create database BulkTestDB; go use BulkTes

Centos7.3 下SQL Server 备份及还原的两种方式

Centos7.3 下SQL Server 备份及还原的两种方式 我们前面两篇文章介绍了Centos7.3下SQL Server的安装配置及使用Powershell的管理介绍,今天我们接着介绍如何实现Centos7.3 下SQL Server  备份及还原,有两种方式:1.使用SSMS备份及还原,该方式最为简单也最方便操作的方式,2.使用Linux下SQL Server自带功能命令备份,具体见下: 我们上一篇中创建了一个测试数据库,我们接着拿这个数据库进行测试,我们首先使用第一种方式,使用SSM

使用INTERSECT运算符

显示符合以下条件的雇员的雇员ID 和职务ID:这些雇员的当前职务与以前的职务相同,也就是说这些雇员曾担任过别的职务,但现在又重新担任了以前的同一职务. hr@TEST0924> SELECT employee_id, job_id FROM employees 2 INTERSECT 3 SELECT employee_id, job_id FROM job_history;   EMPLOYEE_ID JOB_ID ----------- ----------         176 SA_R

C++重载加号运算符实现两个结构体的相加

#include<iostream> #include<string> using namespace std; struct S { int a, b; string str; S operator+(const S &others) { S s1; s1.a = this->a + others.a; s1.b = this->a + others.a; s1.str += this->str; s1.str += others.str; return