mysql中的多表查询
多表查询
多表查询是建立在单表查询的基础之上的
首先来看一下单表查询的基本操作
select distinct 字段名1,字段2from 表名
where 过滤条件1,过滤条件2
group by (分组)字段1,字段2,
having 过滤条件3,过滤条件4,
order by desc(asc),
limit 5,5;
执行顺序
from,where,group by,having,
基于此 我们来认识一下笛卡尔积
create table dep(
id int,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female')not null default 'male',
age int,
dep_id int
);
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');
insert into emp(name,age,dep_id)values
('jason','male',18,200),
('egon','male',48,201),
('kevin','male',38,201),
('nick','female',28,202),
('owen','male',18,200),
('jerry','female',18,204)
;
select * from emp ,dep;
select * from emp,dep where emp.(dep_id) = dep.id
select * from emp,dep where emp.dep_id =dep.id and dep.name ='技术';
内连接(其实也是笛卡尔积,换一种形式)
select * from emp inner join dep on emp.dep_id = dep.id;
select * from emp inner join dep on emp.dep_id = dep.id where dep.name = '技术';
左连接(left inner join)
select * from emp left join dep on emp.dep_id = dep.id;
右连接(right inner join)
select * from emp right join dep on emp.dep_id = dep.id;
全连接(full join 但是mysql不支持 支持左外连接和右外连接之间加上union)
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
子查询:
就是将一个查询语句的结果用括号括起来当作另外一个查询语句条件使用
查询部门是技术或者人力资源的员工信息
2每个部门最新入职的员工 思路: 先查每个部门最新入职的员工 ,再按部门对应上连表查询
规律:
表的查询结果可以作为其他表的查询条件,也可以通过起别名的方式把它作为一张虚拟表去跟其他表做关联查询
select name from dep where id in
(select dep_id emp group by dep_id
having avg(age)>25);
# exist 关键字
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,
而是返回一个真假值,True或False。
当返回True时,外层查询语句将进行查询
当返回值为False时,外层查询语句不进行查询。
select * from emp where exists (select * from dep where 1=2);
select * from emp where exists (select * from dep where id >1);
承蒙关照