多表查询
1.1笛卡尔积查询:
将左边表和右边表的数据联合展示,就是笛卡尔积查询。左边表有m行数据,右边表有n行数据,查询结果就为m*n行数据。
笛卡尔积查询意义:
在笛卡尔积查询中存在正确的结果和错误的结果,只需使用where 子句将错误结果过滤掉,那么就会只剩下正确的查询结果。
selct * from dept,emp;
±—±-------±—±-----±--------+
| id | name | id | name | dept_id |
±—±-------±—±-----±--------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 1 | 张飞 | 1 |
| 3 | 科技部 | 1 | 张飞 | 1 |
| 4 | 销售部 | 1 | 张飞 | 1 |
| 1 | 财务部 | 2 | 关羽 | 2 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 2 | 关羽 | 2 |
| 4 | 销售部 | 2 | 关羽 | 2 |
| 1 | 财务部 | 3 | 刘备 | 3 |
| 2 | 人事部 | 3 | 刘备 | 3 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 3 | 刘备 | 3 |
| 1 | 财务部 | 4 | 赵云 | 4 |
| 2 | 人事部 | 4 | 赵云 | 4 |
| 3 | 科技部 | 4 | 赵云 | 4 |
| 4 | 销售部 | 4 | 赵云 | 4 |
±—±-------±—±-----±--------+
2.2内连接查询:
在笛卡尔积查询的基础之上,获取左边表有且右边表也有的数据,这种查询方式称之为内连接查询。
内连接查询使用的关键字为 inner join … on …
select * from dept,emp where dept.id = emp.dept_id;
<==>
select * from dept inner join emp on dept.id = emp.dept_id;
±—±-------±—±-----±--------+
| id | name | id | name | dept_id |
±—±-------±—±-----±--------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 4 | 赵云 | 4 |
±—±-------±—±-----±--------+
外连接查询:
左外连接查询:
在内连接的基础之上,获取左边表有且右边表没有的数据,这种查询方式称之为左外连接查询。
select * from dept left join emp on dept.id = emp.dept_id;
±—±-------±-----±-----±--------+
| id | name | id | name | dept_id |
±—±-------±-----±-----±--------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 4 | 赵云 | 4 |
| 5 | 后勤部 | NULL | NULL | NULL |
±—±-------±-----±-----±--------+
右外连接查询:
在内连接查询的基础之上,获取右边表有且左边表没有的数据,这种查询方式称之为右外连接查询。
select * from dept right join emp on dept.id = emp.dept_id;
将表名添加一个别名使用:
select * from dept d right join emp e on d.id = e.dept_id;
±-----±-------±—±-----±--------+
| id | name | id | name | dept_id |
±-----±-------±—±-----±--------+
| 1 | 财务部 | 1 | 张飞 | 1 |
| 2 | 人事部 | 2 | 关羽 | 2 |
| 3 | 科技部 | 3 | 刘备 | 3 |
| 4 | 销售部 | 4 | 赵云 | 4 |
| NULL | NULL | 5 | 黄忠 | 6 |
±-----±-------±—±-----±--------+
全外连接查询:
在内连接的基础之上,获取左边表有且右边表没有的数据和右边表有且左边表没有的数据,这种查询方式称之为全外连接查询。
full join在mysql中不存在,可以通过union关键字实现全外连接查询效果。
union 会把查询结果联合起来,并将重复部分的数据去掉,只保留一份。
select * from dept left join emp on dept.id = emp.dept_id
union
select * from dept right join emp on dept.id = emp.dept_id;
来源:CSDN
作者:陌上云
链接:https://blog.csdn.net/qq_44909806/article/details/103245143