mysql 04.子查询和多表查询

一、子查询定义
当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询。

二、子查询出现的地方

  • 在where⼦句中: ⼦查询的结果(具体)可⽤作条件筛选时使⽤的值。
  • 在from⼦句中: ⼦查询的结果可充当⼀张表或视图,需要使⽤表别名。
  • 在having⼦句中: ⼦查询的结果可⽤作分组查询再次条件过滤时使⽤的值
  • 在select⼦句中: ⼦查询的结果可充当⼀个字段。仅限⼦查询返回单⾏单列的情况。(这种情况下会输出没有结果的话结果会有null的情况)

1、子查询出现在where子句中

1、查询⼯资⼤于10号部⻔的平均⼯资的⾮10号部⻔的员⼯信息
分析:
110号部⻔的平均⼯资select avg(sal) from emp where deptno = 10;
2)查询员工信息select * from emp where deptno != 10 and sal > (select avg(sal) from emp where deptno = 10);+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7902 | FORD  | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
+-------+-------+---------+------+------------+---------+------+--------+2、查询与7369同部⻔的同事信息select deptno from emp where empno = 7369;select * from emp where deptno = (select deptno from emp where empno = 7369)and empno != 7369;+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7876 | ADAMS | CLERK   | 7788 | 1987-05-23 | 1100.00 | NULL |     20 |
|  7902 | FORD  | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
+-------+-------+---------+------+------------+---------+------+--------+

2、子查询出现在from子句中

1、查询员⼯的姓名,⼯资,及其部⻔的平均⼯资select ename,sal from emp ;思考:每一个部门的平均工资是多少?select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|    100 | NULL        |
+--------+-------------+
4 rows in set (0.09 sec)
查询员工信息:
select * from emp;
mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 | 800.00  | NULL    |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 | 300.00  |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 | 500.00  |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 | NULL    |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 | NULL    |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 | NULL    |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 | NULL    |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL    |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 | 0.00    |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 | NULL    |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 | 950.00  | NULL    |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 | NULL    |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 | NULL    |     10 |
|  8000 | LaoYan | NULL      | NULL | NULL       | NULL    | NULL    |    100 |
+-------+--------+-----------+------+------------+---------+---------+--------+此时:查询出来的平均工资表可以当做一个虚拟的表,和emp表关联起来mysql> select * from ( select deptno,avg(sal) avgMoney from emp group by deptno ) avgTable;
+--------+-------------+
| deptno | avgMoney    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|    100 | NULL        |
+--------+-------------+现在 avgTable 表  和 emp  通过 deptno 相关联
select  ename,sal,avgMoney from emp , (select deptno,avg(sal) avgMoney from emp group by deptno) avgTable   where emp.deptno=avgTable.deptno;
+--------+---------+-------------+
| ename  | sal     | avgMoney    |
+--------+---------+-------------+
| SMITH  | 800.00  | 2175.000000 |
| ALLEN  | 1600.00 | 1566.666667 |
| WARD   | 1250.00 | 1566.666667 |
| JONES  | 2975.00 | 2175.000000 |
| MARTIN | 1250.00 | 1566.666667 |
| BLAKE  | 2850.00 | 1566.666667 |
| CLARK  | 2450.00 | 2916.666667 |
| SCOTT  | 3000.00 | 2175.000000 |
| KING   | 5000.00 | 2916.666667 |
| TURNER | 1500.00 | 1566.666667 |
| ADAMS  | 1100.00 | 2175.000000 |
| JAMES  | 950.00  | 1566.666667 |
| FORD   | 3000.00 | 2175.000000 |
| MILLER | 1300.00 | 2916.666667 |
| LaoYan | NULL    | NULL        |
+--------+---------+-------------+
最终的答案!虚拟机的表解释:--任何的查询结果都可以当做一个虚拟机的表来使用!
mysql> select ename,job,sal from emp where job is not null;
+--------+-----------+---------+
| ename  | job       | sal     |
+--------+-----------+---------+
| SMITH  | CLERK     | 800.00  |
| ALLEN  | SALESMAN  | 1600.00 |
| WARD   | SALESMAN  | 1250.00 |
| JONES  | MANAGER   | 2975.00 |
| MARTIN | SALESMAN  | 1250.00 |
| BLAKE  | MANAGER   | 2850.00 |
| CLARK  | MANAGER   | 2450.00 |
| SCOTT  | ANALYST   | 3000.00 |
| KING   | PRESIDENT | 5000.00 |
| TURNER | SALESMAN  | 1500.00 |
| ADAMS  | CLERK     | 1100.00 |
| JAMES  | CLERK     | 950.00  |
| FORD   | ANALYST   | 3000.00 |
| MILLER | CLERK     | 1300.00 |
+--------+-----------+---------+
14 rows in set (0.09 sec)mysql> select * from (select ename,job,sal from emp where job is not null) eemp;
+--------+-----------+---------+
| ename  | job       | sal     |
+--------+-----------+---------+
| SMITH  | CLERK     | 800.00  |
| ALLEN  | SALESMAN  | 1600.00 |
| WARD   | SALESMAN  | 1250.00 |
| JONES  | MANAGER   | 2975.00 |
| MARTIN | SALESMAN  | 1250.00 |
| BLAKE  | MANAGER   | 2850.00 |
| CLARK  | MANAGER   | 2450.00 |
| SCOTT  | ANALYST   | 3000.00 |
| KING   | PRESIDENT | 5000.00 |
| TURNER | SALESMAN  | 1500.00 |
| ADAMS  | CLERK     | 1100.00 |
| JAMES  | CLERK     | 950.00  |
| FORD   | ANALYST   | 3000.00 |
| MILLER | CLERK     | 1300.00 |
+--------+-----------+---------+
14 rows in set (0.06 sec)

3.子查询在select语句中

2、查询员⼯的姓名,⼯资,及其部⻔的平均⼯资
说一个情况: emp表和emp表也是可以自己关联自己的。select * from emp e1, emp e2 where e1.empno = e2.empno;select ename,sal, (select avg(sal) from emp e2 where e2.deptno = e1.deptno ) 部门平均工资 from emp e1;
拆解:
select avg(sal) from emp e2 where e2.deptno = 10;
select avg(sal) from emp e2 where e2.deptno = 20;最终的答案:
+--------+---------+--------------+
| ename  | sal     | 部门平均工资 |
+--------+---------+--------------+
| SMITH  | 800.00  | 2175.000000  |
| ALLEN  | 1600.00 | 1566.666667  |
| WARD   | 1250.00 | 1566.666667  |
| JONES  | 2975.00 | 2175.000000  |
| MARTIN | 1250.00 | 1566.666667  |
| BLAKE  | 2850.00 | 1566.666667  |
| CLARK  | 2450.00 | 2916.666667  |
| SCOTT  | 3000.00 | 2175.000000  |
| KING   | 5000.00 | 2916.666667  |
| TURNER | 1500.00 | 1566.666667  |
| ADAMS  | 1100.00 | 2175.000000  |
| JAMES  | 950.00  | 1566.666667  |
| FORD   | 3000.00 | 2175.000000  |
| MILLER | 1300.00 | 2916.666667  |
| LaoYan | NULL    | NULL         |
+--------+---------+--------------+优化一下:工资 保留小数点后2select ename,sal, round(( select avg(sal) from emp e2 where e2.deptno = e1.deptno),2) 部门平均工资 from emp e1;
+--------+---------+--------------+
| ename  | sal     | 部门平均工资 |
+--------+---------+--------------+
| SMITH  | 800.00  | 2175.00      |
| ALLEN  | 1600.00 | 1566.67      |
| WARD   | 1250.00 | 1566.67      |
| JONES  | 2975.00 | 2175.00      |
| MARTIN | 1250.00 | 1566.67      |
| BLAKE  | 2850.00 | 1566.67      |
| CLARK  | 2450.00 | 2916.67      |
| SCOTT  | 3000.00 | 2175.00      |
| KING   | 5000.00 | 2916.67      |
| TURNER | 1500.00 | 1566.67      |
| ADAMS  | 1100.00 | 2175.00      |
| JAMES  | 950.00  | 1566.67      |
| FORD   | 3000.00 | 2175.00      |
| MILLER | 1300.00 | 2916.67      |
| LaoYan | NULL    | NULL         |
+--------+---------+--------------+再来一遍,仔细品味:
mysql> select ename,sal, ( select avg(sal) from emp e2 where e2.deptno = 10 ) from emp;
+--------+---------+------------------------------------------------------+
| ename  | sal     | ( select avg(sal) from emp e2 where e2.deptno = 10 ) |
+--------+---------+------------------------------------------------------+
| SMITH  | 800.00  | 2916.666667                                          |
| ALLEN  | 1600.00 | 2916.666667                                          |
| WARD   | 1250.00 | 2916.666667                                          |
| JONES  | 2975.00 | 2916.666667                                          |
| MARTIN | 1250.00 | 2916.666667                                          |
| BLAKE  | 2850.00 | 2916.666667                                          |
| CLARK  | 2450.00 | 2916.666667                                          |
| SCOTT  | 3000.00 | 2916.666667                                          |
| KING   | 5000.00 | 2916.666667                                          |
| TURNER | 1500.00 | 2916.666667                                          |
| ADAMS  | 1100.00 | 2916.666667                                          |
| JAMES  | 950.00  | 2916.666667                                          |
| FORD   | 3000.00 | 2916.666667                                          |
| MILLER | 1300.00 | 2916.666667                                          |
| LaoYan | NULL    | 2916.666667                                          |
+--------+---------+------------------------------------------------------+
15 rows in set (0.10 sec)mysql> select ename,sal, ( select avg(sal) from emp e2 where e2.deptno = emp.deptno ) from emp;
+--------+---------+--------------------------------------------------------------+
| ename  | sal     | ( select avg(sal) from emp e2 where e2.deptno = emp.deptno ) |
+--------+---------+--------------------------------------------------------------+
| SMITH  | 800.00  | 2175.000000                                                  |
| ALLEN  | 1600.00 | 1566.666667                                                  |
| WARD   | 1250.00 | 1566.666667                                                  |
| JONES  | 2975.00 | 2175.000000                                                  |
| MARTIN | 1250.00 | 1566.666667                                                  |
| BLAKE  | 2850.00 | 1566.666667                                                  |
| CLARK  | 2450.00 | 2916.666667                                                  |
| SCOTT  | 3000.00 | 2175.000000                                                  |
| KING   | 5000.00 | 2916.666667                                                  |
| TURNER | 1500.00 | 1566.666667                                                  |
| ADAMS  | 1100.00 | 2175.000000                                                  |
| JAMES  | 950.00  | 1566.666667                                                  |
| FORD   | 3000.00 | 2175.000000                                                  |
| MILLER | 1300.00 | 2916.666667                                                  |
| LaoYan | NULL    | NULL                                                         |
+--------+---------+--------------------------------------------------------------+
15 rows in set (0.11 sec)再来一题:
查询每个员⼯的信息及其部⻔的平均⼯资,⼯资之和,部⻔⼈数
select *,(select avg(sal) from emp e1 where e1.deptno = emp.deptno) 平均工资,(select sum(sal) from emp e2 where e2.deptno = emp.deptno) 工资之和,(select count(*) from emp e3 where e3.deptno = emp.deptno) 部门人数
from emp;尝试-- 这种不行,报 Operand should contain 1 column(s)
select *,(select avg(sal) 平均工资,sum(sal) 工资之和,count(*) 部门人数  from emp e1 where e1.deptno = emp.deptno) from emp;改变思路:在玩一种很新的东西mysql> select deptno,avg(sal) 平均工资,sum(sal) 工资之和,count(*) 部门人数  from emp e1group by deptno ;
+--------+-------------+----------+----------+
| deptno | 平均工资    | 工资之和 | 部门人数 |
+--------+-------------+----------+----------+
|     10 | 2916.666667 | 8750.00  |        3 |
|     20 | 2175.000000 | 10875.00 |        5 |
|     30 | 1566.666667 | 9400.00  |        6 |
|    100 | NULL        | NULL     |        1 |
+--------+-------------+----------+----------+硬套进去:失败了,原因是这个地方只允许出现一列数据
select * , (select * from (select deptno,avg(sal) 平均工资,sum(sal) 工资之和,count(*) 部门人数  from emp e1group by deptno) pgb where pgb.deptno =emp.deptno ) from emp;

4.having后有子查询

查询平均⼯资⼤于30号部⻔的平均⼯资的部⻔号,和平均⼯资
分析:30号部⻔的平均⼯资
select avg(sal) from emp where deptno = 30;
查询所有部门的平局工资:
select deptno,avg(sal) from emp group by deptno;整合
select deptno,avg(sal) avgMoney from emp group by deptno having avgMoney > (select avg(sal) from emp where deptno = 30);
+--------+-------------+
| deptno | avgMoney    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
+--------+-------------+

三.关键字EXISTS,ANY,ALL的子查询
举个例子:
1.EXISTS关键字:

EXISTS关键字后面的参数可以是任意一个子查询,它不产生任何数据只返回TRUE或FALSE。

当返回值为TRUE时外层查询才会执行。
假如王五同学在学生表中则从班级表查询所有班级信息 MySQL命令

select * from class where exists (select * from student where sname='王五');

2.带ANY关键字的子查询

ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

查询比任一学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > any (select classid from student);

3.带ALL关键字的子查询

ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

select * from class where cid > all (select classid from student);

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

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

相关文章

三目运算符和“??”

1.什么是三目运算符? 三目运算符是一种固定的运算格式,它的作用是简化“ if ”操作。它的语法格式为“ a ? b : c ”,a为条件,是布尔表达式,如果 a 为 true ,该表达式返回 b ,否则返回 c 。 2…

AD(第一部分---绘制元件库)

5.元件库介绍及电阻容模型的创建 注:元件库创建是在,以.SchLib结尾的 注:右下角的Panels消失/出现 点击左上角 "视图""状态栏" (快捷键:VS) 此处的SCH Library就是元件库列表 RES____电阻 CAP____电容&am…

数学——七桥问题——图论

当涉及数学,有很多不同的话题可以讨论。你是否有特定的数学领域、概念或问题想要了解更多?以下是一些常见的数学领域和主题,你可以选择一个或者告诉我你感兴趣的具体内容,我将很乐意为你提供更多信息: 代数学&#xff…

JavaScript Es6_4笔记

JavaScript 进阶 文章目录 JavaScript 进阶深浅拷贝浅拷贝深拷贝递归实现深拷贝js库lodash里面cloneDeep内部实现了深拷贝JSON序列化 异常处理throwtry ... catchdebugger 处理this普通函数箭头函数改变this指向callapplybind 防抖节流 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只…

对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理?

对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理? 比如,你在运行你的代码的时候 它总在python控制台运行,十分难受 解决方法 在pycharm中设置下即可,很简单 选择运行点击…

突破电商单一垂直赛道:Chewy宠物用品如何飙升至美国市场50%以上

《美国商业资讯》2023年5月31日报道,宠物品牌Chewy的最新市值为 143 亿美元,毛利率同比增长90个基点,在美国的宠物电商市场,实现超过50%的市场占有率。 Chewy是一个涵盖各类宠物用品与宠物医疗的新兴品牌,后疫情时代迎…

专题-【B树的构建与删除】

构建: 删除: 叶子结点直接删; 非叶结点 找前驱(左子树最右边)/后继(右子树最左边)元素覆盖即可(满足关键字个数取值范围); 这个更详细 『数据结构与算法』…

MySQL进阶篇之Explain执行计划

MySQL:Explain执行计划 使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。 认识explain EXPLAIN SELECT * FROM user_info i LEFT JOIN user_grade g on i.id …

Vue2Editor 图片上传及不允许粘贴图片

首先封装一下图片上传方法(纯前端): import * as qiniu from qiniu-jsexport function uploadFile(file,token) {let fileNameLen file.name.length;let startPos file.name.lastIndexOf(".");//文件名const key new Date().getTime() _ file.name.…

前端三剑客入门一文解决

文章目录 HTML快速开发网站Flask页面结构标签基础标签超链接图片列表下拉框表格input系列多行文本form表单 网络请求HTML案例 CSSCSS盒模型CSS样式定义CSS选择器 CSS样式使用1. 在标签上直接写2. 在head标签中写3.写到css文件中 标签样式1. 高度和宽度2. 块级和行内标签3.字体设…

8.23笔记(手写),deeplabV2与V3

空洞卷积(Dilated convolution)如下图所示,其中 r 表示两列之间的距离(r1就是常规卷积了)。 池化可以扩大感受野,降低数据维度,减少计算量,但是会损失信息,对于语义分割来说,这造成了发展瓶颈。 空洞卷积可…

一分钟学算法-递归-斐波那契数列递归解法及优化

一分钟学一个算法题目。 今天我们要学习的是用递归算法求解斐波那契数列。 首先我们要知道什么是斐波那契数列。 斐波那契数列,又称黄金分割数列,是一个经典的数学数列,其特点是第一项,第二项为1,后面每个数字都是前…

鲁棒优化入门(5)—Matlab+Yalmip求解鲁棒优化编程实战

之前的博客:鲁棒优化入门(二)——基于matlabyalmip求解鲁棒优化问题 去年发布了使用Yalmip工具箱求解鲁棒优化问题的博客之后,陆陆续续有朋友问我相关的问题,有人形容从学习这篇博客到求解论文中的鲁棒优化问题&#x…

Mybatis 动态 SQL

动态 SQL 1. if 标签2. trim 标签3. where 标签4. set 标签5. foreach 标签 1. if 标签 if 标签有很多应用场景, 例如: 在用户进行注册是有些是必填项有些是选填项, 这就会导致前端传入的参数不固定如果还是将参数写死就很难处理, 这时就可以使用 if 标签进行判断 <insert …

2023年 Java 面试八股文(25w字)

目录 一.Java 基础面试题1.Java概述Java语言有哪些特点&#xff1f;Java和C有什么关系&#xff0c;它们有什么区别&#xff1f;JVM、JRE和JDK的关系是什么&#xff1f;**什么是字节码?**采用字节码的好处是什么?Oracle JDK 和 OpenJDK 的区别是什么&#xff1f; 2.基础语法Ja…

通讯协议048——全网独有的OPC HDA知识一之接口(三)IOPCHDA_Server

本文简单介绍OPC HDA规范的IOPCHDA_Server接口方法&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui.com)。 1&#xff09;HRESULT GetItemAttributes(pdwCount , ppdwAttrID, ppszAttrName, ppszAttrDesc, ppvtAttrDataType) 此函数返回服务器支持的项属性。也支持供应…

018-时间处理库,预处理

018-时间处理库,预处理 ⼀、C语⾔的时间处理库 time.h是C/C++中的⽇期和时间头⽂件,通过他可以获取系统时间及时间格式 转换 time库中常⽤函数介绍 1、函数名称: time 2、函数名称: localtime 3、函数名称: asctime 4、函数名称: ctime 5、函数名称: gmtime 6、函数名…

深入Java中的观察者模式

观察者模式是软件开发中常用的一种设计模式&#xff0c;它通过定义一对多的依赖关系&#xff0c;使得一个对象&#xff08;主题&#xff09;的状态变化可以通知多个其他对象&#xff08;观察者&#xff09;。 这种模式的优点是解耦和增加扩展性&#xff0c;用于实现对象之间的…

.netcore windows app启动webserver

创建controller: using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks;namespace MyWorker.…

使用 ChatGPT 创建 PowerPoint 演示文稿

让 ChatGPT 成为您的助手来帮助您编写电子邮件很简单,因为众所周知,它非常能够生成文本。很明显,ChatGPT 无法帮助您做饭。但您可能想知道它是否可以生成文本以外的其他内容。在上一篇文章中,您了解到 ChatGPT 只能通过中间语言为您生成图形。在这篇文章中,您将了解使用中…