当前位置: 首页 > news >正文

【sql】MySQL中的 JOIN 操作

基础概念

在了解 JOIN 之前,我们先来清晰地界定一些关键的基础概念:

  • 表(Table):在数据库中,它是用于存储数据的结构化单元,恰似一个个分类存放数据的容器。例如,我们设有一个被称为“学生信息表”的表,专门用于收纳学生的各类相关数据。
  • 字段(Field):表中的一列,其作用是存储特定类型的数据,如同容器里的一个个专属格子,每个格子都有其特定的用途。好比在“学生信息表”中,可能存在“姓名”字段用以存放学生的名字,“年龄”字段用于记录学生的岁数等。
  • 记录(Record):表中的一行,代表着单个的数据项,如同容器里的一个具体物件。例如在“学生信息表”中的一行记录或许代表着一个具体学生的姓名、年龄、性别等详尽信息。

示例表

假设我们存在以下两张表:

学生表(students)

学号(student_id)姓名(student_name)
1张三
2李四
3王五

成绩表(scores)

学号(student_id)课程(course)分数(score)
1数学90
2语文85

内连接(INNER JOIN)

内连接仅仅返回两个表中相互匹配的行。

SELECT *
FROM students
INNER JOIN scores
ON students.student_id = scores.student_id;

解释:内连接会依据指定的连接条件,即学生表的学号与成绩表的学号相同,来筛选出同时存在于两个表中的行。唯有当两个表中的学号相互匹配时,对应的行才会被选取出来并组成结果集。因此这里学号为3的就不会被选取出来。就是说不匹配的行不会显示

结果表

学号(student_id)姓名(student_name)学号(student_id)课程(course)分数(score)
1张三1数学90
2李四2语文85

外连接(OUTER JOIN)

外连接可分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)
外连接会显示主表的所有行,即使另一张表中没有匹配的行,这些行也会被包含在结果集中。

  • 左外连接(LEFT JOIN)

SELECT *
FROM students
LEFT JOIN scores
ON students.student_id = scores.student_id;

解释:左外连接以左表(此处为 students 表)为主,会返回左表中的所有行。即便在右表(scores 表)中不存在与之匹配的学号,左表中的行依然会被包含在结果集中,只不过对应右表的列值会显示为 NULL 。

结果表

学号(student_id)姓名(student_name)学号(student_id)课程(course)分数(score)
1张三1数学90
2李四2语文85
3王五NULLNULLNULL
  • 右外连接(RIGHT JOIN)

SELECT *
FROM students
RIGHT JOIN scores
ON students.student_id = scores.student_id;

解释:右外连接以右表(此处为 scores 表)为主,会返回右表中的所有行。倘若左表(students 表)中不存在与之匹配的学号,左表的列值则会显示为 NULL 。

结果表

学号(student_id)姓名(student_name)学号(student_id)课程(course)分数(score)
1张三1数学90
2李四2语文85

右外链接和左外连接可以通过交换左右表来达到同样的效果。

  • 全外连接(FULL OUTER JOIN)

全外连接会返回两个表中的所有行,若没有匹配项则为 NULL 。

SELECT *
FROM students
FULL OUTER JOIN scores
ON students.student_id = scores.student_id;

解释:全外连接会同时涵盖左外连接和右外连接的结果,也就是说,无论左表还是右表中的行,都会出现在结果集中。假如某一行在另一个表中没有匹配项,相应的列值将显示为 NULL 。

结果表

学号(student_id)姓名(student_name)学号(student_id)课程(course)分数(score)
1张三1数学90
2李四2语文85
3王五NULLNULLNULL

交叉连接(CROSS JOIN)

交叉连接会返回两个表的笛卡尔积,也就是每个表中的每一行都与另一个表中的每一行相连接。一般来说这个操作没有必要,除非你真的需要生成一个笛卡尔积。

SELECT *
FROM students
CROSS JOIN scores;

解释:交叉连接会生成两个表中行的所有可能组合。这意味着,如果学生表有 m 行,成绩表有 n 行,那么交叉连接的结果集将包含 m×n 行。

结果表

学号(student_id)姓名(student_name)学号(student_id)课程(course)分数(score)
1张三1数学90
1张三2语文85
2李四1数学90
2李四2语文85
3王五1数学90
3王五2语文85

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • react-redux的使用
  • Java编程中接口与实现分离的七种关键技术和设计模式
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
  • plantUML介绍和使用
  • python:画由两条抛物线所围成的图形
  • Vue 3 深入指南:`watch` 属性监控与响应式处理
  • 深入理解java web分层架构的高内聚低耦合
  • 力扣热题100_二分查找_74_搜索二维矩阵
  • WPF学习(8) --Windows API函数的使用
  • SSM环保知识普及平台—计算机毕业设计源码20330
  • JavaScript AI 编程助手
  • 回顾 | 瑞云科技亮相ICIC2024,虚拟仿真实训云平台引关注
  • 下载文件--后端返回文件数据,前端怎么下载呢
  • 论文阅读笔记:The Graph Neural Network Model
  • 微信小程序电话号码授权
  • css的样式优先级
  • Effective Java 笔记(一)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js中的正则表达式入门
  • Markdown 语法简单说明
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Terraform入门 - 1. 安装Terraform
  • 两列自适应布局方案整理
  • 时间复杂度与空间复杂度分析
  • 因为阿里,他们成了“杭漂”
  • gunicorn工作原理
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 数据库巡检项
  • ​520就是要宠粉,你的心头书我买单
  • #WEB前端(HTML属性)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (编译到47%失败)to be deleted
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (六)Hibernate的二级缓存
  • (六)vue-router+UI组件库
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十八)三元表达式和列表解析
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (算法)硬币问题
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .gitignore文件—git忽略文件
  • .Mobi域名介绍
  • .NET C# 配置 Options
  • .net core控制台应用程序初识
  • .net web项目 调用webService
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • /bin/rm: 参数列表过长"的解决办法
  • @Transient注解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [1]-基于图搜索的路径规划基础