传统集合运算
传统集合运算包括 联合(UNION),差集(EXCEPT 或 MINUS 或 LEFT JOIN&&IS NULL),交集(INTERSECT或INNER JOIN),笛卡尔积(JOIN)。
需要注意的是,不同数据库语法可能会有些不同,不过大体概念即是该段所讲内容。
1:联合(UNION)
联合作用:删除重复的行。
它会分别对比两个表的所有相同列的内容是否一致,但是,你不应该使用一个表的 n 列数据与另一个 n+1 列的数据进行使用 UNION,否则将出现错误。
例,表一people1数据为下:
例,表二people2数据为下:
使用联合 UNION:
select * from people1
union
select * from people2;
2:差集(EXCEPT 或 MINUS 或 LEFT JOIN&&IS NULL)
差集作用:查找在一个集合中存在而在另一个集合中不存在的元素。
- 对比列的数量必须相同,不可以使用一个集合的 n 列与另一个集合的 n+1 列进行比较。(通过上小段的内容,你可能会有点疑惑,其实,当不使用 select * 时,会出现 select name from people1 与 select name,source from people2 进行对比情况)
- 对应列的数据类型需要兼容。一个集合的列为 int 类型不要与另一个集合为 varchar 的列进行集合运算。
MySQL 不支持 EXCEPT 或 MINUS,可以使用LEFT JOIN&&IS NULL来实现,这不是必须的,其他可以实现相同逻辑的方法也是可以的。
PostgreSQL 和 Oracle 支持 EXCEPT 或 MINUS。
例:表一people1数据为下:
例,表二people2数据为下:
使用差集(MySQL数据库):
select * from people1
left join
people2
on people1.name = people2.name
where people2.name is null;
join 需要和 on 一起使用。
使用差集(PostgreSQL 和 Oracle数据库):
select * from people1
MINUS
select * from people2
可以看到,”亚索“ 这一行数据在另一个集合中是不存在的。
3:交集(INTERSECT或INNER JOIN)
交集作用:返回两个集合都相等的行。
MySQL 并不支持 INTERSECT,可以用 INNER JOIN 来实现交集的功能。
PostgreSQL 和 Oracle 支持 INTERSECT。
例:表一people1数据为下:
例:表一people1数据为下:
例,表二people2数据为下:
使用交集(MySQL数据库):
select * from people1
inner join
people2
on people1.name = people2.name;
可以发现,“锐雯” 那一行数据在两个集合内都存在。
4:笛卡尔积(JOIN)
笛卡尔积通常有连接条件:
- INNER JOIN(内连接):返回两个集合中都匹配的行。
- LEFT JOIN(左连接):返回左表所有的行,以及右表匹配的行,否则,右表将返回NULL。
- RIGHT JOIN(右连接):返回右表所有的行,以及左表匹配的行,否则,左表将返回NULL。
- FULL JOIN(全连接):返回左表和右表的所有行,当某一侧行在另一侧的行没有匹配的,将返回NULL。
专门集合运算
专门集合运算包括 选择(SELECT),投影(PROJECTION),连接(JOIN),除(DIVISION)。
1:选择(SELECT)
选择作用:选择出符合某种条件的行,通常用 WHERE 来实现
select * from people1
where name = "亚索";
2:投影(PROJECTION)
投影作用:选择集合中特定的列
select name,source
from people1
where name = "亚索";
3:连接(JOIN)
连接作用:将两个表结合起来,通常和 INNER JOIN、LEFT JOIN、RIGHT JOIN 或 FULL JOIN 一起使用。
4:除(DIVISION)
想要很好使用这个,我们需要想象一个应用场景。
比如:
- 我们想要查找购买了所有商品的的人
- 我们想要查找获得所有奖项的班级
- 我们想要查找参加过所有活动的员工
例,表三people3数据为下:
例,表四allproject数据为下:
使用除,查找参加过所有项目的人:
select name from people3
group by name
having count(distinct project) = (select count(*) from allproject);
文章来源:https://www.toymoban.com/news/detail-470469.html
除(DIVISION)基本思想:使用 GROUP BY 进行分组,然后使用 HAVING 判断每个组的数量是否等于全集的数量。文章来源地址https://www.toymoban.com/news/detail-470469.html
到了这里,关于数据库关系操作集合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!