数据库关系操作集合

news/2024/7/6 6:31:45

文章目录

    • 传统集合运算
      • 1:联合(UNION)
      • 2:差集(EXCEPT 或 MINUS 或 LEFT JOIN&&IS NULL)
      • 3:交集(INTERSECT或INNER JOIN)
      • 4:笛卡尔积(JOIN)
    • 专门集合运算
      • 1:选择(SELECT)
      • 2:投影(PROJECTION)
      • 3:连接(JOIN)
      • 4:除(DIVISION)

传统集合运算


传统集合运算包括 联合(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)

差集作用:查找在一个集合中存在而在另一个集合中不存在的元素。

  1. 对比列的数量必须相同,不可以使用一个集合的 n 列与另一个集合的 n+1 列进行比较。(通过上小段的内容,你可能会有点疑惑,其实,当不使用 select * 时,会出现 select name from people1 与 select name,source from people2 进行对比情况)
  2. 对应列的数据类型需要兼容。一个集合的列为 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)

笛卡尔积通常有连接条件:

  1. INNER JOIN(内连接):返回两个集合中都匹配的行。
  2. LEFT JOIN(左连接):返回左表所有的行,以及右表匹配的行,否则,右表将返回NULL。
  3. RIGHT JOIN(右连接):返回右表所有的行,以及左表匹配的行,否则,左表将返回NULL。
  4. 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)

想要很好使用这个,我们需要想象一个应用场景。

比如:

  1. 我们想要查找购买了所有商品的的人
  2. 我们想要查找获得所有奖项的班级
  3. 我们想要查找参加过所有活动的员工

例,表三people3数据为下:

在这里插入图片描述

例,表四allproject数据为下:

在这里插入图片描述

使用除,查找参加过所有项目的人:

select name from people3 
group by name 
having count(distinct project) = (select count(*) from allproject);

在这里插入图片描述

除(DIVISION)基本思想:使用 GROUP BY 进行分组,然后使用 HAVING 判断每个组的数量是否等于全集的数量。


http://www.niftyadmin.cn/n/393594.html

相关文章

Zabbix(一)

介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 功能组件 Server : Zabbix server是zabbix软件的核心组件 Zabbix agent向其报告可用性、系统完整性和统计信息 Zabbix server存储所有的配置信息、统计信息和操作信…

【Linux网络编程】HTTPS协议原理

https协议原理 一、HTTPS是什么二、基本概念2.1、什么是加密2.2、为什么要加密 三、常见的加密方式四、数据摘要(指纹)&&数字签名五、HTTPS的工作过程探究方案(1):只使用对称加密方案(2):只使用非对…

Vue嵌套表单的 Dialog精美模板分享

文章目录 🐒个人主页🏅Vue项目常用组件模板仓库📖前言:🎀源码如下: 🐒个人主页 🏅Vue项目常用组件模板仓库 📖前言: 本篇博客主要提供vue组件之嵌套表单的 D…

Java对象的共享

要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理。第2章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据,而本章将介绍如何共享和发布对象,从而使它们能够安全地由多个线程同时访问。这两…

Temporal.Duration 规范用法

后端突然告诉我返回给我的时间用了一个新的规范,我展示的时候突然发现这个规范蛮有意思,算是一个新的规范,展示到页面的时候也思考了很多,记录一下子~(注:此 blog 主要目的仅是供自己记录,所以写…

k8s部署Elasticsearch集群+Kibana方案--开启X-Pack 安全认证

前言 本文中使用StatefulSet 方式部署 Elasticsearch 集群,并且开启X-Pack 安全认证,存储使用的是NFS,属于一个初学者自己探索的方案,如果有比较好的方案,还请不吝评论赐教。 版本说明: Kubernetes v1.25…

Linux命令(28)之locate

Linux命令之locate 1.locate介绍 linux命令locate用于查找文件所在位置,与which、whereis命令类似,locate命令将会在预先建立好的档案数据库中查询文件。 locate档案数据库路径:/var/lib/mlocate locate档案数据库名称:mlocat…