mysql多表查询

数据准备

1.部门表

create table dept (
    id int auto_increment primary key comment 'id',
    name varchar(50) not null comment '部门名称'
) comment '部门表';

insert into dept (id, name)
values (1, '研发部'),
       (2, '市场部'),
       (3, '财务部'),
       (4, '销售部'),
       (5, '总经办'),
       (6, '人事部');

2.员工表

create table emp(
    id int auto_increment primary key ,
    name varchar(50) not null ,
    age int,
    job varchar(20) comment '职位',
    salary int ,
    entrydate date comment '入职时间',
    managerid int comment '直属领导id',
    dept_id int comment '所在部门id'
) comment '员工表';

insert into emp
values ( 1, '金庸', 66, '总裁', 20000, '2000-01-01', null, 5 ),
       ( 2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1 ),
       ( 3, '杨晓', 33, '开发', 8400, '2000-11-03', 2, 1 ),
       ( 4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1 ),
       ( 5, '陈玉存', 43, '开发', 10500, '2004-09-07', 3, 1 ),
       ( 6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1 ),
       ( 7, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3 ),
       ( 8, '周芷若', 19, '会计', 48000, '2006-06-02', 7, 3 ),
       ( 9, '丁敏君', 23, '出纳', 5250, '2009-05-13', 7, 3 ),
       ( 10, '赵敏', 20, '市场部总监', 12500, '2004-10-12', 1, 2 ),
       ( 11, '鹿杖客', 56, '职员', 3750, '2006-10-03', 10, 2 ),
       ( 12, '何碧文', 19, '职员', 3750, '2007-05-09', 10, 2 ),
       ( 13, '东方白', 19, '职员', 5500, '2009-02-12', 10, 2 ),
       ( 14, '张三丰', 88, '销售总监', 14000, '2004-10-12', 1, 4 ),
       ( 15, '鱼梁洲', 38, '销售', 4600, '2004-10-12', 14, 4 ),
       ( 16, '宋远桥', 40, '销售', 4600, '2004-10-12', 14, 4 ),
       ( 17, '陈友谅', 42, null, 2000, '2011-10-12', 1, null );

3.工资等级表

create table salgrade (
    grade int,
    losal int comment '本薪资等级的最低界限',
    hisal int comment '最高界限'
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,025001,30000);

多表查询方式

-- 笛卡尔积
select * from dept d ,emp e
-- 消除笛卡尔积
select * from dept d ,emp e where d.id =e.dept_id 

-- 内连接查询的是两张表交集的部分
-- 内连接 显示内连接
select d.name ,e.name  from dept d inner join emp e  on e.dept_id =d.id
-- 内连接 隐式内连接
select d.name, e.name from dept d ,emp e where d.id =e.dept_id 

-- 左外连接相当于查询表1的所有数据包含表1和表2交集的部分数据	(交集部分和左边剩余部分)
select emp.* ,dept.* from emp left outer join dept on emp.dept_id =dept.id

-- 右外连接相当于查询表2的所有数据包含表1和表2交集部分的数据(交集部分和右边剩余部分)
select dept.* ,emp.* from emp right outer join dept on emp.dept_id  =dept.id 

-- 自链接查询可以是内连接查询也可以是外连接查询
select e.name ,d.name  from emp e join emp  d on e.managerid =d.id 

-- 对于联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集
select * from emp where salary >5000 
union  all 
select * from emp where  age >30

select * from emp where salary >5000 
union 
select * from emp where  age >30


-- SQL语句中嵌套select语句为嵌套查询,又称子查询 --标量子查询
select * from emp where dept_id =(select id  from dept where name="研发部")

-- SQL语句中嵌套select语句为嵌套查询,又称子查询 --列子查询
select * from emp where dept_id in (select id from dept where name="研发部" or name="销售部")

-- SQL语句中嵌套select语句为嵌套查询,又称子查询 --行子查询
select * from emp where (salary,managerid)=(select salary, managerid from emp where name='张无忌');

-- SQL语句中嵌套select语句为嵌套查询,又称子查询 --表子查询
select e.*, dept.* from (select * from emp where entrydate>'2006-01-01') e left outer join dept on e.dept_id=dept.id

sql语句练习

在这里插入图片描述

-- 1.查询员工的姓名,年龄,职位,部门等信息
select e.name ,e.age ,e.job ,d.id ,d.name  from emp e ,dept d where e.dept_id =d.id 

-- 2.查询年龄小于30岁的员工的姓名,年龄,职位,部门等信息
select e.name,e.age,e.job,d.*  from emp e inner join dept d on e.dept_id = d.id where e.age<30;

-- 3.查询拥有员工的部门id,部门名称
select distinct d.* from emp e, dept d where d.id=e.dept_id;

-- 4.查询所有年龄大于40岁的员工,及其归属的部门名称,如果员工没有分配归属部门,也需要展示出来
select e.*,d.name  from emp e left outer join dept d on e.dept_id =d.id  where  e.age >40

-- 5.查询所有员工的工资等级
select e.*, s.grade  from emp e , salgrade s where e.salary between s.losal and s.hisal 

-- 6.查询“研发部”所有员工的信息以及工资等级
select e.*,s.grade from emp e ,salgrade s ,dept d where (e.dept_id=d.id)and (d.name="研发部")and (e.salary between s.losal and s.hisal)

-- 7.查询研发部员工的平均工资
select avg(e.salary) from emp e ,dept d where e.dept_id =d.id and d.name ="研发部" 

-- 8.查询工资比灭绝高的员工信息
select * from emp where emp.salary  >(select emp.salary from emp where emp.name="灭绝")

-- 9.查询工资比平均工资高的员工信息
select * from emp  where salary >( select avg(e.salary) from emp e)

-- 10.查询低于本部门平均工资的员工信息
select * from emp where emp.salary < (select avg(salary) from emp e where e.dept_id=emp.dept_id) 

-- 11.查询所有的部门信息,并统计部门的员工人数
select d.*, (select count(*) from emp where emp.dept_id=d.id)from dept d 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小唐僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值