MySql多表查询

【数据库】MySQL-基础篇-多表查询 一、多表关系 1.一对多 2.多对多 3.一对一 二、多表查询概述 1.数据准备 2.概述 3.分类 三、内连接 1.隐式内连接 2.显式内连接 3.案例 四、外连接 1.左外连接 2.右外连接 五、自连接 1.自连接查询 2.联合查询 六、子查询 1.概述 1.1概念 1.2 分类 2.标量子查询 3.列子查询 4.行子查询 5.表子查询 七、多表查询案例 阅读详情

1.1.2 介绍

多表查询:查询时从多张表中获取所需数据

单表查询的SQL语句:select 字段列表 from 表名;

那么要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2;

查询用户表和部门表中的数据:

select * from  tb_emp , tb_dept;

此时,我们看到查询结果中包含了大量的结果集,总共85条记录,而这其实就是员工表所有的记录(17行)与部门表所有记录(5行)的所有组合情况,这种现象称之为笛卡尔积。

笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合和B集合)的所有组合情况。

在多表查询时,需要消除无效的笛卡尔积,只保留表关联部分的数据

在SQL语句中,如何去除无效的笛卡尔积呢?只需要给多表查询加上连接查询的条件即可。

select * from tb_emp , tb_dept where tb_emp.dept_id = tb_dept.id ;

由于id为17的员工,没有dept_id字段值,所以在多表查询时,根据连接查询的条件并没有查询到。

1.1.3 分类

多表查询可以分为:

  1. 连接查询

    • 内连接:相当于查询A、B交集部分数据

  2. 外连接

    • 左外连接:查询左表所有数据(包括两张表交集部分数据)

    • 右外连接:查询右表所有数据(包括两张表交集部分数据)

  3. 子查询

1.2 内连接

内连接查询:查询两表或多表中交集部分数据。

内连接从语法上可以分为:

  • 隐式内连接

  • 显式内连接

隐式内连接语法:

select  字段列表   from   表1 , 表2   where  条件 ... ;

显式内连接语法:

select  字段列表   from   表1  [ inner ]  join 表2  on  连接条件 ... ;

案例:查询员工的姓名及所属的部门名称

  • 隐式内连接实现

select tb_emp.name , tb_dept.name -- 分别查询两张表中的数据
from tb_emp , tb_dept -- 关联两张表
where tb_emp.dept_id = tb_dept.id; -- 消除笛卡尔积
  • 显式内连接实现

select tb_emp.name , tb_dept.name
from tb_emp inner join tb_dept
on tb_emp.dept_id = tb_dept.id;

image-20221207173435289

多表查询时给表起别名:

  • tableA as 别名1 , tableB as 别名2 ;

  • tableA 别名1 , tableB 别名2 ;

image-20221207174234522

使用了别名的多表查询:

select emp.name , dept.name
from tb_emp emp inner join tb_dept dept
on emp.dept_id = dept.id;

注意事项:

一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。

1.3 外连接

外连接分为两种:左外连接 和 右外连接。

左外连接语法结构:

select  字段列表   from   表1  left  [ outer ]  join 表2  on  连接条件 ... ;

左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。

右外连接语法结构:

select  字段列表   from   表1  right  [ outer ]  join 表2  on  连接条件 ... ;

右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。

案例:查询员工表中所有员工的姓名, 和对应的部门名称

-- 左外连接:以left join关键字左边的表为主表,查询主表中所有数据,以及和主表匹配的右边表中的数据
select emp.name , dept.name
from tb_emp AS emp left join tb_dept AS dept 
     on emp.dept_id = dept.id;

image-20221207181204792

案例:查询部门表中所有部门的名称, 和对应的员工名称

-- 右外连接
select dept.name , emp.name
from tb_emp AS emp right join  tb_dept AS dept
     on emp.dept_id = dept.id;

image-20221207181048208

注意事项:

左外连接和右外连接是可以相互替换的,只需要调整连接查询时SQL语句中表的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。

1.4 子查询

1.4.1 介绍

SQL语句中嵌套select语句,称为嵌套查询,又称子查询。

SELECT  *  FROM   t1   WHERE  column1 =  ( SELECT  column1  FROM  t2 ... );

子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是 select。

根据子查询结果的不同分为:

  1. 标量子查询(子查询结果为单个值[一行一列])

  2. 列子查询(子查询结果为一列,但可以是多行)

  3. 行子查询(子查询结果为一行,但可以是多列)

  4. 表子查询(子查询结果为多行多列[相当于子查询结果是一张表])

子查询可以书写的位置:

  1. where之后

  2. from之后

  3. select之后

1.4.2 标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。

常用的操作符: = <> > >= < <=

案例1:查询"教研部"的所有员工信息

可以将需求分解为两步:

  1. 查询 "教研部" 部门ID

  2. 根据 "教研部" 部门ID,查询员工信息

-- 1.查询"教研部"部门ID
select id from tb_dept where name = '教研部';    #查询结果:2
-- 2.根据"教研部"部门ID, 查询员工信息
select * from tb_emp where dept_id = 2;

-- 合并出上两条SQL语句
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');

image-20221207202215946

案例2:查询在 "方东白" 入职之后的员工信息

可以将需求分解为两步:

  1. 查询 方东白 的入职日期

  2. 查询 指定入职日期之后入职的员工信息

-- 1.查询"方东白"的入职日期
select entrydate from tb_emp where name = '方东白';     #查询结果:2012-11-01
-- 2.查询指定入职日期之后入职的员工信息
select * from tb_emp where entrydate > '2012-11-01';

-- 合并以上两条SQL语句
select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方东白');

image-20221207203000445

1.4.3 列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用的操作符:

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内

案例:查询"教研部"和"咨询部"的所有员工信息

分解为以下两步:

  1. 查询 "销售部" 和 "市场部" 的部门ID

  2. 根据部门ID, 查询员工信息

-- 1.查询"销售部"和"市场部"的部门ID
select id from tb_dept where name = '教研部' or name = '咨询部';    #查询结果:3,2
-- 2.根据部门ID, 查询员工信息
select * from tb_emp where dept_id in (3,2);

-- 合并以上两条SQL语句
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

image-20221207203620472

1.4.4 行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:= 、<> 、IN 、NOT IN

案例:查询与"韦一笑"的入职日期及职位都相同的员工信息

可以拆解为两步进行:

  1. 查询 "韦一笑" 的入职日期 及 职位

  2. 查询与"韦一笑"的入职日期及职位相同的员工信息

-- 查询"韦一笑"的入职日期 及 职位
select entrydate , job from tb_emp where name = '韦一笑';  #查询结果: 2007-01-01 , 2
-- 查询与"韦一笑"的入职日期及职位相同的员工信息
select * from tb_emp where (entrydate,job) = ('2007-01-01',2);

-- 合并以上两条SQL语句
select * from tb_emp where (entrydate,job) = (select entrydate , job from tb_emp where name = '韦一笑');

image-20221207204452202

1.4.5 表子查询

子查询返回的结果是多行多列,常作为临时表,这种子查询称为表子查询。

案例:查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息

分解为两步执行:

  1. 查询入职日期是 "2006-01-01" 之后的员工信息

  2. 基于查询到的员工信息,在查询对应的部门信息

select * from emp where entrydate > '2006-01-01';

select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id ;

image-20221208142154263

1.5 案例

基于之前设计的多表案例的表结构,我们来完成今天的多表查询案例需求。

准备环境

将资料中准备好的多表查询的数据准备的SQL脚本导入数据库中。

image-20221208143318921

  • 分类表:category

  • 菜品表:dish

  • 套餐表:setmeal

  • 套餐菜品关系表:setmeal_dish

image-20221208143312292

需求实现

  1. 查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称

/*查询技巧:
     明确1:查询需要用到哪些字段
        菜品名称、菜品价格 、 菜品分类名
     明确2:查询的字段分别归属于哪张表
        菜品表:[菜品名称、菜品价格]
        分类表:[分类名]
     明确3:如查多表,建立表与表之间的关联
        菜品表.caategory_id = 分类表.id
     其他:(其他条件、其他要求)
        价格 < 10
*/
select d.name , d.price , c.name
from dish AS d , category AS c
where d.category_id = c.id
      and d.price < 10;

 

MySQL多表查询 MySQL多表查询 多表查询就是从多张表查询数据 若不加限制条件,直接使用select语句进行多表查询,将会产生笛卡尔积 笛卡尔积就是把所有集合元素的所偶有组合都列举出来,即A的个数乘上B的个数 -- 删除表 DROP TABLE IF EXISTS emp; DROP TABLE IF EXISTS dept; -- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY auto_increment, -- 部门编号,主键自增 dep_n 阅读详情

相关推荐

MySQL(六)——多表查询

文章介绍了多表查询,包含连接查询、子查询以及联合查询

xiaokuer_的博客 1738

数据库基础——7.多表查询

连接 n个表,至少需要n-1个连接条件。比如,连接三个表,至少需要两个连接条件。

m0_52096593的博客 6895

Mysql 多表查询详解

纸上得来终觉浅 1.前言:上篇讲到Mysql中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多张表格 : 1)多表连接有哪些分类; 2)针对这些分类有哪些连接方法? 3)这些连接方法分别作用于哪些应用场景? 这篇针对这三个点通过实例来讲述,目的是穷尽所有的场景和所有的方法,并且对每个方法的使用做实例。 2.假设有两张表格A和B,把表格当作一个集合,那么表格中

Jintao_Ma的博客 12万+

MySQL --- 多表查询 & 驱动表

指从多张表中查询数据,就是从多张表当中进行查询单表查询的SQL语句:select 字段列表 from 表名;那么要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2;-- 多表查询:直接在from之后跟上多张表就可以了,多张表之间使用逗号分隔可以看到,在多表查询的结果当中,每个员工都展示了5次,将每个员工分别和五个部门进行了一次匹配, 也就是将17个员工和5个部门挨个组合了一次,就是17 * 5 = 85。

weixin_53622554的博客 1万+

U8采购入库单CO接口开发实战:加载、新增与删除操作详解

本文详细解析了用友U8采购入库单CO接口的开发实战,重点介绍了加载、新增与删除三大核心操作的实现方法。通过C#代码示例和实际项目经验,帮助开发者高效处理采购入库单,提升企业供应链管理效率。文章还涵盖了环境配置、异常处理、性能优化等关键技巧,适合U8二次开发人员参考。

weixin_33462927的博客 370

Metal ECO实战:如何在不修改底层掩模的情况下修复芯片时序问题

本文深入探讨了Metal ECO技术在芯片设计中的应用,这是一种在不修改底层晶体管掩模的前提下,仅通过调整金属连线和替换预置填充单元来修复时序问题的“微创手术”。文章详细解析了其原理、适用场景、关键操作流程与命令,并分享了实战中的高级技巧与常见陷阱,为面临流片前时序违例的工程师提供了宝贵的修复指南。

wdx0123456的博客 430

MySQL 多表查询

此为MySQL专栏文章之一,讲解MySQL多表查询。多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

Java 技术专栏,从入门到精通,熟悉企业级开发 1万+

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法

之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死的小强,不管怎么关闭,之后还是会自动更新,让不少小伙伴颇为不爽。今天小编带来了这篇改进型教程,通过全方位设置,彻底关闭Win10自动更新,感兴趣的小伙伴不妨试试吧。 ...

jianai0602的博客 108万+

【MySQL】不就是多表查询

嗨!小伙伴们大家好呀,忙碌的一周就要开始!在此之前我们学习的MySQL数据库的各种操作都是在一张表之中,今天我们学习要对多张表进行相关操作,相比较于单一的表来说,多张表操作相对复杂一些,我相信只要认真学习多表查询也不再话下!项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对一(多对一)一对多多对多概述: 指从多张表中查询数据,多表查询就是要消除笛卡尔积。

super大雄的博客 7499

ESP32-S3模组上兼容SCCB总线与I2C总线的解决方案(1)

ESP32-S3模组上兼容SCCB总线与I2C总线的解决方案(1)

phmatthaus的专栏 773

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 63

【MySQL基础教程】多表查询

本文为【MySQL基础教程】多表查询相关知识,下边将对多表关系,多表查询概述,内连接,外连接,自连接,子查询,多表查询案例等进行详尽介绍~

小新要变强的博客 3046

AMBA-AXI and ACE协议详解(十)

本章介绍了ACE协议中的Barrier事务机制,包括内存屏障和同步屏障两种类型。

Crazzy_M的博客 612

MySQL- 多表查询(上)

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库

一起努力共同进步,为了未来一起奋斗吧! 4439

uniapp:实现APP获取陀螺仪数据、加速传感器、线性加速传感器,uniApp实时监听陀螺仪【XYZ】数据及停止监听与资源释放等功能示例源码,根据需求做功能(完美兼容Android安卓、苹果ios)

uniapp陀螺仪,uniapp加速传感器,uniapp线性加速传感器,APP陀螺仪数据,uniapp app 端获取陀螺仪数据示例代码,手机中获取陀螺仪的数据,uniApp实时获取陀螺仪xyz数据,android陀螺仪方向,获得陀螺仪传感器,处理传感器数据,停止监听与资源释放,Android使用陀螺仪,uniapp苹果ios陀螺仪,uni-app设备之(加速计,罗盘,陀螺仪)插件安卓/IOS APP提供了获取陀螺仪数据的能力,手机陀螺仪传感器获得手机自身旋转的角度,陀螺仪获取旋转角度,陀螺仪、加速度传感器

✅ 精选推荐文章 4265

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 272

MYSQL多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

weixin_42894555的博客 4631

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySQL的多表查询

MySQL的多表查询

weixin_55734444的博客 4574

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【MySQL】多表查询

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)、多对多、一对一 的关系,有时需要通过这些关系查询另一张表的数据,这时就需要进行多表查询

m0_72532428的博客 2158

【MySQL】多表操作 —— 多表查询

MySQL 有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表使用。子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含。多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表。在子查询中,有一些常用的逻辑关键字,这些关键字可以提供更丰富的查询功能。对于联合查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。注意:交叉连接查询会产生很多错误的冗余数据。

m0_72516377的博客 1387

MySQL 多表查询详解

本文系统讲解MySQL多表查询技术,主要内容包括:1)三种多表关系(一对多、多对多、一对一)及其实现方式;2)多表查询方法,重点介绍连接查询(内连接、外连接、自连接)、联合查询和子查询;3)通过示例代码演示如何避免笛卡尔积,正确关联多表数据。文章强调在实际业务中,合理设计表关系和选择查询方法对数据提取效率至关重要。

2301_80204744的博客 2170

MySQL之多表查询

指从多张表中查询数据子查询(Subquery)是在一个 SQL 查询中嵌套的另一个查询,它可以出现在SELECTINSERTUPDATEDELETE语句的内部,或者用于WHEREFROMHAVING等子句中。

gege_0606的博客 1543

MySQL多表查询小总结

作为MySQL数据库的初学者,多表查询的知识点多,内容复杂,很令人头大。这篇文章作为总结,以案例的形式,供大家理解和记忆。 目录 概述 一、内连接 概述 多表查询主要分以下两个方面: 一、连接查询 1.内连接 2.外连接 3.自连接 二、子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 我们就用这样的两张学生选课信息表格作为数据 studen...

qq_63708623的博客 5075
上一篇: Ajax和Axios
下一篇: Redis的快速入门
未来的JAVA高级开发工程师
博客等级 码龄3年 1036粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值