左连接,右连接,内连接,全连接: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
- 这种情况下,每行记录与另一张表中的所有行都将进行组合。

浙公网安备 33010602011771号