本文共 4264 字,大约阅读时间需要 14 分钟。
select e.department,e.`name`,t.dept,t.maxMoneyfrom (select e.department as dept,max(e.money) as maxMoney from employee e group by e.department)t join employee e on t.dept = e.department where e.money = t.maxMoney;
select e.department,e.`name`,t.`平均薪水`,e.moneyfrom (select e.department as dept,avg(e.money) as 平均薪水 from employee e group by e.department)tjoin employee eon e.department = t.deptwhere e.money > t.`平均薪水`;
表:
select t.`部门` as 部门,t.`平均薪水` as 平均薪水,m.gradefrom (select e.department as 部门,avg(e.money) as 平均薪水 from employee e group by e.department)tjoin moneygrade mon t.`平均薪水` between m.low and m.high;
方案一:
select e.name,e.moneyfrom employee eorder by e.money desc limit 1;
方案二:
第一步select distinct e.name ,e.moneyfrom employee ejoin employee bon e.money < b.money;
可以发现除了最大值,其他的值都符合要求
第二步select e.name,e.money from employee e where e.money not in (select distinct e.moneyfrom employee ejoin employee bon e.money < b.money);
select t.departmentfrom (select e.department ,avg(e.money) as 平均薪水 from employee e group by e.department)tjoin moneygrade m on t.平均薪水 between m.low and m.highwhere m.grade = ( select min(m.grade) from (select t.department,t.`平均薪水`,m.grade from (select e.department ,avg(e.money) as 平均薪水 from employee e group by e.department)t join moneygrade m on t.平均薪水 between m.low and m.high)m);
课程表:分别对应课号(cno),课名(cname),老师(cteacher)
select sname from s where sno not in (select sno from sc where cno = (select cno from c where cteacher = '郑老师'));
问题2:列出两门(含两门)以上不及格学生姓名及平均成绩
#分组先求每个人成绩小于60分的门数select sc.sno , s.sname ,count(*) as studentSumfrom scjoin son s.sno = sc.snowhere sc.scgrade < 60group by sc.snohaving studentSum >= 2;
问题3:即学过1号课程和2号课程所有学生的姓名
select s.sname from scjoin son sc.sno = s.snowhere cno = 1 and sc.sno in( select sno from sc where cno = 2 );
1,列出所有的员工及领导的名字
select e.ename, b.ename as leadernamefrom emp eleft join emp bon e.mgr = b.empno;
并出现结果
2,列出受雇日期早于其上级的所有的员工编号,姓名,部门名称
#列出受雇日期早于其上级的所有的员工编号,姓名,部门名称 select d.dname,e.empno,e.enamefrom emp ejoin emp bon e.mgr = b.empnojoin dept don e.deptno = d.deptnowhere e.hiredate < b.hiredate;
最终的数据为
select d.dname,e.*from emp eright join dept don e.deptno = d.deptno;
4,列出至少有5个员工的所有部门
select e.deptno,count(e.ename) as totalEmpfrom emp e group by e.deptno having totalEmp >= 5;
select enamefrom empwhere deptno = (select deptno from dept where dname = 'SALES');
6,列出薪资高于公司平均水平的所有员工,所在部门,上级领导
select e.ename, d.dname, b.enamefrom emp ejoin dept don e.deptno = d.deptnoleft join emp bon e.mgr = b.empnowhere e.sal > (select avg(sal) as angsal from emp);
7,列出薪水高于在部门30狗熊的所有员工的薪金的员工姓名和薪金,部门名称
select d.dname, e.ename, e.salFROM emp ejoin dept don e.deptno = d.deptnowhere e.sal > (select max(sal) as maxSal from dept);
8,列出在每个部门工作的员工数量,平均工资
select d.dname,count(*) as '人数',avg(e.sal) as '平均工资' from emp e join dept d on d.deptno = e.deptno group by e.deptno;
9,列出所有的员工的姓名,部门名称和工资
select e.ename as '员工姓名', d.dname as '部门名称', e.sal as '工资'from emp ejoin dept don e.deptno = d.deptno
10,列出所有的部门的详细信息和人数
select d.deptno,d.dname,d.loc,count(e.ename) as totalEmpfrom emp eright join dept don e.deptno = d.deptnogroup by d.deptno,d.dname,d.loc;
11,列出各种工作的最低工资以及从事此工作的雇员姓名
select distinct e.job,t.minSal,e.enamefrom emp ejoin (select e.job,min(e.sal) as minSal from emp e join dept d group by e.job)ton e.sal = t.minSal
12,列出各个部门MANAGER的最低薪金
select w.deptno,min(w.sal) as minSalfrom emp wwhere w.job = 'MANAGER'group by w.deptno;
13,求出员工领导超过3000的员工名称和领导名称
select e.ename, b.ename as leadernamefrom emp ejoin emp bon e.mgr = b.empnowhere b.sal > 3000;
14,名字中带S字符的部门的工资合计和部门人数
select d.dname, sum(e.sal) as sumMoney, count(e.ename) as sumPeoplefrom emp ejoin dept don e.deptno = d.deptnowhere d.dname like '%S%'group by d.dname
15,给任职期间超过30年的员工加薪
update empset sal = sal * 1.1where (to_days(now()) - to_days(hiredate))/365 > 30;
转载地址:http://yahnz.baihongyu.com/