您的当前位置:首页>全部文章>文章详情

【MySQL】 复合查询 | 内外连接

CrazyPanda发表于:2023-11-30 21:44:10浏览:871次TAG:
【转】【MySQL】 复合查询 | 内外连接【侵删】


1. 复合查询

多表笛卡尔积

显示雇员名、雇员工资以及所在部门的名字

由于员工 信息属于 emp表 而所在部门名字属于 dept表
数据来自不同的表,所以需要进行多表查询


1.png

表示从 emp (员工表) 和dept (部门表) 中获取信息


1.png

分别用emp员工的信息 与 dept 部门表的信息 做 穷举 组合
就称 两张表 进行笛卡尔积
就把两张表 变成了 一张表 ,就可以进行单表查询


1.png

如 smith 本来是20号部门的,把10号部门的信息传过来 是没有意义的


1.png

输入 select * from emp,dept where emp.deptno =dept.deptno;
把对应的部门号 与部门信息 匹配上


1.png

输入 select ename ,sal,dname from emp,dept where emp.deptno =dept.deptno;
就可以显示雇员名、雇员工资以及所在部门的名字

自连接

自连接 指的是在同一张表连接查询


1.png

将同一张表单纯的写两次,是不可以一起查询的


1.png

可以把同一张表的表名通过重命名的方式 分别 进行不同命名 即可

把对同一张表 进行笛卡尔积的 行为 叫做 自连接


显示员工FORD的上级领导的编号和姓名

先找 员工FORD 和领导编号 ,与员工表有关
再通过领导的编号,找领导信息,也是与员工表有关
所以就需要借助 自连接


1.png

输入 select e2.ename ,e2.empno from emp e1,emp e2 where e1.ename=‘FORD’ and e1.mgr=e2.empno;
通过第一张表emp中的 员工FORD, 找到对应的领导编号,正好对应第二张emp表的员工编号
所以设置 e1.mgr =e2.empno

这样就可以 通过员工FORD 找到 对应的 领导 的名字和编号

在where子句使用子查询

子查询 是指嵌入其他sql语句中的select语句,也叫嵌套查询

单行子查询

返回一行记录的子查询

1.png

查看emp表 的员工信息


1.png

想要查看工资最高的员工的名字和工作岗位
首先 要找到 最高工资,但是发现这样写是不可以的

子查询: 在 一条sql内部 再执行 select查询
先执行内部的sql语句,再执行外部的sql语句


1.png

先找到 最高工资 ,再通过最高工资找到对应这个人的名字和工作信息


多行子查询

返回多行记录的子查询

in关键字

用来进行判断一个对应的列值是否在一个集合当中
若在集合中,则为查找成功


查询和10号部门的工作岗位相同雇员的名字、岗位、工资、部门号 ,但是不包含10号自己的

1.png

首先要找到10号部门的工作岗位


1.png

再通过in关键字,只有工作种类在 10号部门的工作岗位的集合中 ,才能返回


1.png

使用and 关键字 ,同时也不包含10号部门的人的信息


all关键字

表示所有人


显示工资比部门30的所有员工的工资高的员工的姓名 、工资 和部门号

1.png

先取到 30号部门的所有员工对应的工资
加入 distinct 去除重复的工资


1.png

all (select distinct sal from emp where deptno=30) 表示大于 30号部门的所有员工的薪资


any关键字

表示比任意一个高


显示工资比部门30的任意员工的工资高的员工的排名(包含自己部门)

1.png

先取到 30号部门的所有员工对应的工资
加入 distinct 去除重复的工资


1.png

any(select distinct sal from emp where deptno=30) 表示大于 30号部门的任意员工的薪资


多列子查询

多列子查询 是指 返回多个列数据的子查询语句


查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

1.png

首先要找到SMITH对应的部门和岗位


1.png

因为要比较的是 两个条件 部门和岗位
而mysql 支持 圆括号 直接写两列
将SMITH 对应的部门和岗位作为筛选条件


1.png

还需添加条件 ename <> ‘SMITH’ 不能为SMITH员工本身


在from子句中使用子查询

在查询语句在from子句中,把一个子查询当作一个临时表使用


显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

1.png

首先找到每个部门的平均工资
通过group by 将各个部门分开,再获取对应的每个部门的平均工资


1.png

select deptno,avg(sal) from emp group by deptno 整体操作所形成的数据 看作一张表,并重命名为 tmp,与emp表 做 笛卡尔积


1.png

寻找到emp表的部门号 与 tmp表的部门号 相同的 数据 才是合适的,所以加上 emp.deptno=tmp.deptno


1.png

select deptno,avg(sal) myavg from emp group by deptno
为了不让其在后面比较起冲突,所以 将avg(sal) 重命名为 myavg
再添加 emp.sal > tmp.myavg 筛选条件,显示每个高于自己部门平均工资的员工信息


合并查询

为了合并多个select的执行结果,可以使用集合符 unionunion all


union

1.png

该操作符用于取得 两个结果集的并集,当使用该操作符时,会自动去掉结果集中的重复行


1.png

select * from emp where sal>2500 即工资大于2500 的人的信息


1.png

select * from emp where job=‘MANAGER’ 即工作岗位为 manager的人的信息


发现两者使用重合信息存在的,所以可以使用 union

1.png

使用 union ,会自动去除 两者 重合部分的 重复数据


union all

在union的基础上,不会去除重复部分的重复数据

1.png

重复的数据会被保留


2. 内连接

内连接 是指 使用where子句对两种表形式的笛卡尔积 进行筛选


语法:
select 字段 from 表1 inner join 表2 on 连接条件 and 连接条件;


显示SMITH的名字和部门名称

1.png

筛选条件为 emp.deptno=dept.deptno and ename=‘SMITH’
表示 两张表的 对应 部门号 要相同 ,同时 名字为 SMITH

3. 外连接

左外连接

左侧表完全显示 右侧的表按条件拼接(条件满足拼接,条件不满足拼NULL)


语法:
select 字段名 from 表名1 left join 表名2 on 连接条件

相对于内连接的语法,外连接语法只是把inner 替换成了 left


1.png

创建一张表 stu ,内部包含 id 和 name


1.png

向stu表中 插入对应的数据 ,并 将其显示出来


再次创建一张成绩表 exam ,内部 包含id 和grade


1.png

向exam表中 插入对应的数据,并将其显示出来


1.png

发现stu 学生表中 有四名同学,而exam成绩表中 只有三个成绩
而且成绩表中有一个 不存在的id值为11 的学生


查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

1.png

由于有些学生是没有成绩的,就导致两张表中的id 匹配不上
若只拿id 做内连接,就只有 id值为 1 2 的信息能够显示


1.png

为了保证所有学生的信息都显示,所以使用 左外连接

右外连接

左侧的表按条件拼接(条件满足拼接,条件不满足拼NULL) 右侧表完全显示


语法:
select 字段 from 表名1 right join 表名2 on 连接条件


对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要
显示出来

1.png

stu 学生表中 有四名同学,而exam成绩表中 只有三个成绩
而且成绩表中有一个 不存在的id值为11 的学生


1.png

此时右侧exam表的三个id值 全部显示出来了
左侧stu表 由于只有两个id值与exam表中的id值对应,所以只显示2个,剩下显示为NULL


猜你喜欢

【MySql】mysql查询死锁
在MySQL数据库中,死锁是一个常见的问题,它发生在多个事务互相等待对方释放锁时。当一个事务试图修改已被另一个事务锁定的数据时,就会发生死锁。解决死锁的策略包括预防和检测。以下是一些处理MySQL死锁的方法:
发表于:2025-03-20 浏览:43 TAG: #mysql
【MySQL】库操作
第二篇:库操作#一、系统数据库#1.information_schema&nbsp;:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列表息、权限信息、字符信息等 2.mysql:核心数据库,里面包含用户、权限、关键字等信息。不可以删除 3.performance_schema:mysql&nbsp;5.5&nbsp;版本后添加的新库,主要收集系统性能参数,记录处理查询请求时发生的各种事件、锁等现象 4.sys:mysql5.7&nbsp;版本新增加的库,通过这个库可
发表于:2024-06-21 浏览:389 TAG: #mysql
【MySql】如何进行数学计算、字符串处理和条件判断?
文章目录如何进行数学计算、字符串处理和条件判断?数学函数字符串函数条件判断函数总结如何进行数学计算、字符串处理和条件判断?MySQL 提供了很多功能强大,而且使用起来非常方便的函数,包括数学函数、字符串处理函数和条件判断函数等。在很多场景中 ,我们都会用到这些函数,比如说,在超市项目的实际开发过程中,会有这样的需求:会员积分的规则是一元积一分,不满一元不积分,这就要用到向下取整的数学函数 floor();在打印小票的时候,收银纸的宽度是固定的,怎么才能让打印的结果清晰而整齐呢?这个时候,就要用到
发表于:2023-12-07 浏览:383 TAG:
【MySql】json字段内数据求和
首先,我们需要使用JSON_EXTRACT函数来解析JSON数据。假设我们的数据表名为data_table,JSON数据字段名为json_data,需要查询的字段为field_name。```sql SELECT&nbsp;JSON_EXTRACT(json_data,&nbsp;&#39;$.field_name&#39;)&nbsp;AS&nbsp;extracted_field FROM&nbsp;data_table;###&nbsp;步骤2:使用JSON函数提取数组内字段 如果字段是一
发表于:2024-09-18 浏览:216 TAG: #mysql
【MySQL】mysql百万级数据表翻页查询特别慢的优化方式
最近遇到了mysql百万级数据表翻页查询特别慢的问题,查询第一页的时候,特别快,翻页跨度特别大的时候,翻页查询就会特别慢
发表于:2024-11-14 浏览:258 TAG: #mysql
【MySql】SQL boy的CRUD操作
文章目录增删查改:如何操作表中的数据?select|where|group by|havingfromorder bylimit插入数据记录插入查询结果添加数据删除数据修改数据查询数据增删查改:如何操作表中的数据?关于SQL的CRUD操作是很重要的,有些公司面试的时候会要求我们写一些SQL,我上次面试字节的时候就遇到了(手动狗头)。在我们的超市项目中,我们给用户设计好了一个数据库demo.goodsmaster,定义好了里面的字段以及各种约束,如下:mysql&gt;&nbsp;desc&amp;nbs
发表于:2023-12-08 浏览:409 TAG:
【MySql】MySQL表的内外连接和视图
内外连接一、表的内外连接(1)左外连接(2)右外连接1. 内连接2. 外连接3. 练习二、视图1. 视图的使用2. 视图规则和限制一、表的内外连接表的连接分为内连和外连。1. 内连接内连接实际上就是利用 where 子句对两种表形成的笛卡尔积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。语法: select&nbsp;字段&nbsp;from&nbsp;表1&nbsp;inner&nbsp;join&nbsp;表2&nbsp;on&nbsp;连接条件&amp;nbs
发表于:2024-01-30 浏览:375 TAG:
【MySQL】索引有哪些优缺点
索引是数据库中用于提高查询性能的重要工具,但它也有一些有点和确定,一下是索引的主要优缺点:优点:&nbsp;&nbsp;&nbsp;&nbsp;1. 加速查询速度最显而易见的有嗲你是加速select查询速度。通过使用索引,数据库引擎能够更快的定位和检索数据,特别是在大型数据集中。&nbsp;&nbsp;&nbsp;&nbsp;2. 排序性能提升索引可以提高排序操作的性能,因为数据库引擎可以按照索引顺序而不是表中实际物理存储顺序来执行排序。&nbsp;&nbsp;&nbsp;&nbsp;3. 唯一
发表于:2024-06-16 浏览:273 TAG:
【MySql】怎么利用聚合函数实现高效地分组统计?
文章目录聚合函数:怎么高效地进行分组统计?sum( )avg( ) &amp; max( ) &amp; min( )count( )聚合函数:怎么高效地进行分组统计?MySQL中有5种聚合函数较为常用,分别是求和函数sum(), 求平均函数avg(), 最大值函数max(), 最小值函数min()和计数函数count()。在超市项目中有一个需求是这样的:经营者提出,他们需要统计一个门店,每天、每个单品的销售情况,包括销售数量和销售金额等。这里涉及3个数据表,具体信息如下所示:销售明细表demo
发表于:2023-12-08 浏览:391 TAG:
【MySql】MySQL产生死锁的根本原因及解决方法
概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程一、 什么是死锁死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.二、 死锁产生的四个必要条件互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只
发表于:2024-03-13 浏览:292 TAG: