SQL入门之第十讲——INNER JOIN 内连接

本文详细介绍了数据库查询中的JOIN连接类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。通过实例演示了如何使用JOIN连接多个表,并展示了如何使用USING关键字简化连接条件。此外,还讲解了自连接的概念并提供了一个自连接查询的例子,帮助读者深入理解数据库多表查询的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际的业务当中,往往需要多张表连接查询,这就会涉及到JOIN 连接

1. JOIN 连接的类型

  • INNER JOIN :内连接, 可以只写JOIN ,只有连接的两个表中,都存在连接标准的数据才会保留下来,相当于两个表的交集。如果前后连接的是同一个表,也叫自连接。
  • LEFT JOIN :左连接,也叫左外连接。操作符左边表中符合WHERE子句中的所有记录将会被返回,操作右边表中如果没有符合ON后面连接的条件时,那么右边表指定选择的列将会返回NULL。
  • RIGHT JOIN:右连接,也叫右外连接。返回右边表所有符合WHERE语句的记录,左表中匹配不上的字段值用NULL来代替。
  • FULL JOIN:全连接。返回所有表中符合WHERE语句条件的所有记录。如果表中指定字段没有符合条件的值的话,用NULL来代替。
    在这里插入图片描述

2. INNER JOIN 内连接

  • 通过JOIN语句就可以将几个表通过那几个列连接起来
  • INNER JOIN,可以省略掉 'INNER ’ 只写JOIN就可以

基本语法:

select <字段名>
from <表a>
JOIN <表b>
ON a.<字段名> = b.<字段名>;

实例1:将学生表和教师表通过教师编号Tid连接起来

select * 
from students AS s 
join teachers AS t
on s.Tid = t.Tid;

执行结果:
在这里插入图片描述
查看输出结果,from后面的students表会作为基础表放在前面,后面在根据关联的Tid,去拼接是哪个join后面的teachers 表。

如果将两个表进行调换下位置,那么teachers表将会作为基础表放在前面

select * 
from teachers AS t
join students AS s
on t.Tid = s.Tid;

执行结果:

查看结果时发现,teachers表中一个有6个老师,现在只输出了4个老师,这是因为没出现的2个老师在students里没有对应的学生,所以内连接,只会输出两个表中相互匹配的数据,2个表的交集

JOIN…ON后面可以跟多个连接条件,条件之间使用AND进行连接就可以了。
在这里插入图片描述

3. 多表内连接

  • JOIN不仅仅可以连接两个表,在实际业务中,连接很多表进行查询都是常事,因此多表内连接也是需要掌握的。

基本语法:

select <字段名>
from <表a>
JOIN <表b>
ON a.<字段名> = b.<字段名>
JOIN <表c>
ON a.<字段名> = C.<字段名>

多表连接过程中,FROM后面的表作为基础表,每次和其他表进行连接,是不变的

实例2:学生表同时去连接教师表和课程表,通过教师编号Tid连接起来

select * 
from students as s
join teachers as t
on s.Tid = t.Tid
join suject as u
on s.Tid = u.Tid;

执行结果:
在这里插入图片描述

4. USING 关键字

  • 当JOIN…ON后面作为合并条件的列名时,在两个表中相同时,可以使用USING
    (…,…)来简化,取代ON…AND…
  • 如果列名不一样,是不能够使用USING 关键字来简化的,需要特别注意

例如:

select * 
from students as s 
join teachers as t
on s.Tid = t.Tid
and s.Sname= t.Sname

就可以使用 USING 来简化成:

select * 
from students as s 
join teachers as t
USING(Tid,Sname)

5. 自连接

  • 顾名思义,表仅仅能跟别的表进行连接,还能够跟自己连接,就是自连接。

实例3:编写一个SQL查询,查找所有至少连续出现三次的字,表结构如下:
在这里插入图片描述

select DISTINCT a.num
FROM NUM a 
JOIN NUM b
on a.id+1 = b.id
JOIN NUM c
on a.id+2 = c.id
WHERE a.num = b.num 
and a.num = c.num 

执行结果:
在这里插入图片描述

### 隐式连接与 INNER JOIN 的区别 #### 定义与语法结构 隐式连接(Implicit Join),也称为旧风格的连接,在 `FROM` 子句中通过多个表名并列来指定参与查询的数据源,并利用 `WHERE` 条件表达式定义这些表之间的关系。这种方式源自早期版本的标准 SQL 语句。 ```sql SELECT * FROM employees, departments WHERE employees.department_id = departments.department_id; ``` INNER JOIN 是显式的 ANSI 标准语法的一部分,用于指明两个或更多个表之间基于某些条件进行匹配的方式。这种形式更加直观易读,推荐现代开发人员采用此方法编写 SQL 查询。 ```sql SELECT * FROM employees INNER JOIN departments ON employees.department_id = departments.department_id; ``` #### 性能差异 对于大多数数据库管理系统而言,优化器能够识别这两种写法并将它们转换成相同的执行计划[^1]。然而,由于 INNER JOIN 明确表达了意图,因此更有利于代码维护者理解逻辑以及后续可能涉及的性能调优工作。 #### 可读性和可维护性 使用 INNER JOIN 能够使 SQL 更加清晰地展示各个表间的关系,特别是当涉及到多张表联合操作时尤为明显。而隐式连接容易造成复杂的 WHERE 子句难以阅读和调试的情况发生。 #### 支持的功能特性 值得注意的是,只有 INNER JOIN 和其他类型的显示连接才允许使用额外功能选项,比如 LEFT/RIGHT OUTER JOIN 或 FULL OUTER JOIN 等高级用法[^3]。相比之下,隐式连接仅限于实现简单的笛卡尔积加上过滤条件的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值