MySQL-多表联合查询

这篇具有很好参考价值的文章主要介绍了MySQL-多表联合查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

 🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾MySQL
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

目录

🚀联合查询

🚀子查询

🚀标量子查询

🚀列子查询

🚀行子查询

🚀​​​​​​表子查询


🚀联合查询

union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

主要代码:

SELECT 字段列表	FROM	表 A ...

UNION [ ALL ]

SELECT 字段列表  FROM	表B	;

联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

union all 会将全部的数据直接合并在一起,并不会去重

union 会对合并之后的数据去重。

案例:将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.

思路:

1.直接使用多条件查询,使用逻辑运算符 or 连接

2.通过union/union all来联合查询

select * from empcp where salary < 5000

union all

select * from empcp where age > 50; --联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
 

执行:

第一部分MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

第二部分

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

联合(即要薪资低于5000的员工,又要年龄大于50的员工,那么就意味着这两条数据要合并,关键字union all

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

我们发现union all查询出来的结果,有一个员工k是重复的,k的薪资低于5000,年龄又大于50,所以查询了两次,数据直接合并,仅仅进行简单的合并,并未去重。

select * from empcp where salary < 5000

union

select * from empcp where age > 50;

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

我们发现union联合查询,会对查询出来的结果进行去重处理。

注意:

如果多条查询语句查询出来的结果,字段数量不一致,在进行union/union all联合查询时,将会报错。如:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

🚀子查询

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

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

注意!子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

此时,子查询因为存在嵌套关系,逻辑性较强,代码是比较变通的,切不可死记硬背,根据逻辑去思考问题

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

1.标量子查询(子查询结果为单个值)

2.列子查询(子查询结果为一列)

3.行子查询(子查询结果为一行)

4.表子查询(子查询结果为多行多列)

根据子查询位置,可分为:

1.WHERE之后

2.FROM之后

3.SELECT之后

🚀标量子查询

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

案例:

查询 "销售部" 的所有员工信息

思路:

拆解为两步 (因为在员工表中是没有存储销售部这个部门名称的,仅仅只有部门id)

1.查询"销售部" 部门ID

select id from dept where name = '销售部';

2.根据 "销售部" 部门ID, 查询员工信息,用*返回员工所有信息的字段

select * from empcp where dept_id = (select id from dept where name = '销售部');
或者
select * from empcp where dept_id = 4 ;

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

查询在 "e"这个员工 入职之后的员工信息

思路:

拆解为两步

1.查询 e 的入职日期

select entrydate from empcp where name = 'e';

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

select * from empcp where entrydate > (select entrydate from empcp where name = 'e');
或者
select * from empcp where entrydate > 2004-9-7 ;

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

当然,我们需要了解entrydate是如何比较呢?

在SQL中,entrydate是一个字段名,通常表示一个日期或日期时间类型的数据。

要比较entrydate字段,你可以使用各种比较运算符,如=<><=>=<>!=

以下是一些示例,说明如何比较entrydate字段:

1.等于,大于,小于,小于等于,大于等于,不等于就不过多演示了,因为直接更改比较运算符即可

SELECT * FROM your_table WHERE entrydate = '2023-10-23';
-- =可以改为<,>,<>,<=,>=......

2.BETWEEN: 如果你想选择一个日期范围内的记录,你可以使用BETWEEN:

SELECT * FROM your_table WHERE entrydate BETWEEN '2023-10-01' AND '2023-10-31';

这个查询会返回所有entrydate在'2023-10-01'和'2023-10-31'之间的记录。注意,BETWEEN运算符是包含边界值的。


3. LIKE 和日期: 如果你想基于日期的部分部分进行比较,例如查找以特定年份开始的日期,你可以使用LIKE:

SELECT * FROM your_table WHERE entrydate LIKE '2023%';

这个查询会返回所有以'2023'开头的entrydate的记录。LIKE运算符通常与通配符一起使用,如%表示任何数量的任何字符。


4. DATE() 函数: 如果你只想比较日期部分而忽略时间部分,你可以使用DATE()函数:

SELECT * FROM your_table WHERE DATE(entrydate) = '2023-10-23';

这个查询只会比较日期部分,忽略时间部分。这对于只关心日期而不关心具体时间的情况很有用。

5. 时间间隔: 如果你想基于两个日期之间的时间间隔进行比较,你可以使用减法:

SELECT * FROM your_table WHERE DATEDIFF(day, entrydate, '2023-10-23') > 5;

这个查询会返回所有与'2023-10-23'相差超过5天的entrydate的记录。DATEDIFF()函数根据指定的时间间隔返回两个日期之间的差异。在这个例子中,我们使用天作为时间间隔单位。不同的数据库系统可能有不同的函数来计算日期差异,所以请根据你使用的系统查阅相应的文档。

🚀列子查询

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

常用的操作符:IN 、NOT IN ANY SOME ALL

操作符

描述

IN

在指定的集合范围之内,多选一

NOT IN

不在指定的集合范围之内

ANY

子查询返回列表中,有任意一个满足即可

SOME

与ANY等同,使用SOME的地方都可以使用ANY

ALL

子查询返回列表的所有值都必须满足

案例:

查询 "销售部" 和 "市场部" 的所有员工信息

思路:

分解为两步

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

select id from dept where name = '销售部' or name = '市场部';

2.根据部门ID, 查询员工信息  (由于是两个元素,所以用到了in)

select * from empcp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
或者
select * from empcp where dept_id in(2,4) --2.4是上述语句查询的结果,所以我们可以把2,4替换掉,让上面的语句作为子查询存在

而由于内部的sql查询出来不再是一个单个值了,而是一列,多行。所以这种子查询称为列子查询

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

查询比 财务部 所有人工资都高的员工信息

思路:

分解为以下两步

1.查询所有 财务部 人员工资

select id from dept where name = '财务部'; 

select salary from empcp where dept_id = (select id from dept where name = '财务部');
或者
select salary from empcp where dept_id = 3;

2.比 财务部 所有人工资都高的员工信息 (这个salary要大于这三个工资的所有值,比其中任何一个大,此时就要大于这个列表中所有值,要加上all

select * from empcp where salary > all ( select salary from empcp where dept_id =

(select id from dept where name = '财务部') );

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

查询比 研发部 其中任意一人工资高的员工信息

思路:

分解为两步

1.查询研发部所有人工资

select salary from empcp where dept_id = (select id from dept where name = '研发部');

2.比研发部其中任意一人工资高的员工信息 (关键字any

select * from empcp where salary > any ( select salary from empcp where dept_id =

(select id from dept where name = '研发部') );

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

🚀行子查询

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

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

案例:

查询与 "b" 的薪资及直属领导相同的员工信息 ;

思路:行子查询一般来说,左边要给组合条件,右边再给子查询的结果,不能把条件分开,再给子查询结果

拆解为两步:

1.查询 "b" 的薪资及直属领导

select salary, managerid from empcp where name = 'b';

2.查询与 "b" 的薪资及直属领导相同的员工信息 ;

第三个代码就是使用salary和managerid作为了一个组合条件,然后这个组合条件等于一个组合值

select * from empcp where (salary,managerid) = (select salary, managerid from empcp

where name = 'b');

或者

select * from empcp where salary = 12500 and managerid = 1 ;

或者

select * from empcp where (salary , managerid) =  (12500 ,1) ;

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

🚀​​​​​​表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。(子查询查询返回的结果就类似于一张表)

常用的操作符:IN

表子查询经常在from之后,把表子查询返回的结果作为一张临时表,再和其他表联查操作

案例:1.查询与 "k" , "p" 的职位和薪资相同的员工信息

拆解为两步:

1.查询与 "k" , "p" 的职位和薪资

select job, salary from empcp where name = 'k' or name = 'p';

2.查询与 "k" , "p" 的职位和薪资相同的员工信息 (注意,这里where之后给的是组合条件。如果where之后条件如果是单行,那么我们之前在这一块的写法是(job,salary)= 子查询的结果就ok了,但是现在查询的不是一个单行数据,而是一个多行数据吗,此时就不能等于了,这时候我们要使用的是in

3.解读,这一块的含义指的是job和salary这个组合要么满足上面的,要么满足下面的,在这个列表里面多选一,只要能够满足一个这个员工的数据就可以查询出来

select * from empcp where (job,salary) in ( select job, salary from empcp where name =

'k' or name = 'p' );

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

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

思路:

分解为两步

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

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

2.查询这部分员工, 对应的部门信息;

3.要查询部门的相关信息就要再去联查另一个表,dept表

4.所以我们需要把第一次查询的结果作为一张表,再去联查dept表

先暂时写为*

select * from [刚刚查询的一个结果作为一张表放进来,子查询的结果作为一张临时表存在,取一个别名e] ;

select * from (select * from empcp where entrydate > '2006-01-01') e ;

✨接着查询部门信息,有一个员工q,id为17的没有部门信息,我们要不要查出来,也需要,所以要查全部数据我们要使用到左外连接,此时我们顺便把dept表取名为d

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

执行:MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

✨总结:此时我们就在from之后用到了子查询,它会把这个子查询的结果作为一张表来与另一张表做

select e.*, d.* from (select * from empcp where entrydate > '2006-01-01') e left

join dept d on e.dept_id = d.id ;

或者

select * from (select * from empcp where entrydate > '2006-01-01') e left join dept d

on e.dept_id = d.id ;

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库

执行:

MySQL-多表联合查询,重拾MySQL-基础篇,mysql,数据库


总结:本篇博客到这里就结束了,希望能帮到你,谢谢你这么好看还来看我      文章来源地址https://www.toymoban.com/news/detail-796106.html

到了这里,关于MySQL-多表联合查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库,联合查询

    目录 1. 联合查询 1.1 内查询 1.2 外查询 1.3 自连接 1.4 子查询 1.5 合并查询 联合查询,简单的来讲就是多个表联合起来进行查询。这样的查询在我们实际的开发中会用到很多,因此会用 笛卡尔积 的概念。 啥是笛卡尔积?两张表经过笛卡尔积后得到的新表的列数是两表列数之和

    2023年04月23日
    浏览(76)
  • ⑧【MySQL】数据库查询:内连接、外连接、自连接、子查询、多表查询

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 多表关系 : 一对一 :在 任意一方 加入外键,关联另一方的主键,并设置外键为唯一(UNIQUE)。 一对多(

    2024年02月05日
    浏览(54)
  • MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

    1. 多表关系 MySQL 多表之间的关系可以概括为: 一对一:        比如:一个学生只有一张身份证;一张身份证只能对应一学生。        实现原则:在任一表中添加唯一外键,指向另一方主键,确保一对一关系。         一般一对一关系很少见,遇到一对一关系的表最好是

    2024年02月05日
    浏览(56)
  • MySQL数据库:数据库的约束以及数据的聚合、联合查询

    目录 一.关系模型的简要概述 二.数据库的约束  2.1约束类型         2.2NULL约束 2.3 UNIQUE:唯一约束 2.4 默认约束 2.5 PRIMARY KEY:主键约束 2.6 FOREIGN KEY:外键约束 2.7 CHECK约束 三.高效率查询 3.1高效率查询的分类 3.2聚合查询 3.2.1聚合函数 3.2.2 GROUP BY子句 3.2.3HAVING 3.3.联合查询

    2024年02月10日
    浏览(67)
  • 【JaveWeb教程】(22) MySQL数据库开发之多表查询:内连接、外连接、子查询 详细代码示例讲解(最全面)

    1.1.1 数据准备 SQL脚本: 1.1.2 介绍 多表查询:查询时从多张表中获取所需数据 单表查询的SQL语句:select 字段列表 from 表名; 那么要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2; 查询用户表和部门表中的数据: 此时,我们看到查询结果中包

    2024年01月22日
    浏览(58)
  • MySQL---多表联合查询(下)(内连接查询、外连接查询、子查询(ALL/ANY/SOME/IN/EXISTS关键字)、自关联查询)

    1. 内连接查询 数据准备: 内连接查询语法: 2. 外连接查询 语法: 左外连接: left outer join:             select * from A left outer join B on 条件 ;             右外连接: right outer join:             select * from A right outer join B on 条件 ;             满外连接 : full out

    2024年02月04日
    浏览(56)
  • MySQL基础-多表查询

    本文介绍MySQL的多表查询 一对多(多对一) 多对多 一对一 案例:部门与员工 关系:一个部门对应多个员工,一个员工对应一个部门 实现:在多的一方建立外键,指向一的一方的主键 案例:学生与课程 关系:一个学生可以选多门课程,一门课程也可以供多个学生选修 实现

    2024年02月04日
    浏览(38)
  • Mysql基础8-多表查询

    一对多或者多对一 案例:部门与员工的关系 关系:一个部门对应多个员工,一个员工对应一个部门(不考虑跨部门的特殊情况) 实现:在多的一方建立外键,指向一的一方的主键,这里员工表是多的的一方,部门表是一的一方   多对多 案例:学生与课程的关系 关系:一个

    2024年02月16日
    浏览(36)
  • 《MySQL(五):基础篇- 多表查询》

    我们之前在讲解SQL语句的时候,讲解了DQL语句,也就是数据查询语句,但是之前讲解的查询都是单 表查询,而本章节我们要学习的则是多表查询操作,主要从以下几个方面进行讲解。 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并

    2024年02月08日
    浏览(40)
  • MySQL数据库基础之MySQL查询基础

    从今天开始,本系列内容就带各位小伙伴学习数据库技术 。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约【 1212】 字,不说废话,只讲可以让你学到技术、

    2024年02月06日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包