【MySQL】多表查询方法

article/2025/9/24 7:14:42

目录

多表关系

多表查询之笛卡尔积

多表查询分类

连接查询

内连接

外连接

自连接

子查询

标量子查询

列子查询

行子查询

表子查询

联合查询


多表关系

  • 一对多(多对一):员工与部门,一个部门可以对应多个员工
    一般在多的一方创建外键,指向一的那一方,即员工表建立外键指向部门表
  • 多对多:学生与课程,一个学生可以选多个课,一个课包含多个学生
    一般会建立第三张表,表中至少包含两个外键,分别指向两张表的主键
  • 一对一:人与身份信息,一个人有一个身份证号
    可以在任意一方加入外键,关联另一方的主键,并且设置外键为唯一(unique)

多表查询之笛卡尔积

笛卡尔积:两个表(集合)中的每条数据进行两两组合的结果。
                  在多表查询时会产生笛卡尔积,要通过添加条件消除笛卡尔积

 表一:部门表

drop table if exists dept;
CREATE TABLE dept(id int primary key auto_increment,name varchar(20)
);insert into dept(name) value('研发部'),('市场部'),('财务部'),('销售部'),('总经办')

  表二:员工表

drop table if exists emp;
CREATE TABLE emp(id int primary key auto_increment,name varchar(20),age int,job varchar(20),salary int,entrydate date,managerid int,dept_id int
);insert into emp values(1,'金庸',66,'总裁',20000,'2000-01-01',null,5);
insert into emp values(2,'张无忌',66,'项目经理',12500,'2005-12-05',1,1);
insert into emp values(3,'杨晓',66,'开发',8400,'2000-11-03',2,1);
insert into emp values(4,'韦一笑',66,'开发',11000,'2002-02-05',2,1);
insert into emp values(5,'陈玉存',66,'开发',10500,'2004-09-07',3,1);
insert into emp values(6,'小昭',66,'程序员鼓励师',6600,'2004-10-12',2,1);

 查询产生笛卡尔积的结果:

select * from emp, dept ;

 消除办法:添加约束条件

select * from emp, dept where emp.dept_id=dept.id;

多表查询分类

多表查询一般分为:连接查询,子查询,联合查询

连接查询

连接查询一般分为:内连接、外连接、自连接

内连接

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

内连接查询语法:

# 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
# 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;# 查询每一个员工的姓名及关联的部门的名称
select emp.name, dept.name from emp, dept where emp.dept_id=dept.id;
select emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id;

外连接

外连接分为:外连接、外连接

# 左外连接:查询左表所有数据,以及两张表交集部分数据
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
# 右外连接:查询右表所有数据,以及两张表交集部分数据
select 字段列表 from 表1 right [outer] join 表2 on 条件...;# 查询emp表的所有数据,和应于的部门信息(左)
select emp.*, dept.* from emp left outer join dept on emp.dept_id = dept.id;
# 查询dept表的所有数据,和对于的员工信息(右)
select dept.*, emp.* from emp right outer join dept on emp.dept_id = dept.id;

自连接

自连接查询可以是内连接查询也可以是外连接查询

# 语法格式
select 字段列表 from 表a 别名a join 表a 别名b on 条件;# 查询员工及其所属领导的名字
# 自连接可以看成两张一样的表进行连接查询
select a.name, b.name from emp a join emp b on a.managerid=b.id;

子查询

  • 子查询:SQL语句中嵌套select语句,又称嵌套查询;
  • 可使用子查询的语句:insert、update、delete、select;
  • 子查询使用位置:where后、from后、select后;
  • 根据子查询结构不同,可分为:标量子查询、列子查询、行子查询、表子查询

标量子查询

  • 概念:子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
  • 常用符号:=   !=(<>)   >   >=   <   <=
# 根据销售部门的id查询员工信息
# 先分开查询
# 查询销售部门的id
select id from dept where name='销售部'; #id为4
# 查询销售部门中员工的信息
select * from emp where dept_id=4;
# 合并为一个查询
select * from emp where dept_id=(select dept.id from dept where dept.name='销售部' );

列子查询

  • 概念:子查询的结果为一列(可以是多行)
  • 常用字段:IN、NOT IN、ANY、SOME、ALL
# 列子查询
# 查询销售部和市场部的所有员工信息
# 查询销售部和市场部的id
select id from dept where name='销售部' or name='市场部'; #id为2 4
# 查询两个部门的所有员工
select * from emp where dept_id in (2,4);
# 合并
select * from emp where dept_id in (select id from dept where name='销售部' or name='市场部');# any  all  some 解读
# All:只有当其所有数据都满足条件时,条件才成立
# Any:只要有一条数据满足条件,条件就成立
# Some:其中存在一些数据满足条件,作用和Any大致相同 常规的使用中看作一致即可
select * from emp where dept_id=all(select id from dept where name='研发部' )
select * from emp where dept_id=any(select id from dept where name='销售部' or name='市场部' or name='研发部' )
select * from emp where dept_id=some(select id from dept where name='销售部' or name='市场部' or name='研发部' )

行子查询

  • 子查询返回的结果是一行(可以是多列)
  • 常用操作符:=、<>、IN、NOT IN
# 查询与张无忌的薪资及直属领导相同的员工信息
# 查询张无忌的薪资和直属领导
select salary, managerid from emp where name='张无忌';
# 查询与张无忌的薪资及直属领导相同的员工信息
select * from emp where (salary,managerid)=(select salary, managerid from emp where name='张无忌');

表子查询

  • 子查询的结果是多行多列的查询
  • 常用操作符:in
# 查询与鹿杖客和宋远桥的职位和薪资相同的员工信息
select * from emp where (job, salary) in ( select job, salary from emp where name in ('鹿杖客', '宋远桥'));# 查询入职日期是’2006-01-01‘之后的员工信息和部门信息
# 先查询出入职在’2006-01-01‘之后员工的所有信息
# 与部门表左连接
select e.*, dept.* from (select * from emp where entrydate>'2006-01-01') e left outer join dept on e.dept_id=dept.id;

联合查询

  • 概念:把多次查询的结果合并起来,形成一个新的查询结果集
  • 方法:union、union all
  • union all会将全部的数据直接合并在一起,union会对合并之后的数据去重
# 格式:
select 字段列表 from 表a
union [all]
select 字段列表 from 表b# 将薪资低于5000的员工和年龄大于50的员工查询出来
select * from emp where salary>5000
union all
select * from emp where age>50;# 没有all重复满足条件的只出现一次
# 将薪资低于5000的员工和年龄大于50的员工查询出来
select * from emp where salary>5000
union
select * from emp where age>50;


http://chatgpt.dhexx.cn/article/9JW8S6Xf.shtml

相关文章

【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;相当于查询…

sql语句之多表查询

文章目录 一、笛卡尔积(交叉连接) ---->cross join1、概念2. 语法3.示例 二、内连接---->inner join1、概念2. 语法3.示例 三、外链接---->outer join1、概念2. 语法3.示例 四、联合连接---->union1、概念2.示例 一、笛卡尔积(交叉连接) ---->cross join 1、概…

连接查询(多表查询)——MySQL

连接查询&#xff08;多表查询&#xff09; 又称多表查询&#xff0c;当查询的字段涉及多个表的时候&#xff0c;就要用到连接查询 分类&#xff1a; 为表起别名&#xff1a; 提高语句的简洁度区分多个重名字段注意&#xff1a;如果为表起了别名&#xff0c;则查询的字段就不…

MySQL-多表查询

一、表架构 student(sid,sname,sage,ssex) 学生表course(cid,cname,tid) 课程表sc(sid,cid,score) 成绩表teacher(tid,tname) 教师表 二 、建表sql语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for course -- --…

Java中的XML解析

前言 这几天在手写Spring IOC的时候遇上了xml文件的解析&#xff0c;通过解析Spring.xml配制文件的方式来创建对象。因为之前从来都没遇见过相关的需求&#xff0c;所以对此做一份记录 XML (eXtensible Markup Language) 意为可扩展标记语言&#xff0c;被多数技术人员用以选择…

Java - XML文件解析

Java对XML文件的解析 一、前言二、实例分析 - DOM方式解析XML文件2.1 XMLDomParseUtil - 抽象工具类2.2 待解析xml文件示例2.3 解析xml文件2.3.1 新建一个用于存储xml文件中各节点的属性和属性值的类2.3.2 解析实际节点 2.4 测试 一、前言 1、HTTP网络传输中的数据组织方式有三…