一、内连接查询(INNER JOIN)
内连接查询只返回两个表中匹配的记录,即只有在两个表中都存在的记录才会被返回。内连接查询是最常用的连接查询方式。
场景1: 假设有两个表,一个是订单表 orders,包含订单编号 order_id、商品编号 goods_id 和用户编号 user_id;另一个是商品表 goods,包含商品编号 goods_id、商品名称 goods_name 和商品单价 price。如下:
orders 表:
order_id | goods_id | user_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 1 |
4 | 2 | 3 |
goods 表:
order_id | goods_name | price |
---|---|---|
1 | 商品A | 10 |
2 | 商品B | 20 |
3 | 商品C | 30 |
4 | 商品D | 40 |
现在想要查询所有订单的商品名称和商品单价,可以使用内连接查询
SELECT orders.order_id, goods.goods_name, goods.price
FROM orders
INNER JOIN goods ON orders.goods_id = goods.goods_id;
结果:
order_id | goods_name | price |
---|---|---|
1 | 商品A | 10 |
2 | 商品B | 20 |
3 | 商品C | 30 |
4 | 商品B | 20 |
二、左连接查询(LEFT JOIN)
左连接查询返回左表中的所有记录和右表中的匹配记录。如果左表中的记录在右表中没有匹配的记录,则使用 NULL 填充。
场景1: 假设有两个表,一个是员工表 employees,包含员工编号 id、员工姓名 name 和所属部门编号 department_id;另一个是工资表 salaries,包含工资编号 id、员工编号 employee_id 和工资 salary。如下:
employees 表:
id | name | department_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 1 |
4 | 赵六 | 3 |
salaries 表:
id | employee_id | salary |
---|---|---|
1 | 1 | 5000 |
2 | 2 | 8000 |
3 | 3 | 6000 |
现在想要查询所有员工的姓名和工资,可以使用左连接查询
SELECT employees.name, salaries.salary
FROM employees
LEFT JOIN salaries ON employees.id = salaries.employee_id;
结果:
name | salary |
---|---|
张三 | 5000 |
李四 | 8000 |
王五 | 6000 |
赵六 | NULL |
三、右连接查询(RIGHT JOIN)
右连接查询返回右表中的所有记录和左表中的匹配记录。如果右表中的记录在左表中没有匹配的记录,则使用 NULL 填充。
场景1: 假设有两个表,一个是工资表 salaries,包含工资编号 id、员工编号 employee_id 和工资 salary;另一个是员工表 employees,包含员工编号 id、员工姓名 name 和所属部门编号 department_id。如下:
salaries 表:
salaries 表:
id | employee_id | salary |
---|---|---|
1 | 1 | 5000 |
2 | 2 | 8000 |
3 | 3 | 6000 |
employees 表:
id | name | department_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 1 |
4 | 赵六 | 3 |
现在想要查询所有工资信息和对应的员工姓名,可以使用右连接查询
SELECT employees.name, salaries.salary
FROM salaries
RIGHT JOIN employees ON employees.id = salaries.employee_id;
结果:
name | salary |
---|---|
张三 | 5000 |
李四 | 8000 |
王五 | 6000 |
NULL | NULL |