【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…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
