INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN

2024-04-23 23:52
文章标签 join right left inner full

本文主要是介绍INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

联表查询是指在数据库中同时查询多个表,并通过它们之间的关联条件将结果合并在一起。这通常通过 SQL 中的 JOIN 操作来实现。常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。

让我们通过一个示例来说明联表查询的基本用法。假设有两个表:students 和 grades,它们的结构如下:

-- students 表
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(100),grade_id INT
);-- grades 表
CREATE TABLE grades (id INT PRIMARY KEY,grade_name VARCHAR(100)
);

students 表包含学生的信息,其中 grade_id 是一个外键,指向 grades 表中的对应成绩的标识符。grades 表包含了成绩的信息。

现在,假设我们想要查询每个学生的姓名以及他们所属的成绩名称。我们可以使用 INNER JOIN 来实现:

SELECT students.name, grades.grade_name
FROM students
INNER JOIN grades ON students.grade_id = grades.id;

这条 SQL 查询会返回一个结果集,其中包含每个学生的姓名以及他们所属的成绩名称。INNER JOIN 会根据 students 表中的 grade_id 和 grades 表中的 id 进行匹配,然后将匹配的结果合并起来。

当涉及到多个表的联表查询时,不同类型的 JOIN 可以产生不同的结果。除了 INNER JOIN,还有 LEFT JOIN、RIGHT JOIN 和 FULL JOIN。下面我将用示例说明这些 JOIN 的用法:

假设我们有两个表 orderscustomers,分别存储订单和客户的信息。它们的结构如下:

-- orders 表
CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT,order_date DATE
);-- customers 表
CREATE TABLE customers (customer_id INT PRIMARY KEY,customer_name VARCHAR(100)
);

  1. LEFT JOIN:LEFT JOIN 会返回左边表中的所有记录,即使在右边表中没有匹配项。

SELECT orders.order_id, orders.order_date, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;

这条查询会返回所有订单的信息,即使有些订单的客户信息在 customers 表中找不到匹配项。对于这些订单,customer_name 列会显示为 NULL。

  1. RIGHT JOIN:RIGHT JOIN 会返回右边表中的所有记录,即使在左边表中没有匹配项。

SELECT orders.order_id, orders.order_date, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

这条查询会返回所有客户的信息,即使有些客户没有下过订单。对于这些客户,order_idorder_date 列会显示为 NULL。

  1. FULL JOIN:FULL JOIN 会返回两个表中的所有记录,无论是否有匹配项。

SELECT orders.order_id, orders.order_date, customers.customer_name
FROM orders
FULL JOIN customers ON orders.customer_id = customers.customer_id;

这条查询会返回所有订单和客户的信息,并将它们合并在一起。如果某个订单没有匹配到客户,或者某个客户没有匹配到订单,对应的列会显示为 NULL。

这些是 LEFT JOIN、RIGHT JOIN 和 FULL JOIN 的用法示例。通过合理选择 JOIN 类型,可以根据需求获取不同的查询结果。

这篇关于INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930217

相关文章

MySQL学习笔记-join语句类型

join从句的类型:内链接(inner) 全外连接(full outer) 左外连接(left outer) 右外连接(right outer) 交叉链接(cross) 连接条件:使用ON设定连接条件,也可以用WHERE代替 · ON:设定连接条件 · WHERE:进行结果集记录的过滤 一,内连接inner join:  内连接是返回左表及右表符合连接条件的记录,在MySQL中JO

多线程 | join方法

文章目录 1. 作用2. 用法3. 异常4. 源码为什么使用wait方法 5. 如何实现按照指定顺序执行线程6. 线程运行状态 1. 作用 在 Java 多线程中,join方法用于等待一个线程执行完毕。当一个线程调用另一个线程的join方法时,当前线程会进入等待状态,直到被调用的线程执行完毕。这使得开发者可以控制线程的执行顺序,确保某些关键线程在其他线程之前完成执行。 2. 用

SylixOS pthread_join退出

1 问题描述 在移植中间件过程中,在SylixOS下调用pthread_join时,如果线程在pthread_join等待之前结束,则线程返回无效线程错误值。在Linux下这种调用会正常返回。两种实现是有差别的,实现的原理分别如下。 2 函数实现机制 2.1 实现机制 在SylixOS下调用pthread_join时,如果线程在pthread_join等待之前结束,线程返回无效线程错误标志

多表连接的三种方式hash join,merge join,nested loop

多表之间的连接有三种方式:Nested Loops,Hash Join和 Sort Merge Join. 下面来介绍三种不同连接的不同:     一. NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回

Apache-Flink深度解析-Temporal-Table-JOIN

在《JOIN LATERAL》中提到了Temporal Table JOIN,本篇就向大家详细介绍什么是Temporal Table JOIN。在ANSI-SQL 2011 中提出了Temporal 的概念,Oracle,SQLServer,DB2等大的数据库厂商也先后实现了这个标准。Temporal Table记录了历史上任何时间点所有的数据改动,Temporal Table的工作流程如下:

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,

Flink重点难点:维表关联理论和Join实战

点击上方蓝色字体,选择“设为星标” 回复”面试“获取更多惊喜 在阅读本文之前,你应该阅读过的系列: 《Flink重点难点:时间、窗口和流Join》《Flink重点难点:网络流控和反压》 Flink官方文档中公开的信息 1 Join 的概念 在阅读之前请一定要先了解: 数据流操作的另一个常见需求是对两条数据流中的事件进行联结(connect)或Join。Flink DataStream API中

【硬刚Hadoop】HADOOP MAPREDUCE(11):Join应用

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 Reduce Join Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。 Reduce端的主要工作:在Reduce端以连接字段作为key的分组已经完成,我们只需要在

Csting Left Mid Right

 CString Left( int nCount ) const;                   //从左边1开始获取前 nCount 个字符 CString Mid( int nFirst ) const;                      //从左边第 nCount+1 个字符开始,获取后面所有的字符 CString Mid( int nFirst, int nC

【Puppeteer】‘left‘ is already pressed, ‘${button}‘ is already pressed 的解决办法

解决过程如下 这是我原来的代码,不管我怎么修改,都一直会出现 'left' is already pressed 这个错误 找了很多资料 搜了 很多网站都 找不到解决办法 async function dragAndDrop(page, canvasSelector, startX, startY, endX, endY) {const startCoordinates = await ge