mysql 交并差_用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并不支持这些运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值