SQL表连接方式

一、SQL中的表连接方式:

  1. 内连接(INNER JOIN):返回两个表中符合连接条件的交集。
  2. 外连接(OUTER JOIN):
    • 左外连接(LEFT JOIN):返回左表中所有记录,以及右表中符合连接条件的记录。
    • 右外连接(RIGHT JOIN):返回右表中所有记录,以及左表中符合连接条件的记录。
    • 完全外连接(FULL JOIN):返回左表和右表中的所有记录,如果没有匹配的记录则用NULL填充。
  3. 交叉连接(CROSS JOIN):返回两个表的笛卡尔积,即左表中的每一行都与右表中的每一行组合。
  4. 自连接(SELF JOIN):将表与自身进行连接,常用于比较表中不同行之间的数据。

这些连接方式允许在不同的条件下将多个表关联起来,以满足查询的需求。

二、创建两个表:

employees(员工信息)和departments(部门信息):
sql 复制代码
CREATE TABLE departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50)
);

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    employee_name VARCHAR(50),
    department_id INT,
    manager_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id),
    FOREIGN KEY (manager_id) REFERENCES employees(employee_id)
);

departments表有两个列:department_iddepartment_name,其中department_id是主键。

employees表有四个列:employee_idemployee_namedepartment_idmanager_id,其中employee_id是主键,department_id是外键关联到departments表的department_idmanager_id是外键关联到employees表的employee_id,表示员工的直接上级。

这样就创建了两个简单的表,可以用于存储员工和部门的信息。

插入数据:

sql 复制代码
-- 向 departments 表插入数据
INSERT INTO departments (department_id, department_name) VALUES
(1, 'IT'),
(2, 'HR'),
(3, 'Finance'),
(4, 'Marketing'),
(5, 'Sales');

-- 向 employees 表插入数据
INSERT INTO employees (employee_id, employee_name, department_id, manager_id) VALUES
(1, 'John Doe', 1, NULL),
(2, 'Jane Smith', 2, 1),
(3, 'David Lee', 1, 1),
(4, 'Emily Brown', 3, 1),
(5, 'Michael Johnson', 4, 3),
(6, 'Lisa Wang', 1, 3),
(7, 'Tom Davis', 5, 4),
(8, 'Sarah White', 5, 4),
(9, 'Kevin Martin', 2, 1),
(10, 'Mary Wilson', 3, 1);

三、演示连接方式:

1.内连接(INNER JOIN):

sql 复制代码
SELECT e.employee_name, e.employee_id, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

结果:

sql 复制代码
employee_name   | employee_id | department_name
-----------------------------------------------
John Doe        | 1           | IT
Jane Smith      | 2           | HR
David Lee       | 3           | IT
Emily Brown     | 4           | Finance
Michael Johnson | 5           | Marketing
Lisa Wang       | 6           | IT
Tom Davis       | 7           | Sales
Sarah White     | 8           | Sales
Kevin Martin    | 9           | HR
Mary Wilson     | 10          | Finance

2.左外连接(LEFT JOIN):

sql 复制代码
SELECT e.employee_name, e.employee_id, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

结果:

sql 复制代码
employee_name   | employee_id | department_name
-----------------------------------------------
John Doe        | 1           | IT
Jane Smith      | 2           | HR
David Lee       | 3           | IT
Emily Brown     | 4           | Finance
Michael Johnson | 5           | Marketing
Lisa Wang       | 6           | IT
Tom Davis       | 7           | Sales
Sarah White     | 8           | Sales
Kevin Martin    | 9           | HR
Mary Wilson     | 10          | Finance

3.右外连接(RIGHT JOIN):

sql 复制代码
SELECT e.employee_name, e.employee_id, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

结果:

sql 复制代码
employee_name   | employee_id | department_name
-----------------------------------------------
John Doe        | 1           | IT
Jane Smith      | 2           | HR
David Lee       | 3           | IT
Emily Brown     | 4           | Finance
Michael Johnson | 5           | Marketing
Lisa Wang       | 6           | IT
Tom Davis       | 7           | Sales
Sarah White     | 8           | Sales
Kevin Martin    | 9           | HR
Mary Wilson     | 10          | Finance

4.交叉连接(CROSS JOIN):

sql 复制代码
SELECT e.employee_name, d.department_name
FROM employees e
CROSS JOIN departments d;

结果会返回所有可能的员工和部门组合,共50条记录(10个员工 * 5个部门)。

5.自连接(SELF JOIN):

假设我们想要查找每个员工的经理,我们可以使用自连接:

sql 复制代码
SELECT e.employee_name, m.employee_name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;

这将返回每个员工及其对应的经理的姓名。

相关推荐
Leo.yuan20 分钟前
不同数据仓库模型有什么不同?企业如何选择适合的数据仓库模型?
大数据·数据库·数据仓库·信息可视化·spark
麦兜*37 分钟前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
chat2tomorrow40 分钟前
数据采集平台的起源与演进:从ETL到数据复制
大数据·数据库·数据仓库·mysql·低代码·postgresql·etl
稻草人想看远方43 分钟前
关系型数据库和非关系型数据库
数据库
考虑考虑44 分钟前
Postgerssql格式化时间
数据库·后端·postgresql
千里码aicood1 小时前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan161 小时前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
TDengine (老段)1 小时前
TDengine 选择函数 Max() 用户手册
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
驾驭人生1 小时前
Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL
数据库·mysql·.netcore
float_六七1 小时前
预编译SQL:安全与性能的双重保障
sql·安全·oracle