MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

本文主要是介绍MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操...

绪论​:
本章是mysql篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询的时候光是前面的篇章可能无法完成,所以本章来了,本章将主要结合:子查询 + 笛卡尔积 的方式来解决多表查询问题,下一章将更新MySQL索引敬请期待~
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。

复合查询

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够,所以复合查询就是同时查询多个表中的内容。

1. 回顾查询基本操作

下面将通过几个具体情况来进行回顾

查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J(where、or/and 、like)

分析查询目标:

工资高于500 / 岗位为MANAGER的雇员(查询)select * from emp where sal > 500 or job = 'MANAGER'姓名首字母为大写的... and ename lik 'J%'; / and substring(ename,1,1) = 'J'
以下表数据来操作:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

select * from emp where sal > 500 or job = 'MANAGER' and ename lik 'J%';  / and substring(ename,1,1) = 'J'

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

按照部门号升序而雇员的工资降序排序(order by asc/desc)

比较简单就不分析了,其中要注意的就是对于要进行排序的字段来说:那个在前面那个排序 优先级就较高

select * from emp order by deptno asc,sal desc;

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

使用年薪进行降序排序(select 自定义添加新列、ifnull、order by)

年薪 = 月薪sal * 12 + 奖金comm
获取某个人并创建新列(在select后面直接创建要求并可以创建别名)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

其中任何值和NULL运算都会变成NULL(此处该人的comm为NULL)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

此时就要将这种情况避免(使用ifnull)

select sal*12+ifnull(comm,0) 年薪 from emp;

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

在加上名称和月薪,奖金,年薪,这样跟好看

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

在进行排序得到年薪的降序(order by desc)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

显示工资最高的员工的名字和工作岗位(select 内部允许使用 嵌套select、max函数) 显示工资最高 select max(sal) from emp; 该情况是在表中不存在的所以需要提前筛选出来!员工的名字和工作岗位 select ename job where sal=..

select ename,job where sal=(select max(sal) from emp);`

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

显示工资高于平均工资的员工信息(select嵌套 + avg函数) 平均工资select avg(sal) 平均工资 from emp ;
方法类似同上:

select * from emp where sal > (select avg(sal) from emp);`

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

group by 分组

GROUP BY: 子句用于将查询结果按照指定的列进行分组,通常与聚合函数一起使用。

显示每个部门的平均工资和最高工资(format)

平均工资、最高工资select max(sal) ,avg(sal) from emp;

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

每个部门(对应着需要分组)goup by deptno

select deptno, max(sal) ,avg(sal) from emp group by deptno;

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

在使用format设置一下小数点:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

having

HAVING 子句:用于对分组后的结果进行条件过滤,类似于 WHERE,但专门用于分组后的筛选。

显示平均工资低于2000的部门号和它的平均工资

平均工资(同上)平均工资低于2000的部门号(分组)

就需要对分组之后的数据再做筛选(having)出小于2000的部门号:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

显示每种岗位的雇员总数,平均工资 每种岗位(group分组)雇员总数,平均工资(筛选内容)
MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)2 多表查询(多表笛卡尔积)

结合实例,边练习边了解边快速上手学习

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

因为上面的数据(雇员名、雇员工资以及所在部门和部门号为10的)需要来自EMP和DEPT两张表,因此要联合查询
EMP(需要ename、sal)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

DEPT(需要dname):

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

将他们直接使用select结合:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

对两张表直接进行整合,他的情况是:将两表中的数据进行穷举组合(笛卡尔积)、任何一种组合都包括了,那么此时得到的就是一张新的表了对该表进行操作,就是单表=操作了

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

再对该表进行筛选,选出正确的数据(因为直接穷举的话,他们的数据是不正确的,我们需要将对应部门的数据进行整合,这个部门编号就相当于一个外键的连接作用)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

然后就得到了正确的两表结合的数据(如上图)

回到题目:

显示雇php员名、雇员工资所在部门的名字和部门号为10(在表结合后面再添加部门筛选条件)

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

其中需要注意的是deptno的有两个,所以需要筛选一下

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

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

需要的新表salgrade:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

结合emp得到新表:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

需要员工的姓名,工资,及工资级别

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

其中因为是穷举的,所以说表是用问题的,而我们找的是正确的工资等级所以结合sal 、losal、hisal 通过between and来进行分级:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

总结:

在进行多表查询的时候,将两张表合并的方式是笛卡尔积式的穷举结合,这样可能会导致数据出现问题,所以我们需要进行再次的筛选,得到符合目的的新表,再对这个表进行正常的单表处理即可

自连接

自连接是指在同一张表连接查询

同一张表进行笛卡尔积:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

发现:
同一张表并不能直接的进行笛卡尔积合并,但将这张表重命名为两个名字,就能进行合并了,也就是自连接

那什么情况下会使用自连接呢?

显示员工FORD的上级领导的编号和姓名

mgr是员工领导的编号–empno
此处为什么要使用自连接javascript呢?
因为:员工的领导本质也是员工,本题每个员工的领导只是通过编号来指定的,所以说无法直接找到领导的信息
若想找到某个员工的领导姓名的话,就需要员工信息中的领导的编号和表中的员工编号进行比对筛选才能找到领导的信息

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

找到FORD的领导编号----empselect mgr from emp where ename='FORD';在从emp表中使用领导编号找领导信息—empselect ename,emobo from emp where ename(...);
子查询:

select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

第二种方式(多表查询,自查询):

将相同的表重命名为两张表,再进行笛卡尔积合并从两表结合的新表中找到FORD在从这两张表中获取 判断 表1中的领导编号 = 表二中的员工编号的 信息

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

子查询:

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

单行子查询 显示SMITH同一部门的员工

select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

多行子查询 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
分析题目:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

10号部门岗位(distinct去重):

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

in 查看是否包含:

筛选出job岗位包含10号部门岗位的相同的雇员的名字,岗位,工资,部门号:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

其中还不要10号部门的(那么再次筛选 deptno<> 10 、<>就是不等与)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

进一步拓展(结合前面的理解下):本质就是将上面的结果在重命名为一个张表在和其他表进行合并得到领导名称
其中select子查询还能当成一张表出现在from后面

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

all:获取所有信息 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号 工资比部门30的所有员工(找到30部门的最高工资进行比较)的员工的姓名、工资和部门号(通过前面的最高工资再在表中进行遍历所有比较)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

这种本质也可以,但若想更加的具体且通俗易懂
使用all函数,比较所有情况,不需要提前获取最大的,而是直接比较所有

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

any关键字; 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
很好理解就不过诉了:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
可能有点不太好理解,具体见下面实例:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

注意:
任何时刻,查询出来的临时结构,本质在逻辑上也是表结构

子查询与from

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

找到每个部门的平均工资:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

将原本的表和该表进行笛卡尔积,生成新表(就得到了每个员工和平均工资)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

那么就变成了单标查询

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

若还需要办公地址,就再需要表:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

再次结合,并且去掉没用的值

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

再筛选出需要的字段:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

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;

查找每个部门工资最高的人的姓名、工资、部门、最高工资

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

显示每个部门的信息(部门名,编号,地址)和人员数量

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

select DEPT.deptno, dname, mycnt, loc from DEPT, (select count(*) mycnt, deptno from EMP grouphpp by deptno) tmp where DEPT.deptno=tmp.deptno;

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

mysql一切皆表
解决多表问题的本质:想办法将多表转化为单表,所以mysql中,所有select的问题全部都可以转成单标问题!

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all

zYptl

union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

将工资大于2500或职位是MANAGER的人找出来

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

其中注意的话使用union进行拼接的前提是列相同:

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

本章完。预知后事如何,暂听下回分解。

到此这篇关于MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)的文章就介绍到这了,更多相关mysql多表查询内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S