【MySQL学习】MySQL表的复合查询

文章目录

  • 前言
  • 一、案例准备
  • 二、基本查询
  • 三、多表查询
  • 四、子查询
    • 4.1 单行子查询
    • 4.2 多行子查询
    • 4.3 多列子查询
    • 4.4 FROM子句中的子查询
    • 4.5 合并查询
      • 4.5.1 UNION
      • 4.5.2 UNION ALL
  • 五、自连接
  • 六、内外连接
    • 6.1 内连接
    • 6.2 外连接
      • 6.2.1 左外连接
      • 6.2.2 右外连接

前言

对MySQL表的基本查询还远远达不到实际开发过程中的需求,因此还需要掌握对数据库表的复合查询。本文介绍了多表查询、子查询、自连接、内外连接等复合查询的案例。

一、案例准备

来自oracle 9i的经典测试表:

emp员工表

mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)

dept部门表

mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

salgrade工资等级表

mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

二、基本查询

MySQL表的基本查询都是针对一张表进行的查询操作,在实际开发过程中还远远不够。以下是以下基本查询的案例:

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

按照部门号升序而雇员的工资降序排序

使用年薪进行降序排序


注意:年薪 = 月薪 * 12 + 绩效奖,其中有的绩效comm为NULL,在MySQL中有NULL参与运算的结果都为NULL,因此要使用到ifnull函数。

显示工资最高的员工的名字和工作岗位


注意:因为要使用到max聚合函数,因此不能直接将聚会函数返回的结果作为where筛选的条件去找某一个具体的记录。因此可以先找出最大的薪资,在根据薪资找到该条记录。

但是这样的话就要使用两条SQL语句,因此可以使用子查询:

内部select查询到的结果,作为外部where筛选的条件。

显示工资高于平均工资的员工信息

和上面的一样,也需要用到子查询。

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

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

显示每种岗位的雇员总数,平均工资

三、多表查询

实际开发中,数据往往来自不同的表,因此需要多表查询。以下是使用emp、dept、salgrade三张表进行多表查询的案例:

显示雇员名、雇员工资以及所在部门的名字

由于以上要查询的数据分别来自于emp表和dept表,因此要联合这两张表进行查询:

使用上面的查询方法查询出来的包含许多错误的结果,因此需要使用emp.deptno = dept.deptno条件来进行查询:

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

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

四、子查询

子查询是指嵌入到其他SQL语句中的select语句,也叫嵌套查询。

4.1 单行子查询

单行子查询指的是返回一行记录的子查询,例如:

显示SMITH同一部门的员工

  1. 首先从emp表中找出SMITH所在部门的部门号:

  1. 然后将该部门号作为筛选的条件,筛选出与该部门号相同的员工信息,并且不包含SMITH:


由此可见,子查询就是将第一次select查询的结果,作为第二次select查询的筛选条件。

4.2 多行子查询

多行子查询就是返回多行记录的子查询,此时一般会用于INALLANY 这些关键字:

  • IN:表示存在,即需满足存在条件
  • ALL:表示所有,即需满足所有条件
  • ANY:表示任一,即需满足任一条件

查询案例:

IN关键字:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10号部门自己的

  1. 首先查询出10号部门所有的岗位

  1. 然后将这些岗位信息作为下一次查询的筛选条件进行查询

  1. 最后去掉10号部门的员工信息

ALL关键字:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

  1. 首先查找出30号部门所有的员工工资

  1. 然后将其作为筛选条件查找出比30号部门的所有员工工资都高的员工信息

ANY关键字:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

该案例的前面部分和上面的案例一样,也是首先找出30号部门所有员工的工资,然后再使用ANY关键字找出比部门30的任意员工的工资高的员工信息:


任一当然也包含了30号部门的内部员工,因此只需大于30号部门最低的员工工资的员工都会被筛选出来。

4.3 多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的。而多列子查询则是指查询返回多个列数据的子查询语句。

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

  1. 首先查找出SMITH的部门号和岗位信息

  1. 然后以SMITH的部门号和岗位信息作为筛选条件进行筛选

  1. 最后去掉SMITH的相关信息

4.4 FROM子句中的子查询

FROM子句中的子查询就是指子查询语句出现在FROM后面,其实就是把子查询的结果当成一张临时表使用。

查询案例:

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

  1. 首先对部门进行分组,获取其部门号即平均工资

  1. 将查询结果作为一张临时表,获取其与emp表的笛卡尔积

  1. 最后在笛卡尔积表当中筛选出每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

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

  1. 首先分组查询获取每个部门的部门号和最高工资

  1. 然后将查询结果作为临时表,并获取其与emp表的笛卡尔积

  1. 从获取的笛卡尔积中筛选出每个部门工资最高的人的姓名、工资、部门、最高工资

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

方法一:使用子查询

  1. 首先对部门进行分组,查找每个部门对应的人数

  1. 将查询的结果作为临时表,获取其与dept表的笛卡尔积

  1. 从笛卡尔积表中筛选出每个部门的信息及其部门人数


方法二:使用多表

4.5 合并查询

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

4.5.1 UNION

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

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

可以发现,使用 ORUNION 查询出来的结果相同。

4.5.2 UNION ALL

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

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

此时可以发现UNIONUNION ALL的唯一区别就是前者会对查找结果进行去重,而后者不会。

五、自连接

所谓的自连接是指在同一张表连接查询。
查询案例:

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

方法一:子查询

首先从emp表中找出FORD领导的编号,然后将其作为筛选条件查找出FORD的领导信息。

方法二:自连接

  1. 首先将两张emp表分别作为leader表和worker表,查找出所有领导与员工之间的关系表

  1. 然后从关系表中,查找出员工为FORD的领导信息

六、内外连接

6.1 内连接

内连接实际上就是利用WHERE子句对两张表形成的笛卡尔积进行筛选,因此前面所有的复合查询操作都属于内连接,同时内连接也是实际开发过程中使用最多的连接查询。

内连接语法:

select 字段 from1 inner join2 on 连接条件 and 其他条件;

案例:显示SMITH的名字和部门名称

方法一:使用前面的查询方式


方法二:使用标准内连接查询

  1. 首先通过内连接查询出所有员工与其所在部门名之间的关系

  1. 从以上关系中筛选出SMITH与其部门名

6.2 外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接,右侧的表完全显示就是右外连接。

6.2.1 左外连接

语法:

select 字段名  from 表名1 left join 表名2 on 连接条件;

案例:

-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);

查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来


可以发现,左外连接以左表的内容为准,显示其全部内容,如果右边没有对应信息,则显示为NULL

6.2.2 右外连接

语法:

select 字段 from 表名1 right join 表名2  on 连接条件;

案例:

对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

对dept表和emp表联合查询,列出部门名称和这些部门的员工信息,同时列出没有员工的部门

dept表左外连接emp表:

emp表右外连接dept表:

由此可见左外连接和右外连接可以相互转换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【容器化应用程序设计和开发】2.7 云原生开发工具和框架

2.7 云原生开发工具和框架 今天我们就简单来讲一下云原生下用到的开发工具和一些基本的框架。云原生开发工具和框架是为了支持现代化的应用程序开发,能够简化云原生应用程序的构建、部署、管理和维护。下面是一些常见的云原生开发工具和框架: Kubernetes…

为什么别人家的ChatGPT比我家的更聪明?

文章目录 引子使用技巧技巧1:使用分隔符技巧2:结构化输出技巧3:整理操作步骤技巧4:做示范技巧5:给定具体的步骤技巧6:生成摘要技巧7:情感分析 好问题的三要素总结 引子 你有没有发现&#xff0…

python+Django音乐播放器网站系统0tr3w

音乐网站系统的后台开发目标是以信息管理系统的管理和开发方法,用目前现有的新技术进行系统开发,提供后台管理员高度友好的界面操作以及迅捷的信息处理。而前台的开发目标是以用户的需求作为主导,提供对用户而言非常友好的界面操作环境以及完…

2023年第十五届B题电工杯初步解题思路

第十五届“中国电机工程学会杯”全国大学生 电工数学建模竞赛题目 B题 人工智能对大学生学习影响的评价 人工智能简称AI,最初由麦卡锡、明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出。 2016年,人工智能AlphaGo 4:1战胜韩国围棋高手李世石…

(学习日记)AD学习 #2

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

航空公司预订票数学建模论文

航空公司预订票数学建模论文篇1 试谈机票订票模型与求解 一、概述 1. 问题背景描述 在激烈的市场竞争中,航空公司为争取更多的客源而开展的一个优质服务项目是预订票业务,本模型针对预订票业务,建立二元规划订票方案,既考虑航空公司的利润最大…

利用qsort排序

一、简单排序10个元素的一维数组 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<stdlib.h> void print_arr(int arr[], int sz) {int i 0;for (i 0; i < sz; i){printf("%d ", arr[i]);}printf("…

开源赋能 普惠未来|QUICKPOOL诚邀您参与2023开放原子全球开源峰会

QUICKPOOL算力调度系统的诞生和发展&#xff0c;为广大的算力领域从业者和技术开发者&#xff0c;提供了一条中国技术路线&#xff0c;并与IBM LSF、SLURM、PBS、SGE等产品&#xff0c;共同助力全球算力发展。QUICKPOOL算力调度系统成熟、稳定&#xff0c;具备“超算&智算”…

服务高可用保障:服务限流,Nginx实现服务限流

一、前言 1.1什么是限流&#xff1f; 限流存在于高可用服务中。 用于高可用的保护手段&#xff0c;主要包括&#xff1a;缓存&#xff0c;降级&#xff0c;限流 限流&#xff1a;只允许指定的事件进入系统&#xff0c;超过的部分将被拒绝服务&#xff0c;排队或者降级处理。 …

国内行业垂直型SaaS公司有哪些?发展前景如何?

01 国内行业垂直型SaaS公司有哪些&#xff1f; 根据艾瑞咨询测算&#xff0c;2021年中国企业级应用软件市场规模达到2592亿元&#xff0c;SaaS在其中占比达到28.1%。 在企业数字化转型的全景图中&#xff0c;SaaS扮演着应用场景层面的关键作用&#xff0c;往往是企业特定环节数…

ChatGPT系列学习(1)transformer基本原理讲解

文章目录 1. 简介1.1. 发展史 2. Transformer 整体结构3. 名词解释3.1. token 4. transformer输入4.1. 单词 Embedding4.2. 位置Embedding4.3. Transformer Embedding层实现 5. Attention结构5.1. 简介5.2. Self Attention&#xff08;自注意力机制&#xff09;5.2.1. 简介5.2.…

mysql 库的操作

文章目录 mysql 库的操作1. 创建数据库创建数据库案例 2. 字符集和校验规则查看系统默认的字符集合校验规则查看数据库支持的字符集查看数据库支持的字符集较验规则校验规则对数据库的影响 3. 操作数据库查看数据库显示创建语句修改数据库删除数据库查看数据库连接情况 mysql 库…

uniapp内使用 mescroll

前言 在使用uniapp开发项目的过程中&#xff0c;在很多场景里都需要下拉刷新和上拉加载&#xff0c;而 mescroll.js 则是一个非常精致的下拉刷新和上拉加载 js 框架。 官网地址&#xff1a;mescroll 介绍 mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件&#xff0c;时…

Leetcode 1679. K 和数对的最大数目 双指针法

https://leetcode.cn/problems/max-number-of-k-sum-pairs/ 给你一个整数数组 nums 和一个整数 k 。 每一步操作中&#xff0c;你需要从数组中选出和为 k 的两个整数&#xff0c;并将它们移出数组。 返回你可以对数组执行的最大操作数。 示例 1&#xff1a; 输入&#xff1…

【云计算与虚拟化】第五章—— vCenter Server 5.5 的高级功能(三)

第五章—— vCenter Server 5.5 的高级功能&#xff08;三&#xff09; 1.使用vsphere client 登陆vcenter服务器,创建一个群集&#xff0c;名称为自己的学号&#xff0c;&#xff08;截图&#xff09; 2.针对该群集打开HA功能&#xff08;截图&#xff09; 3.接入控制策略选择…

使用Python复制某文件夹下子文件夹名为数据文件夹下的所有以DD开头的文件夹到桌面...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 楼阁玲珑五云起&#xff0c;其中绰约多仙子。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【魏哥】问了一个Python自动化办公处理…

单模光纤二维模场分布的MATLAB仿真

在上一篇文章中&#xff0c;我们介绍了单模光纤的一维模场分布&#xff0c;能看出沿着径向的光场分布情况&#xff0c;并分析能量的分布 这一篇中&#xff0c;我们绘制光纤横截面上的二维光场分布&#xff1a;代码如下&#xff1a; clear close all V 2.4000; U 1.6453; W …

Netty和Tomcat的区别、性能对比

文章目录 一、Netty和Tomcat有什么区别&#xff1f;二、为什么Netty受欢迎&#xff1f;三、Netty为什么并发高 &#xff1f; 一、Netty和Tomcat有什么区别&#xff1f; Netty和Tomcat最大的区别就在于通信协议&#xff0c;Tomcat是基于Http协议的&#xff0c;他的实质是一个基…

代码随想录算法训练营day52 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

代码随想录算法训练营day52 | 300.最长递增子序列&#xff0c;674. 最长连续递增序列&#xff0c;718. 最长重复子数组 300.最长递增子序列解法一&#xff1a;动态规划 674. 最长连续递增序列解法一&#xff1a;动态规划解法二&#xff1a;双指针法 718. 最长重复子数组解法一&…

SQL案例-高校信息管理系统实现要求

SQL案例-高校信息管理系统实现要求 (1) 建表 stuInfo(学生信息表) 字段名称数据类型说明stuName字符学生姓名&#xff0c;该列必填&#xff0c;要考虑姓氏可能是两个字的&#xff0c;如欧阳俊雄stuNo字符学号&#xff0c;该列必填&#xff0c;学号不能重复&#xff0c;且必须…