内连接
内查询查询的两张表交集的部分,分为隐式内连接和显式内连接
隐式查询 select 列名.... from 表1,表2 where 连表得条件。
-- 连表查询时,如果不使用连表条件则出现笛卡尔集。
-- 所谓笛卡尔集 就是A表中每一条记录关联B中中得每条记录
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)
select * from tb_emp,tb_dept where tb_emp.dept_id=tb_dept.id;
-- 如果表的名字很长 可以为表起别名
select * from tb_emp e, tb_dept d where e.dept_id=d.id;
-- 显示连接: A表 inner join B表 on 连表条件。
2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)
select * from tb_emp inner join tb_dept on tb_emp.dept_id=tb_dept.id;
select * from tb_emp e inner join tb_dept d on e.dept_id=d.id;
-- 上面的 inner可以省略。
select * from tb_emp e join tb_dept d on e.dept_id=d.id;
外连接
查询的两张表交集的部分,分为左外连接和右外连接
语法: select 查询列集 from A表 left join B表 on 连表条件
-- 1.查询emp表的所有数据, 和对应的部门信息(左外连接)
select * from tb_emp e left outer join tb_dept d on e.dept_id = d.id;
select * from tb_emp e left join tb_dept d on e.dept_id=d.id;
-- 2.查询dept表的所有数据,和对应的员工信息(右外连接)
select * from tb_emp e right join tb_dept d on e.dept_id=d.id;
3.5 自联查询
自己和自己相连接查询。 select * from A表 join A表 on 连表条件。
自连接 --1.查询员工及其所属领导的名字。 --2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来
-- 1.查询员工及其所属领导的名字。你要查询的结果再一张表中,但是还不能使用单表查询得到结果。 select a.name,b.name from tb_emp a join tb_emp b on a.managerid=b.id; -- 2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来 select a.name,b.name from tb_emp a left join tb_emp b on a.managerid=b.id;
4. 子查询---嵌套查询
一个查询的结果 作为另一个查询的条件 或者 临时表。 -- 查询市场部的员工信息----- -- 子查询返回的结果一列一条记录。 这个时候可以用= select * from tb_emp where dept_id=(select id from tb_dept where name='市场部') -- 查询市场部和研发部员工的信息。in -- -- 查询市场部和研发部员工的信息。 -- a) 查询市场部和研发部的编号 select id from tb_dept where name in('市场部','研发部') -- b) 再员工表中根据部门编号查询员工信息 select * from tb_emp where dept_id in (select id from tb_dept where name in('市场部','研发部')) -- 查询在“方东白”入职之后的员工信息 select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白') -- -- 查询比财务部所有人工资都高的员工信息。 a)求出财务部中最高的工资。 select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部' b) 根据财务部最高工资查询其他员工信息 select * from tb_emp where salary>( select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部')
5. 组合查询
多个查询的结果 组合到一起。 sql union sql --->把这两条sql查询的结果组合到一起。如果有重复记录则合并成一条。 sql union all sql--->把这两条sql查询的结果组合到一起。如果有重复记录,不合并。 注意: 这两条sql返回的字段必须一样。 select name from tb_emp where salary>8000 UNION select * from tb_emp where age>40;