Mysql中的七种常用查询连接详解

2023-10-27

目录

一、概述

二、连接查询的分类

三、七种常用连接查询详解

1、笛卡尔积:

2、内连接

2.1隐式与显式连接

?2.2等值连接

?2.3非等值连接

?2.4自连接

3外连接

3.1左外连接:

?3.2右外连接:

3.3全外连接


一、概述

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。一个业务都会对应多张表,比如:学生和班级,起码两张表。(避免产生数据的冗余)。

内连接和外连接的区别

1、内连接:

假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。

2、外连接:

假设A和B表进行连接,使用外连接的话, AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

二、连接查询的分类

1、根据语法出现的年代来划分:

  • sql97–仅仅支持内连接(一些老的DBA可能还在使用这种语法。)
  • sql99–推荐使用,支持左外+右外(左外+右外)+交叉

2、根据功能划分分类:

  • 交叉连接:笛卡尔积。
  • 内连接:等值连接、非等值连接、自连接。(还可分为隐式【无join】和显式【有join】)
  • 外连接:左外连接(左连接)、右外连接(右连接)、全连接。

3、 生成测试数据

执行下面的sql语句生成student表和teacher表,两表通过teacher_id关联。

create table student(
    id int(3) not null primary key,
    name char(6) not null,
    age int(2) not null,
    teacher_id int(3) not null
);
create table teacher(
    id int(3) not null primary key,
    name char(6) not null,
    age int(2) not null,
    class_id int(3) not null
);


插入值 id 姓名 年龄 教师id

insert into student values(1, '刘峰', 20, 1);
insert into student values(2, '李福', 22, 2);
insert into student values(3, '王紫', 21, 3);
insert into student values(4, '赵兰', 24, 4);
insert into student values(5, '夏日', 23, 5);
insert into student values(6, '詹启', 22, 6);
insert into student values(7, '刘娜', 24, 4);
insert into student values(8, '王恒', 23, 5);
insert into student values(9, '晓飞', 22, 6);

插入值 id 姓名 年龄 班级id

insert into teacher values(1, '夏晴', 36, 1);
insert into teacher values(2, '李淳', 32, 2);
insert into teacher values(3, '张叶', 34, 3);
insert into teacher values(4, '鹿雪', 37, 3);
insert into teacher values(5, '刘花', 36, 2);
insert into teacher values(6, '贾义', 34, 1);

执行下面查询语句,student表和teacher表如下:

select * from student;
select * from teacher;

student表 teacher表

三、七种常用连接查询详解

1、笛卡尔积:

笛卡尔积也称交叉连接,交叉连接是内连接的一种。

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。如果A表示某学校学生的集合,B表示该学校所有教师的集合,则A与B的笛卡尔积表示学生选择老师所有可能的情况。

笛卡尔积特点:它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行 一 一 匹配。

重点记:

笛卡尔积:用的比较少,因为存在重复数据
笛卡尔积:一个表的每条数据都和另一个表的所有数据匹配一次
结 果:一表 9 条 乘以 另一表 6 条 = 54 条

1.1 案例如下:

查询学生对应的老师

select * from student ,teacher;

学生表 中数据每 1 个学生都和 教师表 中的 所有教师 都匹配一次。


问题:
当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。这就是笛卡尔积现象。查询出来的结果是两张表的记录的乘积9*6=54,许多数据是无效数据。如何避免笛卡尔积现象?

解决方案:增加加条件进行过滤,但只会显示有效记录。此时也是隐式(无join)内连接

根据教师id查询学生对应的选课老师
select st.*,th.* from student st ,teacher th where st.teacher_id = th.id;

**注意:**使用as可以对表和字段起别名,关于表的别名的优点:执行效率高;可读性好。
其中st是student的表的别名,原是from student as st,其中as可以省略。
其中th是teacher的表的别名,原是from teacher as th,其中as可以省略。

2、内连接

内连接,取的就是两张表的交集。

内连接又分为等值连接、非等值连接、自连接。(还可分为隐式【无join】和显式【有join】)

2.1隐式与显式连接

隐式(无join)连接语法:select 字段 from 表A, 表B where 消除笛卡尔积的连接条件

案例:根据教师id查询学生对应的选课老师
select st.*,th.* from student st ,teacher th where st.teacher_id = th.id;

显式(有join)连接语法:select 字段* from 表A 别名 INNER(可以省略) JOIN 表B 别名 ON 消除笛卡尔积的连接条件

案例:根据教师id查询学生对应的选课老师

select st.*,th.* from student st inner join teacher th on st.teacher_id = th.id;

select st.*,th.* from student st join teacher th on st.teacher_id = th.id;(inner 可以省略)

2.2等值连接

等值连接的最大的特点就是:条件是等量关系,SQL99(最常用)。

等值连接语法
select 字段* from 表1 INNER(可以省略) JOIN 表2 ON 消除笛卡尔积的连接条件A=B

案例:根据教师id查询学生对应的选课老师

select st.*,th.* from student st join teacher th on st.teacher_id = th.id;

2.3非等值连接

非等值连接的最大的特点就是:条件不是是等量关系,SQL99(最常用)。

非等值连接语法
select 字段* from 表1 INNER(可以省略) JOIN 表2 ON 消除笛卡尔积的连接条件

案例:查询教师id在4-6之间所教的学生和老师信息
select st.*,th.* from student st jointeacher th on st.teacher_id = th.id and th.id between 4 and 6;

2.4自连接

自连接的最大的特点:就是一张表看做两张表,自己连接自己

实质就是等值连接,只不过是连接表本身。

案例:查询学生id和教师id相同的学生
select s.*,st.teacher_id from student s,student st where s.id = st.teacher_id;

3外连接

外连接又分为左外连接、右外连接、全连接

左外连接(LEFT OUTER JOIN),简称左连接(LEFT JOIN)

右外连接(RIGHT OUTER JOIN),简称右连接(RIGHT JOIN)

全外连接(FULL OUTER JOIN),简称全连接(FULL JOIN)

student 表中插入两条语句,teacher_id的 13和 15在teacher中是不存在的。
INSERT INTO `cqyddx`.`student`(`id`, `name`, `age`, `teacher_id`) VALUES (10, ‘夏雨’, 21,13);
INSERT INTO `cqyddx`.`student`(`id`, `name`, `age`, `teacher_id`) VALUES (11, ‘冬雪’, 22,15);

插入 teacher 表三条语句,id分别为
INSERT INTO `cqyddx`.`teacher`(`id`, `name`, `age`, `class_id`) VALUES (7, ‘付霞’, 34, 4);
INSERT INTO `cqyddx`.`teacher`(`id`, `name`, `age`, `class_id`) VALUES (8, ‘郝仁’, 33, 5);
INSERT INTO `cqyddx`.`teacher`(`id`, `name`, `age`, `class_id`) VALUES (9, ‘赵刚’, 35, 7);

3.1左外连接:

左外连接:left join 或 leftoutrer join (outer可以省略)

左外连接:左边的是主表,左表数据全部显示,右表显示符合ON后的条件的数据,不符合的用NULL代替。

select * from student st left join teacher th on st.teacher_id = th.id;(outer可以省略)

通过查询结果发现,左外连接查询的是 左表独有的数据 加上 两表共有的数据

左外特殊情况:返回没有匹配的记录

案例:查询没有教师的学生信息

select * from student st left join teacher th on st.teacher_id = th.id where th.id is null;

通过查询发现,左连接查询的为左表独有的数据。

3.2右外连接:

右外连接:right join 或 right outrer join (outer可以省略)

右外连接:右边边的是主表,右边表数据全部显示,左边表显示符合ON后的条件的数据,不符合的用NULL代替。

select * from student st right join teacher th on st.teacher_id = th.id;(outer可以省略)

通过结果发现,右外连接查询的是 右表独有的数据 加上 两表共有的数据

右外特殊情况:返回没有匹配的记录

案例:查询没有学生的教师信息

select * from student st right join teacher th on st.teacher_id = th.id where st.teacher_id is null;

通过查询发现,右连接查询的为右表独有的数据。

3.3全外连接

全外连接:full join或 full outer join(outer可以省略),但Mysql不支持,可以使用union组合并去重实现。
简单理解

全外接查询:就是 左表独有的数据 加上 右表独有的数据

select * from student stleft join teacher thon st.teacher_id = th.id where th.id is null
union
select * from student stright join teacher thon st.teacher_id = th.id where st.teacher_id is null

3.4全连接

全连接:full join或 full outer join(outer可以省略),但Mysql不支持,可以使用union组合并去重实现。

简单理解

全连接查询的是 左表所有的数据加上 右表所有的数据并去重。


select * from student st left join teacher th on st.teacher_id = th.id
union
select * from student st right join teacher th on st.teacher_id = th.id

**总结:**mysql存在七种连接,分别是内连接、左外连接、左外连接特殊情况、右外连接、右外连接特殊情况、全连接、全外连接。总结在一起就是内连接、左外连接、右外连接、全外连接。

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql中的七种常用查询连接详解 的相关文章

  • 我不断收到此 mysql 错误代码 #1089

    CREATE TABLE movies movie movie id INT 3 NULL AUTO INCREMENT movie name VARCHAR 25 NULL movie embedded id VARCHAR 50 NUL
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • Magento - 无法重新索引产品价格 - 外键约束失败

    我最近刚刚将我的 magento 商店从 1 4 2 升级到 1 7 0 2 升级进行得很顺利 但是当我尝试在升级后重新索引数据时 产品价格失败了 我尝试过使用php shell indexer php reindexall来自 SSH 它
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • MySQL - 查找接近的匹配项

    MySQL 有没有办法在文本字段中找到紧密匹配的内容 说找到 email protected cdn cgi l email protection当搜索时 email protected cdn cgi l email protection
  • MySQL 薛定谔表:存在,但不存在

    我遇到了最奇怪的错误 有时 在创建或更改表时 我会收到 表已存在 错误 但是 DROP TABLE 返回 1051 未知表 所以我得到了一个无法创建 无法删除的表 当我尝试删除数据库时 mysql 崩溃了 有时它有助于创建另一个具有不同名称
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 如何关闭整个数据库的区分大小写

    我创建了一个包含许多脚本和许多存储过程的数据库 在这个数据库中 我们没有注意担心区分大小写 因为它对于我的本地开发计算机来说是关闭的 综上所述 我试图弄清楚如何使以下两条语句返回相同的结果 SELECT FROM companies SEL
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID
  • 如何编写一个 SQL 查询来计算每月和每年的行数?

    有谁知道如何查询 vbulletin 数据库来生成每月 每年注册数量的报告 以获得如下结果 MM YYYY Count 01 2001 10 02 2001 12 感谢下面的这些答案 我的最终版本有效如下 SELECT COUNT as R
  • mysqli_num_rows 无法正常工作

    I have an admin panel in my website in which the admin creates new pages he provides the page name and then the spaces o
  • 节点js(获取连接)

    var nodePort 3030 var express require express var app express var bodyParser require body parser var db require mysql va
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • MySQL分层存储:搜索所有父母/祖父母等。给定子节点 id 的节点?

    我使用分层模型存储类别 如下所示 CATEGORIES id parent id name 1 0 Cars 2 0 Planes 3 1 Hatchbacks 4 1 Convertibles 5 2 Jets 6 3 Peugeot 7
  • 如何在 kubernetes 上使多个 pod 相互通信

    我是 Kubernetes 新手 我正在尝试通过 microk8s 将应用程序部署到 Kubernetes 该应用程序包含Python Flask后端 Angular前端 Redis和MySQL数据库 我将映像部署在多个 Pod 中 状态显
  • 性能 多次插入或多值单次插入

    从性能角度 时间和服务器负载 来看 最好是进行多个插入或单个插入多个值 我在 stackoverflow 上发现每次插入最多可以有 1000 个值集 我说的是两种情况 要插入大约 1000 3000 个值 有时我会在 mySQL 数据库中插
  • 使用整数数组设置外键

    我对使用 SQL 还很陌生 但我在 Stack Overflow 上遇到过这个关于使用标签的问题 推荐用于标记或标记的 SQL 数据库设计 https stackoverflow com questions 20856 recommende
  • InnoDB:使用事务批量插入或组合多个查询?

    做批量的时候INSERT在InnoDB中 我应该使用事务吗 START TRANSACTION INSERT INTO tbl name a b c VALUES 1 2 3 INSERT INTO tbl name a b c VALUE

随机推荐

  • UE4 UI实现环形进度条效果

    实现步骤 1 制作材质 2 创建材质实例 BGColor 改变背景颜色 ExtenalDensity 改变外圆边缘硬度 值越大越清晰 反之模糊 InternalDensity 改变内圆边缘硬度 percent 控制进度条百分比 StartA
  • 【云原生之kubernetes实战】在k8s环境下使用helm部署homer静态主页

    云原生之kubernetes实战 在k8s环境下使用helm部署homer静态主页 一 homer介绍 1 1 homer简介 1 2 homer特点 二 本次实践介绍 2 1 本次实践简介 2 2 本次环境规划 三 检查k8s环境 3 1
  • Expression tree

    表达树在NHibernate的映射中有重要应用 在Linq中也有非常重要的应用 就像CLR的GC一样需要多多体会与应用
  • 将图像上雨水去除的四种主流方法

    http blog csdn net whyymlm article details 76999469 对图片或者视频进行去噪的研究一直以来都是计算机视觉和图像处理领域内的一个重要课题 在现实生活中 因为雨雪会对道路上的路况造成一定程度的遮
  • 程序员兼职接私活平台大全,兼职也能月薪上万

    前言 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 CSDN大礼包 python兼职资源 全套学习资料 免费分享 安全链接 放心点击 根据我们的经验 程序员兼职主要分为三种 兼职职位众包 项目整包和自由职业者驻场 我
  • C++14变量模板

    如果对模板或者C 标准感兴趣的开发者们相信都不会对变量模板感到陌生 我们今天就讲一讲变量模板 从C 14 开始 变量也可以被某种类型参数化 称为变量模板 例如可以通过下面的代码定义pi 但是参数化了其类型 template
  • Kaggle竞赛题目之——Digit Recognizer

    Classify handwritten digits using the famous MNIST data This competition is the first in a series of tutorial competitio
  • 代码随想录刷题笔记3

    文章目录 回溯 细节 模板 题型 组合 分割 子集 排列 棋盘问题 N皇后问题 解数独问题 其他 总结 回溯 本质上 穷举 剪枝 回溯法就是解决这种k层for循环嵌套的问题 for循环横向遍历 递归纵向遍历 回溯不断调整结果集 注意画出 解
  • JavaScript闭包

    h2 span style font weight normal background color rgb 192 192 192 span style font size 18px 1 什么是闭包 span span h2 h4 span
  • RabbitMQ--基础--8.2--消息确认机制--发布确认机制

    RabbitMQ 基础 8 2 消息确认机制 发布确认机制 代码位置 https gitee com DanShenGuiZu learnDemo tree master rabbitMq learn rabbitMq 03 1 发布确认原
  • 空间相关分析(二) 全局莫兰指数的理解与计算

    在了解空间权重矩阵的相关知识后 再展开对空间相关分析的学习就会变得轻松许多 而在空间相关分析中 全局相关分析和局部相关分析是比较常用的两个方法 今天 就来分享一下全局相关分析的有关知识 目录 一 公式说明 二 深入理解 三 Moran I指
  • 投资理财笔记——以贴现的方式看待基金

    文章目录 DDM DCF 避免空中楼阁 DDM 关于DDM的相关知识 我在股票价值分析中写过 DDM模型认为股票价值决定于分红而不是未来的股价 而在基金购买中 我认为不可以盲目崇拜于分红 也就是基金的累计净值和净值之差 因为分红势必会出售部
  • Relational Learning with Gated and Attentive Neighbor Aggregator for Few-Shot Knowledge Graph Comple...

    小样本知识图补全 关系学习 利用三元组的邻域信息 提升模型的关系表示学习 来实现小样本的链接预测 主要应用的思想和模型包括 GAT TransH SLTM Model Agnostic Meta Learning MAML 论文地址 htt
  • Java8新特性

    可以利用 List 的 sort 方法进行排序 Comparator comparing 可以指定排序字段 thenComparing 可以继续指定其他的排序字段 默认使用正序排列 如果想倒序可以使用 Comparator reverseO
  • 人工智能与营销新纪元 2023 AI+

    人工智能是什么 有望飞跃式提升营销生产力的变革力量 人工智能是研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术及应用系统的一门新的 技术科学 是计算机科学的一个分支 它企图了解智能的实质 并生产出一种新的能以人类智能相 似的方式做出
  • macOS和谐安装Office 2021

    声明 和谐 PJ 安装Office 2021 仅用于学习研究使用 不能作为办公用途 本人概不负法律责任 简介 Microsoft Office 2021是Microsoft推出的办公软件 2021年10月5日 Office 2021 for
  • This call to matplotlib.use() has no effect because the backend has alreadybeen chosen

    遇到这个咋办 方法 将 matplotlib use Agg 改为 plt switch backend agg 大吉大利
  • AF_XDP socket 测试

    本篇是之前博客 1 的进阶篇 博客中给出了相关环境安装配置 功能 本篇通过bpf程序 将icmp数据包重定向到AF XDP socket 内核侧程序片断 xdpsock kern c SPDX License Identifier GPL
  • 如何在windows电脑端添加本地环回网卡loopback网络适配器

    电脑端添加本地环回网卡loopback网络适配器 在使用vmware workstation虚拟机或ENSP等网络模拟器等工具时 经常需要绑定多个电脑网卡来进行实验 但电脑中物理网卡有限 此时可通过添加本地环回网卡来解决相关问题 1 桌面单
  • Mysql中的七种常用查询连接详解

    目录 一 概述 二 连接查询的分类 三 七种常用连接查询详解 1 笛卡尔积 2 内连接 2 1隐式与显式连接 2 2等值连接 2 3非等值连接 2 4自连接 3外连接 3 1左外连接 3 2右外连接 3 3全外连接 一 概述 在实际开发中