【MySQL】什么是多表查询

1.案例说明

下面有员工表、部门表、地址表三张表,查询员工名为'Abel'的人在哪个城市工作?
image
(1)可以这么写

#1.先从员工表中查询姓名为Abel的员工,得到他的部门id为80
SELECT * 
FROM employees
WHERE last_name = 'Abel';

#2.根据他的部门id查找他的地址id,得到地址id为2500
SELECT *
FROM departments
WHERE department_id = 80;

#3.根据地址id找到城市为Oxford
SELECT *
FROM locations 
WHERE location_id = 2500;

(2)多条查询语句需要请求3次,尝试写成一条
查询员工姓名和他的部门名称

SELECT last_name,department_name
FROM employees,departments;

SELECT employee_id,department_name
FROM employees CROSS JOIN departments;

查询结果共2889条数据,每个员工都和部门进行了匹配,员工数107×部门数27 = 2889,出现笛卡尔积错误,缺少连接条件。
这4条查询结果都为2889条数据。

#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments;

SELECT last_name,department_name FROM employees CROSS JOIN departments;

SELECT last_name,department_name FROM employees INNER JOIN departments;

SELECT last_name,department_name FROM employees JOIN departments;

2.笛卡尔积(交叉连接CROSS JOIN)

可以将任意表进行连接,即使这两张表没有关联
image

3.加入连接条件

为避免笛卡尔积错误,需要在where添加有效的连接条件。
表中有相同列时,需要在列名前加上表名前缀。

SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id;

#优化后
SELECT emp.employee_id,dept.department_name,emp.department_id
FROM employees emp,departments dept
WHERE emp.`department_id` = dept.department_id;

结果为106条数据。
结论:如果有n个表实现多表的查询,则需要至少n-1个连接条件
如果给表起了别名,在SELECT和WHERE中都必须使用表的别名,不能再使用表的原名。

posted @ 2022-07-17 16:59  植树chen  阅读(84)  评论(0编辑  收藏  举报