多表查询
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 | 人力资源 |以上是关于多表查询的主要内容,如果未能解决你的问题,请参考以下文章