SQL学习七–JOIN
数据准备
由于需要JOIN操作,故至少需要两个表,一个是STUDENT,一个是CLASS表, 其中,STUDENT表中的CLASSID属性对应了CLASS表中的ID(此处不设定外键)。
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 |
4 | D | Teacher D |
建表语句和插入语句如下:
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'),
(4, 'D', 'Teacher D');
JOIN
如果要做两个表相关的事情,就要JOIN,JOIN其实就是将两个表组织到一个表中,
例如,要将上面的STUDENT表和CLASS表组织到一起,就用JOIN,STUDENT JOIN CLASS
如果是只使用STUDENT JOIN CLASS ,会生成什么呢?JOIN 的过程就是STUDENT的每一行去拼接CLASS表的所有行,即两个表的笛卡尔积,当前只写STUDENT表第一列的所有结果(全部写出来太多了…)
SELECT * FROM
STUDENT JOIN CLASS;
ID | NAME | CLASSID | ID | NAME | TEACHER |
---|---|---|---|---|---|
1 | xiaoming | 1 | 1 | A | Teacher A |
1 | xiaoming | 1 | 2 | B | Teacher B |
1 | xiaoming | 1 | 3 | C | Teacher C |
1 | xiaoming | 1 | 4 | D | Teacher D |
… |
执行结果如下(表1):
此表中存在两个ID,那么在使用时如何区分二者呢,可以通过表名来标识
例如,当我想选择CLASS中ID为奇数的记录,SQL如下:
SELECT * FROM
STUDENT JOIN CLASS
WHERE CLASS.ID % 2 = 1;
结果如下(结果不止下面,还有更多):
ON 条件
当我们将两个表通过JOIN组合到一起后,还可以通过ON条件对组合的表进行过滤筛选,当前的ON过滤是在WHERE之前进行的筛选,例如上面的组合,我们要求STUDENT所属的CLASSID和CLASS表的ID一致的才有意义,才可以得到每个学生所属的班级信息。
SELECT * FROM
STUDENT JOIN CLASS
ON STUDENT.CLASSID = CLASS.ID;
结果如下:
当我想再次选择CLASS中ID为奇数的记录,SQL如下:
SELECT * FROM
STUDENT JOIN CLASS
ON STUDENT.CLASSID = CLASS.ID
WHERE CLASS.ID % 2 = 1;
结果如下: