超详细的MySQL表连接
2023-12-12 15:47:41笛卡尔积定义
来自百度百科定义:
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
多表查询
多表查询原理:是将多个表通过笛卡尔积形成一个虚表,再根据查询条件筛选符合条件的记录集合。
SELECT命令不仅可以从一张表中查询数据,还可以从多张表中一次性查询数据,语法如下:
SELCT 字段列表 FROM 表列表;
应用
首先,我们创建student表和teacher表:
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name varchar(10) UNIQUE NOT NULL COMMENT "学生名称",
age INT COMMENT "学生年龄",
teacher_id INT COMMENT "学生辅导员id",
score INT COMMENT "学生分数"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO
student (name, age, teacher_id, score)
VALUES
("李红", 20, 1, 80),
("刘涛", 10, 1, 90),
("王武", 19, 2, 80),
("李明", 18, 2, 90),
("李小明", 15, null, 99);
CREATE TABLE teacher (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name VARCHAR(10) UNIQUE NOT NULL COMMENT "辅导员名称"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teacher (name) VALUES ("王老师"), ("蒋老师");
ALTER TABLE student ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(id);
现在我们进行多表查询,查询结果(其实是两个表集合的笛卡尔积):
SELECT * FROM student, teacher;
在记录中,发现有两个相同字段名id和name,如果想要区分,我们可以使用 as 进行别名。
表连接
当需要同时显示多个表中的字段时,就可以用表连接来实现。
表连接分为两大类:
内连接
内连接只会通过指定的条件去选择出两张表中相互匹配的记录。
先对两个表进行交叉连接后,在通过限制条件去除不符合条件的子集,最终获取的结果,就是内连接的结果。
图表表示:
- 隐式内连接
语法格式:
SELECT 字段列表 FORM 表列表 WHERE 条件;
例如:我们可以通过student.teacher_id = teacher.id过滤掉笛卡尔积组合的部分记录(student表中teacher_id和teacher表中id不相等的):
SELECT * FROM student, teacher WHERE student.teacher_id = teacher.id;
通过和不带条件的查询记录相比较,可以看到teacher_id中如果是null(不满足where条件判断),就不会被返回。需要注意这一点。
- 显式内连接
语法如下:
SELECT 字段列表 FORM 表名1 [INNER] JOIN 表名2 ON 条件;
例如:
SELECT * FROM student INNER JOIN teacher ON student.teacher_id = teacher.id;
外连接
外连接会选择出其他不匹配的记录。
外连接又分为左外连接和右外连接:
左外连接:包含所有的左边表中的记录甚至右边表中没有和它匹配的记录。
右外连接:包含所有的右边表中的记录甚至左边表中没有和它匹配的记录。
左外连接和右外连接类似,两者之间可以转化。
- 左外连接
语法如下:
SELECT 字段列表 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;
获取的数据内容:表名1(左表)的数据、两者交集的数据,图标如下:
例如:
SELECT * FROM student LEFT OUTER JOIN teacher ON student.teacher_id = teacher.id;
// 或者
SELECT * FROM teacher RIGHT OUTER JOIN student ON student.teacher_id = teacher.id;
- 右外连接
语法如下:
SELECT 字段列表 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;
获取的数据内容:表名2(右表)的数据、两者交集的数据,图标如下:
例如:
SELECT * FROM student RIGHT OUTER JOIN teacher ON student.teacher_id = teacher.id;
// 或者
SELECT * FROM teacher LEFT OUTER JOIN student ON student.teacher_id = teacher.id;