交-并-差的处理

  • SQL语言:并运算UNION,交运算INTERSECT,差运算EXCEPT
  • 基本语法形式:
子查询{UNION [ALL] | INTERSECT [ALL] | EXPECT [ALL] 子查询}
  • 通常情况下自动删除重复元组:不带ALL。若要保留重复的元组,则要带ALL

示例1:求即学过Math课程,又学过English课程的同学

表结构

SELECT * FROM SC
+----------------+------------------+
| name | course |
+----------------+------------------+
| Tom | English |
| Tom | Math |
| David | english |
| David | Computer |
+----------------+------------------+

查询

SELECT name FROM SC WHERE course = 'Math'
INTERSECT
SELECT name FROM SC WHERE course = 'English';

注意!Mysql4.0中增加了对UNION的支持,但是仍然不支持INTERSECTEXPECT

这是因为交运算符INTERSECT并没有增强SQL的表达能力。没有INTERSECT,SQL也可以通过其他方式表达同样的查询需求。只是有了INTERSECT更容易表达一些.。但是增加了SQL语言的不唯一性。

比如上面的查询可以用如下方式替换

SELECT name FROM sc WHERE course='Math' AND name IN
(SELECT name FROM sc WHERE course='English')
+----------------+
| name |
+----------------+
| Tom |
+----------------+

示例2:假定所有学生都有选课,求没有学过Math课程的学生

不能写成

SELECT name FROM sc WHERE course<>'Math'

可以写成

SELECT name FROM sc
EXCEPT
SELECT name FROM sc WHERE course='Math'

同样的EXCEPT也没有增强SQL的表达能力,上面的查询可以改写为

SELECT DISTINCT name
FROM sc sc1
WHERE NOT EXISTS
(
SELECT name
FROM sc
WHERE course='Math'
AND name = sc1.name
)
+----------------+
| name |
+----------------+
| David |
+----------------+

注意

  • UNION运算符是Entry-SQL92的一部分
  • INTERSECTEXCEPTFull-SQL92的一部分
  • 它们都是Core-SQL99的一部分,但有些DBMS并不支持这些运算

用SQL表达交并差操作的更多相关文章

  1. C# List 集合 交集、并集、差集、去重, 对象集合、 对象、引用类型、交并差补、List<T>

    关键词:C#  List 集合 交集.并集.差集.去重, 对象集合. 对象.引用类型.交并差.List<T> 有时候看官网文档是最高效的学习方式! 一.简单集合 Intersect 交集, ...

  2. 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)

    原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...

  3. MySQL 利用SQL线程对Binlog操作

    背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...

  4. MySQL 利用SQL线程对Binlog操作(转)

    背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...

  5. Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)

    Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==== ...

  6. Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)

    Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...

  7. SQL点滴33—SQL中的字符串操作

    原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...

  8. Java集合set的并、交、差操作

    集合的并.交.差操作 Set<Integer> result = new HashSet<Integer>(); Set<Integer> set1 = new H ...

  9. SQL的子查询操作

    对于表中的每一个记录,我们有时候需要提取特殊的或者你需要的记录,要提前做一个表的筛选,之后再对你选出的记录做一个修改,此时你必须使用SQL的子查询操作.如:修改id=5的记录的strContent字段 ...

随机推荐

  1. Storm入门(二)集群环境安装

    1.集群规划 storm版本的变更:storm0.9.x   storm0.10.x  storm1.x上面这些版本里面storm的核心源码是由Java+clojule组成的.storm2.x后期这个 ...

  2. c++11の关联容器

    一.关联容器 C++的容器类型可以分为顺序容器和关联容器两大类.对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map                        ...

  3. android获取string.xml的值

    在android开发过程中,编写java代码中的常量过一般情况下,我们是定义在string.xml这个文件中.这样修改起来也很方便,而且做国际化也很简单. 这个string.xml的值会被R文件映射, ...

  4. handsontable合并表头

    想在页面中做类似excel的操作,发现handsontable符合要求. 然后发现这个文章 http://blog.csdn.net/wynan830/article/details/9054195 ...

  5. lvds接口介绍

    1.项目简介 用索尼的imx264 sensor采集图像,在内部模数转换之后,由lvds接收,然后解码,最后送给后端显示 2.框图 imx264配置成从模式,由spi总线配置,需要由FPGA提供 行. ...

  6. js中uuid不被识别

    后台传了uuid值给前台,然后js报错 原因:反正就是js不认你这个字符串,他觉得你这是应该是数字,但是后面想了想,也不是数字啊,然后就不认了. 解决办法:告诉他,为夫这里是字符串.拼接html的时候 ...

  7. HTTP的一些基本概念

    HTTP协议:HTTP(超文本传输协议)协议就是计算机在网络中进行通信所必须共同遵守的规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器,我们目前使用的是HTTP/1.1 ...

  8. MySQL之字符集

    看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区 1.utf8与utf8mb4(utf8 most bytes 4) M ...

  9. Centos6.5 pppoe-server

    [root@localhost network-scripts]# rpm -q rp-pppoepackage rp-pppoe is not installed ----------------- ...

  10. Django3 Django 路由分发,反向解析,2.0版本的path

    urls配置像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行. 1.简 ...