MySQL - 多表查询与案例详解

article/2025/9/24 7:01:18

目录

多表查询概述

内连接

外连接

        1). 左外连接

        2). 右外连接

自连接

联合查询

子查询

        标量子查询

        列子查询

        行子查询

        表子查询

多表查询练习

        隐式内连接

        显式内连接

        去重distinct

        左外连接

        between ... and ...

        三表查询

        函数AVG

标量子查询

        命名引用


多表查询概述

分类

内连接:相当于查询A、B交集部分数据

外连接:外连接分为两种,分别是:左外连接 和 右外连接

左外连接:查询左表所有数据,以及两张表交集部分数据

右外连接:查询右表所有数据,以及两张表交集部分数据

自连接:当前表与自身的连接查询,自连接必须使用表别名

数据准备

drop table dept;
drop table emp;-- 创建dept表,并插入数据
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');-- 创建emp表,并插入数据
create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

内连接

外连接分为两种,分别是:左外连接 和 右外连接

1). 隐式内连接

SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

2). 显式内连接

SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;

A.查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)

表结构: emp , dept

连接条件: emp.dept_id = dept.id

select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;
-- 为每一张表起别名,简化SQL编写
select e.name,d.name from emp e , dept d where e.dept_id = d.id;

B. 查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现) --- INNER JOIN ...

ON ...

表结构: emp , dept

连接条件: emp.dept_id = dept.id

select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
-- 为每一张表起别名,简化SQL编写
select e.name, d.name from emp e join dept d on e.dept_id = d.id;

注意:一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段

外连接

外连接分为两种,分别是:左外连接 和 右外连接。

1). 左外连接

SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;

左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据

2). 右外连接

SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;

右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。

A. 查询emp表的所有数据, 和对应的部门信息

由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。

select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;select e.*, d.name from emp e left join dept d on e.dept_id = d.id;

B. 查询dept表的所有数据, 和对应的员工信息(右外连接)

由于需求中提到,要查询dept表的所有数据,所以是不能内连接查询的,需要考虑使用外连接查

询。

select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;

注意事项:

左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺

序就可以了。而我们在日常开发使用时,更偏向于左外连接

自连接

自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;

对于自连接查询,可以是内连接查询,也可以是外连接查询

A. 查询员工及其所属领导的名字(内连接)

select a.name , b.name from emp a , emp b where a.managerid = b.id;

B. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来(外连接)

select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid = b.id;

注意事项:

在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。

联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

SELECT 字段列表 FROM 表A ...

UNION [ ALL ]

SELECT 字段列表 FROM 表B ....;

  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重

A. 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来

select * from emp where salary < 5000
union all
select * from emp where age > 50;

union 联合查询,会对查询出来的结果进行去重处理

select * from emp where salary < 5000
union 
select * from emp where age > 50;

子查询

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果不同,分为:

A. 标量子查询(子查询结果为单个值)

B. 列子查询(子查询结果为一列)

C. 行子查询(子查询结果为一行)

D. 表子查询(子查询结果为多行多列)

根据子查询位置,分为:

A. WHERE之后

B. FROM之后

C. SELECT之后


标量子查询

常用的操作符:= <> > >= < <=

查询 "销售部" 的所有员工信息

select * from emp where dept_id = (select id from dept where name = '销售部'); 

查询在 "方东白" 入职之后的员工信息

select * from emp where entrydate > (select entrydate from emp where name = '方东白');

列子查询

常用的操作符:

查询 "销售部" 和 "市场部" 的所有员工信息

select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市
场部');

查询比 财务部 所有人工资都高的员工信息

select * from emp where salary > all ( select salary from emp where dept_id = (select id 
from dept where name = '财务部') );

查询比研发部其中任意一人工资高的员工信息

select * from emp where salary > any ( select salary from emp where dept_id = (select id from dept where name = '研发部') );

行子查询

常用的操作符:= 、<> 、IN 、NOT IN

查询与 "张无忌" 的薪资及直属领导相同的员工信息

select * from emp where (salary,managerid) = (select salary, managerid from emp where name = '张无忌');

表子查询

常用的操作符:IN

A. 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

select * from emp where (job,salary) in ( select job, salary from emp where name = '鹿杖客' or name = '宋远桥' );

B. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息

select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id ;

多表查询练习

数据环境准备:

create table salgrade(
grade int,
losal int,
hisal int
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

隐式内连接

1). 查询员工的姓名、年龄、职位、部门信息 (隐式内连接)

select e.name , e.age , e.job , d.name from emp e , dept d where e.dept_id = d.id;

显式内连接

2). 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)

select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id = d.id where e.age < 30;

去重distinct

3). 查询拥有员工的部门ID、部门名称

select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;

左外连接

4). 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出

来(外连接)

select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40 ;

between ... and ...

5). 查询所有员工的工资等级

-- 方式一
select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary >=
s.losal and e.salary <= s.hisal;
-- 方式二
select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary
between s.losal and s.hisal;

三表查询

6). 查询 "研发部" 所有员工的信息及 工资等级

select e.* , s.grade from emp e , dept d , salgrade s where e.dept_id = d.id and ( e.salary 
between s.losal and s.hisal ) and d.name = '研发部';

函数AVG

7). 查询 "研发部" 员工的平均工资

select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研发部';

标量子查询

8). 查询工资比 "灭绝" 高的员工信息

select * from emp where salary > ( select salary from emp where name = '灭绝' );

9). 查询比平均薪资高的员工信息

select * from emp where salary > ( select avg(salary) from emp );

10). 查询低于本部门平均工资的员工信息

select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where e1.dept_id 
= e2.dept_id );

11). 查询所有的部门信息, 并统计部门的员工人数(select ... from 之间也可以用子查询)

select d.id, d.name , ( select count(*) from emp e where e.dept_id = d.id ) '人数' from dept d;

命名引用

12). 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称

select s.name , s.no , c.name from student s , student_course sc , course c where s.id = 
sc.studentid and sc.courseid = c.id ;


http://chatgpt.dhexx.cn/article/L6hCk3gT.shtml

相关文章

MySQL数据库多表查询

MySQL数据库多表查询 前言 在之前的文章MySQL数据库之SQL入门中&#xff0c;我们讲到了四类SQL中的DQL(数据库查询语言&#xff0c;用于查询表中数据)&#xff0c;但是我仅仅用DQL去查询一张表中数据&#xff0c;而在实际的应用中&#xff0c;经常是对多张数据库表进行查找。…

Oracle多表查询

什么是多表查询 多表查询&#xff1a;当查询的数据并不是来源一个表时&#xff0c;需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据 多表链接方式 内连接&#xff08;inner join&#xff09; 连接两个表&#xff0c;通过相等或不等判断链接列&…

(八)多表查询

目录 多表查询 笛卡尔积的错误 连接条件 表的别名 多表查询分类 自连接 和 非自连接 内连接 和 外连接 SQL92 SQL99 UNION的使用 UNION操作符 UNION ALL操作符 7种SQL JOINS的实现 QL99语法新特性 自然连接 USING连接 多表查询 多表查询&#xff0c;也称…

6、多表查询

第06章_多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了…

【MySQL】多表查询方法

目录 多表关系 多表查询之笛卡尔积 多表查询分类 连接查询 内连接 外连接 自连接 子查询 标量子查询 列子查询 行子查询 表子查询 联合查询 多表关系 一对多&#xff08;多对一&#xff09;&#xff1a;员工与部门&#xff0c;一个部门可以对应多个员工一般在多的…

【MySQL】多表查询

首先&#xff0c;为了方便说明问题&#xff0c;创建两个表emp&#xff08;雇员信息&#xff09;和dept&#xff08;雇员部门信息&#xff09;&#xff0c;其数据如下&#xff1a; 在之前的博客中&#xff0c;我们分享了单表查询的方法&#xff0c;但是在实际应用中&#xff…

mysql 多表查询

一、概念 多表查询也叫关联查询, 其就是指 一次性查询多张表&#xff0c;并且将每张表得到的数据联系作为查询结果 二、关键字 当我们需要一次查询两张表时&#xff0c;如果使用&#xff1a; select * from employees,departmaents; 这样的话会出现笛卡尔积错误 (笛卡尔积错…

数据库-MySQL-多表查询(总结)

目录 前言 多表查询概述 多表查询分类 1、连接查询 2、子查询 内连接 内连接查询语法 案例演示 外连接 外连接查询的语法 案例演示 联合查询-union,union all 子查询 概念 分类 标量子查询 自连接 自连接查询语法 案例演示 子查询 列子查询 行子查询 表子…

多表查询(整理)

一、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间互相关联&#xff0c;所以各个表结构之间也存在着各种联系。 基本上有三种&#xff1a;…

mybatis多表查询

目录 前言 一、Mybatis多表查询 2.一对一查询&#xff08;多对一&#xff09; 2.2 一对多查询 2.3 多对多查询 2.4 知识小结 前言 mybatis初学者记录每日学习日常 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Mybatis多表查询 内连接、左外连…

多表查询(连接查询)

在使用数据库查询语句时&#xff0c;单表的查询有时候不能满足项目的业务需求&#xff0c;在项目开发过程中&#xff0c;有很多需求都是要涉及到多表的连接查询最终需要查询的数据来源于不同的表中时&#xff0c;这个时候需要考虑使用连接查询 新建一张员工表 -- emp drop t…

数据库高级——多表查询

多表查询 多表查询有如下几种&#xff1a; 合并结果集&#xff1a;union、union all连接查询&#xff1a; 2.1. 内连接&#xff1a;inner join on 2.2. 外连接&#xff1a;outer join on – 左外连接&#xff1a;left outer join – 右外连接&#xff1a;right outer join 2.…

MySQL多表查询

文章目录 一、什么是多表查询1、概述2、笛卡尔积现象 二、多表查询的分类1、等值连接 vs非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接4、满外连接&#xff08;FULL OUTER JOIN&#xff09; 三、UNION[ALL]的使用四、7种SQL JOINS的实现 一、什么是多表查询 1、概述 多…

【MySQL】多表查询策略(多表联查子查询)

目录 一、MySQL多表查询 二、准备工作 1.运行环境 2.创建公司表 3.创建员工表 三、多表查询 &#xff08;一&#xff09;多表联查—同时查询多张表 1.联结 2.左连接 3.右连接 4.内连接 &#xff08;二&#xff09;子查询 1.SELECT子查询 2.WHERE子查询 3.FROM子…

MySQL----多表查询

MySQL----多表查询 多表关系表与表之间的联系&#xff1a;一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进行数据库表结构的设计时&#xff0c;会根据业务的需求和…

SQL语句多表查询

多表查询 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&a…

十、多表查询

十、多表查询 *多表查询的本质就是把多张表合并成一个临时表 1、多表数据合并方案 连接查询合并方案【最常见】 首先确保两张表之间存在【隶属关系】将两张表中的数据行【沿着水平方向进行拼接】最终得到一个拥有【完整隶属关系】的新数据行 联合查询合并方案 不需要两张表之…

图解数据库多表查询(多表联查)的几种方式

多表查询&#xff0c;也被称为多表连接查询。 为什么会有多表查询这个操作呢&#xff1f; 在实际项目开发过程中&#xff0c;会出现多张表&#xff0c;用于分类存储不同的信息&#xff0c;我们测试需要的数据也会来自不同的表&#xff0c;因此需要使用多表查询。 我们常用的…

史上最牛mysql-06 (多表连接)

多表连接 个人博客 &#xff1a;www.xiaobeigua.icu 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&…

sql多表查询

1.多表查询概念&#xff1a;从多张表查询数据 2.分类&#xff1a;连接查询和子查询。 有两张表A、B 连接查询&#xff1a; 内连接 相当于查询A、B交集数据 例1&#xff1a;select * from emp,dept where emp.dep_iddept.id; 外连接 左外连接&#xff1a;相当于查询…