MySQL之内连接、左连接和右连接

mysql join 包括左链接、右连接、全链接。直接使用例子表述一下差别,假设有如下score表,以及student学生表

student
学号姓名
1小花
3小二
score
学号分数
110
420

 

可以观察以上表,student 表中学号为3的人,在score表中没有记录。同时score表中,学号为4学生的在student中表没有记录。

全链接

 select * from score join student on student.学号 = student.学号将会得出以下结果

学号分数姓名
110小花

 

可以看出结果中student学号为3的数据以及score表中学号为4的数据都没得了。所以全链接需要on后面的条件都有相同的值的时候记录才会被查询出来

左链接

 select * from score left join student on student.学号 = student.学号将会得出以下结果

学号分数姓名
110小花
3null小二

 

可以看出结果中学号为4的数据都没得了,但是确有student中学号为3的记录,并且分数为空,因为分数表中没有学号为3的分数。左链接可以看作已join左边那张表为基准。如果右边的表没有出现该记录,那么值填为空。

右链接

 select * from score right join student on student.学号 = student.学号将会得出以下结果

学号分数姓名
110小花
420null

 

可以看出结果中学号为3的数据都没得了,但是确有score中学号为4的记录,并且姓名为空,因为学生表中没有学号为4的记录。右链接可以看作已join右边那张表为基准。如果左边的表没有出现某个记录,那么值填为空。

  

### MySQL 中不同类型 JOIN 的解释及用法 #### 左连接 (LEFT JOIN) 左外连接返回左表中的所有行,即使在表中没有匹配的行也会返回。对于表中没有匹配的行,结果集中会显示 `NULL`[^2]。 ```sql SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.foreign_id; ``` 此语句将返回 `table1` 中的所有记录以及与之匹配的 `table2` 记录;如果没有找到匹配项,则对应列填充为 `NULL`[^4]。 #### 连接 (RIGHT JOIN) 连接查询以侧表格作为基准表,即表的信息全部展示出来,而左侧表格只会展现出符合条件的数据部分,不满足条件的位置将以 `NULL` 补充[^1]。 ```sql SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.foreign_id; ``` 这段代码表示获取 `table2` 中所有的数据,并尝试关联来自 `table1` 的相应条目;如果找不到对应的链接,则相关字段设置为空值。 #### 内连接 (INNER JOIN) 内连接仅保留两个表之间存在交集的部分——也就是说只有那些能在两边都找到共同键值组合才会被选入最终的结果集合里[^5]。 ```sql SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.foreign_id; ``` 上述命令用于提取两表间有相同关键字的那一部分内容,其他任何一方独有的项目都不会出现在输出列表之中。 #### 全外连接 (FULL OUTER JOIN) 理论上来说,全外连接应该把左两侧的所有记录都纳入考虑范围之内,无论是否存在对方相配对的情况。然而值得注意的是,在标准SQL之外的具体实现上并非所有数据库管理系统都支持这一特性,MySQL 就是其中之一它并不直接提供 FULL OUTER JOIN 功能。 为了模拟全外连接的效果可以在某些情况下采用 UNION ALL 来合成: ```sql (SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.foreign_id) UNION ALL (SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.foreign_id); ``` 这种方法可以有效地覆盖到两张表各自独立存在的元素加上它们之间的交叉区域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值