MySQL数据库多表查询

article/2025/9/24 6:58:05

MySQL数据库多表查询

前言

在之前的文章MySQL数据库之SQL入门中,我们讲到了四类SQL中的DQL(数据库查询语言,用于查询表中数据),但是我仅仅用DQL去查询一张表中数据,而在实际的应用中,经常是对多张数据库表进行查找。本文介绍MySQL数据库的多表查询,介绍内连接查询、外连接查询以及子查询三种多表查询方式及其区别。

零、创建用于查询的示例数据库表

  1. 创建一张部门表
CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
  1. 为dept表添加数据
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
  1. 创建一张员工表
CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),gender CHAR(1), -- 性别salary DOUBLE, -- 工资join_date DATE, -- 入职日期dept_id INT,FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
  1. 为emp表添加数据
NSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
  1. 部门表dept和员工表emp之间的关系
    在这里插入图片描述

一、笛卡尔积

  • 如果我们使用如下sql查询员工表和部门表,查询得到的是笛卡尔积结果。
SELECT * FROM emp,dept;
  • 笛卡尔积:A笛卡尔积B=A与B组合得到的所有情况。
    在这里插入图片描述
  • 笛卡尔积的结果包含所有可能的组合数据,但是有很多数据是不合理,不正确的(如孙悟空的部门开发部,而查询结果中有两行数据显示他不是开发部,这两行数据很明是不正确的数据,是我们所不需要的数据),因此,我们需要从笛卡尔积的结果中筛选出我们需要的正确数据。
  • 如对于上表笛卡尔积的结果中,我们需要添加员工表中的dept_id要与部门表中的id相同这一条件。而添加这一条件有三种方式,分别对应内连接查询,外连接查询和子查询三种查询方式。

二、内连接查询

1. 隐式内连接:使用where条件消除无用数据

SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id`=t2.`id`;

在这里插入图片描述

2. 显式内连接

  • 语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件
SELECT * FROM emp t1 INNER JOIN dept t2 ON t1.`dept_id`=t2.`id`;

在这里插入图片描述

三、外连接查询

1. 左外连接

  • 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
  • 查询的是左表所有数据以及其交集部分。 即用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示NULL
  • 可以理解为:在内连接的基础上保证左表的数据全部显示
  • 示例:
-- 在部门表中增加一个销售部
INSERT INTO dept(dept.`NAME`) VALUES('销售部');
-- 使用内连接查询两张表
SELECT * FROM emp t1 INNER JOIN dept t2 ON t1.`dept_id`=t2.`id`;
-- 使用左外连接查询两张表
SELECT * FROM dept t1 LEFT OUTER JOIN emp t2 ON t1.`id`=t2.`dept_id`; 

使用内连接查询两张表结果如下图(仅仅展示了双方都有的数据,因为员工没有属于销售部的,所以没有查询出销售部的信息)
在这里插入图片描述
使用左外连接查询两张表结果如下图(查询左表即部门表的所有数据,如果右有匹配的数据则展示,否则赋值为null)
在这里插入图片描述

2. 右外连接

  • 右连接查询和左连接查询正好相反,一般掌握一个即可,只要将左右表交换,即可实现左右连接的效果。
  • 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
  • 查询的是右表所有数据以及其交集部分。 即用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示NULL
  • 可以理解为:在内连接的基础上保证右表的数据全部显示
  • 示例:
-- 在员工表中增加一个员工
INSERT INTO emp VALUES (NULL, '沙僧','男',6666,'2013-12-05',NULL);
-- 使用内连接查询
SELECT * FROM dept INNER JOIN emp ON dept.`id` = emp.`dept_id`;
-- 使用右外连接查询
SELECT * FROM dept RIGHT JOIN emp ON dept.`id` = emp.`dept_id`;
  • 使用内连接查询结果如下图
    在这里插入图片描述
  • 使用右外连接查询结果如下图
    在这里插入图片描述

四、子查询

  • 概念:查询中嵌套查询,称嵌套查询为子查询。
  • 示例:查询工资最高的员工信息
SELECT 
*
FROM 
emp 
WHERE 
emp.`salary` = 
(
SELECT 
MAX(salary) 
FROM 
emp);
  • 子查询不同情况
    1.子查询的结果是单行单列的:子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);

2.子查询的结果是多行单列的:子查询可以作为条件,使用运算符in来判断

-- 查询'财务部''市场部'所有的员工信息
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');

3.子查询的结果是多行多列的:子查询可以作为一张虚拟表参与查询

-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2WHERE t1.id = t2.dept_id;

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

相关文章

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

sql语句之多表查询

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