以下实例以常见的业务场景为例,使用 MySQL 语法,假设存在员工表(employees)、部门表(departments)、订单表(orders)、客户表(customers)等,来展示等值连接的不同用法:
实例1:员工与部门信息关联
员工表(employees):
emp_id emp_name dept_id
1 Alice 101
2 Bob 102
部门表(departments):
dept_id dept_name
101 销售部
102 技术部
需求:查询每个员工所属的部门名称。
SELECT e.emp_name, d.dept_name
FROM employees e
– 通过部门id进行等值连接
INNER JOIN departments d ON e.dept_id = d.dept_id;
结果:
emp_name dept_name
Alice 销售部
Bob 技术部
实例2:订单与客户信息关联
订单表(orders):
order_id customer_id order_amount
1001 C001 500
1002 C002 800
客户表(customers):
customer_id customer_name
C001 张三
C002 李四
需求:查询每个订单对应的客户姓名。
SELECT o.order_id, o.order_amount, c.customer_name
FROM orders o
– 通过客户id进行等值连接
INNER JOIN customers c ON o.customer_id = c.customer_id;
结果:
order_id order_amount customer_name
1001 500 张三
1002 800 李四
实例3:多表等值连接(员工、部门、项目)
员工表(employees):
emp_id emp_name dept_id
1 Alice 101
2 Bob 102
部门表(departments):
dept_id dept_name
101 销售部
102 技术部
项目表(projects):
project_id emp_id project_name
P001 1 项目A
P002 2 项目B
需求:查询每个员工所属部门以及参与的项目名称。
SELECT e.emp_name, d.dept_name, p.project_name
FROM employees e
– 员工表与部门表通过部门id等值连接
INNER JOIN departments d ON e.dept_id = d.dept_id
– 员工表与项目表通过员工id等值连接
INNER JOIN projects p ON e.emp_id = p.emp_id;
结果:
emp_name dept_name project_name
Alice 销售部 项目A
Bob 技术部 项目B
实例4:带条件的等值连接(查询特定部门员工)
员工表(employees):
emp_id emp_name dept_id
1 Alice 101
2 Bob 102
3 Charlie 101
部门表(departments):
dept_id dept_name
101 销售部
102 技术部
需求:查询销售部的员工姓名。
SELECT e.emp_name, d.dept_name
FROM employees e
– 通过部门id进行等值连接
INNER JOIN departments d ON e.dept_id = d.dept_id
– 添加条件筛选销售部
WHERE d.dept_name = ‘销售部’;
结果:
emp_name dept_name
Alice 销售部
Charlie 销售部
实例5:自连接(查询员工及其上级)
员工表(employees):
emp_id emp_name manager_id
1 Alice NULL
2 Bob 1
3 Charlie 1
需求:查询每个员工及其对应的上级姓名(manager_id为上级的emp_id)。
SELECT e.emp_name AS employee, m.emp_name AS manager
FROM employees e
– 自连接,员工表与自身通过manager_id和emp_id进行等值连接
INNER JOIN employees m ON e.manager_id = m.emp_id;
结果:
employee manager
Bob Alice
Charlie Alice
实例6:等值连接与聚合函数(统计每个部门的员工数量)
员工表(employees):
emp_id emp_name dept_id
1 Alice 101
2 Bob 102
3 Charlie 101
部门表(departments):
dept_id dept_name
101 销售部
102 技术部
需求:统计每个部门的员工数量。
SELECT d.dept_name, COUNT(e.emp_id) AS employee_count
FROM employees e
– 通过部门id进行等值连接
INNER JOIN departments d ON e.dept_id = d.dept_id
– 按部门名称分组
GROUP BY d.dept_name;
结果:
dept_name employee_count
销售部 2
技术部 1
实例7:等值连接与子查询(查询购买特定商品的客户信息)
订单表(orders):
order_id customer_id product_id
1001 C001 P001
1002 C002 P002
1003 C001 P003
客户表(customers):
customer_id customer_name
C001 张三
C002 李四
需求:查询购买了商品P001的客户姓名(通过子查询先找出购买P001的订单对应的客户id)。
SELECT c.customer_name
FROM customers c
– 通过客户id进行等值连接
INNER JOIN (
SELECT customer_id
FROM orders
WHERE product_id = ‘P001’
) o ON c.customer_id = o.customer_id;
结果:
customer_name
张三
实例8:使用别名的等值连接(避免列名冲突)
员工表1(employees1):
emp_id emp_name dept_id
1 Alice 101
2 Bob 102
员工表2(employees2):
emp_id emp_salary dept_id
1 5000 101
2 6000 102
需求:查询每个员工的姓名和工资。
SELECT e1.emp_name, e2.emp_salary
FROM employees1 e1
– 通过员工id和部门id进行等值连接,使用别名区分表
INNER JOIN employees2 e2 ON e1.emp_id = e2.emp_id AND e1.dept_id = e2.dept_id;
结果:
emp_name emp_salary
Alice 5000
Bob 6000