多表查询

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表查询相关的知识,希望对你有一定的参考价值。

多表查询

准备员工表和部门表

# 部门表
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,'运营');

insert into emp(name,sex,age,dep_id) values
("haha","male",18,200),
("xixi","female",48,201),
("dudu","male",38,201),
("lala","female",18,202),
("nana","male",16,200),
("bubu","female",18,204);

# 查看表结构
desc dep;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

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    |                |
+--------+-----------------------+------+-----+---------+----------------+

# 查看表数据
select * from emp;
+----+------+--------+------+--------+
| id | name | sex    | age  | dep_id |
+----+------+--------+------+--------+
|  1 | haha | male   |   18 |    200 |
|  2 | xixi | female |   48 |    201 |
|  3 | dudu | male   |   38 |    201 |
|  4 | lala | female |   18 |    202 |
|  5 | nana | male   |   16 |    200 |
|  6 | bubu | female |   18 |    204 |
+----+------+--------+------+--------+

select * from dep;
+------+--------------+
| id   | name         |
+------+--------------+
|  200 | 技术         |
|  201 | 人力资源     |
|  202 | 销售         |
|  203 | 运营         |
+------+--------------+

连接查询

将多个select语句生成的虚拟表进行拼接,拼接成一张表进行查询!!!

交叉连接:不适用任何匹配条件,生成笛卡尔积

笛卡尔积

  假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0),(b, 1), (b, 2)}
 select * from emp,dep;
+----+------+--------+------+--------+------+--------------+
| id | name | sex    | age  | dep_id | id   | name         |
+----+------+--------+------+--------+------+--------------+
|  1 | haha | male   |   18 |    200 |  200 | 技术         |
|  1 | haha | male   |   18 |    200 |  201 | 人力资源     |
|  1 | haha | male   |   18 |    200 |  202 | 销售         |
|  1 | haha | male   |   18 |    200 |  203 | 运营         |
|  2 | xixi | female |   48 |    201 |  200 | 技术         |
|  2 | xixi | female |   48 |    201 |  201 | 人力资源     |
|  2 | xixi | female |   48 |    201 |  202 | 销售         |
|  2 | xixi | female |   48 |    201 |  203 | 运营         |
|  3 | dudu | male   |   38 |    201 |  200 | 技术         |
|  3 | dudu | male   |   38 |    201 |  201 | 人力资源     |
|  3 | dudu | male   |   38 |    201 |  202 | 销售         |
|  3 | dudu | male   |   38 |    201 |  203 | 运营         |
|  4 | lala | female |   18 |    202 |  200 | 技术         |
|  4 | lala | female |   18 |    202 |  201 | 人力资源     |
|  4 | lala | female |   18 |    202 |  202 | 销售         |
|  4 | lala | female |   18 |    202 |  203 | 运营         |
|  5 | nana | male   |   16 |    200 |  200 | 技术         |
|  5 | nana | male   |   16 |    200 |  201 | 人力资源     |
|  5 | nana | male   |   16 |    200 |  202 | 销售         |
|  5 | nana | male   |   16 |    200 |  203 | 运营         |
|  6 | bubu | female |   18 |    204 |  200 | 技术         |
|  6 | bubu | female |   18 |    204 |  201 | 人力资源     |
|  6 | bubu | female |   18 |    204 |  202 | 销售         |
|  6 | bubu | female |   18 |    204 |  203 | 运营         |
+----+------+--------+------+--------+------+--------------+

inner join 内连接

  inner join  	将表进行拼接,找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
# dep没有204这个部门,因而emp表中关于204这条员工信息没有匹配出来
select emp.id,emp.name,emp.sex,emp.age,emp.dep_id,dep.name from emp inner join dep on dep.id=emp.dep_id;
+----+------+--------+------+--------+--------------+
| id | name | sex    | age  | dep_id | name         |
+----+------+--------+------+--------+--------------+
|  1 | haha | male   |   18 |    200 | 技术         |
|  2 | xixi | female |   48 |    201 | 人力资源     |
|  3 | dudu | male   |   38 |    201 | 人力资源     |
|  4 | lala | female |   18 |    202 | 销售         |
|  5 | nana | male   |   16 |    200 | 技术         |
+----+------+--------+------+--------+--------------+

# dep没有204这个部门,因而emp表中关于204这条员工信息没有匹配出来
select * from emp inner join dep on emp.dep_id=dep.id;
+----+------+--------+------+--------+------+--------------+
| id | name | sex    | age  | dep_id | id   | name         |
+----+------+--------+------+--------+------+--------------+
|  1 | haha | male   |   18 |    200 |  200 | 技术         |
|  2 | xixi | female |   48 |    201 |  201 | 人力资源     |
|  3 | dudu | male   |   38 |    201 |  201 | 人力资源     |
|  4 | lala | female |   18 |    202 |  202 | 销售         |
|  5 | nana | male   |   16 |    200 |  200 | 技术         |
+----+------+--------+------+--------+------+--------------+

left join 左连接

  left join		将表进行拼接,以左表为准,优先显示左表全部记录
# 以左表为准,即找出所有员工信息,当然包括没有部门的员工信息
select emp.id,emp.name,emp.sex,emp.age,emp.dep_id,dep.name from emp left join dep on emp.dep_id=dep.id;
+----+------+--------+------+--------+--------------+
| id | name | sex    | age  | dep_id | name         |
+----+------+--------+------+--------+--------------+
|  1 | haha | male   |   18 |    200 | 技术         |
|  5 | nana | male   |   16 |    200 | 技术         |
|  2 | xixi | female |   48 |    201 | 人力资源     |
|  3 | dudu | male   |   38 |    201 | 人力资源     |
|  4 | lala | female |   18 |    202 | 销售         |
|  6 | bubu | female |   18 |    204 | NULL         |
+----+------+--------+------+--------+--------------+

# 以左表为准,即找出所有员工信息,当然包括没有部门的员工信息
select * from emp left join dep on emp.dep_id=dep.id;
+----+------+--------+------+--------+------+--------------+
| id | name | sex    | age  | dep_id | id   | name         |
+----+------+--------+------+--------+------+--------------+
|  1 | haha | male   |   18 |    200 |  200 | 技术         |
|  5 | nana | male   |   16 |    200 |  200 | 技术         |
|  2 | xixi | female |   48 |    201 |  201 | 人力资源     |
|  3 | dudu | male   |   38 |    201 |  201 | 人力资源     |
|  4 | lala | female |   18 |    202 |  202 | 销售         |
|  6 | bubu | female |   18 |    204 | NULL | NULL         |
+----+------+--------+------+--------+------+--------------+

right join 右连接

  right join		将表进行拼接,以右表为准,优先显示右表全部记录
# 以右表为准,即找出所有部门信息,包括没有员工的部门
select emp.id,emp.name,emp.sex,emp.age,emp.dep_id,dep.name from emp right join dep on emp.dep_id=dep.id;
+------+------+--------+------+--------+--------------+
| id   | name | sex    | age  | dep_id | name         |
+------+------+--------+------+--------+--------------+
|    1 | haha | male   |   18 |    200 | 技术         |
|    2 | xixi | female |   48 |    201 | 人力资源     |
|    3 | dudu | male   |   38 |    201 | 人力资源     |
|    4 | lala | female |   18 |    202 | 销售         |
|    5 | nana | male   |   16 |    200 | 技术         |
| NULL | NULL | NULL   | NULL |   NULL | 运营         |
+------+------+--------+------+--------+--------------+

# 以右表为准,即找出所有部门信息,包括没有员工的部门
select * from emp right join dep on emp.dep_id=dep.id;
+------+------+--------+------+--------+------+--------------+
| id   | name | sex    | age  | dep_id | id   | name         |
+------+------+--------+------+--------+------+--------------+
|    1 | haha | male   |   18 |    200 |  200 | 技术         |
|    2 | xixi | female |   48 |    201 |  201 | 人力资源     |
|    3 | dudu | male   |   38 |    201 |  201 | 人力资源     |以上是关于多表查询的主要内容,如果未能解决你的问题,请参考以下文章

python flask(多对多表查询)

MyBatis多表联查

phpcms v9后台多表查询分页代码

thinkphp3.1 多表联合查询代码

mysql 多表联合查询啥用

19.Sqlite多表连接查询及聚合函数的应用