MySQL多表查询内连接外连接详解,join、left join、right join、full join的使用

news2024/12/24 8:18:03

目录

1、多表查询概览

1.1、分类

1.2、外连接的分类

1.3、常用的SQL语法标准

2、内外联接案例

2.1、初始化表

2.2、内连接

2.3、外连接案例

2.4、全连接案例

2.5、union和union all

2.6、实现MySQL全连接

2.7、内外连接面试基础

2.8、SQL99多表查询新特性


1、多表查询概览

1.1、分类

可以根据3个角度进行分类:

角度1:是否使用"="符号

  • 等值接连:where条件中,表字段与表字段直接使用等于符号("=")进行判断
  • 非等值连接:where条件中,表字段与表字段使用非"="符号,如:<=(小于等于)、>=(大于等于)、between and等等。

角度2:连接表的数量是否大于1

  • 自连接:一张表直接的关联查询,自己表连接自己进行查询,如菜单表查子级
  • 非自连接:多表关联查询

角度3:多表关联时,是否查询有关联的数据

  • 内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
  • 外连接:合并具有同一列的两个以上的表的行,结果集中包含一个表与另一个表匹配的行之外,还包含了左表 或 右表不匹配的行

1.2、外连接的分类

  • 左外连接(left outer join,可缩写为left  join):两个表连接过程中,除了返回满足条件的行以外,还会返回左表中不满足条件的行,这种连接称为左连接
  • 右外连接(right outer join,可缩写为right join):两个表连接过程中,除了返回满足条件的行以外,还会返回右表中不满足条件的行,这种连接称为右连接
  • 全连接(full outer join,可缩写为full  join):又称为"满外连接",两个表连接过程中,返回两表直接的所有数据,这种连接称为全连接

1.3、常用的SQL语法标准

  • SQL92:1992发布的是数据库的一个ANSI/ISO标准(偶尔使用)
  • SQL99:1999发布的是数据库的一个ANSI/ISO标准(现在开发中主流标准)
  1. ANSI:美国国家标准学会
  2. ISO:国际标准化组织

2、内外联接案例

2.1、初始化表

<1>学生表:student

create table if not exists taobao.student
(
	id int auto_increment primary key,
	name varchar(50) null,
	classid int null,
	age int null
)
comment '学生表';

INSERT INTO student (id, name, classid, age) VALUES (1, '张三', 1, 18);
INSERT INTO student (id, name, classid, age) VALUES (2, '李四', 1, 18);
INSERT INTO student (id, name, classid, age) VALUES (3, '王五', 2, 17);
INSERT INTO student (id, name, classid, age) VALUES (4, '老六', 2, 18);
INSERT INTO student (id, name, classid, age) VALUES (5, '七七', null, 17);
INSERT INTO student (id, name, classid, age) VALUES (6, '二流子', null, 19);
INSERT INTO student (id, name, classid, age) VALUES (7, '巴哥', null, 18);
  • 数据如图所示:

 <2>班级表:classinfo

create table if not exists taobao.classinfo
(
	classid int auto_increment primary key,
	name varchar(100) null
)
comment '班级表';

INSERT INTO classinfo (name) VALUES ('高一1班');
INSERT INTO classinfo (name) VALUES ('高一2班');
INSERT INTO classinfo (name) VALUES ('高一3班');

2.2、内连接

需求:查询已分配的学生信息,如:学生基本信息,所在班级名称

<1>SQL92内连接写法:

select
    t1.id       -- 学生ID
    ,t1.name    -- 学生姓名
    ,t1.age     -- 学生年龄
    ,t2.name    -- 班级名称
from student t1,classinfo t2
where t1.classid=t2.classid

<2>SQL99内连接写法:

select
    t1.id       -- 学生ID
    ,t1.name    -- 学生姓名
    ,t1.age     -- 学生年龄
    ,t2.name    -- 班级名称
from student t1
join classinfo t2
on t1.classid=t2.classid

结果:

2.3、外连接案例

需求:查询所有的学生信息,并查出学生所对应的班级名称

【注意:多表查询时,当查询一个表所有数据,该查询语句一定是外连接】

 <1>SQL92外连接写法:

注意:

  • 这种写法MySQL不支持,但在Oracle中支持
  • 在不需要查询表中所有数据的那张表后,添加”(+)”,表示外连接(理解为这个表只是附加的)

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1,classinfo t2
where t1.classid=t2.classid(+)

<2>SQL99外连接写法:

左连接写法:

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1
left join classinfo t2    --注意:left join是缩写,也可以写为:left outer join
on t1.classid=t2.classid

右连接写法:

select
    t2.id       -- 学生ID
    ,t2.name    -- 学生姓名
    ,t2.age     -- 学生年龄
    ,t1.name    -- 班级名称
from classinfo t1
right join student t2
on t1.classid=t2.classid

 结果:

2.4、全连接案例

需求:查询学生表中的所有信息,并关联班级表信息及显示未关联的班级表信息

  • 在SQL92中,并不直接支持全连接语法

SQL99全连接写法(Oracle):

关键字:full join ... on ... 或者 full outer join ... on ...

注意:MySQL不支持全连接,但是Oracle支持

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1
full join classinfo t2
on t1.classid=t2.classid

MySQL实现全连接,需要使用关键字"union"或者"union all"

2.5、union和union all

union:联合、合并的意思

  • union:对两个查询的结果集,进行合并操作,会对重复的数据进行去重,同时进行默认规则(主键升序)的排序(因此效率比较低)。

  • union all:对两个查询的结果集,进行合并操作,不对数据进行去重,也不进行排序,直接把两个结果进行合并(效率高)。

例如:我们把学生表查询两次,并使用union或union all进行合并

<1>union 语句

select * from student
union   -- 会进行去重操作
select * from student

结果:

 <2>union  all 语句

select * from student
union all  -- 不去重
select * from student

结果:

注意:

  •  union和union all使用时,select下的字段数量必须一致,否则会报错

2.6、实现MySQL全连接

需求:查询学生表中的所有信息,并关联班级表信息及显示未关联的班级表信息

实现方式有多种,这里我使用:

  1. 首先查询出学生表所有信息并显示对应的班级表信息
  2. 其次查询班级表中,classid不在学生表中的数据
  3. 把上述结果使用union all合并

代码如下:

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1
left join classinfo t2    -- 注意:left join是缩写,也可以写为:left outer join
on t1.classid=t2.classid
union all
select
    null        -- null:这里设置为null,只是为了与上一个select的结果行字段(数量)进行匹配,以下2个null作用一样
    ,null
    ,null
    ,t1.name
from classinfo t1
where t1.classid not in (
    select
        distinct classid    -- distinct表示去重
    from student t2 where t2.classid is not null
    )

结果:

2.7、内外连接面试基础

 上述图对应7种多表查询,是面试及实际开发中,必会的操作,这里就不多言了

  • A:看作是学生表
  • B:看作是班级表

注意:当关联表的数量超过3个时,禁止使用join,因为一个join相当于一个for性能会很差


2.8、SQL99多表查询新特性

<1>natural  join

  •  自然连接:就是等值(内)连接,会自动查询两张连接表中所有相同的字段,然后进行等值连接

如:上面的内连接SQL为:

select
    t1.id       -- 学生ID
    ,t1.name    -- 学生姓名
    ,t1.age     -- 学生年龄
    ,t2.name    -- 班级名称
from student t1
join classinfo t2
on t1.classid=t2.classid

使用natural  join进行改造,如下:

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1
natural join classinfo t2    --自然连接

结果:

查询到了0条数据,这是因为:

  • natural  join 关联多张表时,会自动根据表中相同的字段名称去匹配
  • 上述student表中classid(班级编号)、name(学生姓名)与classinfo表中的 classid(班级编号)、name(班级名称)是一样的字段,而班级名称不可能与学生姓名相等,所以查询不到数据

也就是上述的自然连接,转义为内连接的SQL为:

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1
join classinfo t2
on t1.classid=t2.classid
and t1.name = t2.name    -- 这个条件也被自然连接附带上了

因此,使用natural join的前提条件就是:

  1. 多表关联时,关联字段名称必须相同
  2. 不进行关联的字段名称必须不相同

综上:在实际开发中,我们应当避免使用natural  join,造成表与表之间的耦合较高

<2>using

  • 等值条件的一种优化写法

语法:

  • using(多表关联的字段名称)

前提:

  • 多表关联时,关联字段的名称必须相同
  • 注意:这种写法公司一般不给使用,当某个字段改名时,很难定位错误

如:上面的内连接SQL为:

select
    t1.id       -- 学生ID
    ,t1.name    -- 学生姓名
    ,t1.age     -- 学生年龄
    ,t2.name    -- 班级名称
from student t1
join classinfo t2
on t1.classid=t2.classid

使用using:

select
    t1.id       -- 学生ID
     ,t1.name    -- 学生姓名
     ,t1.age     -- 学生年龄
     ,t2.name    -- 班级名称
from student t1
join classinfo t2
using(classid)

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python入门项目:数据清洗

文章目录前言一、数据清洗是什么&#xff1f;二、重复值处理三 缺失值处理四、数据类型转换前言 本文是对数据清洗的简单学习。 本文使用的数据来源为&#xff1a;博雅读书社所提供的数据 一、数据清洗是什么&#xff1f; 数据清洗是指在数据分析或挖掘之前进行的&#xff0…

Linux Shell 实现一键部署Rabbitmq

rabbitmq 前言 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代…

2023年企业选择云服务器配置方法教程

这篇文章主要介绍企业选择腾讯云CVM云服务器配置方法教程。现在随着互联网信息的飞速发展&#xff0c;任何企业都脱离不了互联网&#xff0c;越来越多的企业都通过互联网实施无纸化的办公&#xff0c;互联网推广一体化整体型推广、互联网电子商务。中小型企业网站如何选购云服务…

又一款 AI 应用开源了,让你的绘画作品动起来!

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01;2021 年的时候&#xff0c;Meta&#xff08;前身是 Facebook&#xff09;团队发布了一款非常有趣的 AI 工具&#xff0c;叫 Animated Drawings&#xff0c;它的牛逼之处&#xff0c;在于能借…

解锁ERD Online 高级隐藏功能

ERD Online 是全球第一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL 查询等功能&#xff0c;辅以版本、导入、导出、数据源、SQL 解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 ERD Online 产品图鉴 ERD …

使用DVSSL证书的钓鱼网站正在增加,如何识别钓鱼网站?

信息安全是一个庞大的领域&#xff0c;其中涉及到很多知识点&#xff0c;但是大多公司都对其没有提及足够的重视&#xff0c;希望随着国内对于安全的越来越重视以及各大主流浏览器对http网站的不友好&#xff0c;更多的公司也能在信息安全领域投入越来越多的注意。 然而&#…

C++IO流

目录 1. C语言的输入与输出 2. 流是什么 3. CIO流 3.1 C标准IO流 3.2 C文件IO流 4.stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据&#xff0c;并将值存放在变量中…

vs中的错误集合

记录在vs 中遇到的 各种错误 1&#xff1a;project.vcxproj.filters 文件出现了异常&#xff0c;发现了以前的解决方案下的筛选器竟然没有了 原因&#xff1a;合并svn的时候 .vcxproj.filters 文件出现了 合并错误(检查该文件里面是否有不一样的) 解决办法&#xff1a;解决 该文…

Centos 7 上安装 Kubernetes 1.27 集群

Centos 7 上安装 Kubernetes 1.27 集群0. 安装 "Development Tools"1. 禁用swap2. 禁用防火墙3. 将SELinux设置为permissive模式4. 安装 ipset 和 ipvsadm5. 添加网桥过滤及内核转发配置文件6. 加载 overlay、br_netfilter、ip_tables、iptable_filter 模块7. 安装 c…

js调用gpt3.5(支持流回显、高频功能)

参考链接&#xff1a;直接在前端调用 GPT-3 API 效果图&#xff1a; 查看在线demo(要梯子) 注意&#xff1a; 1. 需要apiKey&#xff0c;自用安全&#xff0c;不要给别人 2. 需要梯子 3. 选择稳定、人少的代理ip 4. 不要频繁切换ip&#xff0c;防止封号 5. api调用上限高&…

李宏毅2023机器学习作业HW03解析和代码分享

ML2023Spring - HW3 相关信息&#xff1a; 课程主页 课程视频 Kaggle link Sample code HW03 视频 HW03 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. 即便 kaggle 上的时间已经截止&#xff0c;你仍然可以在上面提交和查看分数。但需要注意的是&#xff1a;在 kaggle…

SpringAOP入门基础银行转账实例------------事务处理

SpringAOP入门基础银行转账实例------------事务处理 AOP为Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP编程思想 AOP面向切面是一种编程思想&#xff0c;是oop的延…

Python 字符串format()格式化 / 索引

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 为了确保字符串按预期显示&#xff0c;我们可以使用 format() 方法对结果进行格式化。 字符串 format() format() 方法允许您格式化字符串的选定部分。 有时文本的一部分是你无法控制的&#xff0c;也许它们来自数据库或…

更深度了解getchar和putchar现象

目录 前言&#xff1a; 1.getchar和putchar 1.1基本使用 1.2一些特殊打印 1.3putchar打印空格 2.深度了解现象 前言&#xff1a; 经过学习&#xff0c;总结getchar()函数和putchar()函数在搭配使用while循环的时候&#xff0c;控制台窗口光标位置的出现位置的由来。 1.…

JavaSE学习进阶day04_03 包装类

第五章 包装类&#xff08;重点&#xff09; 5.1 概述 Java提供了两个类型系统&#xff0c;基本类型与引用类型&#xff0c;使用基本类型在于效率&#xff0c;然而很多情况&#xff0c;会创建对象使用&#xff0c;因为对象可以做更多的功能&#xff0c;如果想要我们的基本类型…

蓝桥杯15单片机--超声波模块

目录 一、超声波工作原理 二、超声波电路图 三、程序设计 1-设计思路 2-具体实现 四、程序源码 一、超声波工作原理 超声波时间差测距原理超声波发射器向某一方向发射超声波&#xff0c;在发射时刻的同时开始计时&#xff0c;超声波在空气中传播&#xff0c;途中碰到障碍…

计算属性,watch和watchEffect

计算属性-computed 什么是计算属性&#xff1a; computed函数&#xff0c;是用来定义计算属性的&#xff0c;计算属性不能修改。 模板内的表达式非常便利&#xff0c;但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。 计算属性还可以依…

【目标检测论文阅读笔记】Extended Feature Pyramid Network for Small Object Detection

&#xff08;未找到代码&#xff0c;只有yaml文件&#xff09; Abstract. 小目标检测仍然是一个未解决的挑战&#xff0c;因为很难提取只有几个像素的小物体的信息。虽然特征金字塔网络中的尺度级对应检测缓解了这个问题&#xff0c;但我们发现各种尺度的特征耦合仍然会损害小…

百度飞桨paddlespeech实现小程序实时语音流识别

前言&#xff1a; 哈哈&#xff0c;这是我2023年4月份的公司作业。如果仅仅是简单的语音识别倒也没什么难度&#xff0c;wav文件直接走模型输出结果的事。可是注意标题&#xff0c;流式识别、实时&#xff01; 那么不得不说一下流式的优点了。 1、解决内存溢出的烦恼。 2、…

《论文阅读》Unified Named Entity Recognition as Word-Word Relation Classification

总结 将NER视作是word-word间的 Relation Classification。 这个word-word 间的工作就很像是TPlinker那个工作&#xff0c;那篇工作是使用token间的 link。推荐指数&#xff1a;★★★☆☆值得学习的点&#xff1a; &#xff08;1&#xff09;用关系抽取的方法做NER抽取 &…