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

问:SQL中join语法的差异?

在SQL中,JOIN语法用于结合来自两个或多个表的数据。不同类型的JOIN会基于不同的条件来合并表中的数据。以下是几种常见的JOIN及其差异:

假设我们有两个表:employeesdepartments

employees:

employee_idnamedepartment_id
1Alice10
2Bob20
3CharlieNULL
4David10

departments:

department_iddepartment_name
10HR
20Engineering
30Sales

1. INNER JOIN

INNER JOIN 只返回两个表中匹配的行。

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

结果:

namedepartment_name
AliceHR
DavidHR
BobEngineering

2. LEFT JOIN (或 LEFT OUTER JOIN)

LEFT JOIN 返回左表中的所有行以及右表中匹配的行。如果没有匹配,右表中的字段将为 NULL

SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

结果:

namedepartment_name
AliceHR
BobEngineering
CharlieNULL
DavidHR

3. RIGHT JOIN (或 RIGHT OUTER JOIN)

RIGHT JOIN 返回右表中的所有行以及左表中匹配的行。如果没有匹配,左表中的字段将为 NULL

SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

结果:

namedepartment_name
AliceHR
DavidHR
BobEngineering
NULLSales

4. FULL JOIN (或 FULL OUTER JOIN)

FULL JOIN 返回两个表中的所有行,并在没有匹配时显示 NULL

SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;

结果:

namedepartment_name
AliceHR
BobEngineering
CharlieNULL
DavidHR
NULLSales

5. CROSS JOIN

CROSS JOIN 返回两个表的笛卡尔积,即每个来自第一张表的行都会和第二张表中的每一行进行组合。

SELECT e.name, d.department_name
FROM employees e
CROSS JOIN departments d;

结果:

namedepartment_name
AliceHR
AliceEngineering
AliceSales
BobHR
BobEngineering
BobSales
CharlieHR
CharlieEngineering
CharlieSales
DavidHR
DavidEngineering
DavidSales

6. SELF JOIN

SELF JOIN 是表与自身的连接。假设我们要找到具有相同部门的员工。

SELECT e1.name AS employee1, e2.name AS employee2, e1.department_id
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.employee_id <> e2.employee_id;

结果:

employee1employee2department_id
AliceDavid10
DavidAlice10

每种JOIN都有其特定的用途,选择哪种JOIN取决于你希望如何合并表中的数据。

总结

Join 类型语法使用场景
INNER JOINSELECT … FROM table1 INNER JOIN table2 ON table1.column = table2.column;当需要从两个表中获取匹配的行时。只返回两个表中都有匹配记录的行。
LEFT JOIN (或 LEFT OUTER JOIN)SELECT … FROM table1 LEFT JOIN table2 ON table1.column = table2.column;当需要从左表中获取所有行,并获取与右表匹配的行时。如果右表中没有匹配记录,则结果中右表的字段为NULL。
RIGHT JOIN (或 RIGHT OUTER JOIN)SELECT … FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;当需要从右表中获取所有行,并获取与左表匹配的行时。如果左表中没有匹配记录,则结果中左表的字段为NULL。
FULL JOIN (或 FULL OUTER JOIN)SELECT … FROM table1 FULL JOIN table2 ON table1.column = table2.column;当需要从两个表中获取所有行,并获取它们之间匹配的行时。如果没有匹配记录,则结果中相应表的字段为NULL。
CROSS JOINSELECT … FROM table1 CROSS JOIN table2;当需要生成两个表的笛卡尔积时,即每个来自第一张表的行都会和第二张表中的每一行进行组合。通常用于生成测试数据或进行某些特殊计算。
SELF JOINSELECT … FROM table1 AS alias1 JOIN table1 AS alias2 ON alias1.column = alias2.column;当需要对同一个表进行连接操作时,通常用于查找表内的相关记录。例如,查找具有相同部门或相同兴趣的员工。

上述总结仅提供了基本的Join类型和语法示例。在实际使用中,可能还需要根据具体需求添加其他条件、过滤或排序等操作。此外,不同的数据库管理系统(DBMS)可能对Join操作有一些特殊的实现或优化,具体使用时,建议参考相应文档。

http://www.lryc.cn/news/451885.html

相关文章:

  • 计算机网络各层有哪些协议?计算机网络协议解析:从拟定到实现,全面了解各层协议的作用与区别
  • 解决方案:机器学习中,基学习器 跟 弱学习器,有什么区别
  • 【Python】ftfy 使用指南:修复 Unicode 编码问题
  • 第9课-C++String功能的探索
  • 基于Hive和Hadoop的保险分析系统
  • 国庆节快乐前端(HTML+CSS+JavaScript+BootStrap.min.css)
  • 【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
  • PyTorch源码系列(一)——Optimizer源码详解
  • Java - LeetCode面试经典150题(三)
  • 基于SpringBoot+Vue+MySQL的民宿预订平台
  • Hadoop krb5.conf 配置详解
  • 工程师 - DNS请求过程
  • Solidity智能合约中的事件和日志
  • 第四十一篇-Docker安装Neo4j
  • 数电基础(组合逻辑电路+Proteus)
  • 自给自足:手搓了一个睡眠监测仪,用着怎么样?
  • Miniforge详细安装教程(macOs和Windows)
  • HDFS Shell作业1
  • 工业交换机一键重启的好处
  • 滚雪球学Oracle[4.2讲]:PL/SQL基础语法
  • springboot系列--web相关知识探索二
  • Oracle 12c在Windows环境下安装
  • Stable Diffusion绘画 | 来训练属于自己的模型:打标处理与优化
  • 【论文笔记】Visual Instruction Tuning
  • ubuntu 设置静态IP
  • Java 每日一刊(第19期):泛型
  • windows下安装rabbitMQ并开通管理界面和允许远程访问
  • 深度剖析音频剪辑免费工具的特色与优势
  • Oracle中TRUNC()函数详解
  • 【Spring Boot 入门一】构建你的第一个Spring Boot应用