【SQL】所谓的连表查询
阅读原文时间:2023年08月29日阅读:2

连表查询

外连接

外连接分为两种,左(外)连接右(外)连接

基本语法如下:

SELECT 字段列表
FROM 表1
LEFT JOIN 表2
ON 条件;

这是左连接,因此以表1中的 [字段列表] 为基础,拿着这些字段去表2一条一条的找,看看有没有符合 [条件] 的,没有找到符合条件的用null代替,然后把表1与表2中的满足条件的和不满足条件的(null)拼在一起,返回结果

右连接也类似

SELECT 字段列表
FROM 表1
RIGHT JOIN 表2
ON 条件;

这是右连接,因此以表2中的 [字段列表] 为基础,拿着这些字段去表1一条一条的找,看看有没有符合 [条件] 的,没有找到符合条件的用null代替,然后把表1与表2中的满足条件的和不满足条件的(null)拼在一起,返回结果

说白了就是基于某个表的数据去另一个表查找满足条件的数据,如果查到就返回值,查不到就用null代替返回值

下面是例子

先看左连接,我们使用表1去表2中查询

酸菜在表2中没有对应,好,酸菜对应null;

肉末在表2中uid与茄子对应,肉末对应茄子;

可乐在表2中uid与鸡翅对应,可乐对应鸡翅;(拼在一起返回结果)

注意,左连接时以表1为基础,表1遍历完之后就结束了,因此不会存在"null-猪蹄"的情况

再看右连接,这里使用表2去表1中查询

茄子在表1中uid与对应肉末,茄子对应肉末;

鸡翅在表1中uid与对应可乐,鸡翅对应可乐;

猪蹄的uid在表1中无对应,那么其uid对应null,其aname也对应null;

因为是右连接,以表2为基础,所以不会有酸菜出现

内连接

简单来说,内连接就是使用关键字INNER JOIN将两个表连接起来,查询出所有的结果

例如:

SELECT *
FROM 表1
INNER JOIN 表2;

如果此时就输出,那么mysql会使用笛卡尔积将两张表进行组合并返回结果

笛卡尔积是指将第一个表的每一行与第二个表的每一行都进行组合,生成一个新的结果集。

假设我们有两个表:Customers(客户表)和 Orders(订单表)。每个表都有几行记录。

Customers 表:

| CustomerID | CustomerName |
|------------|--------------|
| 1          | Alice        |
| 2          | Bob          |

Orders 表:

| OrderID | OrderDate   |
|---------|-------------|
| 101     | 2022-01-01  |
| 102     | 2022-02-01  |

如果我们执行下面的查询语句而没有指定连接条件:(这里隐式的写了内连接

SELECT Customers.CustomerName, Orders.OrderID, Orders.OrderDate
FROM Customers, Orders;

则会得到如下结果:

| CustomerName | OrderID | OrderDate   |
|--------------|---------|-------------|
| Alice        | 101     | 2022-01-01  |
| Alice        | 102     | 2022-02-01  |
| Bob          | 101     | 2022-01-01  |
| Bob          | 102     | 2022-02-01  |

这个结果是通过将 Customers 表中的每一行都与 Orders 表中的每一行进行组合得到的。结果集中的每一行都包含了 Customers 表和 Orders 表中的所有列值。

但是,笛卡尔积会导致结果集的大小呈指数级增长,并且可能会产生大量冗余数据。因此,在实际应用中,我们通常会根据特定的连接条件来执行连接操作,以避免不必要的笛卡尔积。

于是就有:

SELECT *
FROM 表1
INNER JOIN 表2
ON 条件;

这样我们就可以根据两张表里共同有的一些字段,来过滤想要的数据,从而得到最终结果

注意,如果是隐式的写法,要用WHERE来过滤

先组合,再过滤