深入理解 SQL 的 JOIN 查询:从基础到高级的第一步

article/2025/8/26 15:51:34

在处理数据库时,我们常常需要从多个表中提取数据。比如想知道一个城市的天气情况,同时又想知道这个城市的具体位置。这就需要将 weather 表和 cities 表结合起来查询。这种操作在 SQL 中被称为 JOIN 查询

现在看下两种表的情况

1.weather 表:

2.cities 表:

一.JOIN 查询的基础

现在有两个表:weather 和 cities。weather 表记录了不同城市的天气情况,而 cities 表记录了城市的名称和位置。

想找出所有城市的天气记录以及它们的位置,我们可以使用 JOIN 语句来连接两个表。语句如下:

select * from weather join cities on city = name;

也可以使用别名,在两个表有相同字段名称时来区别它们。

​​​​​​​

SELECT * FROM weather as w JOIN cities as c ON w.city = c.name;

上面语句的意思是:从 weather 表中取出每一行,然后在 cities 表中查找 name 列与 weather 表中的 city 列相匹配的行。如果找到匹配的行,就将这两行的内容组合在一起返回。

也可以按照要求查询特点字段。

​​​​​​​

SELECT w.id,w.city,w.prcp,c.location FROM weather as w JOIN cities as c ON w.city = c.name;

注意

    列名冲突:如果两个表中有同名列,需要使用表名来限定列名,例如 w.city 或 c.name。

    明确指定输出列:为了避免不必要的列重复,建议明确指定需要输出的列,而不是使用 SELECT *。

二.外连接(Outer Join)


在上面的例子中,西安 没有出现在结果中,因为 cities 表中没有 西安 的记录。如果希望即使没有匹配的行也能显示 weather 表中的记录,可以使用 外连接。

1.左外连接(LEFT OUTER JOIN)

左外连接会返回左表(weather)的所有行,即使右表(cities)中没有匹配的行。如果没有匹配的行,右表的列将显示为 NULL

​​​​​​​

select w.id,w.city,w.prcp , c.id,c.name,c.location from weather wleft outer join cities c -- 这里的 outer可以省略不写on w.city = c.name;

2.右外连接(RIGHT OUTER JOIN)

右外连接会返回右表(cities)的所有行,即使左表(weather)中没有匹配的行。

​​​​​​​

select w.id,w.city,w.prcp , c.id,c.name,c.location from weather wright join cities con w.city = c.name;

3.全外连接(FULL OUTER JOIN)

全外连接会返回左表和右表的所有行,无论是否有匹配的行。如果某一行在另一表中没有匹配的行,那么对应的列将显示为 NULL

​​​​​​​

select w.id,w.city,w.prcp , c.id,c.name,c.location from weather wfull outer join cities c  -- 这里的 outer可以省略不写on w.city = c.name;

外连接可以简单理解为 指向谁,以谁为主。

三.自连接(Self Join)

有时候,我们可能需要将一个表与自己连接起来。例如想找出杭州的温度范围在其他天气记录之内的天气记录数据。

语句如下:

​​​​​​​

SELECT distinct  w1.city,       w1.temp_low AS low,       w1.temp_high AS high,
      w2.city,       w2.temp_low AS low,       w2.temp_high AS highFROM weather w1JOIN weather w2ON w1.temp_low < w2.temp_low AND w1.temp_high > w2.temp_highwhere w1.city = '杭州';

在这个查询中,我们将 weather 表重新标记为 w1 和 w2,以便区分连接的左部和右部。

总结下:JOIN 查询是 SQL 中非常强大的工具,可以帮助我们从多个表中提取和组合数据。

通过使用不同的 JOIN 类型(如内连接、左外连接、右外连接和全外连接),我们可以灵活地处理各种数据组合需求。同时,自连接也为我们提供了处理复杂逻辑的手段。


http://www.hkcw.cn/article/fXUgHBceSO.shtml

相关文章

【无标题】C++23新特性:支持打印volatile指针

文章目录 前言背景与问题C23的解决方案实现原理使用场景硬件开发多线程调试 总结 前言 在C开发中&#xff0c;volatile关键字常用于修饰变量&#xff0c;以确保编译器不会对这些变量进行优化&#xff0c;从而保证程序能够正确地与硬件交互或处理多线程环境下的特殊变量。然而&…

RPG15.轻攻击

上一篇已经制作了装备和卸下武器 接下来开始做战斗系统 1.先添加Tag ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_EquipAxe);ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_UnEquipAxe); ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Play…

20250529-C#知识:继承、密封类、密封方法、重写

C#知识&#xff1a;继承、密封类、密封方法、重写 继承是面向对象的三大特性之一&#xff0c;通过继承能够减少重复代码的编写&#xff0c;有助于提升开发效率。 1、继承 C#不同于C&#xff0c;只支持单继承当子类出现与父类同名的成员时&#xff0c;父类成员被隐藏&#xff0…

第30次CCF计算机软件能力认证-1-重复局面

时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 下载题目目录&#xff08;样例文件&#xff09; 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 题目描述 国际象棋每一个局面可以用大小为 88…

【计算机网络】第2章:应用层—DNS

目录 一、PPT 二、总结 DNS&#xff08;域名系统&#xff09;详解 &#xff08;一&#xff09;DNS核心概念 &#xff08;二&#xff09;DNS查询过程&#xff08;重点❗&#xff09; &#xff08;三&#xff09;DNS资源记录&#xff08;RR&#xff09;类型…

[C]基础18.自定义类型:联合和枚举

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、联合体&#xff08;共用体&#xff09;1.1 联合体类型的声明1.2 联合体的特点1.3 联合体大小的计算1.4 联合体的应用场景1.5 联合体练习&#xff1a;判断机器字节序…

目标检测预测框置信度(Confidence Score)计算方式

预测框的置信度&#xff08;Confidence Score&#xff09;是目标检测模型输出的一个关键部分&#xff0c;它衡量了模型对一个预测框中包含特定类别对象的确定程度。 不同的目标检测模型&#xff08;如Faster R-CNN、SSD、YOLO、DETR等&#xff09;在计算置信度时有其特有的机制…

视觉分析开发范例:Puppeteer截图+计算机视觉动态定位

一、选型背景&#xff1a;传统爬虫已无力应对的视觉挑战 在现代互联网环境中&#xff0c;尤其是小红书、抖音、B站等视觉驱动型平台&#xff0c;传统基于 HTML 的爬虫已经难以满足精准数据采集需求&#xff1a; 内容加载由 JS 动态触发&#xff0c;难以直接解析 HTML&#xf…

Java 开发上门家政系统源码:全流程数字化管理,适配家政公司 / 个体户接单派单

家政服务订单管理混乱、人员调度低效、客户留存率低&#xff1f;基于 Java 开发的上门家政系统源码&#xff0c;凭借其强大的稳定性、灵活的扩展性和全流程数字化管理能力&#xff0c;为家政行业提供了一套高效、低成本的解决方案&#xff0c;实现从接单、派单到服务结算的全链…

java24

1.双列集合Map定义 collection和Map都自有contains方法 把实现类对象赋值给接口类对象属于多态的一种&#xff0c;但是这样不能使用实现类里面的特殊方法和重写方法 写好的API里面好像只有数组的打印值是地址值 2.Map遍历方式 Entry是Map接口里面的一个内部接口&#xff0c;所…

VSCode的下载与安装(2025亲测有效)

目录 0 前言1 下载2 安装3 后记 0 前言 丫的&#xff0c;谁懂啊&#xff0c;尝试了各种办法不行的话&#xff0c;我就不得不拿出我的最后绝招了&#xff0c;卸载&#xff0c;重新安装&#xff0c;我经常要重新安装&#xff0c;所以自己写了一个博客&#xff0c;给自己&#xf…

深入了解linux系统—— 库的制作和使用

什么是库&#xff1f; 库&#xff0c;简单来说就是现有的&#xff0c;成熟的代码&#xff1b; 就比如我们使用的C语言标准库&#xff0c;我们经常使用输入scanf和输出printf&#xff0c;都是库里面给我们实现好的&#xff0c;我们可以直接进行服用。 库呢又分为静态库和动态…

VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理

​一、软件介绍 文末提供程序和源码下载 VoltAgent 是一个开源 TypeScript 框架&#xff0c;用于构建和编排 AI 代理 二、什么是 VoltAgent&#xff1f; AI 代理框架提供了构建由自主代理提供支持的应用程序所需的基础结构和工具。这些代理通常由大型语言模型 &#xff08;&am…

弹性公网IP的五大核心优势解析

在云服务架构中&#xff0c;弹性公网IP&#xff08;EIP&#xff09;已成为现代企业网络部署的核心组件。与传统固定IP相比&#xff0c;它通过独特的技术机制解决了动态环境下的公网访问难题。以下五大核心优势决定了其不可替代的价值&#xff1a; 一、动态绑定的灵活性 弹性公…

分布式数据库备份实践

在分布式备份中可以采取两种方式进行备份&#xff0c;一种是采用手动编写backup.yml文件进行备份&#xff0c;另外一种是吧备份过程交给备份工具自动执行。如果需要个性化进行备份&#xff0c;建议采用手动编写备份文件方式进行备份。 以下是针对两种备份方式的实践&#xff1a…

社群分享:义乌|杭州电商|店群卖家,私域鱼塘运营的排单系统开源|私域鱼塘运营|返款软件开源

熟悉东哥的朋友都知道&#xff0c;我自己也运营一个电商社群&#xff0c;主要是针对玩私域|鱼塘的电商玩家。 在当前电商环境下&#xff0c;社群分享型电商、店群卖家及私域鱼塘运营者&#xff0c;面临着日益复杂的订单管理和客服调度问题。传统的人工处理不仅效率低…

一键提取Office内图片的工具

软件介绍 OfficeImagesExtractor是一款专门用于提取office文档里面图片的软件。 软件开发 这款软件是由吾爱大佬namejm专门开发的。 软件使用方法 该软件使用起来非常简单。用户只需要把文件拖入到软件里&#xff0c;再设置好保存目录即可。 支持文件格式 这款软件能提取的…

NVIDIA英伟达AI图片视频内容描述总结软件describe-anything整合包

和大家分享一个英伟达联合其他大学开发的一款应用describe-anything&#xff0c;该应用可以通过AI识别分析并详细描述图片视频中指定区域物体内容&#xff0c;我基于最新版制作了免安装一键启动整合包&#xff0c;下载链接在文章末尾。 describe-anything介绍 Describe Anythi…

农村土地承包经营权二轮延包—归户表

"作为二轮延包公示后的一个确认方式&#xff0c;归户表还是要写一下的。归户表跟摸底表很相似&#xff0c;编程方面&#xff0c;用到的python库&#xff0c;摸底表用py-docx多一些&#xff0c;归户表更多用的pywin32&#xff0c;py-docx对于word无依赖&#xff0c;所以摸底…

基于vue框架的独居老人上门护理小程序的设计r322q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,护理人员,服务预约,服务评价,服务类别,护理项目,请假记录 开题报告内容 基于Vue框架的独居老人上门护理小程序的设计开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着社会老龄化的加剧&#xff0c;独居老…