SQL中内连接和外连接的区别

yizhihongxing

SQL中连接(Join)用于将两个或多个表中的数据关联起来。连接可以分为内连接和外连接,它们的区别在于如何处理没有匹配上的数据。

内连接

内连接(Inner Join)将两个表中匹配的行关联起来,只输出匹配的行。语法如下:

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

其中table1table2是需要连接的两个表格,INNER JOIN表示内连接,ON表示连接条件,即需要连接的列。

接下来,我们通过两个示例来理解内连接的作用:

示例1:连接两个表中的公共数据

下面是orders表格:

OrderID OrderDate CustomerID
10248 1996-07-04 4
10249 1996-07-05 3
10250 1996-07-08 1

下面是customers表格:

CustomerID CustomerName ContactName Country
1 Alfreds Maria Germany
2 Ana Trujillo Ana Mexico
3 Antonio Antonio Mexico

我们可以通过内连接,将两个表格中的公共数据(即customers表格中CustomerID列和orders表格中CustomerID列相同的数据)关联起来,用于统计每个客户下订单的总数。代码如下:

SELECT customers.CustomerName, COUNT(orders.OrderID) AS OrderCount
FROM customers
INNER JOIN orders
ON customers.CustomerID = orders.CustomerID
GROUP BY customers.CustomerName;

输出结果如下:

CustomerName OrderCount
Alfreds 1
Antonio 1
Ana Trujillo 0

示例2:连接三个表格

下面是orders表格:

OrderID OrderDate CustomerID
10248 1996-07-04 4
10249 1996-07-05 3
10250 1996-07-08 1

下面是customers表格:

CustomerID CustomerName ContactName Country
1 Alfreds Maria Germany
2 Ana Trujillo Ana Mexico
3 Antonio Antonio Mexico

下面是order_details表格:

OrderDetailID OrderID ProductID Quantity
1 10248 11 12
2 10248 42 10
3 10249 14 9
4 10250 51 5

我们需要查询每个顾客下的所有订单的详细信息,以及对应的产品信息。代码如下:

SELECT customers.CustomerName, orders.OrderID, order_details.ProductID
FROM customers
INNER JOIN orders ON customers.CustomerID = orders.CustomerID
INNER JOIN order_details ON orders.OrderID = order_details.OrderID
ORDER BY customers.CustomerName;

输出结果如下:

CustomerName OrderID ProductID
Alfreds 10248 11
Alfreds 10248 42
Antonio 10249 14

外连接

外连接(Outer Join)则是将两个表中匹配和不匹配的行都关联起来,不匹配的行用空值填充。外连接有三种,分别是左外连接、右外连接和全外连接。

左外连接

左外连接(Left Outer Join)将左表中所有行都关联到右表中匹配的行,并将右表中不匹配的行用空值填充。语法如下:

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

接下来,我们通过示例来理解左外连接的作用:

示例3:查询数据表中部分无法匹配的数据

下面是orders表格:

OrderID OrderDate CustomerID
10248 1996-07-04 4
10249 1996-07-05 3
10250 1996-07-08 1

下面是customers表格:

CustomerID CustomerName ContactName
1 Alfreds Maria
2 Ana Trujillo Ana
3 Antonio Antonio

我们可以通过左外连接,查询那些在orders表格中出现的但无法找到匹配数据的客户的信息以及其对应的订单号。代码如下:

SELECT *
FROM customers
LEFT JOIN orders
ON customers.CustomerID = orders.CustomerID;

输出结果如下:

CustomerID CustomerName ContactName OrderID OrderDate CustomerID
1 Alfreds Maria 10250 1996-07-08 1
2 Ana Trujillo Ana NULL NULL NULL
3 Antonio Antonio 10249 1996-07-05 3

右外连接

右外连接(Right Outer Join)与左外连接类似,只是将右表中所有行都关联到左表中匹配的行,并将左表中不匹配的行用空值填充。语法如下:

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

示例4:查询数据表中全部的订单信息

下面是orders表格:

OrderID OrderDate CustomerID
10248 1996-07-04 4
10249 1996-07-05 3
10250 1996-07-08 1

下面是customers表格:

CustomerID CustomerName ContactName
1 Alfreds Maria
2 Ana Trujillo Ana
3 Antonio Antonio

我们可以通过右外连接,查询所有的订单信息以及其所对应的客户信息。代码如下:

SELECT *
FROM customers
RIGHT JOIN orders
ON customers.CustomerID = orders.CustomerID;

输出结果如下:

CustomerID CustomerName ContactName OrderID OrderDate CustomerID
1 Alfreds Maria 10250 1996-07-08 1
NULL NULL NULL 10248 1996-07-04 4
3 Antonio Antonio 10249 1996-07-05 3

全外连接

全外连接(Full Outer Join)则是将两个表中所有的行都关联起来。语法如下:

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

但是MySQL和SQLite并不支持FULL OUTER JOIN,可以通过左右外连接的方式模拟实现。

综上所述,内连接和外连接是关系型数据库中两种基本的连接方式。在实际应用中,我们应该结合实际情况,选择合适的连接方式,以便处理出更加准确有用的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL中内连接和外连接的区别 - Python技术站

(0)
上一篇 2023年3月27日
下一篇 2023年3月27日

相关文章

  • MySQL检索数据操作方法梳理

    MySQL检索数据操作方法梳理 MySQL作为一种开源且广泛应用的关系型数据库管理系统,其检索数据的操作方法是数据库开发中经常使用的基本技能。下面是MySQL检索数据操作方法的详细攻略,包括基本语法、常用关键字和示例说明等内容。 基本语法 在MySQL中,检索数据的基本语法为: SELECT column1, column2, … FROM table_…

    database 2023年5月22日
    00
  • MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法

    这里我来为大家详细讲解MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法的完整攻略。 1. 背景介绍 在MySQL数据库中,GTID是用于跟踪复制事务的全局唯一标识符。在MySQL5.6及其以上版本中,使用GTID复制模式可以避免数据不一致等问题。 然而,有时候在使用GTID模式下进行同步复制时,可能会出现以下报错: Error ‘Could n…

    database 2023年5月18日
    00
  • redis5.5官方文档

    https://www.cnblogs.com/zsl-find/articles/11780974.html 博客 https://redis.io/topics/cluster-tutorial 官方 https://www.cnblogs.com/zgqbky/p/11792141.html 博客   新虚拟机 2G内存,配yum源 配置JDK环境 y…

    Redis 2023年4月11日
    00
  • JavaScript中连接操作Oracle数据库实例

    连接操作Oracle数据库实例可以使用Node.js的包管理器npm(Node Package Manager)中的oracledb库。oracledb是由Oracle Corporation提供的官方Node.js驱动程序,它支持连接Oracle Database 11.2、12.1、12.2、18c和19c。接下来我们将详细介绍如何使用oracledb在…

    database 2023年5月21日
    00
  • oracle数据与文本导入导出源码示例

    下面开始详细讲解“Oracle数据与文本导入导出源码示例”的攻略。 1. 前置知识 在学习本攻略前,需要对Oracle数据库和PL/SQL编程有一定的了解和掌握。同时需要熟悉SQL语言,掌握读写文件的知识。 2. 源码示例1:从Oracle数据库导出数据到文本文件 下面是一个示例代码,可以将Oracle数据库中的数据导出到一个文本文件中。 declare f…

    database 2023年5月19日
    00
  • CentOS7.5 安装 Mysql8.0.19的教程图文详解

    下面是详细的攻略: CentOS7.5 安装 Mysql8.0.19的教程图文详解 环境准备 CentOS 7.5操作系统 足够的磁盘空间和内存空间 步骤一:下载 Mysql8.0.19 首先,需要到 MySQL 官网下载 Mysql8.0.19 的安装包。下载地址:https://dev.mysql.com/downloads/mysql/。 根据系统和版…

    database 2023年5月22日
    00
  • Oracle 统计用户下表的数据量实现脚本

    下面为您提供详细讲解“Oracle 统计用户下表的数据量实现脚本”的完整攻略,具体步骤如下: 准备工作 在编写统计脚本前,请确保已经安装开发工具 PL/SQL Developer 和 Oracle 数据库,并且有权限访问需要统计的用户下所有数据表。 步骤一:创建统计表 首先,需要创建一个统计表,用于记录每个数据表的数据量。可以使用如下的 SQL 语句在数据库…

    database 2023年5月21日
    00
  • 详解在python操作数据库中游标的使用方法

    下面我就详细讲解一下“详解在Python操作数据库中游标的使用方法”。 什么是游标(Cursor) 在Python中操作数据库时,游标是不可或缺的一个组件。游标(Cursor)是连接到数据库的一个对象,通过它可以对数据库进行操作。一般情况下,我们需要先创建一个游标对象,然后再使用该对象来执行 SQL 语句,并获取执行结果。在 Python 的 DB API …

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部