mysql多表查询

内连接查询:

定义:只查询交集

隐式内连接:

语法:select 查询字段 from 表1,表2 where 查询条件;

-- 多表查询之隐式内连接
select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;

显示内连接:

语法:select 查询字段 from 表1 inner join 表2 on 查询条件;

-- 多表查询之显式内连接
select e.name,d.name from emp e inner join dept d on e.dept_id = d.id;

外连接查询:

左外连接查询:查询左表全部以及交集部分;

语法:select 查询字段 from 表1 left outer join 表2 on 查询条件;

-- 多表查询之左外连接
select e.name,d.name from emp e left join dept d on d.id = e.dept_id;

右外连接查询:查询右表全部以及交集部分;

语法:select 查询字段 from 表1 right outer join 表2 on 查询条件;

-- 多表查询之右外连接
select e.name,d.name from emp e right outer join dept d on d.id = e.dept_id;

自连接查询:

定义:自连接查询其实就相当于把自身一个表通过起不同的别名当做不同的表,再进行内连接或外连接查询;

-- 自连接之内连接
select a.*,b.name as '领导' from emp a , emp b where a.managerid = b.id;
-- 自连接之右外连接
select a.*,b.name as '领导' from emp a right join emp b on a.managerid=b.id;

联合查询:

定义:把几次查询的结果合并到一起,要求几次查询的结果字段要一模一样,否则无法合并;

关键字:union all不去重直接合并,union去重后合并;

-- 联合查询
select * from emp where salary < 10000
union all
select * from emp where age > 50;  #union all直接合并,不去重;

select * from emp where salary < 10000
union
select * from emp where age > 50; #union去重后合并;

子查询:

定义:把一次查询的结果作为其它查询的条件;

关键字:in,all,any

-- 子查询
-- 查询研发部的所有员工信息
select *
from emp
where dept_id = (select id from dept where name = '研发部');


-- 查询入职日期在韦一笑之后的所有员工信息
select *
from emp
where entrydate > (select emp.entrydate from emp where name = '韦一笑');


-- 查询研发部和总经办所有员工的信息
select *
from emp
where dept_id in (select id from dept where name = '研发部' or name = '总经办');


-- 查询比总经办所有人工资都高的员工信息
select *
from emp
where salary > all (select salary from emp where dept_id = (select id from dept where name = '总经办'));

-- 查询比总经办任意一人工资高的员工信息
select *
from emp
where salary > any (select salary from emp where dept_id = (select id from dept where name = '总经办'));

-- 查询与张无忌薪资和领导相同的员工信息
select *
from emp
where (salary, managerid) = (select salary, managerid from emp where name = '张无忌');


-- 查询与张无忌和韦一笑职位、薪资相同的员工的信息
select *
from emp
where (job, salary) in (select job, salary from emp where name = '张无忌' or name = '韦一笑');


-- 查询入职日期在2004-01-01之后的员工信息及其部门
select e.*, d.name
from (select * from emp where entrydate > '2004-01-01') e
         left outer join dept d on e.dept_id = d.id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值