06-多表查询

103 阅读2分钟

多表查询时,查询字段要指定是哪个表的,如果不指定,当两个表都有相同字段就会报错。

笛卡尔积

两个表的乘积,比如A 表有10 条数据,B表有10行,结果是100行数据
SELECT employee_id,department_name FROM employees,departments

等值连接

逻辑判断是相等
查询员工的employee_id,last_name,department_name
SELECT e.employee_id,last_name,d.department_name FROM employees e,departments d WHERE e.department_id = d.department

非等值连接

逻辑判断是大于,小于,大于等于,小于等于
查询员工的工资级别
SELECT e.last_name,e.salary,j.grade_level FROM employees e,job_grades j WHERE e.salary >= j.lowest_sal AND e.salary <= j.highest_sal 

自连接

字面自已连接自己,所有字段都是同一表的字段
查询是员工employee_id,姓名和员工管理者的姓名、manager_id
SELECT e.employee_id,e.last_name,m.last_name,m.manager_id FROM employees e,employees m WHERE e.employee_id = m.manager_id

内边接 两个表交集

106 条数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
JOIN departments d ON e.department_id = d.department_id;

左外连接 左表多余数据+交集数据

107 条数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id;

右外连接 右表多余数据+交集数据

122 条数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
RIGHT JOIN departments d ON e.department_id = d.department_id;

左表多余数据 左表所有数据-交集数据

1 条数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL

右表多余数据 右表所有数据-交集数据

16 条数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
RIGHT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NULL

右表多余数据 + 左表多余数据

17 条数据
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;

左表多余数据 + 交集数据 + 右表多余数据

123 数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id
UNION ALL
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
RIGHT JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id IS NULL

123 数据
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL
UNION ALL
SELECT e.employee_id,e.last_name,d.department_name FROM employees e 
RIGHT JOIN departments d ON e.department_id = d.department_id;