SQL JOIN

JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。

让我们看一下“Orders”表的一部分选择:

OrderID CustomerID OrderDate
10308 2 1996-09-18
10309 37 1996-09-19
10310 77 1996-09-20

然后,看一下“Customers”表的一部分选择:

CustomerID CustomerName ContactName Country
1 Alfreds Futterkiste Maria Anders Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Mexico
3 Antonio Moreno Taquería Antonio Moreno Mexico

注意,“Orders”表中的“CustomerID”列是指“Customers”表中的“CustomerID”。上述两个表之间的关系是“CustomerID”列。

然后,我们可以创建以下SQL语句(包含INNER JOIN),选择在两个表中具有匹配值的记录:

示例

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

它将产生类似于以下的结果:

OrderID CustomerName OrderDate
10308 Ana Trujillo Emparedados y helados 9/18/1996
10365 Antonio Moreno Taquería 11/27/1996
10383 Around the Horn 12/16/1996
10355 Around the Horn 11/15/1996
10278 Berglunds snabbköp 8/12/1996

不同类型的SQL JOIN

以下是SQL中不同类型的JOIN:

  • (INNER) JOIN:返回在两个表中具有匹配值的记录
  • LEFT (OUTER) JOIN:返回左表中的所有记录以及右表中匹配的记录
  • RIGHT (OUTER) JOIN:返回右表中的所有记录以及左表中匹配的记录
  • FULL (OUTER) JOIN:在左表或右表中有匹配时返回所有记录

这些JOIN类型可以根据您的需求选择,以确保检索到所需的数据。希望这能帮助你理解SQL中JOIN的概念。如果有其他问题,请随时告诉我。

SQL INNER JOIN

INNER JOIN关键字选择在两个表中具有匹配值的记录。

让我们看一下Products表的一部分选择:

ProductID ProductName CategoryID Price
1 Chais 1 18
2 Chang 1 19
3 Aniseed Syrup 2 10

以及Categories表的一部分选择:

CategoryID CategoryName Description
1 Beverages Soft drinks, coffees, teas, beers, and ales
2 Condiments Sweet and savory sauces, relishes, spreads, and seasonings
3 Confections Desserts, candies, and sweet breads

我们将使用两个表的CategoryID字段连接Products表和Categories表:

示例

使用INNER JOIN关键字连接ProductsCategories

SELECT ProductID, ProductName, CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

SQL INNER JOIN

注意:INNER JOIN关键字仅返回两个表中具有匹配值的行。这意味着如果您有一个没有CategoryID的产品,或者CategoryIDCategories表中不存在的记录,该记录将不会在结果中返回。

语法

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

指定列名

在SQL语句中指定列时,最好在列名前包含表名。

示例

指定表名:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

上面的示例在不指定表名的情况下也可以工作,因为指定的列名在两个表中都不存在。如果尝试在SELECT语句中包含CategoryID,则如果不指定表名,将会出现错误(因为CategoryID在两个表中都存在)。

JOIN或INNER JOIN

JOIN和INNER JOIN将返回相同的结果。

INNER是JOIN的默认连接类型,因此当您写JOIN时,解析器实际上会写INNER JOIN。

示例

JOIN与INNER JOIN相同:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
JOIN Categories ON Products.CategoryID = Categories.CategoryID;

连接三个表

以下SQL语句选择具有客户和承运商信息的所有订单:

示例

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

INNER JOIN用于将多个表中的数据连接在一起,以便根据关联列的匹配情况检索相应的数据。希望这帮助你理解INNER JOIN的使用方式。如果有其他问题,请随时提出。

SQL LEFT JOIN关键字

SQL LEFT JOIN关键字返回左表(table1)中的所有记录以及右表(table2)中的匹配记录。如果没有匹配,则右侧的结果为0条记录。

LEFT JOIN语法

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

注意:在某些数据库中,LEFT JOIN被称为LEFT OUTER JOIN。

SQL LEFT JOIN

演示数据库

在本教程中,我们将使用著名的Northwind示例数据库。

以下是“Customers”表的部分选择:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

以及“Orders”表的部分选择:

OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

示例

假设我们想要检索所有客户以及他们的订单(如果有的话)。我们可以使用LEFT JOIN将两个表连接在一起,以便即使某些客户没有订单,它们仍然会在结果中显示。

SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderDate
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

在这个例子中,LEFT JOIN确保了所有的客户都会出现在结果中,而与之关联的订单信息(如果存在的话)也会被检索出来。如果某个客户没有订单,相应的OrderID和OrderDate列将显示为NULL。

希望这能帮助你理解SQL中LEFT JOIN的使用方式。如果有其他问题,请随时提出。

最后

为了方便其他设备和平台的小伙伴观看往期文章:公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。

看完如果觉得有帮助,欢迎点赞、收藏关注

SQL JOIN 子句:合并多个表中相关行的完整指南的更多相关文章

  1. MySQL 合并查询join 查询出的不同列合并到一个表中

    为了求解问题时思路清晰,建议先分列查询,再将列合并到一个表中,这样相当于将复杂问题拆解为简单问题,一一解决.优点是避免所有问题混在一起,代码逻辑清晰,可迁移性强,下次遇到类似的查询问题能快速求解,缺点 ...

  2. MySQL 合并查询union 查询出的行合并到一个表中

    在合并查询中,尤其是二分类的情况,在查询结果是相同列名的时候可以考虑合并查询.先查询出行的结果,再使用union或者union all合并查询结果. 另外如果 union 和 order by 一起使 ...

  3. 在论坛中出现的比较难的sql问题:10(删除多表中的同一个外键)

    原文:在论坛中出现的比较难的sql问题:10(删除多表中的同一个外键) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  4. sql语句,怎么查看一个表中的所有约束

    sql语句,怎么查看一个表中的所有约束,比如,一个student表,有唯一,外键,主键,用sql语句怎么查看student表中的所有约束呢? select * from sysobjects wher ...

  5. 【HANA系列】SAP HANA SQL取表中每行最小值

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL取表中每 ...

  6. sql语句 怎么从一张表中查询数据插入到另一张表中?

    sql语句 怎么从一张表中查询数据插入到另一张表中?  ----原文地址:http://www.phpfans.net/ask/MTc0MTQ4Mw.html 比如我有两张表 table1 字段 un ...

  7. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...

  8. XGBoost中参数调整的完整指南(包含Python中的代码)

    (搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日     介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...

  9. 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句

      标签: SQL合并数据 2013-08-21 10:41 489人阅读 评论(0) 收藏 举报  分类: Oracle数据库(14)  select * into 新表名 from (select ...

  10. sql存储过程通过ID删除两表中的数据。

    CREATE OR REPLACE PROCEDURE del_p --建立名为del_p 的过程 IS CURSOR get_abid --简历名为get_abid的cursor 用来存放a表的id ...

随机推荐

  1. Jetpack Compose(1) —— Android 全新的 UI 框架

    写在前面 Jetpack Compose 已经不是什么新技术了,Google 早在 2019 年就推出 Jetpack Compose 的首个 alpha 版本,时至今日,相当大比例的国内 Andro ...

  2. 【LeetCode二叉树#11】最大二叉树(构造二叉树)

    最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构 ...

  3. 【算法day5】排序算法的稳定性及其汇总

    稳定性 定义:值相同的元素在排序完成之后能否保证原有的次序不变(同样值的个体之间,如果不因为排序而改变相对次序,这个排序就是有稳定性的,否则就没有) 举例: [2,1,3,1]-->[1,1,2 ...

  4. 【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败

    问题描述 跨区域无法访问Azure Redis服务, Redis 启用了Network并设置在一个VNET中,现在客户端部署在另一个区域数据中心中,两个数据中心区域使用VNET Peer(对等互连)访 ...

  5. 【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息

    问题描述 在Spring Boot应用中集成Event Hub,发送消息时指定Partition Key,日志中发现异常: 应用使用Event Hub版本为 <dependency> &l ...

  6. 答应我,在vue中不要滥用watch好吗?

    前言 上周五晚上8点,开开心心的等着产品验收完毕后就可以顺利上线.结果产品突然找到我说要加需求,并且维护这一块业务的同事已经下班走了,所以只有我来做.虽然内心一万头草泥马在狂奔,但是嘴里还是一口答应没 ...

  7. 用 nebula_dart_gdbc 在移动设备玩图数据库,泰酷辣!

    nebula_dart_gdbc,是访问 NebulaGraph 的 Dart 语言客户端,在 dart_gdbc 的规范下进行开发. dart_gdbc 是一套使用 Dart 语言定义的图数据库标准 ...

  8. curator-framework 使用采坑记之org.apache.zookeeper.ClientCnxn - Opening socket connection to server..........Will not attempt to authenticate using SASL (unknown error)报错解决

    一.curator-framework  简介 curator-framework 是对zookeeper做的分二次分布式封装处理,目前代码也是apache 开源社区维护,如下所示. github地址 ...

  9. 8、zookeeper的集群搭建

    完全配置--https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_zkMulitServerSetup https://zoo ...

  10. 学习笔记-涛讲F#(基础 II)

    目录 处理一堆数 组织代码(命名空间.模块) 使用联合重命名类型 类必须显式转换成接口 对象表达式 递归函数 CPS解决堆栈溢出 扩展一个类型 静态解析的类型参数 ref变量的实现原理及应用 F#资源 ...