SQL 连接和窗口函数

发布: (2026年3月2日 GMT+8 20:19)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供需要翻译的正文内容,我将为您翻译成简体中文。

介绍

SQL 连接允许您使用公共标识符(例如外键)将两个或多个表组合在一起。由于规范化的原因,单个表可能不包含您需要的所有列,因此连接会在表之间“传输”数据,使您能够在结果集中包含来自两个表的列。

示例表格用于说明

学生表

student_idnamecourse_id
1Willis Kip001
2Edwin Sifuna002
3Tonny OtiNULL

课程表

course_idcourse_name
001植物学
002政治学
004英语

SQL 连接类型

1️⃣ 内连接

仅返回在两个表中都存在的行。

Inner Join Diagram

SELECT name, course_name
FROM Student
INNER JOIN Course
  ON Student.course_id = Course.course_id;

输出

名称课程名称
Willis KipBotany
Edwin SifunaPolitical_sci

2️⃣ 左连接

返回左表的所有行以及右表中匹配的行。

Left Join Diagram

SELECT name, course_name
FROM Student
LEFT JOIN Course
  ON Student.course_id = Course.course_id;

输出

名称课程名称
Willis KipBotany
Edwin SifunaPolitical_sci
Tonny OtiNULL

3️⃣ 右连接

返回右表的所有行以及左表中匹配的行。

Right Join Diagram

SELECT name, course_name
FROM Student
RIGHT JOIN Course
  ON Student.course_id = Course.course_id;

输出

名称课程名称
Willis KipBotany
Edwin SifunaPolitical_sci
NULLEnglish

4️⃣ 全连接

返回两个表的所有行,在可能的情况下进行匹配。

Full Join Diagram

SELECT name, course_name
FROM Student
FULL JOIN Course
  ON Student.course_id = Course.course_id;

输出

名称课程名称
Willis KipBotany
Edwin SifunaPolitical_sci
Tonny OtiNULL
NULLEnglish

窗口函数

A window function performs a calculation across a specific set of rows (the “window”) defined by an OVER () clause. Unlike traditional aggregate functions, which collapse rows into a single result, window functions return a value for each row while still having access to other rows in the defined window.

语法

SELECT column_1,
       column_2,
       function() OVER (
           PARTITION BY partition_expression
           ORDER BY order_expression
       ) AS output_column_name
FROM table_name;

说明

组件描述
SELECT列出你想在结果集中显示的列。
function()你想要应用的窗口函数(例如 ROW_NUMBER()AVG())。
OVER()定义函数操作的窗口。
PARTITION BY将行划分为不同的分区;如果省略,则整个结果集视为单个分区。
ORDER BY确定每个分区内行的顺序。
output_column_name计算列的别名。

示例

SELECT dem.first_name,
       dem.last_name,
       gender,
       AVG(salary) OVER (PARTITION BY gender) AS avg_salary_by_gender
FROM employee_demographics dem
JOIN employee_salary sal
  ON dem.employee_id = sal.employee_id;

此查询在仍然显示每位员工记录的同时,计算每个性别的平均工资。

常用窗口函数

  • ROW_NUMBER()
  • RANK()
  • DENSE_RANK()
  • LAG(expression, offset)
  • FIRST_VALUE()
  • LAST_VALUE()

作为窗口函数使用的聚合函数

  • SUM()
  • AVG()
  • MAX()
  • MIN()
  • COUNT()

结论

  • 当需要从多个表合并相关数据时使用 JOIN
  • 根据要保留的行选择合适的连接类型(INNERLEFTRIGHTFULL)。
  • 当需要基于一组相关行进行行级计算(例如累计总和、排名、移动平均)时使用 窗口函数
  • PARTITION BYORDER BY 结合使用,以微调窗口范围和排序。

这些工具共同使 SQL 成为既能检索数据又能进行分析计算的强大语言。

0 浏览
Back to Blog

相关文章

阅读更多 »

SQL 连接和窗口函数

markdown !Musungu Ruth Ambogohttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws...

精通SQL连接和窗口函数

介绍:SQL 连接用于基于相关列合并两个或多个表中的行,而窗口函数在一组行上执行计算,……