MySQL高级③(多表查询)

举报
十八岁讨厌编程 发表于 2022/08/05 23:02:21 2022/08/05
【摘要】 文章目录 笛卡尔积多表查询种类内连接查询隐式内连接显示内连接 外连接查询子查询单行单列多行单列多行多列 笛卡尔积 首先我们有两张表: emp表: dept表: 现在我们执行以下...

笛卡尔积

首先我们有两张表:
emp表:
在这里插入图片描述
dept表:
在这里插入图片描述
现在我们执行以下语句:

select * from emp , dept;  -- 从emp和dept表中查询所有的字段数据

结果:
在这里插入图片描述
从上面的结果我们看到有一些无效的数据,如 孙悟空 这个员工属于1号部门,但也同时关联的2、3、4号部门。

这就是笛卡尔积的情况。也就是说它会在两表集合中取出所有可能情况。

所以我们要通过限制员工表中的 dep_id 字段的值和部门表 did 字段的值相等来消除这些无效的数据:

select * from emp , dept where emp.dep_id = dept.did;

在这里插入图片描述
上面语句就是连接查询

多表查询种类

在这里插入图片描述

内连接查询

内连接相当于查询 A B 交集数据
在这里插入图片描述

语法:

-- 隐式内连接
SELECT 字段列表 FROM1,2WHERE 条件;

-- 显示内连接
SELECT 字段列表 FROM1 [INNER] JOIN2 ON 条件;

隐式内连接

在这里插入图片描述
我们前面所得到的这张表就属于隐式内连接。现在我们可以取其中的几列进行搜寻:

SELECT
	emp. NAME,
	emp.gender,
	dept.dname
FROM
	emp,
	dept
WHERE
	emp.dep_id = dept.did;

因为两张表的字段可能会有重合,所以我们在SELECT字段的时候最好是带上字段所属表的前缀。

同时考虑到表的名字可能会很长,这就给我们带来不必要的麻烦。所以我们可以给表起别名。

SELECT
	t1. NAME,
	t1.gender,
	t2.dname
FROM
	emp t1,
	dept t2
WHERE
	t1.dep_id = t2.did;

这段代码与上面的代码是等价的,执行结果如下:
在这里插入图片描述
因为是内连接,所以取得是交集,我们可以发现在这张表中,没有小白龙,还有销售部。

显示内连接

同样是上面的结果,如果我们使用显示内连接来写,如下:

select * from emp inner join dept on emp.dep_id = dept.did;
-- 上面语句中的inner可以省略,可以书写为如下语句
select * from emp  join dept on emp.dep_id = dept.did;

外连接查询

在这里插入图片描述

左外连接和右外连接本质上是可以相互转换的,换个位置就行了

例如还是前文的两张表:
使用左外连接:

select * from emp left join dept on emp.dep_id = dept.did;

结果:
在这里插入图片描述
使用右外连接:

select * from emp right join dept on emp.dep_id = dept.did;

在这里插入图片描述

子查询

子查询说白了就是嵌套查询。

子查询根据结果不同,作用也不同:

  • 单行单列
  • 多行单列
  • 多行多列

在这里插入图片描述

单行单列

例如:查询工资高于猪八戒的员工信息

select * from emp where salary > (select salary from emp where name = '猪八戒');

多行单列

例如:查询 ‘财务部’ 和 ‘市场部’ 所有的员工信息。
那我们的思路是要先查询这两个部门的id号,再根据这个id号去查找具体的员工

select did from dept where dname = '财务部' or dname = '市场部';

select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');

多行多列

例如:查询入职日期是 ‘2011-11-11’ 之后的员工信息和部门信息
我们思路是先查询入职日期是 ‘2011-11-11’ 之后的员工信息,然后将结果与dept表进行内连接

-- 查询入职日期是 '2011-11-11' 之后的员工信息
select * from emp where join_date > '2011-11-11' ;
-- 将上面语句的结果作为虚拟表和dept表进行内连接查询
select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;

文章来源: blog.csdn.net,作者:十八岁讨厌编程,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zyb18507175502/article/details/124409383

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。