SQL JOIN含义、应用场景、事例演示

2022-01-08  本文已影响0人  CoderZb

含义:将两个或多个表的行结合起来展示。

有以下四种常用类型:

JOIN: 等同INNER JOIN(内连接、等值连接)。只会把筛选条件等值的内容查询出来。

LEFT JOIN:左连接。 会匹配左边数据表的所有行,即使右边表无对应的数据。
数据生成的默认规则是: 先展示交集,再展示左边表的剩余数据。
交集数据产生的规则是,右边的每行数据执行一次,左边的所有数据就会遍历一次。(类似固定变量法:右边某行固定一次,左边所有数据遍历一次)

RIGHT JOIN:右连接。会匹配右边数据表的所有行,即使左边表无对应的数据。
数据生成的默认规则是: 先展示交集,再展示右边表的剩余数据。
交集数据产生的规则是是,左边的每行数据执行一次,右边的所有数据遍历一次。(类似固定变量法:左边某行固定一次,右边所有数据遍历一次)

FULL JOIN:全连接。 会把左连接+右连接的数据筛选出来。

应用场景:

有时候我们需要通过关联关系,来从两个或多个表中获取数据,为了展示更完整的数据数据,这时候就需要用JOIN来查询数据。
因为数据库中创建的每个表都有其主要的功能,在保证其主要功能的情况下,可能只会在表中存储另一个表的id,这个id在另一个表中极有可能为主键,我们就可以通过这个id来进行关联查询等。

事例演示:language表+person表

language表数据如下:11条数据
image.png
person表数据如下:11条数据
image.png

JOIN 等同:INNER JOIN

例1:根据用户id进行筛选。
共筛选出10条数据
因为左表的invention_userId =100001没有能和右表userId对应的数据,同理,右表的userId = 20001没有能和左表invention_userId对应的数据。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot,
    d.invention_name,
    d.country,
    d.userId
FROM
    LANGUAGE c
    INNER JOIN person d ON c.invention_userId = d.userId;

例2:根据语言的发明时间进行筛选。
共筛选出23条数据
根据筛选出的数据,可以得知匹配的规则是:先从右表的invention_time=1994开始,然后从左表中遍历找到invention_time=1994的数据,找到就筛选出一条并记录展示。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot
FROM
    LANGUAGE c
    INNER JOIN person d ON c. invention_time = d. invention_time;

LEFT JOIN

例2:根据用户id进行筛选。
可以测试无对应数据的情况,因为左表某行的invention_userId为100001,右表没有能对应的数据
共筛选出11条数据
匹配的规则是:文章最上面有介绍。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot,
    c.invention_userId,
    d.userId 
FROM
    LANGUAGE c
    LEFT JOIN person d ON c.invention_userId = d.userId;

例2:根据语言的发明时间进行筛选。
共筛选出23条数据
匹配的规则是:文章最上面有介绍。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot
FROM
    LANGUAGE c
    LEFT JOIN person d ON c.invention_time = d.invention_time;

RIGHT JOIN

例1: 根据用户id进行筛选。
可以测试无对应数据的情况,因为右表某行的userId为20001,左表没有能对应的数据
共筛选出11条数据
匹配的规则是:文章最上面有介绍。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot,
    c.invention_userId,
    d.userId 
FROM
    LANGUAGE c
    RIGHT JOIN person d ON c.invention_userId = d.userId;

例2:根据语言的发明时间进行筛选。
共筛选出23条数据
匹配的规则是:文章最上面有介绍。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot
FROM
    LANGUAGE c
    RIGHT JOIN person d ON c.invention_time = d.invention_time;

FULL JOIN 由于MySQL不支持FULL JOIN,可改为UNION ALL进行测试,是等价的。

例1: 根据用户id进行筛选。
共筛选出22条数据。其实就是11条左连接的数据+11条右连接的数据。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot,
    c.invention_userId,
    d.userId 
FROM
    LANGUAGE c
    LEFT JOIN person d ON c.invention_userId = d.userId UNION ALL
SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot,
    c.invention_userId,
    d.userId 
FROM
    LANGUAGE c
    RIGHT JOIN person d ON c.invention_userId = d.userId;

例2:根据语言的发明时间进行筛选。
共筛选出46条数据。其实就是23条左连接的数据+23条右连接的数据。

SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot 
FROM
    LANGUAGE c
    LEFT JOIN person d ON c.invention_time = d.invention_time UNION ALL
SELECT
    c.id,
    c.language_name,
    c.invention_time,
    c.hot 
FROM
    LANGUAGE c
    RIGHT JOIN person d ON c.invention_time = d.invention_time
上一篇 下一篇

猜你喜欢

热点阅读