SQL集合运算 差集 并集 交集
来源:互联网 发布:项目数据分析师培训 编辑:程序博客网 时间:2024/05/20 10:22
SQL-3标准中提供了三种对检索结果进行集合运算的命令:并集UNION;交集INTERSECT;差集EXCEPT(在Oracle中叫做 MINUS)。在有些数据库中对此的支持不够充分,如MySql中只有UNION,没有其他两种。实际上这些运算都可以通过普通的SQL来实现,虽然有时有些繁琐。
假设有两个表(或视图)s,t,s中有两个字段sa,sb;t中有两个字段ta,tb;
差集EXCEPT:
- SELECTsaFROMs
- EXCEPT
- SELECTtaFROMt;
可以写作
- SELECTsaFROMs
- WHEREsaNOTIN
- (SELECTtaFROMt)
上面的例子中忽略了对s和t单独的条件,这些总可以加入AND条件完成,或者使用视图。如果是多个字段比较麻烦,如:
- SELECTsa, sbFROMs
- EXCEPT
- SELECTta, tbFROMt;
需要写成
- SELECTsa, sbFROMs
- WHERE(sa, sb)NOTIN
- (SELECTta, tbFROMt)
上面使用的语法不见得数据库都支持。好在不支持EXCEPT的MySQL支持这种语法,而不支持这种语法的MSSQL又支持EXCEPT。
注意对于这样的row constructors(Mysql术语),是和下面写法(以及其他类似写法)不等价的。
- SELECTsa, sbFROMs
- WHEREsaNOTIN
- (SELECTtaFROMt)
- ANDsbNOTIN
- (SELECTtbFROMt)
在MSSQL中的一个解决技巧是,把这两个字段(假设字符类型)拼起来,即
- SELECTsa, sbFROMs
- WHEREsa+sbNOTIN
- (SELECTta+tbFROMt)
交集INTERSECT:
- SELECTsaFROMs
- INTERSECT
- SELECTtaFROMt;
可以写成
- SELECTsaFROMs
- WHEREsa IN
- (SELECTtaFROMt)
当然也可以写成
- SELECTsaFROMs
- WHEREEXISTS
- (SELECT*FROMtWHEREt.ta=s.sa)
或者使用连接
- SELECTsaFROMs, t
- WHEREsa = ta
实际上这几个语句都有点问题,就是INTERSECT在出现重复时的语义问题。按照SQL-3标准,类似UNION,可以有明确的 INTERSECT ALL或者INTERSECT DISTINCT语法。一般的INTERSECT实现并没有明确这一点,而且从逻辑上讲意义也不大。那么当s或t中出现重复的时,如sa='x'的有2 个,sb='x'的有3个,使用上面的子查询将返回2行,使用连接将返回6行,当然这两个语句都可以加上一个DISTINCT,就实现了 INTERSECT DISTINCT语义了。
并集UNION:
MySql从4.0开始就支持UNION(ALL 和 DISTINCT)了,为完整起见,也列举一下。
其实实现这样一个结果是很麻烦的
- SELECTsaFROMs
- UNIONDISTINCT
- SELECTtaFROMt;
需要使用外连接,而且是Full的外连接
- SELECTDISTINCTNVL(s.sa, t.ta)
- FROMs FULLOUTERJOINtON(s.sa=t.ta)
上面的例子中我使用了Oracle的语法,实际上MySql不支持FULL OUTER JOIN(虽然支持LEFT和RIGHT OUTER JOIN),好在MySql支持UNION。
对于UNION ALL语义,我还没有想出来用普通查询如何实现,如果在上面语句中去掉DISTINCT,结果肯定不对。
- SQL集合运算:差集、交集、并集
- SQL集合运算 差集 并集 交集
- SQL集合运算 差集 并集 交集
- SQL集合运算:差集、交集、并集
- SQL集合运算 差集 并集 交集
- java集合运算:求交集,并集,集合差
- java集合运算:求交集,并集,集合差
- Oracle集合运算符 交集 并集 差集
- Oracle集合运算符 交集 并集 差集
- python set集合运算(交集,并集,差集,对称差集)
- 两个集合的交集,并集,差
- 重载运算符“+”、“*”、“-”实现集合的并集、交集、差集运算
- 重载运算符“+”、“*”、“-”实现集合的并集、交集、差集运算
- 构建一个类,对集合进行运算,包括求集合的交集,并集和差集。
- Oracle中关于并集/交集/差集的运算
- 【Oracle】Oracle交集、并集、差集的运算
- python 集合比较(交集、并集,差集)
- java集合(交集,并集,差集)
- ASIHTTPRequest-使用代理连接
- WebService应用-ABAP实例:ABAP调用外部WebService
- SQL Server使用Merge语句当源表数据集为空时,无法进行查询的问题
- ASIHTTPRequest-其他特性
- Git Diff 输出到文件保留着色
- SQL集合运算 差集 并集 交集
- ASIHTTPRequest-Debug选项
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- AndBug-android调试工具
- 比较WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP与WM_CHAR
- 初次安装cocos2dx所遇到的问题以及解决办法
- mysql 数据库的导出导入和一些常用命令与远程访问到MYsql
- 改变UIAlterView大小
- 测试网站速度简单方法