超详细的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);

multi table

现在我们进行多表查询,查询结果(其实是两个表集合的笛卡尔积):

SELECT * FROM student, teacher;

multi table

在记录中,发现有两个相同字段名id和name,如果想要区分,我们可以使用 as 进行别名。

表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现。

表连接分为两大类:

内连接

内连接只会通过指定的条件去选择出两张表中相互匹配的记录。

先对两个表进行交叉连接后,在通过限制条件去除不符合条件的子集,最终获取的结果,就是内连接的结果。

图表表示:

multi table

  1. 隐式内连接

语法格式:

SELECT 字段列表 FORM 表列表 WHERE 条件;

例如:我们可以通过student.teacher_id = teacher.id过滤掉笛卡尔积组合的部分记录(student表中teacher_id和teacher表中id不相等的):

SELECT * FROM student, teacher WHERE student.teacher_id = teacher.id;

multi table

通过和不带条件的查询记录相比较,可以看到teacher_id中如果是null(不满足where条件判断),就不会被返回。需要注意这一点。

  1. 显式内连接

语法如下:

SELECT 字段列表 FORM 表名1 [INNER] JOIN 表名2 ON 条件;

例如:

SELECT * FROM student INNER JOIN teacher ON student.teacher_id = teacher.id;

multi table

外连接

外连接会选择出其他不匹配的记录。

外连接又分为左外连接和右外连接:

  • 左外连接:包含所有的左边表中的记录甚至右边表中没有和它匹配的记录。

  • 右外连接:包含所有的右边表中的记录甚至左边表中没有和它匹配的记录。

左外连接和右外连接类似,两者之间可以转化。

  1. 左外连接

语法如下:

SELECT 字段列表 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;

获取的数据内容:表名1(左表)的数据、两者交集的数据,图标如下:

multi table

例如:

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;

multi table

multi table

  1. 右外连接

语法如下:

SELECT 字段列表 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;

获取的数据内容:表名2(右表)的数据、两者交集的数据,图标如下:

multi table

例如:

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;

multi table

multi table

目录

相关推荐
MySQL入门-什么是MySQL,什么是SQL超详细的 SQL 语句 DDL(数据定义语言)讲解MySQL中如何对表字段进行增加、删除、改名、类型修改SQL语句-DML(数据操作语言)对表记录的插入、更改、删除命令MySQL中的约束详解超详细的DQL(数据查询语言)讲解