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

SQL自学:什么是联结,如何编写使用联结的SELECT语句

在 SQL(Structured Query Language,结构化查询语言)的世界里,联结(JOIN)是一个强大且至关重要的概念。它允许我们从多个表中检索数据,从而实现更复杂的查询和数据分析。本文将深入探讨联结的概念、不同类型以及如何编写使用联结的 SELECT 语句。

一、联结的概念

联结是一种在 SQL 中用于合并两个或多个表中数据的操作。通过联结,我们可以基于共同的列值将不同表中的行组合在一起,从而获取更全面的信息。

想象一个数据库中有两个表:一个是 “Customers” 表,包含客户的 ID、姓名、地址等信息;另一个是 “Orders” 表,包含订单的 ID、客户 ID、订单日期、订单金额等信息。如果我们想要查看每个客户的订单信息,就需要使用联结将这两个表中的数据合并起来。

二、联结的类型

1、内联结(INNER JOIN)
内联结是最常用的联结类型之一。它只返回两个表中满足联结条件的行。

例如,假设有两个表 “TableA” 和 “TableB”,都有一个共同的列 “ID”。使用内联结的 SQL 语句如下:

SELECT *
FROM TableA
INNER JOIN TableB ON TableA.ID = TableB.ID;

这条语句将返回 “TableA” 和 “TableB” 中 “ID” 列值相等的行。

2、左联结(LEFT JOIN)
左联结返回左表中的所有行以及右表中与左表满足联结条件的行。如果右表中没有与左表匹配的行,则相应的列值为 NULL。

以下是使用左联结的示例:

SELECT *
FROM TableA
LEFT JOIN TableB ON TableA.ID = TableB.ID;

在这个例子中,“TableA” 是左表,它的所有行都会被返回。如果 “TableB” 中没有与 “TableA” 中某一行匹配的行,那么 “TableB” 的列值将为 NULL。

3、右联结(RIGHT JOIN)
右联结与左联结相反,它返回右表中的所有行以及左表中与右表满足联结条件的行。如果左表中没有与右表匹配的行,则相应的列值为 NULL。

示例如下:

SELECT *
FROM TableA
RIGHT JOIN TableB ON TableA.ID = TableB.ID;

4、全联结(FULL JOIN)
全联结返回两个表中的所有行。如果某一行在另一个表中没有匹配的行,则相应的列值为 NULL。

然而,并非所有的数据库都支持全联结。在支持全联结的数据库中,SQL 语句如下:

SELECT *
FROM TableA
FULL JOIN TableB ON TableA.ID = TableB.ID;

三、编写使用联结的 SELECT 语句

1、确定要联结的表
首先,你需要确定要联结的表以及它们之间的关系。这通常涉及找到共同的列,这些列将用于建立联结条件。

例如,在一个电子商务数据库中,可能有 “Customers” 表、“Orders” 表和 “Products” 表。“Customers” 表和 “Orders” 表可以通过 “CustomerID” 列联结,而 “Orders” 表和 “Products” 表可以通过 “ProductID” 列联结。

2、选择要检索的列
确定要从联结后的表中检索哪些列。你可以选择来自不同表的列,只要它们在 SELECT 语句中明确指定。

例如,要检索客户的姓名和他们的订单信息,可以使用以下 SQL 语句:

SELECT Customers.Name, Orders.OrderDate, Orders.OrderAmount
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

3、指定联结条件
联结条件是用于确定哪些行应该被合并在一起的规则。通常,这是通过在 ON 子句中指定两个表中共同列的相等关系来实现的。

例如,继续上面的例子,联结条件是 “Customers.CustomerID = Orders.CustomerID”,这意味着只有当 “Customers” 表中的 “CustomerID” 列值与 “Orders” 表中的 “CustomerID” 列值相等时,这两行才会被合并。

4、使用别名
如果表名很长或者为了提高代码的可读性,可以为表指定别名。别名可以在 SELECT 语句中的任何地方使用,以代替表名。

例如:

SELECT c.Name, o.OrderDate, o.OrderAmount
FROM Customers AS c
INNER JOIN Orders AS o ON c.CustomerID = o.CustomerID;

在这个例子中,“Customers” 表被别名为 “c”,“Orders” 表被别名为 “o”。

5、处理多个联结
如果需要从多个表中检索数据,可以使用多个联结。在这种情况下,每个联结都需要有自己的联结条件。

例如,要检索客户的姓名、订单日期和订单中的产品名称,可以使用以下 SQL 语句:

SELECT c.Name, o.OrderDate, p.ProductName
FROM Customers AS c
INNER JOIN Orders AS o ON c.CustomerID = o.CustomerID
INNER JOIN OrderDetails AS od ON o.OrderID = od.OrderID
INNER JOIN Products AS p ON od.ProductID = p.ProductID;

在这个例子中,首先将 “Customers” 表和 “Orders” 表联结,然后将 “Orders” 表和 “OrderDetails” 表联结,最后将 “OrderDetails” 表和 “Products” 表联结。

四、联结的注意事项

1、性能考虑
联结操作可能会对数据库性能产生影响,尤其是当处理大量数据时。为了提高性能,可以考虑以下几点:

  • 确保联结条件使用的列上有索引。
  • 避免不必要的联结,只联结需要的表。
  • 如果可能,使用内联结而不是全联结,因为全联结通常需要更多的处理时间。

2、数据完整性
在进行联结时,要确保数据的完整性。如果一个表中的数据与另一个表中的数据不匹配,可能会导致结果不准确。

例如,如果 “Customers” 表中的某个客户没有任何订单,那么在使用内联结时,这个客户将不会出现在结果中。如果需要包括所有客户,即使他们没有订单,可能需要使用左联结。

3、可读性
编写联结的 SQL 语句时,要注意代码的可读性。使用别名、注释和适当的缩进可以使代码更易于理解和维护。

例如:

-- 检索客户的姓名和他们的订单信息
SELECT c.Name, o.OrderDate, o.OrderAmount
FROM Customers AS c
INNER JOIN Orders AS o ON c.CustomerID = o.CustomerID;

练习题:

1.编写SQL语句,返回Customers表中的顾客名称(cust_name)和Orders表中的相关订单号(order_num)​,并按顾客名称再按订单号对结果进行排序。实际上是尝试两次,一次使用简单的等联结语法,一次使用INNER JOIN。

2.我们来让上一题变得更有用些。除了返回顾客名称和订单号,添加第三列OrderTotal,其中包含每个订单的总价。有两种方法可以执行此操作:使用OrderItems表的子查询来创建OrderTotal列,或者将OrderItems表与现有表联结并使用聚合函数。提示:请注意需要使用完全限定列名的地方。3.我们重新看一下第11课的挑战题2。编写SQL语句,检索订购产品BR01的日期,这一次使用联结和简单的等联结语法。

4.这次使用ANSI的INNER JOIN语法。在之前编写的代码中使用了两个嵌套的子查询。要重新创建它,需要两个INNER JOIN语句,每个语句的格式类似于本课讲到的INNERJOIN示例,而且不要忘记WHERE子句可以通过prod_id进行过滤。

5.再让事情变得更加有趣些,我们将混合使用联结、聚合函数和分组。编写SQL语句,使用联结从Customers表返回顾客名称(cust_name)​,并从OrderItems表返回所有订单的总价。提示:要联结这些表,还需要包括Orders表(因为Customers表与OrderItems表不直接相关,Customers表与Orders表相关,而Orders表与OrderItems表相关)​。不要忘记GROUP BY和HAVING,并按顾客名称对结果进行排序。你可以使用简单的等联结或ANSI的INNER JOIN语法。

 

相关文章:

SQL自学:什么是联结,如何编写使用联结的SELECT语句

在 SQL(Structured Query Language,结构化查询语言)的世界里,联结(JOIN)是一个强大且至关重要的概念。它允许我们从多个表中检索数据,从而实现更复杂的查询和数据分析。本文将深入探讨联结的概念…...

【C++】函数重载+引用

大家好,我是苏貝,本篇博客带大家了解C的函数重载和引用,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 预处理、编译、汇编、链接二. 函数重载1 概念2 C支持函数重载的原理—名字修饰…...

华为S5735交换机console密码重置和恢复出厂设置

比较简单,简单说就是进入bootload清除密码,然后进入default mode下重置密码。 1.开机按CtrlB,进入启动加载菜单(BootLoad menu) 拨电源重启交换机,大约开机10多秒的时候会出现提示按CtrlB可以进入BootLoa…...

Spring Security无脑使用

步骤1&#xff1a;添加Spring Security依赖 在你的Spring Boot项目的pom.xml文件中&#xff0c;添加Spring Security的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</art…...

学习 PostgreSQL + Spring Boot 3 +mybatisplus整合过程中的报错记录

今天计划学习 PostgreSQL&#xff0c;并顺便尝试使用 Spring Boot 3.x 框架&#xff0c;打算整合 Spring Boot 3、PostgreSQL 和 MyBatis-Plus。整合后一直出现以下报错&#xff1a; 去AI上面搜了讲的是sqlSessionFactory 或 sqlSessionTemplate 没有正确配置 初始分析&#…...

立仪光谱共焦传感器在玻璃测量技术上的突破

近年来&#xff0c;随着科技的不断发展&#xff0c;光谱共焦传感器逐渐成为了工业检测领域的重要工具。尤其是在玻璃这种透明材质的厚度测量中&#xff0c;光谱共焦传感器展现出了其独特的优势。立仪科技小编将围绕光谱共焦传感器在玻璃行业中的应用&#xff0c;从问题、分析到…...

Llama系列上新多模态!3.2版本开源超闭源,还和Arm联手搞了手机优化版,Meta首款多模态Llama 3.2开源!1B羊驼宝宝,跑在手机上了

Llama系列上新多模态&#xff01;3.2版本开源超闭源&#xff0c;还和Arm联手搞了手机优化版&#xff0c;Meta首款多模态Llama 3.2开源&#xff01;1B羊驼宝宝&#xff0c;跑在手机上了&#xff01; 在多模态领域&#xff0c;开源模型也超闭源了&#xff01; 就在刚刚结束的Met…...

系统缺失mfc140.dll的修复方法,有效修复错误mfc140.dll详细步骤

mfc140.dll丢失原因分析 1 系统文件损坏或病毒感染 系统文件损坏或被病毒感染是导致mfc140.dll丢失的常见原因之一。根据用户反馈和安全研究报告&#xff0c;大约有30%的mfc140.dll丢失案例与系统文件损坏或病毒感染有关。病毒、木马或其他恶意软件可能会破坏或删除系统中的m…...

移动app的UI和接口自动化测试怎么进行?

标题&#xff1a;从0到1&#xff1a;移动App的UI和接口自动化测试 导语&#xff1a;移动App的快速发展使得UI和接口自动化测试成为了确保应用质量的重要环节。本文将从零开始介绍移动App的UI和接口自动化测试的基本概念以及如何进行测试。 第一部分&#xff1a;了解移动App自动…...

Unity实现自定义图集(二)

以下内容是根据Unity 2020.1.0f1版本进行编写的   实现一个自定义图集,该怎么入手呢。首先简单思考一下unity是怎么实现图集的。 因为unity的ui部分是开源的,所以我们可以看到UGUI的源代码,另外,Unity的内置Shader也是开源的,可以直接在官网下载(在下载的网页选择Built…...

智能码二维码zhinengma.cn的动态数据更新是如何实现的?

智能码二维码的动态数据更新功能是通过其背后的技术原理实现的&#xff0c;主要依赖于服务器和二维码的链接结构。以下是具体介绍&#xff1a; 动态数据更新的实现原理 链接嵌入&#xff1a;动态二维码中嵌入了一个链接&#xff0c;该链接指向服务器上的数据源。数据请求与更…...

uniapp view怎么按长度排列一行最多四个元素,并且换行后,每一行之间都有间隔

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

Android列表组件api

目录 1.ListView控件 1&#xff09;android:divider 2&#xff09;android:dividerHeight 3&#xff09;android:entries 4&#xff09;android:footerDividersEnabled 5&#xff09;android:headerDividersEnabled 6&#xff09;android:listSelector 7&#xff09;android:sc…...

ToB项目身份认证AD集成(完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法介绍

在前面的两篇文章中&#xff0c;我详细的介绍了使用ldap与window AD服务集成&#xff0c;实现ToB项目中的身份认证集成方案&#xff0c;包括技术方案介绍、环境配置&#xff1a; ToB项目身份认证AD集成&#xff08;一&#xff09;&#xff1a;基于目录的用户管理、LDAP和Active…...

SpringBoot+SeetaFace6搭建人脸识别平台

前言 最近多个项目需要接入人脸识别功能&#xff0c;之前的方案是使用百度云api集成&#xff0c;但是后续部分项目是内网部署及使用&#xff0c;考虑到接入复杂程度及收费等多种因素&#xff0c;决定参考开源方案自己搭建&#xff0c;保证服务的稳定性与可靠性 项目地址&…...

MySQL-06.DDL-表结构操作-创建

一.DDL(表操作) create database db01;use db01;create table tb_user(id int comment ID&#xff0c;唯一标识,username varchar(20) comment 用户名,name varchar(10) comment 姓名,age int comment 年龄,gender char(1) comment 性别 ) comment 用户表; 此时并没有限制ID为…...

在Visual Studio中使用CMakeLists.txt集成EasyX库的详细指南

EasyX库是一款专为Windows平台设计的轻量级C图形库&#xff0c;适合初学者和教育领域使用。结合Visual Studio和CMake工具链&#xff0c;用户可以轻松创建C项目&#xff0c;并集成EasyX库&#xff0c;实现丰富的图形编程效果。本文将详细介绍如何在Visual Studio中通过CMakeLis…...

CRC码计算原理

CRC8这里先以CRC8来说明CRC的计算过程1、CRC8在线计算器通过CRC在线计算器可以看见CRC8的特征多项式:x8+x2+x+1,初始值为0000’0000。CRC计算的核心是:反转+异或+移位(此处的CRC8没有涉及反转,见后面CRC16)。2、CRC8计算过程(1)、取值从高到低依次取需校验数据的位,这里…...

对高危漏洞“Docker Engine API is accessible without authentication”的修复

一.背景 之前文章maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网_1panel 构建镜像-CSDN博客将1Panel软件的Doocker端口给到了局域网&#xff0c;安全组兄弟扫描认为是高危漏洞&#xff0c;可能导致攻击者获取对Docker主机的完全控制权。 二.修复的建…...

两种方式创建Vue项目

文章目录 引言利用Vue命令创建Vue项目准备工作安装Vue CLI创建Vue项目方法一&#xff1a;使用vue init命令方法二&#xff1a;使用vue create命令启动Vue项目 利用Vite工具创建Vue项目概述利用Vite创建项目启动项目 结语 引言 大家好&#xff0c;今天我将向大家展示如何使用不…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...