MySQL中的多表联合查询

news2024/9/24 17:12:48

目录

一.介绍

数据准备

交叉连接查询

 内连接查询

外连接

子查询

特点

子查询关键字

all关键字

any关键字和some关键字

in关键字

exists关键字

 自关联查询

总结


 

一.介绍

多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表.多表查询有以下分类:

  1. 交叉连接查询[产生笛卡尔积,了解]
  2. 内连接查询(使用的关键字inner join -- inner可以省略)
  3. 外连接查询(使用的关键字outer join -louter可以省略)
  4. 子查询
  5. 表自关联

数据准备

-- 创建部门表
create table if not exists dept3(
  deptno varchar(20) primary key ,  -- 部门号
  name varchar(20) -- 部门名字
);

-- 创建员工表
create table if not exists emp3(
  eid varchar(20) primary key , -- 员工编号
  ename varchar(20), -- 员工名字
  age int,  -- 员工年龄
  dept_id varchar(20)  -- 员工所属部门
);

-- 给dept3表添加数据
insert into dept3 values('1001','研发部');
insert into dept3 values('1002','销售部');
insert into dept3 values('1003','财务部');
insert into dept3 values('1004','人事部');

-- 给emp3表添加数据
insert into emp3 values('1','乔峰',20, '1001');
insert into emp3 values('2','段誉',21, '1001');
insert into emp3 values('3','虚竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','扫地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鸠摩智',50, '1002'); 
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');

交叉连接查询

  • 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
  • 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
  • 假如A表有m行数据,B表有n行数据,则返回m*n行数据
  • 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

格式

实现

结果

 

 内连接查询

内连接查询求多张表的交集

 格式

操作

 inner可以省略

操作

 

-- 查询研发部门的所属员工
-- 隐式内连接
select * from emp3 e ,dept3 d where e.dept_id =d.deptno and name ='研发部';
-- 显式内连接
select * from dept3 d join emp3 e on d.deptno =e.dept_id and name ='研发部'; 
-- 查询研发部和销售部的所属员工
select * from dept3 a join emp3 b on a.deptno = b.dept_id and (name = '研发部' or name = '销售部') ; 
select * from dept3 a join emp3 b on a.deptno = b.dept_id and name in('研发部' ,'销售部') ; 

-- 查询每个部门的员工数,并升序排序

select 
	a.name,a.deptno,count(1) 
from dept3 a 
   join emp3 b on a.deptno = b.dept_id 
group by 
  a.deptno,name;


-- 查询人数大于等于3的部门,并按照人数降序排序

select
  a.deptno,
  a.name,
  count(1) as total_cnt
from dept3 a
	join emp3 b on a.deptno = b.dept_id
group by 
  a.deptno,a.name
having 
  total_cnt >= 3
order by 
  total_cnt desc;

外连接

外连接分为左外连接(left outer join)、右外连接(right outer join),满外连接(full outer join)。注意: oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用unjion来达到目的。

 格式

左外连接: left outer join
        select* from A left outer join B on条件;
右外连接: right outer join
        select* from A right outer join B on条件;
满外连接: full outer join
        select * from A full outer join B on 条件;

 操作

 直接用fulljion会报错

-- 外连接查询
-- 查询哪些部门有员工,哪些部门没有员工
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;
-- 查询员工有对应的部门,哪些没有
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
-- 使用union关键字实现左外连接和右外连接的并集
select * from dept3 left outer join emp3 on dept3. deptno = emp3.dept_id
union
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

子查询

介绍

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。

特点

子查询可以返回的数据类型一共分为四种:

  1. 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
  2. 单行多列:返回一行数据中多个列的内容;
  3. 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
  4. 多行多列:查询返回的结果是一张临时表

操作

-- 查询年龄最大的员工信息,显示信息包含员工号、员工名字,员工年龄
select * from emp3 where age=(select max(age) from emp3 );

select eid,ename ,age from emp3 where age = (select max (age) from emp3);
-- 查询年研发部和销售部的员工信息,包含员工号、员工名字
select  * from emp3 where emp3.dept_id in (select deptno from dept3 d where d.name='研发部' or d.name='销售部');

select eid,ename , t.name from emp3 where dept_id in (select deptno, name from dept3where name ='研发部'or name ='销售部');
-- 查询研发部20岁以下的员工信息,包括员工号、员工名字,部门名字

-- 方式一:关联查询
select * from dept3 d join emp3 e on d.deptno =e.dept_id and (d.name='研发部' and e.age<20); 
-- 方式二:子查询
select eid,age ,ename , name from (select * from dept3 where name = '研发部')t1 , (select * from emp3 where age <20) t2 where  t1.deptno =t2.dept_id ;
 
select eid,age ,ename , name from (select * from dept3 where name = '研发部')t1 join  (select * from emp3 where age <20) t2 on t1.deptno =t2.dept_id ;

子查询关键字

在子查询中,有一些常用的逻辑关键字,这些关键字可以给我们提供更丰富的查询功能,主要关键字如下:

1.ALL关键字
2.ANY关键字
3.SOME关键字
4.IN关键字
5.EXISTS关键字

all关键字

格式

特点

  •  ALL:与子查询返回的所有值比较为true则返回true
  • ALL可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
  • ALL表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可以推出其它的比较运算符的情况。

操作

 

any关键字和some关键字

格式

特点

  • ANY:与子查询返回的任何值比较为true则返回true
  • ANY可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一个数据。
  • 表示制定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以推出其它的比较运算符的情况。
  • SOME和ANY的作用一样,SOME可以理解为ANY的别名

操作

 

in关键字

格式

 特点

  • IN关键字,用于判断某个记录的值,是否在指定的集合中
  • 在IN关键字前边加上not可以将条件反过来

操作

exists关键字

格式

 

特点

  • 该子查询如果“有数据结果”(至少返回一行数据),则该EXISTS()的结果为“true"”,外层查询执行
  • 该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false",外层查询不执行
  • EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立
  • 注意,EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字

操作

 自关联查询

概念

MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。

格式

 

操作

数据准备

-- 创建表,并建立自关联约束
create table t_sanguo (
    eid int primary key ,
    ename varchar (20) ,
    manager_id int,
    foreign key (manager_id) references t_sanguo (eid) -- 添加自关联约束
);

--添加数据
insert into t_sanguo values (1,'刘协',NULL) ,
                             (2,'刘备',1),
                             (3,'关羽',2),
                            (4,'张飞',2),
                             (5,'曹操',1),
                            (6,'许褚',5),
                             (7,'典韦',5),
                             (8,'孙权',1) ,
                             (9,'周瑜',8),
                            (10,'鲁肃',8) ;

-- 进行关联查询
-- 1.查询每个三国人物及他的上级信息,如:关羽刘备
select * from t_sanguo ts ,t_sanguo ts2 where ts .manager_id  =ts2.eid  ;						
						
						
select ts.ename ,ts2.ename  from t_sanguo ts ,t_sanguo ts2 where ts .manager_id  =ts2.eid  ;						
-- 2.查询所有人物及上级(刘协(没有上级)也输出)
select a.ename,b.ename from t_sanguo a left join t_sanguo b on a.manager_id = b.eid;
-- 3.查询所有人物、上级,上上级比如:张飞刘备刘协
select
	a.ename,b.ename,c.ename
from t_sanguo a
left join t_sanguo b on a.manager_id = b.eid
left join t_sanguo c on b.manager_id = c.eid;

总结

 

 

 

 

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

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

相关文章

四足机器人发展史及机器人盘点

四足机器人发展史及机器人盘点 本文翻译整理自文章 四足行走机器人发展综述 20世纪初前后 1870 CHebyshev(沙俄)发明了第一个行走机构, 将旋转运动转换为匀速平动运动. - 由于连接机构形似希腊字母λ, 该连杆命名为λ机构. - 可在平面运动, 没有独立的腿部运动 - Rygg(美国…

windows下nodejs下载及环境变量配置,运行vue项目

文章目录1.下载安装node.js2.环境变量配置&#xff08;重点&#xff09;3.切换镜像源切换yarn作为主力命令1.下载安装node.js 1.https://registry.npmmirror.com/binary.html 搜索node&#xff0c;下载对应的版本&#xff0c;安装即可。一路next&#xff0c;路径选择自己想放置…

与string容易混淆的类——StringBuilder

目录 StringBuilder类概述及其构造方法 StringBuilder类的常用方法 StringBuilder类练习 StringBuilder类概述及其构造方法 StringBuilder类概述–我们如果对字符串进行拼接操作&#xff0c;每次拼接&#xff0c;都会构建一个新的String对象&#xff0c;既耗时&#xff0c;…

verilog图像算法实现与仿真(流程和实现)

【声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了fpga&#xff0c;谈到了用pythoncv2实现图像算法&#xff0c;直到现在才算是慢慢进入了正题。毕竟用verilog实现图像算法&#xff0c…

HalfEdge半边数据结构详解

我们可以将离散表面表示为多边形网格。 多边形网格可以被认为是图&#xff08;具有顶点和顶点之间的边&#xff09;加上面列表&#xff0c;其中面是边的环。 推荐&#xff1a; 使用 NSDT场景设计器 快速搭建 3D场景。 下面&#xff0c;我们将网格指定为顶点列表和面列表&#…

【博学谷学习记录】大数据课程-学习第四周总结

分布式技术 为什么需要分布式 计算问题 无论是我们在学校刚开始学编程&#xff0c;还是在刚参加工作开始处理实际问题&#xff0c;写出来的程序都是很简单的。因为面对的问题很简单。以处理数据为例&#xff0c;可能只是把一个几十K的文件解析下&#xff0c;然后生成一个词频…

Python正则表达式所有函数详解

文章目录1 fullmatch2 match3 search4 findall5 finditer6 split7 sub8 compile本篇博客主要讲解正则表达式相关的函数&#xff0c;均不涉及复杂的正则表达式语法。如需了解正则表达式语法&#xff0c;请参考下面的文章&#xff1a;Python正则表达式语法详解1 fullmatch Pytho…

96. BERT预训练代码

利用实现的BERT模型和从WikiText-2数据集生成的预训练样本&#xff0c;我们将在本节中在WikiText-2数据集上对BERT进行预训练。 import torch from torch import nn from d2l import torch as d2l首先&#xff0c;我们加载WikiText-2数据集作为小批量的预训练样本&#xff0c;…

Logstash:如何使用 Logstash 解析并摄入 JSON 数据到 Elasticsearch

在我之前的文章 “Logstash&#xff1a;Data 转换&#xff0c;分析&#xff0c;提取&#xff0c;丰富及核心操作” 有涉及到这个话题。今天我想使用一个具体的例子来更深入地展示。 准备数据 我们先来把如下的数据拷贝下来&#xff0c;并保存到一个叫做 sample.json 的文件中。…

OS 学习笔记(5) 操作系统的体系结构

OS 学习笔记(5) 操作系统的体系结构 王道OS 1.4 操作系统的体系结构 文章目录OS 学习笔记(5) 操作系统的体系结构知识总览分层结构模块化操作系统的内核大内核 vs 微内核知识回顾与重要考点外核王道chap1 回顾英文表达、术语积累&#xff08;《操作系统概念》第九版、ostep 《O…

电子模块|心率血氧传感器模块MAX30102及其驱动代码

电子模块|心率血氧传感器模块MAX30102及其驱动代码实物照片模块简介工作原理原理图及引脚说明STM32软件驱动IIC通信代码数值转换代码main函数结果实物照片 模块简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。 它集成了一个红光LED和一个红外光LED、光电…

【经济学】MIT 微观经济学 Microeconomoics

MIT 微观经济学P1 Introduction and Supply & Demand约束优化和机会成本供给和需求P1 Introduction and Supply & Demand 约束优化和机会成本 微观经济学是研究如何个人和公司做决定在一个稀缺的世界。稀缺性是微观经济的驱动力。 微观经济学是一系列约束优化练习&a…

Hadoop安全之Kerberos

简介 安全无小事&#xff0c;我们常常要为了预防安全问题而付出大量的代价。虽然小区楼道里面的灭火器、消防栓常年没人用&#xff0c;但是我们还是要准备着。我们之所以愿意为了这些小概率事件而付出巨大的成本&#xff0c;是因为安全问题一旦发生&#xff0c;很多时候我们将…

自学数据分析——数据分析方法和模型

一、数据分析方法 数据分析的思维需要培养&#xff0c;先模仿别人&#xff0c;从模仿者到创造者。首先需要建立数据的敏感性&#xff0c;能快速了解数据在说什么&#xff0c;下面我们以抖音教育直播为例&#xff0c;首先来了解核心指标&#xff0c;以及各个指标所表示的含义。…

17.Stream流

目录 一.Stream流 1.1 什么是Stream流 1.2 Stream流思想 1.3 Stream流的三类方法 1.4 获取Stream流 1.4.1 集合获取Stream流的方式 1.4.2 数组获取Stream流的方式 1.5 中间方法 1.6 终结方法 1.7 收集Stream流 1.7.1 什么是收集Stream流 1.7.2 收集方法 一.Stream流…

Ant Design Vue 之a-tree-select

Ant Design Vue 是比较流行的vue框架之一&#xff0c;主要是展示a-tree-select 的简单用法&#xff0c;a-tree-select组件主要用于展示树结构的选择。 <template><a-spin :spinning"confirmLoading"><a-form :form"form"><a-form-ite…

CnOpenDataA股上市公司社会责任报告数据

一、数据简介 A股上市公司社会责任报告数据由和讯网自2013年开始独家策划的产品&#xff0c;也是国内首家上市公司社会责任专业测评产品。上市公司社会责任报告专业测评体系从股东责任、员工责任、供应商、客户和消费者权益责任、环境责任和社会责任五项考察&#xff0c;各项分…

Linux Workqueue

Linux Workqueue 1、前言 Workqueue 是内核里面很重要的一个机制&#xff0c;特别是内核驱动&#xff0c;一般的小型任务 (work) 都不会自己起一个线程来处理&#xff0c;而是扔到 Workqueue 中处理。Workqueue 的主要工作就是用进程上下文来处理内核中大量的小任务。 所以 …

基于php的旅游管理系统

摘要随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;在线旅游给人们的旅游业带来了更大的发展机遇。在经济快速发展的带动下&#xff0c;旅…

【Linux】tar命令打包 | 查看压缩文件 | 打包时忽略文件

tar命令打包 | 查看压缩文件 | 打包时忽略文件 等操作 1.起因 今天下午写阿狸bot的代码的时候&#xff0c;写错了aiofiles的保存操作 # 正确写法 async def write_file_aio(path:str, value):async with aiofiles.open(path, w, encodingutf-8) as f:await f.write(json.dump…