SQL学习八–LEFT JOIN && RIGHT JOIN
数据准备
实现LEFT JOIN和RIGHT JOIN也和JOIN一样,需要两个表,可以使用前一节中使用的表,一个是STUDENT,一个是CLASS表, 其中,STUDENT表中的CLASSID属性对应了CLASS表中的ID(此处不设定外键)。但是数据需要做一些特殊处理(CLASS表中不要有ID=4的结果)。
STUDENT表:
ID | NAME | CLASSID |
---|---|---|
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 |
建表语句和插入语句:
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表
ID | NAME | TEACHER |
---|---|---|
1 | A | Teacher A |
2 | B | Teacher B |
3 | C | Teacher 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与不包含的行组成新行加入新表
首先考虑左表中所有的记录都包含在新生成的结果中
ID | NAME | CLASSID |
---|---|---|
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 |
ID | NAME | TEACHER |
---|---|---|
1 | A | Teacher A |
2 | B | Teacher B |
3 | C | Teacher C |
4 | D | Teacher 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