深入理解SQL中的INNER JOIN操作

news/2024/9/19 19:47:45/ 标签: sql, 数据库, inner, 关联查询, join

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作,用于返回两个表中匹配的行,只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用,通过示例展示其结果集行数的计算方法。此外,文中还比较了INNER JOIN与LEFT JOIN、RIGHT JOIN、FULL JOIN和CROSS JOIN的异同,帮助读者理解不同类型的JOIN在实际查询中的应用场景。通过本文,读者能够掌握INNER JOIN的核心概念和技术细节,提高SQL查询和数据处理的效率。

在这里插入图片描述


一、InnerJoin 的定义和概念

在关系数据库中,JOIN操作用于在两个或多个表之间基于某些条件进行连接。INNER JOIN是最常见的JOIN类型之一,它仅返回两个表中匹配的行。了解INNER JOIN的定义和概念对于正确使用和优化SQL查询至关重要。

什么是INNER JOIN?

INNER JOIN用于返回两个表中基于指定条件匹配的行。换句话说,只有当连接条件满足时,才会返回行。如果没有匹配的行,则不会在结果集中包含这些行。

INNER JOIN的语法

标准SQL语法中,INNER JOIN的基本形式如下:

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

在这个语法中,table1table2是要连接的两个表,column_name(s)是要选择的列,ON子句指定了连接条件。

INNER JOIN的使用场景

INNER JOIN广泛应用于各种场景,包括:

  1. 数据分析:从多个相关表中检索数据进行分析。
  2. 数据聚合:结合多个表的数据进行汇总和统计。
  3. 报告生成:生成基于多表数据的报告。
  4. 数据验证:验证多个表之间的关系和数据一致性。

通过理解INNER JOIN的定义和概念,可以更有效地应用它来解决实际问题。


二、InnerJoin 关联结果的计算方法

在实际应用中,INNER JOIN的结果集行数取决于连接表之间的关系类型和匹配条件。为了准确计算INNER JOIN的返回行数,我们需要深入了解以下几种情况:

一对多关系和多对多关系

在关系数据库中,一对多关系和多对多关系是两种常见的表关系类型。INNER JOIN在这两种关系中的行为有所不同,但可以通过理解它们的本质来统一计算方法。

一对多关系

在一对多关系中,一个表中的每一行可以与另一个表中的多行相关联。INNER JOIN在一对多关系中的行为主要取决于子表中的匹配行数。

假设:

  • 表 A 具有 m 行。
  • 表 B 具有 n 行。
  • 表 A 中的每一行可能在表 B 中匹配零行、一行或多行。

如果表 A 中的每一行在表 B 中平均匹配 k 行(k 可以是 0),那么INNER JOIN返回的总行数为 m * k

多对多关系

在多对多关系中,一个表中的每一行可以与另一个表中的多行相关联,反之亦然。这种关系通常通过一个中间表(交叉表)来实现,该表包含两个表的外键。

假设:

  • 表 A 具有 m 行。
  • 表 B 具有 n 行。
  • 中间表 C 具有 p 行,表示表 A 和表 B 之间的关系数量。

在这种情况下,INNER JOIN的结果集行数通常等于中间表 C 的行数,即 p 行。

Inner Join 关联结果的计算方法

为了更好地理解INNER JOIN的计算方法,下面我们将通过具体示例进行详细讲解。

示例:一对多关系

假设我们有两个表:Customers 和 Orders,其中 Customers 表记录了客户信息,Orders 表记录了客户的订单信息。这是一个典型的一对多关系,每个客户可以有多个订单。

  • Customers 表:

    CustomerID | CustomerName
    -----------+-------------
    1          | Alice
    2          | Bob
    3          | Charlie
    
  • Orders 表:

    OrderID | CustomerID | OrderAmount
    --------+------------+------------
    1       | 1          | 100
    2       | 1          | 150
    3       | 2          | 200
    4       | 2          | 250
    5       | 3          | 300
    

在这种场景中,执行INNER JOIN查询:

sql">SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmount
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

返回的结果为:

CustomerID | CustomerName | OrderID | OrderAmount
-----------+--------------+---------+------------
1          | Alice        | 1       | 100
1          | Alice        | 2       | 150
2          | Bob          | 3       | 200
2          | Bob          | 4       | 250
3          | Charlie      | 5       | 300

示例:多对多关系

假设我们有三个表:Students, Courses 和 Enrollments,其中 Students 表记录学生信息,Courses 表记录课程信息,Enrollments 表记录学生与课程的注册关系。

  • Students 表:

    StudentID | StudentName
    ----------+------------
    1         | Alice
    2         | Bob
    3         | Charlie
    
  • Courses 表:

    CourseID | CourseName
    ---------+-----------
    1        | Math
    2        | Science
    3        | History
    4        | Art
    
  • Enrollments 表:

    EnrollmentID | StudentID | CourseID
    -------------+-----------+---------
    1            | 1         | 1
    2            | 1         | 2
    3            | 2         | 2
    4            | 2         | 3
    5            | 3         | 3
    6            | 3         | 4
    

在这种场景中,执行多对多关系的INNER JOIN查询:

sql">SELECT Students.StudentID, Students.StudentName, Courses.CourseID, Courses.CourseName
FROM Students
INNER JOIN Enrollments ON Students.StudentID = Enrollments.StudentID
INNER JOIN Courses ON Enrollments.CourseID = Courses.CourseID;

返回的结果为:

StudentID | StudentName | CourseID | CourseName
----------+-------------+----------+-----------
1         | Alice       | 1        | Math
1         | Alice       | 2        | Science
2         | Bob         | 2        | Science
2         | Bob         | 3        | History
3         | Charlie     | 3        | History
3         | Charlie     | 4        | Art

InnerJoin关联结果的总结

通过上述示例,我们可以总结出INNER JOIN在不同关系类型中的行为规律:

  • 一对多关系:INNER JOIN返回的行数主要取决于“多”方的行数,即子表的行数和匹配关系。最终的结果集行数等于父表中每一行在子表中的平均匹配数与父表行数的乘积。
  • 多对多关系:INNER JOIN返回的行数通常等于中间表的行数。中间表记录了两表之间的所有关系,因此结果集行数等于中间表的记录数。

三、InnerJoin与其他Join关联查询结果的异同

在关系数据库中,除了INNER JOIN,还有其他类型的JOIN,例如LEFT JOIN、RIGHT JOIN和FULL JOIN。了解它们之间的差异对于选择合适的JOIN类型至关重要。

LEFT JOIN(或LEFT OUTER JOIN)

LEFT JOIN返回左表中的所有行,即使右表中没有匹配的行。对于没有匹配的行,右表的列将包含NULL值。

示例

假设我们有两个表:Customers 和 Orders。

sql">SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmount
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

返回的结果可能包含没有订单的客户:

CustomerID | CustomerName | OrderID | OrderAmount
-----------+--------------+---------+------------
1          | Alice        | 1       | 100
1          | Alice        | 2       | 150
2          | Bob          | 3       | 200
2          | Bob          | 4       | 250
3          | Charlie      | 5       | 300
4          | David        | NULL    | NULL

RIGHT JOIN(或RIGHT OUTER JOIN)

RIGHT JOIN返回右表中的所有行,即使左表中没有匹配的行。对于没有匹配的行,左表的列将包含NULL值。

示例

sql">SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmount
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

返回的结果可能包含没有匹配客户的订单:

CustomerID | CustomerName | OrderID | OrderAmount
-----------+--------------+---------+------------
1          | Alice        | 1       | 100
1          | Alice        | 2       | 150
2          | Bob          | 3       | 200
2          | Bob          | 4       | 250
3          | Charlie      | 5       |300
NULL       | NULL         | 6       | 350

FULL JOIN(或FULL OUTER JOIN)

FULL JOIN返回两个表中的所有行。如果没有匹配的行,则相应表的列将包含NULL值。

示例

sql">SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmount
FROM Customers
FULL JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

返回的结果可能包含所有客户和订单,包括没有匹配的行:

CustomerID | CustomerName | OrderID | OrderAmount
-----------+--------------+---------+------------
1          | Alice        | 1       | 100
1          | Alice        | 2       | 150
2          | Bob          | 3       | 200
2          | Bob          | 4       | 250
3          | Charlie      | 5       | 300
4          | David        | NULL    | NULL
NULL       | NULL         | 6       | 350

CROSS JOIN

CROSS JOIN返回两个表的笛卡尔积,即每个表中的每一行都与另一个表中的每一行进行组合。

示例

sql">SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmount
FROM Customers
CROSS JOIN Orders;

返回的结果为:

CustomerID | CustomerName | OrderID | OrderAmount
-----------+--------------+---------+------------
1          | Alice        | 1       | 100
1          | Alice        | 2       | 150
1          | Alice        | 3       | 200
1          | Alice        | 4       | 250
1          | Alice        | 5       | 300
2          | Bob          | 1       | 100
2          | Bob          | 2       | 150
2          | Bob          | 3       | 200
2          | Bob          | 4       | 250
2          | Bob          | 5       | 300
3          | Charlie      | 1       | 100
3          | Charlie      | 2       | 150
3          | Charlie      | 3       | 200
3          | Charlie      | 4       | 250
3          | Charlie      | 5       | 300

四、InnerJoin 总结

INNER JOIN是SQL查询中最常用的JOIN类型之一,它仅返回两个表中匹配的行。在理解INNER JOIN时,需要重点关注以下几点:

  1. 定义和概念:INNER JOIN用于返回两个表中基于指定条件匹配的行。
  2. 计算方法:在一对多和多对多关系中,INNER JOIN的结果集行数取决于匹配条件和表之间的关系类型。
  3. 与其他JOIN的比较:INNER JOIN与LEFT JOIN、RIGHT JOIN、FULL JOIN和CROSS JOIN在行为和返回结果上存在显著差异,选择合适的JOIN类型对于正确查询至关重要。

通过理解这些概念和技术细节,您可以更高效地使用INNER JOIN进行数据查询和分析,解决复杂的数据处理需求。在实际应用中,建议通过动手练习和阅读相关文档来进一步巩固所学知识,并在项目中灵活应用。

在这里插入图片描述


http://www.ppmy.cn/news/1514349.html

相关文章

【论文阅读】Enhance Model Stealing Attack via Label Refining(2022)

摘要 With machine learning models(机器学习模型) being increasingly(越来越多) deployed(部署), model stealing attacks(模型窃取攻击) have raised an increasing interest. Extracting decision-based models(基于决策的模型窃取) is a more challenging task…

【工具类】Java优雅的将XML转为JSON格式、XML转JSON

Java优雅的将XML转为JSON格式、XML转JSON 1. 导入依赖1.1 Maven使用1.2 Gradle使用 2. 代码编写3.运行示例 1. 导入依赖 1.1 Maven使用 <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</vers…

《计算机操作系统》(第4版)第4章 存储器管理 复习笔记

第4章 存储器管理 一、存储器的层次结构 1. 多层结构的存储器系统 如图4-1所示&#xff0c;在存储层次中越往上&#xff0c;存储介质的访问速度越快&#xff0c;价格也越高&#xff0c;相对存储容量也越小。 图4-1 计算机系统存储层次示意 2.三级存储系统 (1)Cache- 主存存储体…

linux下搭建MySQL8.0.25一主一从

一、主从复制概述 1.1、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行…

AI大模型开发——7.百度千帆大模型调用

本节旨在为读者提供一个实用指南&#xff0c;探讨如何有效地利用百度千帆大模型平台的强大功能。从基础的账号注册和密钥申请入手&#xff0c;逐步引领用户通过案例&#xff0c; 理解并掌握如何调用文本和图像处理的大模型 API&#xff0c; 包括但不限于 NLP、对话生成、文本续…

windows bash获取一个目录下所有的文件

在Windows系统中&#xff0c;我们可以使用命令行工具来获取文件夹下的所有文件名。具体操作如下&#xff1a; 1. 打开命令提示符&#xff08;WinR&#xff0c;输入cmd&#xff0c;回车&#xff09;&#xff1b; 2. 进入需要提取文件名的文件夹&#xff08;使用cd命令&#xf…

sqlilabs less16-20关手工注入

第16关 一.判断闭合方式 闭合方式点“&#xff09; admin")and11# 二.判断数据库长度 admin") and if(length(database())>7, 0, sleep(5))# 页面无延迟 admin") and if(length(database())>8, 0, sleep(5))# 页面有延迟说明数据库长度为8 三.判断数…

spark全面个人总结(20个面试点)非网文

1. 请简述Spark的工作原理和架构&#xff1f; 基于RDD&#xff0c;一种数据结构&#xff0c;含数据项、处理函数、血缘。spark解析任务&#xff0c;生成rdd&#xff0c;并将系列rdd转换成一系列物理计划&#xff0c;然后发送到集群上的各个节点执行。spark负责管理这些任务&a…

UV LED供电为什么要选择使用恒流驱动电源

LED为何一定要恒流供电? 在讨论此议题之前&#xff0c;什么是电源的恒流恒压&#xff1f; 什么是电源的恒流恒压   恒流&#xff0c;就是输出电流是恒定的&#xff0c;但电源电流却不是固定的&#xff0c;标称的电压只是安全上限&#xff1b;恒压&#xff0c;就是输出电压是…

Mysql varchar的最大值到底有多少

MySQL中varchar类型的最大值受到多个因素的影响&#xff0c;包括MySQL的版本、字符集以及行的其他字段配置。以下是对varchar最大值的一个详细解析&#xff1a; 1. MySQL版本差异 MySQL 4.1及以前版本&#xff1a;varchar的最大长度限制为255字节。MySQL 5.0及以后版本&#…

Ps:首选项 - 图像处理

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“图像处理” Image Processing选项卡让用户可以根据当前工作任务的需要&#xff0c;在处理速度和结果的精细度之间找到平衡。这些设置可以帮助优化 Photoshop 的处理性能&…

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(2)

STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(2) 简介 实验 2&#xff1a;在单片机搭建好 tcp 服务器后&#xff0c;编写传送文件的上位机。 整体实现 - 利用qt的tcpsocket简单封装 - 每次发送512字节&#xff0c;这样小的tcp包就不会自动分包。保证每一个51…

无人驾驶,并非无人之地

图片&#xff5c;Photo by 萝卜快跑 ©自象限原创 作者丨罗辑 老司机又双叒叕被“抢”了&#xff1f; 随着武汉无人驾驶的Robotaxi在各社交媒体平台出圈&#xff0c;自动驾驶安全员的职业从幕后走向台前&#xff0c;近期&#xff0c;招聘平台信息也显示&#xff0c;萝卜…

React Native中好用的UI组件库

文章目录 前言1.React Native ElementsStar数超24K地址 2.React Native UI KittenStar数超20K地址 3.NativeBaseStar数超20K地址 前言 下面是React Native中一些常用的UI库 1.React Native Elements Star数超24K 官方介绍 React Native Elements 的目标是提供一套用于在 Rea…

wpf DataTemplate 和 ControlTemplate 区别,应用举例

在WPF中&#xff0c;模版&#xff08;ControlTemplate &#xff09; ControlTemplate用于定义控件的内部结构和外观&#xff0c;它决定了控件的“长成什么样子”&#xff0c;并允许开发者在控件原有的内部逻辑基础上扩展自己的逻辑。DataTemplate则专注于数据内容的展示方式&am…

Parallels Desktop 19 for Mac 安装虚拟机需要激活吗

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

【Docker】gitea的ssh容器直通

本文首发于 ❄️慕雪的寒舍 1.跟着文档走 gitea的安装比较简单&#xff0c;直接使用官方文档中的docker-compose文件即可。如果想实现ssh容器直通&#xff0c;需要对这个docker-compose文件做一定修改。 如果你还没有安装docker&#xff0c;参考本站教程 linux安装docker&…

手机麻将APP开发违法吗,有哪些注意的地方呢?

在我的职业生涯中&#xff0c;我处理过许多因开发或运营手机游戏而遭遇法律处罚的案例。游戏作为一种传统的娱乐形式&#xff0c;在中国拥有广泛的受众。然而&#xff0c;随着智能手机的普及&#xff0c;手机游戏的开发和运营逐渐成为热门领域&#xff0c;但其中也存在不少法律…

c++链表(list)

前言 链表作为一个常见的数据结构&#xff0c;在高频插入删除的场景下有独特的优势&#xff0c;在内存的使用上也极少有浪费可以按需申请。今天我们就来简单的学习一下这种数据结构&#xff0c;链表也有很多不同的实现&#xff0c;我们这里和标准库保持一致&#xff0c;实现带…

docker手动部署django项目Dockerfile编排-后端发布

1、首先创建一个桥接网络 docker network create auto 2、部署redis,提供celery的消息队列服务 docker run --name redis --restartalways -d --network auto -v redis:/data redis:alpine3、部署数据库 注意数据库账号密码 docker run --name mariadb --restartalways -d…