一.准备工作
打开Navicat,新建一个名为employee的表以及一个名为department的表,表的字段如下,为后面的查询作准备,建完表后,自行给其中添加数据。
employee的表
department的表
二.储备知识
如果多表连接并且没有指定连接条件,那么将会产生很多没用的数据,导致查询效率降低,因此多表连接必须指定连接条件
三.多表查询的语法知识
3.1多个表都有的列名,在使用时必须指定使用的是哪张表的列名
例子: 查询一条员工信息,在查询该员工对应的部门名称
SELECT employee_id, last_name, salary, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;
3.2给表取别名
例子: 查询一条员工信息,在查询该员工对应的部门名称
SELECT employee_id, last_name, salary, department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;
3.3三表查询最少需要2个连接条件
例子: 查询一条员工信息
SELECT employee_id, last_name, e.department_id, department_name, d.location_id, city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id and d.location_id = l.location_id;
3.4自连接和非自连接
例子: 查询一条员工id,员工姓名,经理id,经理姓名(一张表当作两张使用,第一张用来查询员工信息,第二张查询经理信息)
SELECT worker.employee_id, worker.last_name, worker.manager_id, worker.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id;
3.5内连接
所有的sql语法都是sql92的语法
sql99的语法:select … from 表名1 join 表名2 on 连接条件1 join 表名3 on 连接条件2
内连接: 多表查询时,只显示符合条件的数据,不符合的数据被过滤掉
例子: 查询一条员工id,员工姓名,经理id,经理姓名(一张表当作两张使用,第一张用来查询员工信息,第二张查询经理信息)
SELECT emp1.employee_id, emp1.last_name, emp1.manager_id, emp2.last_name
FROM employees emp1
join employees emp2
on emp1.manager_id = emp2.employee_id;
3.6外连接
外连接: 多表查询时,有时希望不符合的数据也被显示出来。外连接分为左外连接和右外连接。
左外连接: 显示左表不符合条件的数据
右外连接: 显示右表不符合条件的数据
例子: 查询员工姓名,部门编号,部门名称,如果员工没有部门也查询出来
SELECT last_name, e.department_id, department_name
FROM employees e
LEFT OUTER JOIN departments d
on e.department_id = d.department_id;
3.7去掉重复的记录
例子: 查询部门id,并去掉重复的
SELECT DISTINCT department_id FROM employees;