SQL学习笔记——关系除法

该汇总来自于[日]MICK的《SQL基础教程》与《SQL进阶教程》,这两本书内容深入浅出,非常值得学习。

 

例子:找出员工表emp中拥有技能表skills中全部技能的员工id

(例子与解题思路来自于[日]MICK的《SQL基础教程》)

 

select distinct id from emps a

where not exists

(select skill from skills b

where not exists (select skill from emps c where c.id=a.id and c.skill= b.skill))

 

Oracle、SQL Server等数据库可以使用except

以上SQL语句可以改为

select distinct id

from emps a

where not exists

(select skill from

(skills except (select skill from emps c where c.id=a.id)))

 

 

使用having+内连接达到关系除法的作用

(解题思路来自于[日]MICK的《SQL进阶教程》)

 

select emps.id

from emps inner join skills

on emps.skill=skills.skill

group by emps.id

having count(emps.id)=(select count(*) from skills);

 

使用外连接达到关系除法的作用

(解题思路来自于[日]MICK的《SQL进阶教程》)

 

select id from emps a

where not exists

(select *

from skills b left join emps c

on c.skill=b.skill and c.id=a.id

where c.skill is null)

 

Oracle与MySQL不支持在连接条件中使用关联子查询的表名,但是postgreSQL可以。

MySQL报错

SQL学习笔记——关系除法_第1张图片

你可能感兴趣的:(SQL)