MySQL 复合查询 内外连接

news2024/12/26 0:12:35

目录

基本查询回顾

多表查询

自连接 

group by可以带多个

子查询

在from子句中使用子查询

合并查询

表的内连和外连

内连接

外连接

左外连接

右外连接

关于自连接和内连接(chatgpt)


基本查询回顾

查询工资高于 500 或岗位为 MANAGER 的雇员,同时还要满足他们的姓名首字母为大写的 J
select * from EMP where (sal> 500 or job= 'MANAGER' ) and ename like 'J%' ;
按照部门号升序而雇员的工资降序排序
select * from EMP order by deptno, sal desc ;
使用年薪进行降序排序
select ename, sal* 12 +ifnull(comm, 0 ) as ' 年薪 ' from EMP order by 年薪 desc ;
显示工资最高的员工的名字和工作岗位
select ename, job from EMP where sal = ( select max(sal) from EMP);
显示工资高于平均工资的员工信息
select ename, sal from EMP where sal>( select avg(sal) from EMP);
显示每个部门的平均工资和最高工资
select deptno, format(avg(sal), 2 ) , max(sal) from EMP group by deptno;
显示平均工资低于 2000 的部门号和它的平均工资
select deptno, avg(sal) as avg_sal from EMP group by deptno having
avg_sal< 2000 ;
显示每种岗位的雇员总数,平均工资
select job, count (*), format(avg(sal), 2 ) from EMP group by job;

多表查询

显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自 EMP DEPT 表,因此要联合查询

其实我们只要emp表中的deptno = dept表中的deptno字段的记录

select EMP .ename , EMP .sal , DEPT .dname from EMP, DEPT where EMP .deptno =
DEPT .deptno ;

显示部门号为10的部门名,员工名和工资

select ename, sal,dname from EMP, DEPT where EMP .deptno =DEPT .deptno and
DEPT .deptno = 10 ;

显示各个员工的姓名,工资,及工资级别

select ename, sal, grade from EMP, SALGRADE where EMP .sal between losal and
hisal;

自连接 

自连接是指在同一张表连接查询。
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno
使用的子查询:
select empno,ename from emp where emp .empno =( select mgr from emp where
ename= 'FORD' );
使用多表查询(自查询)
-- 使用到表的别名
--from emp leader, emp worker ,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别
select leader .empno ,leader .ename from emp leader, emp worker where
leader .empno = worker .mgr and worker .ename = 'FORD' ;
PS:

group by可以带多个

子查询

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

单行子查询

返回一行记录的子查询。
显示 SMITH 同一部门的员工
select * from EMP WHERE deptno = ( select deptno from EMP where
ename= 'smith' );
多行子查询
返回多行记录的子查询。
in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
select ename,job,sal,deptno from emp where job in ( select distinct job from
emp where deptno= 10 ) and deptno<> 10 ;
all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename, sal, deptno from EMP where sal > all( select sal from EMP where
deptno= 30 );
any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
select ename, sal, deptno from EMP where sal > any( select sal from EMP where
deptno= 30 );
多列子查询
单行子查询是指子查询只返回单列单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。
查询和 SMITH 的部门和岗位完全相同的所有雇员,不含 SMITH 本人
mysql> select ename from EMP where (deptno, job)=( select deptno, job from EMP
where ename= 'SMITH' ) and ename <> 'SMITH' ;
+-------+
| ename |
+-------+
| ADAMS |
+-------+

from子句中使用子查询

子查询语句出现在 from 子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
// 获取各个部门的平均工资,将其看作临时表
select ename, deptno, sal, format(asal, 2 ) from EMP,
( select avg(sal) asal, deptno dt from EMP group by deptno) tmp
where EMP .sal > tmp .asal and EMP .deptno =tmp .dt ;
查找每个部门工资最高的人的姓名、工资、部门、最高工资
select EMP .ename , EMP .sal , EMP .deptno , ms from EMP,
( select max(sal) ms, deptno from EMP group by deptno) tmp
where EMP .deptno =tmp .deptno and EMP .sal =tmp .ms ;
显示每个部门的信息(部门名,编号,地址)和人员数量
方法 1 :使用多表
select DEPT .dname , DEPT .deptno , DEPT .loc , count (*) ' 部门人数 ' from EMP,
DEPT
where EMP .deptno =DEPT .deptno
group by DEPT .deptno ,DEPT .dname ,DEPT .loc ;
方法 2 :使用子查询
-- 1. EMP 表进行人员统计
select count (*), deptno from EMP group by deptno;
-- 2. 将上面的表看作临时表
select DEPT .deptno , dname, mycnt, loc from DEPT,
( select count (*) mycnt, deptno from EMP group by deptno) tmp
where DEPT .deptno =tmp .deptno ;

合并查询

在实际应用中,为了合并多个 select 的执行结果,可以使用集合操作符 union union all。
union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
将工资大于 2500 或职位是 MANAGER 的人找出来
mysql> select ename, sal, job from EMP where sal> 2500 union
-> select ename, sal, job from EMP where job= 'MANAGER' ; -- 去掉了重复记录
+-------+---------+-----------+
| ename | sal | job |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER |
| SCOTT | 3000.00 | ANALYST |
| KING | 5000.00 | PRESIDENT |
| FORD | 3000.00 | ANALYST |
| CLARK | 2450.00 | MANAGER |
+-------+---------+-----------+
union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
将工资大于 25000 或职位是 MANAGER 的人找出来
mysql> select ename, sal, job from EMP where sal> 2500 union all
-> select ename, sal, job from EMP where job= 'MANAGER' ;
+-------+---------+-----------+
| ename | sal | job |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER |
| SCOTT | 3000.00 | ANALYST |
| KING | 5000.00 | PRESIDENT |
| FORD | 3000.00 | ANALYST |
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER |
| CLARK | 2450.00 | MANAGER |
+-------+---------+-----------+

表的内连和外连

表的连接分为内连和外连。

内连接

内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
语法:
select 字段 from 1 inner join 2 on 连接条件 and 其他条件;
显示 SMITH 的名字和部门名称
-- 用前面的写法
select ename, dname from EMP, DEPT where EMP .deptno =DEPT .deptno and
ename= 'SMITH' ;
-- 用标准的内连接写法
select ename, dname from EMP inner join DEPT on EMP .deptno =DEPT .deptno and
ename= 'SMITH' ;
PS:
内链接用外键把主表和从表关联起来

也可以一下连接多表

外连接

外连接分为左外连接和右外连接。

左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。
语法:
select 字段名 from 表名 1 left join 表名 2 on 连接条件
案例:
-- 建两张表
create table stu (id int , name varchar ( 30 )); -- 学生表
insert into stu values ( 1 , 'jack' ),( 2 , 'tom' ),( 3 , 'kity' ),( 4 , 'nono' );
create table exam (id int , grade int ); -- 成绩表
insert into exam values ( 1 , 56 ),( 2 , 76 ),( 11 , 8 );
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
-- 当左边表和右边表没有匹配时,也会显示左边表的数据
select * from stu left join exam on stu .id =exam .id ;

右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接。
语法:
select 字段 from 表名 1 right join 表名 2 on 连接条件;
案例:
stu 表和 exam 表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要 显示出来
select * from stu right join exam on stu .id =exam .id ;
列出部门名称和这些部门的员工信息,同时列出没有员工的部门
方法一:
select d .dname , e.* from dept d left join emp e on d .deptno =e .deptno ;
方法二:
select d .dname , e.* from emp e right join dept d on d .deptno =e .deptno ;
PS:

关于自连接和内连接(chatgpt)

MySQL中的自连接(self-join)内连接(inner join)是两种不同类型的连接操作,但它们之间有一定的关系。首先,让我们了解一下这两种连接的基本概念。

自连接(self-join):自连接是一种特殊类型的连接,它是将一张表与其自身进行连接。这通常用于处理具有层次结构或树形结构的数据,例如员工和经理之间的关系。自连接可以是内连接、左连接或右连接。

内连接(inner join):内连接是一种基本的连接类型,它返回两个表中匹配的行。当连接条件得到满足时,它会将两个表中的行组合在一起。如果连接条件不满足,那么这些行将不会出现在结果集中。

关于自连接和内连接的关系:

1. 自连接可以是内连接:当你在自连接中使用内连接时,你将只获得那些符合连接条件的行。例如,如果你想找到所有员工及其直接经理,你可以使用自连接的内连接。

```sql
SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2 ON e1.manager_id = e2.id;
```

在这个例子中,`employees`表与其自身进行了内连接,连接条件是`e1.manager_id = e2.id`。

2. 自连接不一定是内连接:如前所述,自连接也可以是左连接或右连接。这意味着,虽然自连接可以是内连接,但它们并不总是相同的。

综上所述,自连接和内连接之间的关系在于自连接可以选择使用内连接来实现。然而,它们还是两个不同的概念,因为自连接还可以是左连接或右连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟键盘:十六进制值和鼠标或键盘等效项。 代码按数字顺序列出

Virtual-Key Codes (Winuser.h) - Win32 apps | Microsoft Learn 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn Value说明0x01鼠标左键0x02鼠标右键0x03控制中断处理0x04中间鼠标按钮 (三键鼠标)0x05X1 鼠标按钮0x06X2 鼠标按钮0x07Undefined0x08BACKSPACE 密钥0x09T…

注册阿里云OSS步骤

注册阿里云OSS步骤 阿里云是阿里巴巴集团旗下全球领先的云计算公司&#xff0c;也是国内最大的云服务提供商 。 云服务指的就是通过互联网对外提供的各种各样的服务&#xff0c;比如像&#xff1a;语音服务、短信服务、邮件服务、视频直播服务、文字识别服务、对象存储服务等等…

【SAM】CAN SAM COUNT ANYTHING? AN EMPIRICAL STUDY ON SAM COUNTING

论文链接&#xff1a; 代码链接&#xff1a; 目的 探索SAM在few-shot setting的object counting的能力。 结论 它目前落后于最先进的few-shot object counting方法&#xff0c;特别是对于小而拥挤的物体。两个主要原因。首先&#xff0c;SAM倾向于使用单个掩码分割同一类别…

javaIO流之序列流

目录 简介一、ObjectOutputStream二、ObjectInputStream三、Kryo四、小结 简介 Java 的序列流&#xff08;ObjectInputStream 和 ObjectOutputStream&#xff09;是一种可以将 Java 对象序列化和反序列化的流。 序列化是指将一个对象转换为一个字节序列&#xff08;包含对象的…

《算法训练营》贪心入门 + 10题

&#x1f442; 梦寻古镇 - 羽翼深蓝Wings - 单曲 - 网易云音乐 &#x1f442; 如果我有一个男朋友 - 于娜懿 - 单曲 - 网易云音乐 &#x1f442; 对酒&#xff08;女生版&#xff09; - 浅影阿 - 单曲 - 网易云音乐 &#x1f442; 知我&#xff08;抒情版&#xff09; - 尘a…

分享一个程序员接私活、兼职的平台

分享一个程序员接私活、兼职的平台 1、技术方向满足任一即可2、技术要求3、最后 1、技术方向满足任一即可 Python&#xff1a;熟练掌握Python编程语言&#xff0c;能够使用Python进行数据处理、机器学习和深度学习等相关工作。 MATLAB&#xff1a;熟练掌握MATLAB编程语言&…

API接口设计方案

API&#xff08;Application Programming Interface&#xff09;接口是一种用于与应用程序进行交互的标准化接口&#xff0c;它允许第三方应用程序通过网络调用应用程序的功能。设计API接口是开发人员在开发软件系统时的重要任务之一&#xff0c;因为API接口的质量和易用性直接…

UML的14种图

目录 1.UML 2.0包括14种图&#xff0c;分别列举如下&#xff1a; 2.活动图、用例图 3.部署图、顺序图 4.类图、协作图 5. 状态图、构件图 6.UML结构图和行为图 7.最后推荐一个图片转文字网站 8.最后推荐一个抖音去水印在线工具 9.最后推荐一个PPT模板下载网站 1.UML 2…

基于移动端vue的项目中webpack升级注意事项

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Android应用-开发框架设计

目录 1. &#x1f4c2; 简介 1.1 背景 1.2 专业术语 2. &#x1f531; 总体设计思想 2.1 分层&#xff1a;组件化设计框架 2.2 分类&#xff1a;应用开发架构图 3. ⚛️ 框架详细设计 3.1 组件化框架外形 3.2 业务模块化 3.3 代码编程框架 4. &#x1f4a0; 框架其他…

streamlit

正常在学习一个新框架之前&#xff0c; 肯定要先调研下这个框架究竟能做些什么事吧&#xff1f; 但对于 streamlit 来说&#xff0c;请你相信我&#xff0c;这是一个你可以无脑去学习的框架&#xff0c;我之所以这么说&#xff0c;是因为我相信终有一天&#xff0c;你一定能用…

【算法学习系列】04 - 由01不等概率随机实现01等概率随机

文章目录 约定条件说明解决方案思路说明实现代码 验证方案 约定条件说明 存在函数 unequalP_01() 不等概率返回 0 和 1。只能通过函数 unequalP_01() 来实现 01 等概率随机函数 equalP_01() 解决方案 为了能够验证最后的等概率随机&#xff0c;这里先把函数 unequalP_01() 实现…

美颜SDK设计思路与架构分析:如何实现高可定制化

当下&#xff0c;美颜SDK也成为了移动应用开发中的必备工具之一。在实际应用中&#xff0c;不同的应用场景需要不同的美颜效果&#xff0c;因此如何实现高可定制化的美颜SDK就成为了一个重要的技术问题。 一、美颜SDK的设计思路 美颜SDK的设计思路需要考虑以下几个方面&…

Vivado 下 AD9767 双通道正弦波产生例程

Vivado 下 AD9767 双通道正弦波产生例程 1、实验简介 本实验基于 Xinlinx 黑金 AX7A035 FPGA 开发板&#xff0c; 练习使用 AN9767 模块&#xff0c;实验中使用的模块是采用 ANALOG DEVICES 公司的 AD9767 芯 片&#xff0c;支持独立双通道、14 位、 125MSPS 的数模转…

金币商城功能迭代. 使用版本号解决数据的并发修改问题

前言. 公司的商城模块嵌在微信公众号里面, 商城里面除了少量的现金业务, 大头在金币业务里面, 商城本来就是用来增加客户粘度的, 金币是客户通过某些行为免费获得如注册, 绑定,推荐等 需求. 金币方面之前的设计: 1.金币只有一个流水表,消费为负,获取为正 2.并且…

github上有什么好的node.js的项目?

前言 可以参考一下下面的nodejs相关的项目&#xff0c;希望对你的学习有所帮助&#xff0c;废话少说&#xff0c;让我们直接进入正题 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数据库&am…

驱动开发:通过应用堆实现多次通信

在前面的文章《驱动开发&#xff1a;运用MDL映射实现多次通信》LyShark教大家使用MDL的方式灵活的实现了内核态多次输出结构体的效果&#xff0c;但是此种方法并不推荐大家使用原因很简单首先内核空间比较宝贵&#xff0c;其次内核里面不能分配太大且每次传出的结构体最大不能超…

jvm之GC

写在前面 本文一起看下GC相关的内容。 1&#xff1a;GC基础内容 1.1&#xff1a;为什么要有GC 内存资源的稀缺性&#xff0c;以及内存管理的复杂性&#xff0c;决定了需要有垃圾回收器这样的角色来帮助我们管理内存资源&#xff0c;避免手动管理带来的内存不能得到正常释放…

普源DS1102Z-E示波器,100MHz带宽

DS1000Z-E系列数字示波器是RIGOL基于主流需求而设计的&#xff0c;电商专供款高性能经济型数字示波器,具备100MHz带宽和1GSa/s采样率&#xff0c;搭载RIGOL独创的UltraVision技术平台&#xff0c;更深的储存&#xff08;标配达24 Mpts&#xff09;&#xff0c;高达30,000 wfms/…

解决基于kvm的win10虚拟机只识别2个cpu的问题

在使用kvmqemu创建win10虚拟机的时候&#xff0c;发现尽管我在virt manager里面指定了72个vcpu&#xff0c;但是win10里面只识别2个cpu核心的现象。 如图所示&#xff1a; 虚拟系统管理器里面当时是这样设置的&#xff1a; 这个时候&#xff0c;对应的xml文件内&#xff0c;关…