当谈到关系数据库中的连接(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 JOIN
或 JOIN
实现。
实例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技术站