插件窝 干货文章 sql多表连接查询3个表

sql多表连接查询3个表

连接 dept emp name 958    来源:    2025-03-29

SQL 多表连接查询(3个表)

在SQL中,连接3个表的查询是常见的操作,下面我将介绍几种常用的连接方式及其示例。

基本连接类型

  1. 内连接(INNER JOIN) - 只返回匹配的行
  2. 左连接(LEFT JOIN) - 返回左表所有行,右表不匹配则为NULL
  3. 右连接(RIGHT JOIN) - 返回右表所有行,左表不匹配则为NULL
  4. 全连接(FULL JOIN) - 返回所有表的行,不匹配则为NULL

示例场景

假设我们有3个表: - employees (员工表) - departments (部门表) - projects (项目表)

表结构

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(100),
    dept_id INT,
    salary DECIMAL(10,2)
);

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100),
    location VARCHAR(100)
);

CREATE TABLE projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(100),
    emp_id INT,
    start_date DATE,
    end_date DATE
);

示例查询

1. 内连接三个表

SELECT 
    e.emp_id, 
    e.emp_name, 
    d.dept_name, 
    p.project_name
FROM 
    employees e
INNER JOIN 
    departments d ON e.dept_id = d.dept_id
INNER JOIN 
    projects p ON e.emp_id = p.emp_id;

2. 左连接三个表

SELECT 
    e.emp_id, 
    e.emp_name, 
    d.dept_name, 
    p.project_name
FROM 
    employees e
LEFT JOIN 
    departments d ON e.dept_id = d.dept_id
LEFT JOIN 
    projects p ON e.emp_id = p.emp_id;

3. 混合连接类型

SELECT 
    e.emp_id, 
    e.emp_name, 
    d.dept_name, 
    p.project_name
FROM 
    employees e
INNER JOIN 
    departments d ON e.dept_id = d.dept_id
LEFT JOIN 
    projects p ON e.emp_id = p.emp_id;

4. 带条件的多表连接

SELECT 
    e.emp_id, 
    e.emp_name, 
    d.dept_name, 
    p.project_name
FROM 
    employees e
INNER JOIN 
    departments d ON e.dept_id = d.dept_id
INNER JOIN 
    projects p ON e.emp_id = p.emp_id
WHERE 
    d.location = 'New York'
    AND p.start_date > '2023-01-01';

5. 使用别名和聚合函数

SELECT 
    d.dept_name,
    COUNT(e.emp_id) AS employee_count,
    COUNT(p.project_id) AS project_count,
    AVG(e.salary) AS avg_salary
FROM 
    departments d
LEFT JOIN 
    employees e ON d.dept_id = e.dept_id
LEFT JOIN 
    projects p ON e.emp_id = p.emp_id
GROUP BY 
    d.dept_name;

性能考虑

  1. 索引:确保连接字段有适当的索引
  2. 连接顺序:通常从小表连接到大表性能更好
  3. 选择性:优先使用选择性高的条件进行过滤
  4. 只查询需要的列:避免使用SELECT *

其他连接方式

使用WHERE子句连接(旧式语法)

SELECT 
    e.emp_id, 
    e.emp_name, 
    d.dept_name, 
    p.project_name
FROM 
    employees e, 
    departments d, 
    projects p
WHERE 
    e.dept_id = d.dept_id
    AND e.emp_id = p.emp_id;

虽然这种语法仍然有效,但推荐使用显式的JOIN语法,因为它更清晰且更容易理解连接条件。