SQL学习七--JOIN

SQL学习七–JOIN

数据准备

由于需要JOIN操作,故至少需要两个表,一个是STUDENT,一个是CLASS表, 其中,STUDENT表中的CLASSID属性对应了CLASS表中的ID(此处不设定外键)。
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
4DTeacher 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;
IDNAMECLASSIDIDNAMETEACHER
1xiaoming11ATeacher A
1xiaoming12BTeacher B
1xiaoming13CTeacher C
1xiaoming14DTeacher 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;

结果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值