自然连接和内连接的区别

当谈到关系数据库中的连接(join)时,自然连接和内连接(inner join)是两种常见的连接方式。

自然连接

当使用自然连接时,只要两张表共享一个或多个同名列,这些列就会自动匹配并形成连接。自然连接一般通过使用关键词 NATURAL JOIN 实现。

实例1

假设有两个表:表A和表B。表A中包含学生的成绩信息(数据类型为:学号、姓名、英语成绩、数学成绩、历史成绩)。表B中包含学生的个人信息(数据类型为:学号、姓名、性别、年龄、家庭地址)。若要查询学生的全部信息,可以使用以下SQL语句:

SELECT * FROM A NATURAL JOIN B;

执行这条语句后,返回的结果将包含两个表中的所有匹配行,并剔除重复的列,得到如下结果:

学号 姓名 英语成绩 数学成绩 历史成绩 性别 年龄 家庭地址
001 张三 85 92 78 18 北京市
002 李四 79 88 92 20 上海市
003 王五 90 78 85 19 广州市

在此例中,NATURAL JOIN自动按照学号和姓名两个同名列进行连接。

实例2

假设有两个表:表A和表B。表A中包含邮件的信息(数据类型为:发送者、收件人、主题、时间、正文)。表B中包含每条邮件的附件信息(数据类型为:发送者、收件人、附件名称、附件大小)。若要查询每条邮件的附件信息,可以使用以下SQL语句:

SELECT * FROM A NATURAL JOIN B;

执行这条语句后,返回的结果将包含两个表中的所有匹配行,并剔除重复的列,得到如下结果:

发送者 收件人 主题 时间 正文 附件名称 附件大小
用户A 用户C 问题反馈 2021-01-01 请尽快处理 影像资料 20MB
用户B 用户D 订单确认 2021-01-02 请查看附件 合同 15MB

在此例中,NATURAL JOIN自动按照发送者和收件人两个同名列进行连接。

内连接

当使用内连接时,只有当两个表中的记录在连接条件上匹配时,它们才会被包含在结果集中。内连接一般通过使用关键词 INNER JOINJOIN 实现。

实例1

仍按照上一个例子,如果要查询成绩在85分以上的男生的信息,可以使用以下SQL语句:

SELECT a.学号, a.姓名, a.英语成绩, a.数学成绩, a.历史成绩, b.年龄
FROM A AS a
INNER JOIN B AS b ON a.学号 = b.学号
WHERE a.英语成绩 >= 85 AND a.数学成绩 >= 85 AND a.历史成绩 >= 85 AND b.性别 = '男';

执行这条语句后,返回的结果将包含表A和表B中所有性别为男的成绩在85分以上的学生的信息,得到如下结果:

学号 姓名 英语成绩 数学成绩 历史成绩 年龄
002 李四 79 88 92 20

在此例中,INNER JOIN 是根据学号两个同名列进行连接的。

实例2

假设有两个表:表A和表B。表A中包含订单的信息(数据类型为:订单号、商品名称、单价、数量)。表B中包含商品的库存信息(数据类型为:商品名称、总量、剩余量)。若要查询当前还有库存的订单的总金额,可以使用以下SQL语句:

SELECT a.订单号, a.商品名称, a.单价, a.数量, SUM(a.单价 * a.数量) AS 总金额
FROM A AS a
INNER JOIN B AS b ON a.商品名称 = b.商品名称 AND a.数量 <= b.剩余量
GROUP BY a.订单号, a.商品名称, a.单价, a.数量;

执行这条语句后,返回的结果将包含表A和表B中所有还有库存的订单的信息以及对应的总金额,得到如下结果:

订单号 商品名称 单价 数量 总金额
20210101 商品A 10 3 30
20210102 商品B 15 4 60
20210103 商品C 20 5 100

在此例中,INNER JOIN 是根据商品名称两个同名列进行连接的,并且还增加了一个限制条件,只查询库存充足(数量小于等于剩余量)的订单。

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

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

相关文章

  • Redis系列12:Redis 的事务机制

    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster 集群模式 追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级数据计算Redis…

    2023年4月10日
    00
  • MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)出错的解决

    首先,MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)是比较常见的一种方式,但是在实际应用中,如果不注意一些细节,就容易出现错误。 问题现象:当使用如下代码时,查询结果为空: <select id="findByNameLike" parameterType="java.lang.String&qu…

    database 2023年5月22日
    00
  • 深入学习SQL Server聚合函数算法优化技巧

    深入学习SQL Server聚合函数算法优化技巧 背景介绍 在SQL Server数据库中,聚合函数是非常常用的一种功能,如SUM、COUNT、AVG、MAX、MIN等。然而,在数据量较大的情况下,聚合函数的查询效率会变得非常低下,影响整个系统的性能。所以,在这种情况下,优化聚合函数的算法是非常必要的。 SQL Server聚合函数优化技巧 下面介绍一些SQ…

    database 2023年5月21日
    00
  • redis中key的设置方法步骤

    Redis是一种基于内存的键值对数据库,它支持丰富的数据类型,同时也提供了强大的键管理机制。在Redis中,key是最基本的存储单位,下面我们就来详细讲解一下Redis中key的设置方法步骤。 1. 命令格式 在Redis中,设置一个key的语法结构非常简单,例如: SET key value 其中key表示键名,value表示键值。 2. 键名的命名规则 …

    database 2023年5月22日
    00
  • oracle中关于case when then的使用

    关于Oracle中关于CASE WHEN THEN的使用,我为你准备了以下完整攻略: 什么是CASE WHEN THEN CASE WHEN THEN是Oracle SQL语句中的一种条件表达式。它可以根据条件表达式的结果执行不同的语句块。简单来说,它可以相当于编程语言中的if-else语句。 CASE WHEN THEN的语法 CASE expressio…

    database 2023年5月21日
    00
  • php安装redis扩展过程介绍

    下面是详细的php安装redis扩展过程介绍攻略。 安装Redis扩展前的准备工作 在安装Redis扩展之前,需要先保证已经安装了Redis服务器,可以通过以下命令检查Redis是否已经安装: redis-cli ping 如果输出为PONG,则表示Redis服务器已经启动,在此基础上开始安装Redis扩展。 安装Redis扩展 步骤1:下载Redis扩展源…

    database 2023年5月22日
    00
  • Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤

    下面是详细的Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤攻略。 下载并安装MySQL5.7 步骤1:在Ubuntu终端中更新APT软件包 在终端中输入以下命令更新APT软件包: sudo apt-get update 步骤2:下载并安装MySQL5.7 在终端中输入以下命令下载并安装MySQL5.7: sudo apt-get install…

    database 2023年5月22日
    00
  • Oracle两张表关联批量更新其中一张表的数据

    要批量更新Oracle中两张表的数据,需要进行如下步骤: 使用SELECT语句编写需要更新的数据的查询语句 将上述查询语句嵌入到UPDATE语句中,来实现数据的批量更新 使用JOIN语句连接需要更新的表 下面通过两个示例来进行讲解: 示例1:更新学生表中的成绩,假设学号和成绩需要更新 第一步,使用SELECT语句查询需要更新的数据: SELECT stu.s…

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