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

SQL语言学习(JOIN)

在 SQL 的 JOIN 操作中,左表(Left Table)和右表(Right Table)的区分完全取决于 FROM 和 JOIN 关键字的书写顺序

  • 左表FROM 子句中指定的表(第一个表)。
  • 右表JOIN 子句中指定的表(第二个表)。

在 SQL 中,JOIN 用于合并多个表的数据,根据不同的需求,主要有以下几种 JOIN 类型:

  1. INNER JOIN(内连接)
  2. LEFT JOIN(左连接)
  3. RIGHT JOIN(右连接)
  4. FULL JOIN(全连接)
  5. CROSS JOIN(交叉连接)

结合案例(person 和 orders 表)详细介绍它们的用法和区别。


1. INNER JOIN(内连接)

作用:返回两个表中匹配的记录(即 ON 条件成立的记录)。
特点

  • 如果某人在 person 表中存在,但在 orders 表中没有订单,则不会出现在结果中
  • 反之,如果 orders 表中的订单没有对应的 person 记录,也不会出现。
select p.lastname,p.firstname,o.orderno
from person p
inner join orders o on p.id_p = o.id_p;

示例结果:

适用场景

  • 只需要查询有订单的人及其订单信息。

2. LEFT JOIN(左连接)

作用:返回左表(person)的所有记录,即使右表(orders)没有匹配的记录。
特点

  • 如果某人在 person 表中存在,但在 orders 表中没有订单,则 orderno 为 NULL
  • 如果 orders 表中的订单没有对应的 person 记录,则不会出现(因为左连接以左表为准)。
select p.lastname,p.firstname,o.orderno
from person p
left join orders o on p.id_p=o.id_p;

实例结果:

 

3. RIGHT JOIN(右连接)

作用:返回右表(orders)的所有记录,即使左表(person)没有匹配的记录。
特点

  • 如果 orders 表中的订单没有对应的 person 记录,则 lastname 和 firstname 为 NULL
  • 如果某人在 person 表中存在,但没有订单,则不会出现(因为右连接以右表为准)。
select p.lastname,p.firstname,o.orderno
from person p
right join orders o on p.id_p=o.id_p;

适用场景

  • 查询所有订单及其对应的人(即使订单没有对应的人也要显示)。

4. FULL JOIN(全连接)

作用:返回左表和右表的所有记录,无论是否匹配。
特点

  • 如果某人在 person 表中存在,但在 orders 表中没有订单,则 orderno 为 NULL
  • 如果 orders 表中的订单没有对应的 person 记录,则 lastname 和 firstname 为 NULL
SELECT p.lastname, p.firstname, o.orderno
FROM person p
FULL JOIN orders o ON p.id_P = o.id_p;

适用场景

  • 查询所有人和所有订单,无论是否匹配(适用于数据对账或异常检查)。

5. CROSS JOIN(交叉连接)

作用:返回左表和右表的笛卡尔积(即所有可能的组合)。
特点

  • 不需要 ON 条件,因为它会返回 person 的每一行与 orders 的每一行的组合。
  • 如果 person 有 3 行,orders 有 4 行,则结果有 3×4=12 行。
SELECT p.lastname, p.firstname, o.orderno
FROM person p
CROSS JOIN orders o;

 

一般不使用,主要用于生成测试

总结:

http://www.dtcms.com/a/311969.html

相关文章:

  • Orange的运维学习日记--25.Linux文件系统基本管理
  • 使用xshell连接远程腾讯云服务器,报错:Xshell Socket error Event: 32 Error: 10053
  • 智能图书馆管理系统开发实战系列(五):前后端集成 - koffi调用与接口设计
  • 用resmon搜索某文件被未知程序占用而无法删除
  • 第15届蓝桥杯Python青少组_省赛_中/高级组2024年8月真题
  • Java,八股,cv,算法——双非研0四修之路day23
  • SpringBoot 信用卡检测、OpenAI gym、OCR结合、DICOM图形处理、知识图谱、农业害虫识别实战
  • 博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)
  • 占道经营识别漏检率↓76%:陌讯动态场景适配算法实战解析
  • 区分「尊重」和「顺从」
  • FastAPI入门:响应模型
  • 如何分析Linux内存性能问题
  • Windows字体simsum.ttf的安装与Python路径设置指南
  • junit中@InjectMocks作用详解
  • wgd v1.1.2 安装与使用-生信工具056
  • Java 字符串常量池 +反射,枚举和lambda表达式
  • 【数据结构】栈的顺序存储(整型栈、字符栈)
  • Postman四种请求教程
  • unsloth - LLM超级轻量级微调框架
  • ollama 多实例部署
  • 语音识别数据集
  • 【ROS2】ROS2节点Node机制与常用命令行
  • Autosar Nm-网管报文PNC停发后无法休眠问题排查
  • 决策树算法:三大核心流程解析
  • Agents-SDK智能体开发[4]之集成MCP入门
  • Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】
  • Python编程基础与实践:Python文件处理入门
  • 智能手表:MPU6050和水平仪,动态表情包
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题
  • Qemu-NUC980(二):时钟clock代码添加