左连接,右连接,内连接,全连接:MySQL不能直接支持

一 连接方式简介

  • 数据通常不在同一张表中,这就涉及到连表操作,而表间连接方式有很多

  • 内连接:把两张表中共有的数据,连接到一起

  • 连接:以左表为基准,把左表所有数据都展示,有可能右表没有,用空补齐

  • 右连接:以右表为基准,把右表所有数据都展示,有可能左表没有,用空补齐

  • 全连接:以左右两表数据作为基准,左右两表数据都展示,有可能左或表没有,用空补齐

数据往往存储在不同的数据表中,因此在进行查询和分析时,需要使用表间连接操作来合并相关数据。

以下是常见的表间连接方式:

1.内连接(Inner Join)

内连接是将两个表中满足连接条件的数据连接到一起的操作,它只返回左右两个表中交集部分的数据。

2.左连接(Left Join)

  • 左连接以左表为基准,将左表的所有数据都展示出来,并用右表的匹配数据进行补充。
  • 若右表没有匹配的数据,则用空值进行补齐。

3.右连接(Right Join)

  • 右连接以右表为基准,将右表的所有数据都展示出来,并用左表的匹配数据进行补充。
  • 若左表没有匹配的数据,则用空值进行补齐。

4.全链接

  • 全连接将左右两个表的数据作为基准,同时展示左表和右表的所有数据。
  • 若某个表缺少匹配的数据,则用空值进行补齐。
  • 在MySQL中,并没有直接支持全连接(FULL JOIN)的语法。但是可以使用其他方式来模拟全连接的效果。

二 简单演示多表查询

1.准备数据

  • 创建表
create table dep(
	id int,
    name varchar(20)
);


CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
    sex ENUM("male","female") NOT NULL DEFAULT "male",
    age INT,
    dep_id INT
);

  • 插入数据
insert into dep values
("200","技术部"),
("201","人力资源"),
("202","销售部"),
("203","运营部"),
("204","售后部");

insert into emp(name,sex,age,dep_id) values
("dream","male",18,200),
("chimeng","female",18,201),
("menmgneg","male",38,202),
("hope","male",18,203),
("own","male",28,204),
("thdream","male",18,205);

  • 查看表
desc dep;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.13 sec)

desc emp;

+--------+-----------------------+------+-----+---------+----------------+
| Field  | Type                  | Null | Key | Default | Extra          |
+--------+-----------------------+------+-----+---------+----------------+
| id     | int(11)               | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20)           | YES  |     | NULL    |                |
| sex    | enum('male','female') | NO   |     | male    |                |
| age    | int(11)               | YES  |     | NULL    |                |
| dep_id | int(11)               | YES  |     | NULL    |                |
+--------+-----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

  • 查看数据
select * from dep;

+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术部       |
|  201 | 人力资源     |
|  202 | 销售部       |
|  203 | 运营部       |
|  204 | 售后部       |
+------+--------------+
5 rows in set (0.00 sec)

select * from emp;

+----+----------+--------+------+--------+
| id | name     | sex    | age  | dep_id |
+----+----------+--------+------+--------+
|  1 | dream    | male   |   18 |    200 |
|  2 | chimeng  | female |   18 |    201 |
|  3 | menmgneg | male   |   38 |    202 |
|  4 | hope     | male   |   18 |    203 |
|  5 | own      | male   |   28 |    204 |
|  6 | thdream  | male   |   18 |    205 |
+----+----------+--------+------+--------+
6 rows in set (0.00 sec)

1.1拼表

结果叫 笛卡尔积

  • 查询数据
select * from dep,emp;
+------+--------------+----+----------+--------+------+--------+
| id   | name         | id | name     | sex    | age  | dep_id |
+------+--------------+----+----------+--------+------+--------+
|  200 | 技术部       |  1 | dream    | male   |   18 |    200 |
|  201 | 人力资源     |  1 | dream    | male   |   18 |    200 |
|  202 | 销售部       |  1 | dream    | male   |   18 |    200 |
|  203 | 运营部       |  1 | dream    | male   |   18 |    200 |
|  204 | 售后部       |  1 | dream    | male   |   18 |    200 |
|  200 | 技术部       |  2 | chimeng  | female |   18 |    201 |
|  201 | 人力资源     |  2 | chimeng  | female |   18 |    201 |
|  202 | 销售部       |  2 | chimeng  | female |   18 |    201 |
|  203 | 运营部       |  2 | chimeng  | female |   18 |    201 |
|  204 | 售后部       |  2 | chimeng  | female |   18 |    201 |
|  200 | 技术部       |  3 | menmgneg | male   |   38 |    202 |
|  201 | 人力资源     |  3 | menmgneg | male   |   38 |    202 |
|  202 | 销售部       |  3 | menmgneg | male   |   38 |    202 |
|  203 | 运营部       |  3 | menmgneg | male   |   38 |    202 |
|  204 | 售后部       |  3 | menmgneg | male   |   38 |    202 |
|  200 | 技术部       |  4 | hope     | male   |   18 |    203 |
|  201 | 人力资源     |  4 | hope     | male   |   18 |    203 |
|  202 | 销售部       |  4 | hope     | male   |   18 |    203 |
|  203 | 运营部       |  4 | hope     | male   |   18 |    203 |
|  204 | 售后部       |  4 | hope     | male   |   18 |    203 |
|  200 | 技术部       |  5 | own      | male   |   28 |    204 |
|  201 | 人力资源     |  5 | own      | male   |   28 |    204 |
|  202 | 销售部       |  5 | own      | male   |   28 |    204 |
|  203 | 运营部       |  5 | own      | male   |   28 |    204 |
|  204 | 售后部       |  5 | own      | male   |   28 |    204 |
|  200 | 技术部       |  6 | thdream  | male   |   18 |    205 |
|  201 | 人力资源     |  6 | thdream  | male   |   18 |    205 |
|  202 | 销售部       |  6 | thdream  | male   |   18 |    205 |
|  203 | 运营部       |  6 | thdream  | male   |   18 |    205 |
|  204 | 售后部       |  6 | thdream  | male   |   18 |    205 |
+------+--------------+----+----------+--------+------+--------+
30 rows in set (0.00 sec)

1.2拼表升级

  • 查询数据
select * from dep,emp where emp.dep_id = dep.id;
+------+--------------+----+----------+--------+------+--------+
| id   | name         | id | name     | sex    | age  | dep_id |
+------+--------------+----+----------+--------+------+--------+
|  200 | 技术部       |  1 | dream    | male   |   18 |    200 |
|  201 | 人力资源     |  2 | chimeng  | female |   18 |    201 |
|  202 | 销售部       |  3 | menmgneg | male   |   38 |    202 |
|  203 | 运营部       |  4 | hope     | male   |   18 |    203 |
|  204 | 售后部       |  5 | own      | male   |   28 |    204 |
+------+--------------+----+----------+--------+------+--------+
5 rows in set (0.00 sec)

1.3拼表语法

  • inner join(内连接)

只拼接两张表中共有的数据部分

select * from emp inner join dep on emp.dep_id = dep.id;
+----+----------+--------+------+--------+------+--------------+
| id | name     | sex    | age  | dep_id | id   | name         |
+----+----------+--------+------+--------+------+--------------+
|  1 | dream    | male   |   18 |    200 |  200 | 技术部       |
|  2 | chimeng  | female |   18 |    201 |  201 | 人力资源     |
|  3 | menmgneg | male   |   38 |    202 |  202 | 销售部       |
|  4 | hope     | male   |   18 |    203 |  203 | 运营部       |
|  5 | own      | male   |   28 |    204 |  204 | 售后部       |
+----+----------+--------+------+--------+------+--------------+
5 rows in set (0.00 sec)

  • left join(左连接)

左表所有的数据都展示出来,没有对应的项就用null表示

  • 查询数
select * from emp left  join dep on emp.dep_id = dep.id;
+----+----------+--------+------+--------+------+--------------+
| id | name     | sex    | age  | dep_id | id   | name         |
+----+----------+--------+------+--------+------+--------------+
|  1 | dream    | male   |   18 |    200 |  200 | 技术部       |
|  2 | chimeng  | female |   18 |    201 |  201 | 人力资源     |
|  3 | menmgneg | male   |   38 |    202 |  202 | 销售部       |
|  4 | hope     | male   |   18 |    203 |  203 | 运营部       |
|  5 | own      | male   |   28 |    204 |  204 | 售后部       |
|  6 | thdream  | male   |   18 |    205 | NULL | NULL         |
+----+----------+--------+------+--------+------+--------------+
6 rows in set (0.00 sec)
  • right join(右连接)

右表所有的数据都展示出来,没有对应的项就用null表示

  • 查询数据
select * from emp right join dep on emp.dep_id = dep.id;
+------+----------+--------+------+--------+------+--------------+
| id   | name     | sex    | age  | dep_id | id   | name         |
+------+----------+--------+------+--------+------+--------------+
|    1 | dream    | male   |   18 |    200 |  200 | 技术部       |
|    2 | chimeng  | female |   18 |    201 |  201 | 人力资源     |
|    3 | menmgneg | male   |   38 |    202 |  202 | 销售部       |
|    4 | hope     | male   |   18 |    203 |  203 | 运营部       |
|    5 | own      | male   |   28 |    204 |  204 | 售后部       |
+------+----------+--------+------+--------+------+--------------+
5 rows in set (0.00 sec)

  • union(全连接)

左右两表的数据都展示出来
在MySQL中,并没有直接支持全连接(FULL JOIN)的语法。但是可以使用其他方式来模拟全连接的效果。

  • 查询数据
select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id;
+------+----------+--------+------+--------+------+--------------+
| id   | name     | sex    | age  | dep_id | id   | name         |
+------+----------+--------+------+--------+------+--------------+
|    1 | dream    | male   |   18 |    200 |  200 | 技术部       |
|    2 | chimeng  | female |   18 |    201 |  201 | 人力资源     |
|    3 | menmgneg | male   |   38 |    202 |  202 | 销售部       |
|    4 | hope     | male   |   18 |    203 |  203 | 运营部       |
|    5 | own      | male   |   28 |    204 |  204 | 售后部       |
|    6 | thdream  | male   |   18 |    205 | NULL | NULL         |
+------+----------+--------+------+--------+------+--------------+
6 rows in set (0.02 sec)

三 笛卡尔积

  • 当我们没有指定任何连接条件时,会发生笛卡尔积的情况。
  • 笛卡尔积是指两个表直接产生的所有可能的组合结果。
  • 例如,在没有指定连接条件的情况下执行以下查询:
SELECT * FROM book, publish WHERE book.publish_id = publish.id;
  • 第一个表(book):
id  name  age   publish_id
1    xx    11      1
2    yy    12      1
  • 第二个表(publish):
id  name  age
1    xx    11
2    yy    12
  • 由于未指定连接条件,将会返回两个表的笛卡尔积结果:
id  name  age   publish_id  id  name  age
1    xx    11      1         1    xx    11
1    xx    11      1         2    yy    12
2    yy    12      1         1    xx    11
2    yy    12      1         2    yy    12
  • 这种情况下,每行记录与另一张表中的所有行都将进行组合。
posted @ 2023-11-20 19:20  瓜瓜不甜  阅读(533)  评论(0)    收藏  举报