【MySQL】什么是多表查询
1.案例说明
下面有员工表、部门表、地址表三张表,查询员工名为'Abel'的人在哪个城市工作?
(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)
可以将任意表进行连接,即使这两张表没有关联
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中都必须使用表的别名,不能再使用表的原名。