【SQL】掌握SQL查询技巧:高效数据整合与查询优化
目录
- 1. SQL 的基本构成
- 2. SQL 联接(JOIN)
- 2.1 内联接(INNER JOIN)
- 2.2 外联接(OUTER JOIN)
- 2.2.1 左外联接(LEFT JOIN)
- 2.2.2 右外联接(RIGHT JOIN)
- 2.2.3 全外联接(FULL JOIN)
- 2.3 自联接(SELF JOIN)
- 3. 联接(JOIN)示例
- 3.1 表结构
- 3.2 示例查询
- 3.2.1 INNER JOIN
- 3.2.2 LEFT JOIN
- 3.2.3 RIGHT JOIN
- 3.2.4 FULL JOIN
- 3.2.5 SELF JOIN
- 3.2.6 联接类型总结
- 4 实践中的最佳实践
- 5 注意事项
- 总结
在数据管理和分析中,SQL(结构化查询语言)是不可或缺的工具。它不仅可以从数据库中提取信息,还能进行复杂的数据处理和分析。本篇文章旨在介绍 SQL 的基本构成以及各类联接(JOIN)的应用,包括内联接(INNER JOIN)、外联接(OUTER JOIN)中的左外联接(LEFT JOIN)、右外联接(RIGHT JOIN)和全外联接(FULL JOIN),以及自联接(SELF JOIN)。通过图表、表结构和示例查询的详细说明,读者将能够深入理解和应用不同类型的联接来处理数据库中的数据关系。此外,我们还将探讨实践中的最佳实践与注意事项,以帮助用户更加高效地使用 SQL。
1. SQL 的基本构成
SQL 是一种用于操作关系型数据库的标准语言。通过 SQL,用户能够执行多种操作,包括创建、读取、更新和删除数据。作为一种强大的工具,SQL 允许用户以灵活和高效的方式对数据进行查询和分析。
SQL 语句通常由以下几个部分构成:
| 关键字 | 功能描述 |
|---|---|
| SELECT | 指定要查询的列 |
| FROM | 指定数据来源的表 |
| WHERE | 添加条件以过滤记录 |
| GROUP BY | 按指定列进行分组 |
| ORDER BY | 对结果进行排序 |
| JOIN | 在多个表之间进行联接 |
2. SQL 联接(JOIN)
联接是 SQL 中非常重要的概念,它允许我们从多个表中检索数据。根据联接的不同类型,以下是常见的SQL 联接类型及其详细描述:
| 联接类型 | 描述 |
|---|---|
| 内联接 (INNER JOIN) | 返回两个表中匹配的记录。 |
| 左联接 (LEFT JOIN 或 LEFT OUTER JOIN) | 返回左表中的所有记录,以及右表中匹配的记录,右表中没有匹配的记录则返回 NULL。 |
| 右联接 (RIGHT JOIN 或 RIGHT OUTER JOIN) | 返回右表中的所有记录,以及左表中匹配的记录,左表中没有匹配的记录则返回 NULL。 |
| 全联接 (FULL JOIN 或 FULL OUTER JOIN) | 返回两个表的所有记录,无论是否有匹配。只有在存在匹配时才显示数据;否则,显示 NULL。 |
| 自联接 (SELF JOIN) | 将表与自身进行联接,通常用于比较表中同一行或不同条件下的记录。 |
2.1 内联接(INNER JOIN)
内联接是最常用的联接方式,只返回两个表中满足联接条件,都有匹配记录的结果,是最常用的联接类型。。
示例:获取员工及其部门信息:
假设我们有两个表:employees(员工表)和 departments(部门表)。我们希望获取每位员工及其所在部门的信息:
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
解析:
-
SELECT e.employee_id, e.first_name, d.department_name:
- 从员工表中选择员工 ID 和名字,从部门表中选择部门名称。
-
FROM employees e:
- 指定主表为
employees,并给它一个别名e。
- 指定主表为
-
INNER JOIN departments d:
- 联接部门表
departments,并给它一个别名d。
- 联接部门表
-
ON e.department_id = d.department_id:
- 定义联接条件,指定员工表和部门表之间的关联字段。
应用场景:
这种查询适合生成员工与其部门对应的报告,便于公司了解员工的组织结构。
2.2 外联接(OUTER JOIN)
外联接包括左外联接(LEFT JOIN)、右外联接(RIGHT JOIN)和全外联接(FULL OUTER JOIN)。外联接会返回至少一张表中的所有记录,即使另一张表中没有匹配的记录。
2.2.1 左外联接(LEFT JOIN)
左外联接返回左侧表中的所有记录,即使在右表中没有匹配的记录,以及右侧表中匹配的记录。
示例:获取所有员工及其部门信息(即使某些员工没有部门):
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
应用场景:
此查询适用于需要查看所有员工信息的报告,尤其是在公司重组或部门调整时。
图示:左外联接示意图
2.2.2 右外联接(RIGHT JOIN)
右外联接与左外联接相反,返回右侧表中的所有记录,以及左侧表中匹配的记录。
示例:获取所有部门及其员工信息(即使某些部门没有员工):
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
应用场景:
这种查询适合分析公司中所有部门的情况,确保不会遗漏任何部门的细节。
图示:右外联接示意图
2.2.3 全外联接(FULL JOIN)
全外联接返回两个表中的所有记录,无论是否存在匹配的记录。
示例:获取所有员工和所有部门的信息:
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;
应用场景:
全外联接适合全面了解公司人力资源情况的场景,确保没有遗漏任何信息。
全外联接示意图
2.3 自联接(SELF JOIN)
自联接是指将同一张表与自身进行联接,通常用于处理层级数据或比较同一表中的不同记录。
示例:获取员工及其经理的信息:
假设员工表中有一个 manager_id 字段,用于指示每位员工的经理。我们可以使用自联接来获取每位员工及其经理的姓名:
SELECT e1.first_name AS employee_name, e2.first_name AS manager_name
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;
应用场景:
这种查询适合于生成组织结构图,帮助管理层了解团队和汇报关系。
3. 联接(JOIN)示例
下面是关于 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 的示例,包含了两张表的数据。
3.1 表结构
表1: customers
| customer_id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
表2: orders
| order_id | customer_id | amount |
|---|---|---|
| 101 | 1 | 250 |
| 102 | 2 | 150 |
| 103 | 1 | 100 |
| 104 | 4 | 200 |
3.2 示例查询
3.2.1 INNER JOIN
只返回两个表中匹配的记录。
SELECT c.name, o.amount
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;
结果
| name | amount |
|---|---|
| Alice | 250 |
| Alice | 100 |
| Bob | 150 |
3.2.2 LEFT JOIN
返回左表的所有记录,以及右表中匹配的记录。如果没有匹配,则结果为 NULL。
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;
结果
| name | amount |
|---|---|
| Alice | 250 |
| Alice | 100 |
| Bob | 150 |
| Charlie | NULL |
3.2.3 RIGHT JOIN
返回右表的所有记录,以及左表中匹配的记录。如果没有匹配,则结果为 NULL。
SELECT c.name, o.amount
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id;
结果
| name | amount |
|---|---|
| Alice | 250 |
| Alice | 100 |
| Bob | 150 |
| NULL | 200 |
3.2.4 FULL JOIN
返回两个表的所有记录,只有在存在匹配时才显示数据;否则,显示 NULL。
SELECT c.name, o.amount
FROM customers c
FULL JOIN orders o ON c.customer_id = o.customer_id;
结果
| name | amount |
|---|---|
| Alice | 250 |
| Alice | 100 |
| Bob | 150 |
| Charlie | NULL |
| NULL | 200 |
3.2.5 SELF JOIN
自联接是将同一张表与自身进行联接,常用于比较表中同一行或不同条件下的记录。
SELECT a.customer_id, a.amount AS OrderAmount1, b.amount AS OrderAmount2
FROM orders a
JOIN orders b ON a.customer_id = b.customer_id AND a.order_id <> b.order_id;
结果
| customer_id | OrderAmount1 | OrderAmount2 |
|---|---|---|
| 1 | 250 | 100 |
3.2.6 联接类型总结
- INNER JOIN:只显示匹配的数据。
- LEFT JOIN:显示左表的所有数据和右表的匹配数据。
- RIGHT JOIN:显示右表的所有数据和左表的匹配数据。
- FULL JOIN:显示两个表的所有数据,包括未匹配的记录。
- SELF JOIN:将同一表中的记录进行联接,用于比较或查找关联数据。
4 实践中的最佳实践
在实际应用中,以下是一些最佳实践:
- 清晰的需求: 在构建查询之前,明确您希望从数据中获得的信息。
- 合理命名: 使用
AS关键字重命名结果,使输出结果更易于理解。 - 数据预处理: 在应用聚合函数之前,确保数据已被清洗和格式化。
- 性能优化: 对于大量数据,考虑使用索引以提升查询性能。
5 注意事项
- 性能:多表联接可能导致性能问题,尤其是在大数据集上。务必确保有适当的索引。
- NULL值:在使用左联接和右联接时,需要处理可能出现的 NULL 值情况。
- 逻辑顺序:联接的顺序可能影响结果,特别是在复杂查询中,理解各层级的逻辑关系很重要。
总结
SQL 是一种强大的数据库查询语言,通过各种联接操作,用户可以灵活地从多个表中提取、组合和分析数据。掌握内联接、外联接和自联接等多种联接方式,将极大提升数据处理的效率和准确性。在实际应用中,遵循最佳实践并注意潜在问题,可以确保 SQL 查询的性能和结果的可靠性。通过不断练习和优化,将能更熟练地运用 SQL 来解决复杂的数据管理任务。
希望这篇博客能够帮助您更深入地理解 SQL 联接函数,让您在数据分析工作中事半功倍。通过不断练习和探索,您将能够熟练掌握这些技术,为您的职业发展打下坚实的基础。
相关文章:
【SQL】掌握SQL查询技巧:高效数据整合与查询优化
目录 1. SQL 的基本构成2. SQL 联接(JOIN)2.1 内联接(INNER JOIN)2.2 外联接(OUTER JOIN)2.2.1 左外联接(LEFT JOIN)2.2.2 右外联接(RIGHT JOIN)2.2.3 全外联…...
一个月学会Java 第5天 控制结构
Day5 控制结构 这么叫可能有些就算有基础的人也看不懂,其实就是if-else、switch-case、for、while、do-while这几个,没基础的听到了这个也不要慌张,这几个是程序的基础,多多训练就好 第一章 顺序结构 这章其实没有什么好讲的&…...
世界职业院校技能大赛(大数据技术与应用)参赛项目介绍内容模拟示例参考
最近关注世界职业院校技能大赛的同学应该都知道了,比赛已经正式改为”世界职业院校技能大赛“了,不仅仅是名称变化,而且比赛的形式也发生了巨大的改革,2024年世界职业院校技能大赛设置42个赛道,要求各比赛项目提交项目…...
【Python】文件及目录
文章目录 概要一、文件对象的函数1.1 open()函数1.2 文件对象的函数1.3 with语句 二、基于os和os.path模块的目录操作三、基于Pandas的文件处理3.1 Pandas读写各种类型文件 其他章节的内容 概要 本文主要将了打开文件的函数open()的参数,以及文件对象的函数&#x…...
OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 OpenHarmony Camera驱动模型结构 HDI Implementation&#x…...
霓虹灯数字时钟(可复制源代码)
文章目录 一、效果演示二、CodeHTMLCSSJavaScript 三、实现思路拆分CSS 部分JavaScript 部分 四、源代码 一、效果演示 文末可一键复制完整代码 二、Code HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…...
大模型微调技术之 LoRA:开启高效微调新时代
一、LoRA 简介 LoRA,即低秩适应(Low-Rank Adaptation),是一种用于微调大型语言模型的技术,旨在以较小的计算资源和数据量实现模型的快速适应特定任务或领域。 LoRA 方法通过引入低秩近似的思想,对大型预训…...
【Vue】Vue2(2)
文章目录 1 数据代理1.1 回顾Object.defineproperty方法1.2 何为数据代理1.3 Vue中的数据代理 2 事件处理2.1 事件的基本使用2.2 事件修饰符2.3 键盘事件 1 数据代理 1.1 回顾Object.defineproperty方法 <!DOCTYPE html> <html><head><meta charset&quo…...
如何实现一个基于 HTML+CSS+JS 的任务进度条
如何实现一个基于 HTMLCSSJS 的任务进度条 在网页开发中,任务进度条是一种常见的 UI 组件,它可以直观地展示任务的完成情况。本文将向你展示如何使用 HTML CSS JavaScript 来创建一个简单的、交互式的任务进度条。用户可以通过点击进度条的任意位置来…...
学会流体力学,冬天洗澡再也不冷啦
前些日子收到一位网友“究极理性怪物”的私信,说最近在学校的公共浴室洗澡时,快被冻死了,希望我从流体力学角度帮他分析一下浴室的温度分布,以便找到相对温暖的洗澡位置。 我看到后觉得很有意思,就与他展开了关于澡堂…...
WPF下使用FreeRedis操作RedisStream实现简单的消息队列
Redis Stream简介 Redis Stream是随着5.0版本发布的一种新的Redis数据类型: 高效消费者组:允许多个消费者组从同一数据流的不同部分消费数据,每个消费者组都能独立地处理消息,这样可以并行处理和提高效率。 阻塞操作:消费者可以设置阻塞操作,这样它们会在流中有新数据…...
踩坑NVTX
最开始在 【简说】NVTX Nsight Nvidia性能分析利器 看到NVTX的时候,我觉得这是一个好东西啊,可以详细说明每一段时间对应的是哪一段程序。 看了一下github,他的文章已经过时,现在已经不需要链接动态库了,直接includ…...
Ubuntu修改IP方法
方法一:通过图形化界面修改IP 打开网络设置: 点击桌面右上角的网络图标,然后选择“设置”或“网络设置”。 选择网络接口: 在网络设置窗口中,选择你正在使用的网络接口(有线或无线网络)。 进…...
C++——STL简介
目录 一、什么是STL 二、STL的版本 三、STL的六大组件 没用的话..... 不知不觉两个月没写博客了,暑假后期因为学校的事情在忙,开学又在准备学校的java免修,再然后才继续开始学C,然后最近打算继续写博客沉淀一下最近学到的几周…...
[linux] 磁盘清理相关
在 CentOS 7 中清理磁盘空间可以通过多种方法实现,以下是一些常用的步骤和命令: 1. 查找和删除大文件 你可以使用 find 命令查找占用大量空间的文件: find / -type f -size 100M 2>/dev/null这条命令会查找大于 100 MB 的文件。你可以根…...
【笔记】DDD领域驱动设计
同名读书笔记,对于一些自觉重要的点进行记录。 扩展资源:github.com/evancyz/ddd-learning UML中类图的一些基本知识 - jack_Meng - 博客园 最后的第四部分暂时没看 Part Two 模型驱动设计的构造块 Chapter 5 软件中所表示的模型 5.2 模式:…...
用AI构建小程序需要多久?效果如何?
随着移动互联网的快速发展,多端应用的需求日益增长。为了提高开发效率、降低成本并保证用户体验的一致性,前端跨端技术在如今的开发界使用已经非常普遍了,技术界较为常用的跨端技术有小程序技术、HTML5技术两大类。 2023年以来,伴…...
深度学习的应用综述
文章目录 引言深度学习的基本概念深度学习的主要应用领域计算机视觉自然语言处理语音识别强化学习医疗保健金融分析 深度学习应用案例公式1.损失函数(Loss Function) 结论 引言 深度学习是机器学习的一个子领域,通过模拟人脑的神经元结构来处理复杂的数据。近年来&…...
whereis命令:查找命令的路径
一、命令简介 whereis 命令用于查找命令的:可执行文件、帮助文件和源代码文件。 例如 $ whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz找到了 ls 命令的可执行文件、帮助文件的位置。 二、命令参数 命令格式 whereis [选项] [命令名称]选项…...
【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)
第四部分:项目实践 第十四章 项目结构与管理 在构建现代 Web 应用程序时,良好的项目结构和管理是确保代码可维护性、高效开发和部署成功的关键因素。这一章将深入讨论项目初始化与配置,以及如何使用构建工具来简化和优化项目建设过程。 14…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
