多表查询(内连接与外连接的混合使用)(union联合)
内连接与外连接的混合使用: 格式:select*from表1 left other join 表2 on 条件 inner join 表3 on条件
查询工资高于公司平均工资的所有员工列:显示员工信息,部门名称,上级领导,工资等级 如下:
SELECT e.* ,d.dname 部门名称,m.ename 上级领导 ,s.grade 工资等级 FROM emp e LEFT OUTER JOIN emp m ON e.mgr=m.id INNER JOIN dept d ON e.dept_id=d.id INNER JOIN salarygrade s ON e.salary BETWEEN s.losalary AND hisalary AND e.salary>( SELECT AVG(salary) FROM emp) LIMIT 0, 1000;
union联合: 格式: 左连接+union+右连接
左连接:
使用左表的每一条数据与右边的每一条数据组合,不管条件是否满足,左表的数据都会显示出来。 格式: select 字段 from 表1 left outer join 表2,… on 清除笛卡尔积的条件 and 其他的条件
如: 查询出所有的员工,显示所有的员工信息,并且需要显示该员工所属的部门名称。 SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.dept_id = d.id;
右连接:
使用右表的每一条数据与左边的每一条数据组合,不管条件是否满足,右表的数据都会显示出来。 格式: select 字段 from 表1 right outer join 表2,… on 清除笛卡尔积的条件 and 其他的条件 如:
查询出所有的员工信息,并且要显示员工所属的部门名称,不管该部门是否存在员工,都需要显示。 SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.dept_id = d.id ;
union:
会把两个sql语句的查询结果合并,如果是重复的数据只会显示一次。 格式: select * from 表1 left outer join 表2 on 清除笛卡尔积的条件 union select * from 表1 right outer join 表2 on 清除笛卡尔积的条件
如: SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.dept_id = d.id UNION SELECT * FROM emp e RIGHT OUTER JOIN dept d ONe.dept_id = d.id ;
