SQL学习八--LEFT JOIN && RIGHT JOIN

SQL学习八–LEFT JOIN && RIGHT JOIN

数据准备

实现LEFT JOIN和RIGHT JOIN也和JOIN一样,需要两个表,可以使用前一节中使用的表,一个是STUDENT,一个是CLASS表, 其中,STUDENT表中的CLASSID属性对应了CLASS表中的ID(此处不设定外键)。但是数据需要做一些特殊处理(CLASS表中不要有ID=4的结果)。

STUDENT表:

IDNAMECLASSID
1xiaoming1
2xiaowang1
3xiaotian2
4xiaoming2
5xiaowang3
6xiaotian4
7xiaogang1
8xiaoqiang1
9xiaojing2
10xiaotie2
11wangqiang3
12wangwei3
13liming4
14liqiang4

建表语句和插入语句:

CREATE TABLE IF NOT EXISTS Student (
	ID INT PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL,
    CLASSID INT NOT NULL
);

INSERT INTO Student
VALUES 
(1, 'xiaoming', 1),
 (2, 'xiaowang', 1),
 (3, 'xiaotian', 2),
 (4, 'xiaoming', 2),
 (5, 'xiaowang', 3),
 (6, 'xiaotian', 4),
(7, 'xiaogang', 1),
(8, 'xiaoqiang', 1),
(9, 'xiaojing', 2),
(10, 'xiaotie', 2),
(11, 'wangqiang', 3),
(12, 'wangwei', 3),
(13, 'liming', 4),
(14, 'liqiang', 4);

CLASS表

IDNAMETEACHER
1ATeacher A
2BTeacher B
3CTeacher C

建表语句和插入语句如下:

CREATE TABLE IF NOT EXISTS CLASS (
	ID INT,
	NAME VARCHAR(20),
	TEACHER VARCHAR(20)
);

INSERT INTO CLASS
VALUES 
(1, 'A', 'Teacher A'),
(2, 'B', 'Teacher B'),
(3, 'C', 'Teacher C');

LEFT JOIN

LEFT JOIN 和JOIN的区别

  • LEFT JOIN 必须有ON 条件
  • LEFT JOIN 会检查左表中的数据是否都包含再新生成的表中
    • 如果是,与JOIN没有区别
    • 如果不是,则用NULL与不包含的行组成新行加入新表

首先考虑左表中所有的记录都包含在新生成的结果中

IDNAMECLASSID
1xiaoming1
2xiaowang1
3xiaotian2
4xiaoming2
5xiaowang3
6xiaotian4
7xiaogang1
8xiaoqiang1
9xiaojing2
10xiaotie2
11wangqiang3
12wangwei3
13liming4
14liqiang4
IDNAMETEACHER
1ATeacher A
2BTeacher B
3CTeacher C
4DTeacher D

那么执行下面的SQL结果为:

SELECT * 
FROM STUDENT LEFT JOIN CLASS
ON STUDENT.CLASSID=CLASS.ID;

在这里插入图片描述

如果将CLASS表中ID为4的数据删除,最终结果为:

DELETE FROM CLASS WHERE ID = 4;

SELECT * 
FROM STUDENT LEFT JOIN CLASS
ON STUDENT.CLASSID=CLASS.ID;

在这里插入图片描述
如果将两个表反过来,结果又如何呢?即CLASS LEFT JOIN STUDENT
其实LEFT JOIN 和JOIN 的区别不大,LEFT JOIN 关注的点在于左表的记录都要在结果中出现,且需要满足ON条件,故

SELECT * 
FROM CLASS LEFT JOIN STUDENT 
ON STUDENT.CLASSID=CLASS.ID;

的结果为:
在这里插入图片描述

因为将两个表JOIN后的结果包含了CLASS的所有记录,故LEFT JOIN的结果和JOIN的结果一致(属性列前后顺序不同)

RIGHT JOIN

A LEFT JOIN B === B RIGHT JOIN A

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值