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

解释什么是内连接、左连接和右连接,并给出每种连接的SQL示例

在关系型数据库中,连接(JOIN)是一种在查询中组合来自两个或多个表的行的方法。这些表通过一个或多个列中的相关值关联起来。SQL 提供了几种类型的连接,每种连接在处理表之间的关系和数据检索时都有其特定的方式。最常见的连接类型是内连接(INNER JOIN)、左连接(LEFT JOIN 或 LEFT OUTER JOIN)和右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)。

1. 内连接(INNER JOIN)

内连接返回两个表中满足连接条件的行。如果某行在一个表中没有匹配,则不会在结果集中出现。内连接是最常用的连接类型,因为它只返回那些在两个表中都有匹配项的行。

SQL 示例:

假设我们有两个表:employees 和 departments

employees 表:

employee_idemployee_namedepartment_id
1John Doe10
2Jane Smith20
3Bob Brown10
4Alice JohnsonNULL

departments 表:

department_iddepartment_name
10Sales
20Marketing
30HR

如果我们想要查询每个员工及其所在的部门,我们可以使用内连接:

 

sql复制代码

SELECT employees.employee_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

结果集:

employee_namedepartment_name
John DoeSales
Jane SmithMarketing
Bob BrownSales

注意:Alice Johnson 没有出现在结果集中,因为她在 employees 表中没有与 departments 表匹配的 department_id

2. 左连接(LEFT JOIN 或 LEFT OUTER JOIN)

左连接返回左表中的所有行,以及右表中满足连接条件的行。如果左表中的某行在右表中没有匹配项,则结果集中该行对应的右表部分将包含 NULL。左连接通常用于保留左表中的所有信息,即使右表中没有匹配项。

SQL 示例:

使用上面的 employees 和 departments 表,如果我们想要查询所有员工及其所在的部门(包括没有部门的员工),我们可以使用左连接:

 

sql复制代码

SELECT employees.employee_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

结果集:

employee_namedepartment_name
John DoeSales
Jane SmithMarketing
Bob BrownSales
Alice JohnsonNULL

注意:这次 Alice Johnson 出现在结果集中,但她的 department_name 是 NULL,因为她在 employees 表中没有与 departments 表匹配的 department_id

3. 右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)

右连接与左连接相反。它返回右表中的所有行,以及左表中满足连接条件的行。如果右表中的某行在左表中没有匹配项,则结果集中该行对应的左表部分将包含 NULL。右连接在某些数据库系统中不常用,因为可以通过调整表的位置并使用左连接来达到相同的效果。然而,了解它的工作原理仍然很重要,以便在阅读或编写SQL代码时能够理解它。

SQL 示例:

使用上面的 employees 和 departments 表,如果我们想要查询所有部门及其员工(包括没有员工的部门),我们可以使用右连接:

 

sql复制代码

SELECT employees.employee_name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

结果集:

employee_namedepartment_name
John DoeSales
Bob BrownSales
Jane SmithMarketing
NULLHR

注意:这次 HR 部门出现在结果集中,但它没有对应的员工名,因为 departments 表中的 HR 部门在 employees 表中没有匹配的 department_id。另外,请注意这个查询可以通过将 employees 和 departments 表的位置互换并使用左连接来得到相同的结果。然而,在某些情况下,使用右连接可能会使查询更加清晰或符合特定的逻辑结构。

相关文章:

  • day03_登录注销(前端接入登录,异常处理, 图片验证码,获取用户信息接口,退出功能)
  • 【pytorch矩阵应用】
  • 哈工大中文mistral介绍(Chinese-Mixtral-8x7B)
  • Redis实现滑动窗口限流
  • 微服务之qiankun主项目+子项目搭建
  • C++:封装
  • Pyglet综合应用|推箱子游戏之关卡图片载入内存
  • JMETER与它的组件们
  • 【C++】树形关联式容器set、multiset、map和multimap的介绍与使用
  • DAY12_VUE基本用法详细版
  • 深度学习--神经网络基础
  • 数仓项目6.0(二)数仓
  • 【Linux C | 网络编程】gethostbyname 函数详解及C语言例子
  • 人工智能与网络安全
  • Android 监听网络状态变化
  • Android 架构优化~MVP 架构改造
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CEF与代理
  • docker容器内的网络抓包
  • es6
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JS实现简单的MVC模式开发小游戏
  • Object.assign方法不能实现深复制
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 关于Java中分层中遇到的一些问题
  • 基于web的全景—— Pannellum小试
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊一聊前端的监控
  • 爬虫模拟登陆 SegmentFault
  • 探索 JS 中的模块化
  • 网络应用优化——时延与带宽
  • 携程小程序初体验
  • 学习ES6 变量的解构赋值
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​iOS安全加固方法及实现
  • #100天计划# 2013年9月29日
  • #13 yum、编译安装与sed命令的使用
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (笔试题)分解质因式
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)visual stdio 书签功能介绍
  • (转)平衡树
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)树状数组
  • **PHP分步表单提交思路(分页表单提交)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 6 redis操作类