mysql综合实验

USE dept_emp;    
CREATE TABLE dept (
    deptno INT(2) NOT NULL COMMENT '部门编号',
    dname VARCHAR (15) COMMENT '部门名称',
    loc VARCHAR (20) COMMENT '地理位置' 
);

-- 添加主键
ALTER TABLE dept ADD PRIMARY KEY (deptno);
INSERT INTO dept (deptno,dname,loc)VALUES (10,'财务部','高新四路');
INSERT INTO dept (deptno,dname,loc)VALUES (20,'人事部','科技二路');
INSERT INTO dept (deptno,dname,loc)VALUES (30,'销售部','长安区');
INSERT INTO dept (deptno,dname,loc)VALUES (40,'运输部','雁塔区');

mysql综合实验_第1张图片

mysql综合实验_第2张图片

CREATE TABLE emp(
    empno INT(4) NOT NULL COMMENT '员工编号',
    ename VARCHAR(10) COMMENT '员工名字',
    job VARCHAR(10) COMMENT '职位',
    mgr INT(4) COMMENT '上司',
    hiredate DATE COMMENT '入职时间',
    sal INT(7) COMMENT '基本工资',
    comm INT(7) COMMENT '补贴',
    deptno INT(2) COMMENT '所属部门编号'
);

-- 添加主键
ALTER TABLE emp ADD PRIMARY KEY (empno);

-- 添加外键约束
ALTER TABLE emp ADD CONSTRAINT f_ed_key
FOREIGN KEY (deptno) 
REFERENCES dept(deptno);
INSERT INTO `emp` VALUES('7369','张倩','办事员','7902','2002-12-17','820',NULL,'20');
INSERT INTO `emp` VALUES('7499','刘博','售货员','7698','1992-02-20','1900','300','30');
INSERT INTO `emp` VALUES('7521','李兴','售货员','7698','1995-07-22','1250','500','30');
INSERT INTO `emp` VALUES('7566','李雷','人事部长','7839','1991-04-02','975',NULL,'20');
INSERT INTO `emp` VALUES('7654','刘浩','售货员','7698','1991-09-28','1250','1400','30');
INSERT INTO `emp` VALUES('7698','刘涛','销售部长','7839','1997-05-01','2850',NULL,'30');
INSERT INTO `emp` VALUES('7782','华仔','人事部长','7839','1995-06-09','2450',NULL,'10');
INSERT INTO `emp` VALUES('7788','张飞','人事专员','7566','1998-04-19','3000',NULL,'20');
INSERT INTO `emp` VALUES('7839','马晓云','董事长',NULL,'1991-11-17','5000',NULL,'10');
INSERT INTO `emp` VALUES('7844','马琪','售货员','7698','1996-09-08','1500','0','30');
INSERT INTO `emp` VALUES('7876','李涵','办事员','7788','1997-05-23','1100',NULL,'20');
INSERT INTO `emp` VALUES('7900','李小涵','销售员','7698','1993-2-13','950',NULL,'30');
INSERT INTO `emp` VALUES('7902','张三','人事组长','7566','1992-10-08','3000',NULL,'20');
INSERT INTO `emp` VALUES('7934','张三丰','人事长','7782','1997-06-23','1300',NULL,'10');

mysql综合实验_第3张图片

mysql综合实验_第4张图片

CREATE TABLE salgrade(
grade INT (10) COMMENT '工资等级',
losal INT (10) COMMENT '最低限额',
hisal INT (10) COMMENT '最高限额'
);
INSERT INTO salgrade (grade, losal, hisal)VALUES (1, 700, 1200);
INSERT INTO salgrade (grade, losal, hisal)VALUES (2, 1201, 1400);
INSERT INTO salgrade (grade, losal, hisal)VALUES (3, 1401, 2000);
INSERT INTO salgrade (grade, losal, hisal)VALUES (4, 2001, 3000);
INSERT INTO salgrade (grade, losal, hisal)VALUES (5, 3001, 9999);

mysql综合实验_第5张图片

mysql综合实验_第6张图片

-- 单表查询

-- 1.选择部门30中的所有员工

select * from emp where deptno=30;

mysql综合实验_第7张图片

-- 2.列出所有办事员的姓名,编号和部门编号

select ename,empno,deptno,job from emp where job='办事员';

mysql综合实验_第8张图片

-- 3.找出佣金高于薪金的员工

Select ename,comm,sal from emp where comm>sal;

mysql综合实验_第9张图片

-- 4.找出没有佣金的员工

Select ename,comm,sal from emp where comm=0;

mysql综合实验_第10张图片

-- 5.找出佣金高于薪金的60%的员工

Select ename,comm,sal from emp where comm>sal*0.6;

mysql综合实验_第11张图片

-- 6.找出部门10中所有人事部长和部门20中所有办事员的详细资料

select * from emp where(deptno=10 and job='人事部长') or (deptno=20 and job='办事员');

mysql综合实验_第12张图片

-- 7.找出收取佣金的员工

select * from emp where comm>0;

mysql综合实验_第13张图片

-- 8.找出不收取佣金或收取的佣金低于100的员工

mysql> select * from emp where comm<0 or comm<100;

mysql综合实验_第14张图片

-- 9.找出姓张的员工的信息

select * from emp where ename like '张%';

mysql综合实验_第15张图片

-- 10.显示员工的姓名和受雇日期,新的员工排在最前面

select ename,hiredate from emp order by hiredate desc;

mysql综合实验_第16张图片

-- 11.按工作的降序排序,若工作相同则按薪金排序

SELECT ename,job,sal FROM emp ORDER BY job DESC,sal ;

mysql综合实验_第17张图片

-- 12.查出不姓刘的员工的信息

select * from emp where ename not like '刘%';

mysql综合实验_第18张图片

-- 13.取出姓李的员工

select * from emp where ename like '李%';

mysql综合实验_第19张图片

-- 多表查询

-- 1. 查询出每一位雇员的编号、姓名、职位、部门名称、位置

select empno,ename,job,dept.* from emp,dept where emp.deptno = dept.deptno;

mysql综合实验_第20张图片

-- 2.要求查询出每一位雇员的姓名、职位、领导的姓名

select e.ename,e.job,(select ename from emp where e.mgr=empno) 领导名字 from emp e;

mysql综合实验_第21张图片

-- 3.查询出每个雇员的编号、姓名、基本工资、职位、领导的姓名、部门名称及位置。

SELECT e.empno, e.ename, e.sal, e.job, (SELECT ename FROM emp WHERE e.mgr = emp.empno) AS 领导名字, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno;

mysql综合实验_第22张图片

-- 4.列出在部门"销售部"工作的员工的姓名,假定不知道销售部的部门编号。

select emp.ename from emp,dept where emp.deptno=dept.deptno and dept.dname ='销售部';

mysql综合实验_第23张图片

-- 5.列出与"李兴"从事相同工作的所有员工。

Select e.ename,e.job,d.dname
from emp e
join dept d on e.deptno = d.deptno
where job=(select job from emp where ename = '李兴') and ename !='李兴';

mysql综合实验_第24张图片

-- 6.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。

select e.ename,e.sal,d.dname from emp e inner join dept d on e.deptno=d.deptno where sal>(select max(sal) from emp where deptno=30);

mysql综合实验_第25张图片

-- 7.列出受雇日期早于其直接上级的所有员工。

select a.empno,a.ename,d.dname from emp a 
join emp b on a.mgr=b.empno 
join dept d on a.deptno=d.deptno 
where a.hiredate

mysql综合实验_第26张图片

-- 分组函数查询

-- 1.按照部门编号分组,求出每个部的人数,平均工资

select e.deptno,d.dname,count(e.ename) as 人数,avg(e.sal) as 平均工资 from emp e
join dept d on e.deptno=d.deptno
group by e.deptno,d.dname;

mysql综合实验_第27张图片

-- 2.按照职位分组,求出每个职位的最高和最低工资

select max(sal) as 最高工资,min(sal) as 最低工资,job from emp group by job;

mysql综合实验_第28张图片

-- 3.计算出每个各职位的平均工资

select job,avg(sal) as 平均工资 from emp group by job;

mysql综合实验_第29张图片

-- 4.查询出每个部门的名称、部门的人数、平均工资

select d.dname,count(e.ename) as 人数,avg(e.sal) as 平均工资 from emp e
join dept d on e.deptno=d.deptno
group by e.deptno,d.dname;

mysql综合实验_第30张图片

-- 5.要求统计出每个部门的详细信息,并且要求这些部门的平均工资高于2000;

select e.deptno,d.dname,count(e.ename) as 人数,avg(sal) as 平均工资
from emp e
join dept d on e.deptno=d.deptno
group by e.deptno,d.dname
having avg(e.sal) >2000;

mysql综合实验_第31张图片

-- 6.要求查询出工资比华仔还要高的全部雇员信息

select * from emp where sal >(select sal from emp where ename like '华仔');

mysql综合实验_第32张图片

-- 7.要求查询出高于公司平均工资的全部雇员信息

select * from emp where sal >(select avg(sal) from emp);

mysql综合实验_第33张图片

-- 8.查询出每个部门的编号、名称、位置、部门人数、平均工资

select d.deptno,d.dname,d.loc,count(e.ename) as 部门人数,avg(sal) as 平均工资
from emp e
join dept d on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc;

mysql综合实验_第34张图片

-- 9.列出至少有一个员工的所有部门。

select distinct d.deptno,d.dname,d.loc from dept d
join emp e on d.deptno=e.deptno;

mysql综合实验_第35张图片

-- 等级查询

-- 1.查询每个工资等级各有多少员工

select sg.grade,count(e.ename) as 员工数量
from salgrade sg
left join emp e on e.sal between sg.losal and sg.hisal
group by sg.grade;

mysql综合实验_第36张图片

-- 2.查询部门中(所有人)的平均工资等级

mysql> select e.deptno,avg(sg.grade) as 平均工资等级
    -> from emp e
    -> join salgrade sg on e.sal between sg.losal and sg.hisal
    -> group by e.deptno;

mysql综合实验_第37张图片

你可能感兴趣的:(mysql,数据库)