返回顶部
首页 > 资讯 > 数据库 >MySQL表复合查询的实现
  • 772
分享到

MySQL表复合查询的实现

MySQL复合查询MySQL多表查询 2023-05-19 14:05:54 772人浏览 八月长安
摘要

目录前言一、案例准备二、基本查询三、多表查询四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 FROM子句中的子查询4.5 合并查询4.5.1 UNION

前言

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同一部门的员工

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

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

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

4.2 多行子查询

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

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

查询案例:

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

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

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

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

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

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

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

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

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

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

4.3 多列子查询

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

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

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

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

最后去掉SMITH的相关信息

4.4 FROM子句中的子查询

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

查询案例:

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

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

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

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

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

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

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

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

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

方法一:使用子查询

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

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

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

方法二:使用多表

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的领导信息。

方法二:自连接

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

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

六、内外连接

6.1 内连接

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

内连接语法:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

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

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

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

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

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

6.2 外连接

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

6.2.1 左外连接

语法:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

案例:

-- 建两张表
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表:

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

到此这篇关于MySQL表复合查询的实现的文章就介绍到这了,更多相关MySQL 复合查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL表复合查询的实现

本文链接: https://lsjlt.com/news/213430.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL表复合查询的实现
    目录前言一、案例准备二、基本查询三、多表查询四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 FROM子句中的子查询4.5 合并查询4.5.1 UNION...
    99+
    2023-05-19
    MySQL 复合查询 MySQL 多表查询
  • 【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询
    「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4....
    99+
    2023-08-30
    mysql 学习 android
  • 【MySQL】MySQL表之联合查询(多表查询)
    📌前言:本篇博客介绍MySQL数据库的MySQL表之联合查询(多表查询),学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。 那我们废话不多说,直接进入主体!...
    99+
    2023-08-16
    mysql 数据库 java
  • 【MySQL】复合查询
    复合查询 一、基本查询回顾二、多表查询三、自连接四、子查询1. 单行子查询2. 多行子查询3. 多列子查询4. 在 from 子句中使用子查询5. 合并查询(1)union(2)un...
    99+
    2024-01-21
    mysql 数据库 android linux centos
  • MySQL联合查询(多表查询)
    一、内连接 select *from 表1 [ inner | cross ] join 表2 [ on过滤条件 ] [ where查询条件 ] ; [ inner | cross ]: join 内连接关键字(必须要有...
    99+
    2023-09-14
    mysql 数据库 database
  • MySQL查询表中重复数据的实现
    目录一、查询重复记录方法1方法2:使用别名as方法3,不推荐,执行速度较慢二、总结一、查询重复记录 例:查询员工表里出现重复姓名的记录 思路:1、查看重复记录,首先要使用分组函数(group by),再用聚合函数中的计数...
    99+
    2023-08-25
    MySQL查询重复数据
  • MySQL中的聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL中的聚合查询和联合查询怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL中的聚合查询和联合查询怎么实现”文章能帮助大家解决问题。一、聚合查询(行与行之间的计...
    99+
    2023-07-05
  • 【MySQL】聚合查询 + 多表联合查询(重点)
    文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12...
    99+
    2023-09-29
    mysql 数据库 聚合查询 联合查询 内连接
  • 【MySQL】详解聚合查询、多表查询
    MySQL 增删查改(进阶) 文章目录 MySQL 增删查改(进阶)01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GR...
    99+
    2023-10-07
    mysql adb 数据库
  • Mysql 复杂查询丨联表查询
    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! JOIN(联表查询) 联表查询(Join)是一种在数据库中使用多个表进行关联查询的操...
    99+
    2023-08-16
    mysql 数据库
  • MySQL之复杂查询的实现
    目录1.排序2.分组3.联合查询4.多表连接1.排序 ORDER BY 子句来设定哪个字段哪种方式来进行排序,再返回搜索结果。desc:降序 select * from b...
    99+
    2024-04-02
  • mysql中如何实现多表联合查询操作
    这篇文章将为大家详细讲解有关mysql中如何实现多表联合查询操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MySQL多表联合查询语法:复制代码 代码如下...
    99+
    2024-04-02
  • MySQL联合查询如何实现
    这篇文章主要介绍“MySQL联合查询如何实现”,在日常操作中,相信很多人在MySQL联合查询如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL联合查询如何实现”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-04
  • mysql的多表查询实现方法
    本篇文章给大家分享的是有关mysql的多表查询实现方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。多表查询有3种方式,分别是:1、传统方式,...
    99+
    2024-04-02
  • MySQL实现单表查询的语句
    下文给大家带来关于MySQL实现单表查询的语句,感兴趣的话就一起来看看这篇文章吧,相信看完MySQL实现单表查询的语句对大家多少有点帮助吧。         ...
    99+
    2024-04-02
  • Mysql中怎么实现子查询和联合查询
    Mysql中怎么实现子查询和联合查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。查询: 在select查...
    99+
    2024-04-02
  • MySQL数据库聚合查询和联合查询怎么实现
    这篇文章主要介绍“MySQL数据库聚合查询和联合查询怎么实现”,在日常操作中,相信很多人在MySQL数据库聚合查询和联合查询怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库聚合查询和联合...
    99+
    2023-06-21
  • mysql多表联合的查询方法
    本文主要给大家介绍mysql多表联合的查询方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql多表联合的查询方法吧。   ...
    99+
    2024-04-02
  • MySQL如何实现单表查询
    这篇文章给大家分享的是有关MySQL如何实现单表查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。单表查询指从一张表数据中查询所需的数据。(1)查询所有字段(2)查询指定字段(3...
    99+
    2024-04-02
  • mysql怎么实现多表查询
    这篇文章给大家分享的是有关mysql怎么实现多表查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明查询其实就是对于对于各个表格进行递归调用,和矩阵的乘法一样一样的,这个对应非常直观,也非常通用。常规的查询...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作