create table emp(
id int auto_increment comment 'ID' primary key ,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(50) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';
insert into emp(id,name,age,job,salary,entrydate,managerid,dept_id) values
(1,'金庸',66,'总裁',20000,'2000-1-1',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,'会计',4800,'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,'职员',3760,'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);
create table dept(
id int auto_increment comment 'ID' primary key ,
name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id,name) values (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'z总经办');
alter table emp add constraint fk_deptid foreign key (dept_id) references dept (id);
create table salgrade(
grade int,
losal int,
hisal int
) 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,25001,30000);
1.查询员工的姓名,年龄,职位,部门信息 (隐式内连接)
select e.name, e.age, e.job, d.name from emp e, dept d where e.dept_id = d.id;
2.查询年龄小于30岁的员工姓名,年龄,职位,部门信息(显式内连接,隐式内连接)
select e.name, e.age, e.job, d.name from emp e inner join dept d on e.dept_id = d.id where e.age < 30;
3.查询拥有员工的部门名称,部门ID
select distinct d.name, d.id from emp e, dept d where e.dept_id = d.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.salray between s.losal and s.hisal;
6.查询‘研发部’所有员工的信息及工资等级
select e.*, s.grade from emp e, salgrade s where e.salary between s.losal and s.hisal and e.dept_id = (select id from dept where name = '研发部');
7.查询‘研发部’员工的平均工资
select avg(salary) from emp e where e.id = (select id from dept where name = '研发部');
8.查询工资比‘灭绝’高的员工信息
select * from emp e where e.salary > (select salary from emp where name = '灭绝');
9.查询比平均薪资高的员工信息
select * from emp e where e.salary > (select avg(salary) from emp);
*10.查询低于本部门平均工资的员工信息(前面的e1传递给后面进行部门是否相同的比较)
select * from epm e1 where e1.salary < (select avg(salary) from emp e2 where e2.dept_id = e1.dept_id);
*11.查询所有的部门信息,并统计部门的员工人数
select count(*) from emp where dept_id =
select d.id, d.name, (select count(*) from emp where dept_id = d.id) '人数' from dept ;
总结:
查询拥有员工的部门(级交集)使用内连接查询,注意用distinct去除重复
若没有员工的部门也要显示出来(即两表并集),使用左外连接
外部字段的可以传递给子查询作为条件进行判断