SQL 基础 | JOIN 操作介绍

在SQL中,JOIN是一种强大的功能,用于将两个或多个表中的行结合起来,基于相关的列之间的关系。

JOIN操作通常用在SELECT语句中,以便从多个表中检索数据。

以下是几种基本的JOIN类型以及它们的用法:

  1. INNER JOININNER JOIN是最常用的连接类型。它返回两个表中连接条件相匹配的行。

    SELECT column_names
    FROM table1
    INNER JOIN table2
    ON table1.common_field = table2.common_field;

例如,获取所有有订单的客户信息:

复制代码
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
  1. LEFT (OUTER) JOINLEFT JOIN返回左表( table1)的所有行,即使右表( table2)中没有匹配的行。如果右表中没有匹配的行,那么结果集中右表的部分将为NULL。

    SELECT column_names
    FROM table1
    LEFT JOIN table2
    ON table1.common_field = table2.common_field;

例如,获取所有客户信息,包括那些没有订单的客户:

复制代码
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
  1. RIGHT (OUTER) JOINRIGHT JOINLEFT JOIN相反,它返回右表( table2)的所有行,即使左表( table1)中没有匹配的行。左表中没有匹配的行的部分将为NULL。

    SELECT column_names
    FROM table1
    RIGHT JOIN table2
    ON table1.common_field = table2.common_field;

  2. FULL (OUTER) JOINFULL JOIN返回左表和右表中所有行的信息。如果某一侧的表中没有匹配的行,那么该侧的结果集中相应的部分将为NULL。

    SELECT column_names
    FROM table1
    FULL OUTER JOIN table2
    ON table1.common_field = table2.common_field;

  3. CROSS JOINCROSS JOIN将一个表中的每一行与另一个表中的每一行组合,如果表中数据量很大,结果集可能会非常庞大。

    SELECT column_names
    FROM table1
    CROSS JOIN table2;

  4. SELF JOINSELF JOIN是一个表与其自身的连接。这通常用于当表中有一个列引用了同一表中的另一个值时。

    SELECT column_names
    FROM table1 t1, table1 t2
    WHERE t1.common_field = t2.common_field;

  5. NATURAL JOINNATURAL JOIN基于两个表中同名的列进行连接。如果表中有多个同名的列,可能会产生不确定的连接逻辑。

    SELECT column_names
    FROM table1
    NATURAL JOIN table2;

  6. JOIN with subqueries: 子查询也可以被连接。你可以在子查询中定义一个结果集,然后将其作为一个临时表与其他表连接。

    SELECT column_names
    FROM table1
    INNER JOIN (SELECT column_names FROM table2 WHERE condition) AS subquery
    ON table1.common_field = subquery.common_field;

使用JOIN时,需要确保理解连接条件,以及如何影响结果集的大小和性能。合理的索引和查询优化可以显著提高JOIN操作的性能。

-- END --

如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)

本文由mdnice多平台发布

相关推荐
郝学胜-神的一滴2 天前
TCP通讯的艺术:从握手到挥手的优雅对话
开发语言·网络·网络协议·tcp/ip·程序人生
郝学胜-神的一滴2 天前
使用Linux命名管道(FIFO)实现无血缘关系进程间通信
linux·服务器·开发语言·c++·程序人生
灵狐数据FoxData2 天前
2025全球应用下载类别洞察:游戏持续领跑,工具与内容类应用重塑全球需求
程序人生·智能手机·生活·业界资讯·娱乐·媒体
edisao2 天前
第二章:资产的自审(The Self-Audit)
科技·学习·程序人生·微信·生活·求职招聘·新浪微博
愚者游世3 天前
brace-or-equal initializers(花括号或等号初始化器)各版本异同
开发语言·c++·程序人生·面试·visual studio
郝学胜-神的一滴3 天前
Python中的`set`与`frozenset`:可变与不可变集合的终极指南
开发语言·数据结构·python·程序人生
WeiXiao_Hyy3 天前
为什么一场会议,就能毁掉程序员的整个下午?
java·开发语言·经验分享·笔记·程序人生
程序员agions3 天前
为了个 Hello World 引入 800MB 垃圾,这届前端真的病了
前端·程序人生
愚者游世4 天前
Inherited constructors(继承构造)各版本异同
开发语言·c++·程序人生·面试·visual studio
hqyjzsb4 天前
亲历AI浪潮5年:技术更新快,但掌握底层逻辑永远有价值
人工智能·程序人生·职场和发展·创业创新·学习方法·业界资讯·远程工作