【MySQL数据库学习】(MySQL复合查询)
承渊政道个人主页❄️个人专栏:《C语言基础语法知识》 《数据结构与算法》 《C知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》✨逆境不吐心中苦,顺境不忘来时路!✨ 博主简介:在实际开发中,数据库查询往往不会停留在单表 简单条件的层面.随着业务复杂度的提升,我们需要从多个数据表中获取关联信息,并对结果进行筛选、组合与重组.这时,MySQL 复合查询就成为提升数据处理能力的核心技能之一.本篇文章围绕【MySQL数据库学习】(MySQL复合查询)展开,将带你系统理解多表查询的本质逻辑,包括JOIN 多表连接、子查询Subquery、UNION 合并查询以及集合运算等关键内容.通过这些能力,你可以把分散在不同表中的数据“拼接”为有意义的结果集,从而更高效地支撑复杂业务场景.无论你是刚接触 SQL 的初学者,还是希望提升查询性能与表达能力的开发者,这一部分内容都非常关键.掌握复合查询,不仅意味着你能写出能用的SQL,更意味着你开始具备用SQL解决问题的能力.接下来,我们将从最基础的多表连接开始,一步步拆解复合查询的核心思想与实战写法.废话不多说,下面跟着小编的节奏一起去疯狂的学习吧!目录1.复合查询(重点)2.基本查询回顾3.多表查询4.自连接5.子查询5.1单行子查询5.2多行子查询5.3多列子查询5.4在from子句中使用子查询5.5合并查询5.5.1union5.5.2union all6.实战OJ6.1查找所有员工入职时候的薪水情况6.2获取所有非manager的员工emp_no6.3获取所有员工当前的manager1.复合查询(重点)1.什么是复合查询在 MySQL 中,**复合查询(Compound Query)**指的是通过多种查询方式组合来获取最终结果的查询结构.它不再局限于单一的SELECT 单表条件,而是通过多表连接、子查询、集合运算等方式,实现更复杂的数据检索逻辑.简单来说复合查询 多种 SQL 查询方式的组合使用用来解决复杂业务数据需求。2.为什么需要复合查询在真实业务中数据通常分散在多个表中,例如用户信息存在users表订单信息存在orders表商品信息存在products表如果只靠单表查询,你无法直接得到某个用户买了什么商品、消费了多少钱这样的结果.因此必须使用复合查询,把多个表拼接或组合起来.3.复合查询的核心类型1.多表连接JOIN用于将多个表按关联字段进行合并查询INNER JOIN只返回匹配数据LEFT JOIN保留左表全部数据RIGHT JOIN保留右表全部数据典型应用订单 用户 商品信息整合查询2.子查询Subquery在一个查询中嵌套另一个查询用来作为条件或数据源。常见形式WHERE子查询FROM子查询SELECT子查询典型应用查“消费超过1000的用户”3.UNION 合并查询用于将多个查询结果纵向合并UNION去重合并UNION ALL不去重合并典型应用合并普通用户 VIP 用户列表4.集合运算用于对查询结果进行“集合级别”的处理例如INTERSECT交集EXCEPT差集MySQL中通常用替代写法典型应用筛选不同条件下的重合数据4.复合查询的本质复合查询的核心思想可以概括为一句话把数据当作集合通过“连接 过滤 合并”来重新组织信息。2.基本查询回顾查询工资高于500或岗位为MANAGER的雇员同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用年薪进行降序排序显示工资最高的员工的名字和工作岗位显示工资高于平均工资的员工信息显示每个部门的平均工资和最高工资显示平均工资低于2000的部门号和它的平均工资显示每种岗位的雇员总数,平均工资3.多表查询实际开发中往往数据来自不同的表,所以需要多表查询.下面我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询.案例显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询.其实我们只要emp表中的deptno dept表中的deptno字段的记录显示部门号为10的部门名,员工名和工资显示各个员工的姓名,工资,及工资级别4.自连接自连接是指在同一张表连接查询案例显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)使用的子查询:使用多表查询(自查询)使用到表的别名from emp leader, emp worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别5.子查询1.什么是子查询子查询(Subquery)就是:在一个 SQL 语句里面再嵌套一个 SQL 查询。通俗理解 SQL 里面套 SQL 用“内层查询结果”作为“外层查询条件”2.子查询的基本结构SELECT列FROM表WHERE字段(SELECT字段FROM表WHERE条件);5.1单行子查询返回一行记录的子查询显示SMITH同一部门的员工5.2多行子查询返回多行记录的子查询in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)5.3多列子查询单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句案例查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人5.4在from子句中使用子查询子查询语句出现在from子句中.这里要用到数据查询的技巧,把一个子查询当做一个临时表使用.案例显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资查找每个部门工资最高的人的姓名、工资、部门、最高工资显示每个部门的信息(部门名,编号,地址)和人员数量方法1使用多表方法2使用子查询5.5合并查询合并查询(UNION Query)就是:把多个 SELECT 查询结果纵向拼接在一起通俗理解子查询嵌套SQL 套 SQLJOIN横向拼接加列UNION纵向拼接加行5.5.1union该操作符用于取得两个结果集的并集.当使用该操作符时,会自动去掉结果集中的重复行.案例将工资大于2500或职位是MANAGER的人找出来5.5.2union all该操作符用于取得两个结果集的并集.当使用该操作符时,不会去掉结果集中的重复行.案例将工资大于25000或职位是MANAGER的人找出来6.实战OJ6.1查找所有员工入职时候的薪水情况SELECTe.emp_no,s.salaryFROMemployees eJOINsalaries sONe.emp_nos.emp_noANDe.hire_dates.from_dateORDERBYe.emp_noDESC;6.2获取所有非manager的员工emp_noSELECTe.emp_noFROMemployees eLEFTJOINdept_manager dONe.emp_nod.emp_noWHEREd.emp_noISNULL;6.3获取所有员工当前的managerSELECTde.emp_no,dm.emp_noASmanagerFROMdept_emp deJOINdept_manager dmONde.dept_nodm.dept_noWHEREde.to_date9999-01-01ANDdm.to_date9999-01-01ANDde.emp_nodm.emp_no;真正的勇者不是流泪的人,而是含泪奔跑的人!敬请期待下一篇文章内容每日心灵鸡汤: 慢慢来,也是在前进!人生不是一场必须立刻抵达终点的比赛.很多时候,我们焦虑,不是因为自己不够努力,而是因为太急着看到结果.请相信,那些你认真走过的路,那些你默默坚持的日子,都不会白费.也许今天的你还没有变得特别厉害,但只要你没有放弃,就已经在变好的路上.允许自己慢一点,允许生活有起伏.真正重要的不是跑得多快,而是在迷茫的时候,依然愿意向前走一步.愿你今天也能带着温柔和勇气,继续成为更好的自己.