您当前的位置:首页 > 电脑百科 > 数据库 > 百科

SQL的JOIN操作和不同类型的JOIN

时间:2023-03-20 14:47:19  来源:  作者:树言树语Tree

SQL的JOIN操作是将两个或多个表中的数据按照指定条件进行连接,并生成一个新的表。JOIN操作是SQL语言中最重要的操作之一,也是处理多表查询的关键。

在JOIN操作中,我们需要指定两个表之间的连接条件,通常是通过在SELECT语句中使用关键字JOIN来实现。JOIN操作根据两个表之间的连接类型可以分为以下几类:

  1. INNER JOIN

INNER JOIN也称为等值连接,它是最常用的连接类型。INNER JOIN通过比较两个表之间的共同列,只返回两个表中具有匹配行的结果。

语法:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

示例:

假设有两个表:学生表(students)和班级表(classes),分别如下:

students 表:

student_id

student_name

class_id

1

Alice

1

2

Bob

1

3

Charlie

2

4

David

3

classes 表:

class_id

class_name

1

Math

2

English

3

Science

4

History

我们可以使用INNER JOIN来获取每个学生所在班级的名称:

SELECT students.student_name, classes.class_name
FROM students
INNER JOIN classes
ON students.class_id = classes.class_id;

结果:

student_name

class_name

Alice

Math

Bob

Math

Charlie

English

David

Science

  1. LEFT JOIN

LEFT JOIN也称为左连接,它返回包括左表中所有记录和右表中与左表记录匹配的记录。

语法:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

示例:

假设我们希望获取所有班级及其所拥有的学生信息,包括没有学生的班级。

SELECT classes.class_name, students.student_name
FROM classes
LEFT JOIN students
ON classes.class_id = students.class_id;

结果:

class_name

student_name

Math

Alice

Math

Bob

English

Charlie

Science

David

History

NULL

在这个例子中,由于历史(History)班级没有学生,因此在LEFT JOIN的结果中只显示班级信息,而学生信息显示为NULL。

  1. RIGHT JOIN

RIGHT JOIN也称为右连接,它返回包括右表中所有记录和左表中与右表记录匹配的记录。

语法:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

示例:

假设我们需要获取每个学生所在的班级信息,包括没有学生的班级。

SELECT students.student_name, classes.class_name
FROM students
RIGHT JOIN classes
ON students.class_id = classes.class_id;

结果:

student_name

class_name

Alice

Math

Bob

Math

Charlie

English

David

Science

NULL

History

在这个例子中,由于历史(History)班级没有学生,因此在RIGHT JOIN的结果中只显示班级信息,而学生信息显示为NULL。

  1. FULL OUTER JOIN

FULL OUTER JOIN也称为全外连接或全连接,它返回包括两个表中的所有记录和匹配的记录。

语法:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;

示例:

假设我们需要获取所有学生和班级的信息,包括没有学生的班级和没有班级的学生。

SELECT students.student_name, classes.class_name
FROM students
FULL OUTER JOIN classes
ON students.class_id = classes.class_id;

结果:

student_name

class_name

Alice

Math

Bob

Math

Charlie

English

David

Science

NULL

History

在这个例子中,由于历史(History)班级没有学生,以及有一些学生没有班级,因此在FULL OUTER JOIN的结果中所有学生和班级都会被显示,而没有匹配的信息会显示为NULL。

  1. CROSS JOIN

CROSS JOIN也称为笛卡尔积连接,它返回两个表中所有可能的组合,即每个表的行数相乘。CROSS JOIN一般用于生成测试数据或者进行复杂的数据处理。

语法:

SELECT column_name(s)
FROM table1
CROSS JOIN table2;

示例:

假设我们需要获取所有班级和所有学生的组合。

SELECT students.student_name, classes.class_name
FROM students
CROSS JOIN classes;

结果:

student_name

class_name

Alice

Math

Bob

Math

Charlie

Math

David

Math

Alice

English

Bob

English

Charlie

English

David

English

Alice

Science

Bob

Science

Charlie

Science

David

Science

Alice

History

Bob

History

Charlie

History

David

History

在这个例子中,我们使用CROSS JOIN获取了每个学生和班级的所有可能的组合。由于每个班级都有四名学生,因此在结果中共有16行数据。

总结:

SQL的JOIN操作是处理多表查询非常重要的一个操作,它可以根据不同的连接类型返回不同的结果。我们可以根据具体的需求选择合适的连接类型,并在查询中指定正确的连接条件,从而得到我们需要的结果。

每天坚持学习一点点,不求有回报,只愿可以丰富自己!!!



Tags:SQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  Search: SQL  点击:(6)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  Search: SQL  点击:(4)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28  Search: SQL  点击:(14)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  Search: SQL  点击:(11)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  Search: SQL  点击:(10)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: SQL  点击:(24)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  Search: SQL  点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  Search: SQL  点击:(5)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10  Search: SQL  点击:(6)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  Search: SQL  点击:(28)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(4)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(13)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(15)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(27)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条