用SQL表达交并差操作
交-并-差的处理
- 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
的支持,但是仍然不支持INTERSECT
和EXPECT
这是因为交运算符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
的一部分INTERSECT
和EXCEPT
是Full-SQL92
的一部分- 它们都是
Core-SQL99
的一部分,但有些DBMS并不支持这些运算
用SQL表达交并差操作的更多相关文章
- C# List 集合 交集、并集、差集、去重, 对象集合、 对象、引用类型、交并差补、List<T>
关键词:C# List 集合 交集.并集.差集.去重, 对象集合. 对象.引用类型.交并差.List<T> 有时候看官网文档是最高效的学习方式! 一.简单集合 Intersect 交集, ...
- 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)
原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...
- MySQL 利用SQL线程对Binlog操作
背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...
- MySQL 利用SQL线程对Binlog操作(转)
背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...
- Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)
Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==== ...
- Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)
Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...
- SQL点滴33—SQL中的字符串操作
原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...
- Java集合set的并、交、差操作
集合的并.交.差操作 Set<Integer> result = new HashSet<Integer>(); Set<Integer> set1 = new H ...
- SQL的子查询操作
对于表中的每一个记录,我们有时候需要提取特殊的或者你需要的记录,要提前做一个表的筛选,之后再对你选出的记录做一个修改,此时你必须使用SQL的子查询操作.如:修改id=5的记录的strContent字段 ...
随机推荐
- Storm入门(二)集群环境安装
1.集群规划 storm版本的变更:storm0.9.x storm0.10.x storm1.x上面这些版本里面storm的核心源码是由Java+clojule组成的.storm2.x后期这个 ...
- c++11の关联容器
一.关联容器 C++的容器类型可以分为顺序容器和关联容器两大类.对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map ...
- android获取string.xml的值
在android开发过程中,编写java代码中的常量过一般情况下,我们是定义在string.xml这个文件中.这样修改起来也很方便,而且做国际化也很简单. 这个string.xml的值会被R文件映射, ...
- handsontable合并表头
想在页面中做类似excel的操作,发现handsontable符合要求. 然后发现这个文章 http://blog.csdn.net/wynan830/article/details/9054195 ...
- lvds接口介绍
1.项目简介 用索尼的imx264 sensor采集图像,在内部模数转换之后,由lvds接收,然后解码,最后送给后端显示 2.框图 imx264配置成从模式,由spi总线配置,需要由FPGA提供 行. ...
- js中uuid不被识别
后台传了uuid值给前台,然后js报错 原因:反正就是js不认你这个字符串,他觉得你这是应该是数字,但是后面想了想,也不是数字啊,然后就不认了. 解决办法:告诉他,为夫这里是字符串.拼接html的时候 ...
- HTTP的一些基本概念
HTTP协议:HTTP(超文本传输协议)协议就是计算机在网络中进行通信所必须共同遵守的规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器,我们目前使用的是HTTP/1.1 ...
- MySQL之字符集
看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区 1.utf8与utf8mb4(utf8 most bytes 4) M ...
- Centos6.5 pppoe-server
[root@localhost network-scripts]# rpm -q rp-pppoepackage rp-pppoe is not installed ----------------- ...
- Django3 Django 路由分发,反向解析,2.0版本的path
urls配置像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行. 1.简 ...