0
点赞
收藏
分享

微信扫一扫

【笔记】14. 多表联合查询

Just_Esme 2022-01-31 阅读 29
sql
-- 创建部门表
create table if not exists dept3(
  deptno varchar(20) primary key,  -- 部门号
  name varchar(20) -- 部门名字
);
 
-- 创建员工表
create table if not exists emp3(
  eid varchar(20) primary key, -- 员工编号
  ename varchar(20), -- 员工名字
  age int,  -- 员工年龄
  dept_id varchar(20)  -- 员工所属部门
);

-- 给dept3表添加数据
insert into dept3 values('1001','研发部');
insert into dept3 values('1002','销售部');
insert into dept3 values('1003','财务部');
insert into dept3 values('1004','人事部');
-- 给emp表添加数据
insert into emp3 values('1','乔峰',20, '1001');
insert into emp3 values('2','段誉',21, '1001');
insert into emp3 values('3','虚竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','扫地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鸠摩智',50, '1002'); 
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');

-- 内连接查询
select * from dept3,emp3 where dept3.deptno = emp3.dept_id;
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;
#查询每个部门的所属员工
select dept3.`name`,emp3.`ename` from dept3 inner join emp3 on dept3.deptno = emp3.dept_id; 
#查询研发部门的所属员工
select * from dept3 INNER JOIN emp3 on dept3.deptno=emp3.dept_id and dept3.deptno = '1001';
#查询研发部和销售部的员工
select * from dept3 INNER JOIN emp3 on dept3.deptno=emp3.dept_id and (dept3.deptno = '1001' or dept3.deptno ='1002');
select * from dept3 INNER JOIN emp3 on dept3.deptno=emp3.dept_id and dept3.deptno in ('1001','1002');
#查询每个部门的员工数,并升序
select dept3.`name`,COUNT(*) from dept3 INNER JOIN emp3 on dept3.deptno=emp3.dept_id GROUP BY dept3.`name` ORDER BY COUNT(*);
#查询人数大于等于3的部门,按人数降序
select dept3.`name`,COUNT(*) from dept3 INNER JOIN emp3 on dept3.deptno=emp3.dept_id GROUP BY dept3.`name` having COUNT(emp3.ename) >= 3 ORDER BY COUNT(*) desc;

-- 左外连接查询
#查询哪些部门有员工,哪些部门没有员工
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;
#多张表
# select * from A left outer join B on 条件1 left outer join C on 条件2 

-- 右外连接查询
#查询哪些员工有部门
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

-- union实现左外和右外的并集(满外连接)
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;
union #union去重,union all不去重
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

-- 子查询
#查询年龄最大的员工信息
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id and emp3.age = (select max(emp3.age) from emp3);
#查询研发部和销售部的员工信息
select * from emp3 where dept_id in (select dept3.deptno from dept3 where name = '研发部' or name = '销售部');
#查询研发部20岁以下的员工信息
select * from emp3 where dept_id = (select dept3.deptno from dept3 where name = '研发部') and age < 30;

-- 关键字
-- all
#查询年龄大于1003部门所有年龄的员工信息
SELECT * from dept3 INNER JOIN emp3 on dept3.deptno = emp3.dept_id and emp3.age>all(select emp3.age from emp3 where emp3.dept_id = '1003');
#查询不属于任何一个部门的员工信息
SELECT * from emp3 where emp3.dept_id != all(select deptno from dept3);
-- any和some: 大于任意一个就可以,相当于or,即大于最小值
SELECT * from dept3 INNER JOIN emp3 on dept3.deptno = emp3.dept_id and emp3.age>any(select emp3.age from emp3 where emp3.dept_id = '1003');
-- in
-- exists: 必须起别名
#查询是否有大于60岁的员工,有则输出
select * from emp3 a where exists(select * from emp3 where a.age > 60);
#查询有所属部门的员工信息
select * from emp3 a where exists(select * from emp3 where a.dept_id in(select dept3.deptno from dept3));
举报

相关推荐

0 条评论