【前言】:
这套题目已经是第三次刷了 , 前前后后每一遍过的时候都有不同的心情,最开始是在B站《动力结点》–老杜那里看到的 , 后来了解了这是ORACLE的一套教程,好多教学视频都把它搬过来,单、多表查询,外连接,子查询等均有涉及。
【内容】:
- 从EMP表中查询 员工编号、员工名字信息。
SELECT EMPNO,ENAME FROM EMP;
- 查询员工的年薪。
SELECT ENAME,SAL*12 FROM EMP;
- 【条件查询训练】:
(1) 查询工资等于5000的员工姓名;
SELECT ENAME FROM EMP WHERE SAL=5000;
(2) 查询SMITH的工资;
SELECT ENAME,SAL FROM EMP WHERE ENAME='SMITH';
(3) 找出工资高于3000的员工;
SELECT ENAME,SAL FROM EMP WHERE SAL>3000;
(4) 找出工资不等于3000的员工;
SELECT ENAME,SAL FROM EMP WHERE SAL!=3000;
(5) 找出工资在1100和3000之间的员工,左闭右闭。 ( #两种方法# )
SELECT ENAME,SAL FROM EMP WHERE SAL>=1100 AND SAL<=3000;
SELECT ENAME,SAL FROM EMP WHERE SAL BETWEEN 1100 AND 3000;
(6) 找出哪些人津贴是NULL;
SELECT ENAME,COMM FROM EMP WHERE COMM IS NULL ;
(7) 找出哪些人津贴不为NULL;
SELECT ENAME,COMM FROM EMP WHERE COMM IS NOT NULL ;
(8) 找出哪些人没有津贴;
SELECT ENAME,COMM FROM EMP WHERE COMM IS NULL OR COMM=0;
(9) 找出工作岗位是 MANAGER 和 SALESMAN 的员工;
SELECT ENAME,JOB FROM EMP WHERE JOB='MANAGER' OR JOB='SALESMAN';
(10) 找出薪资大于1000的并且部门编号是20或30部门的员工;
SELECT ENAME FROM EMP WHERE SAL>1000 AND (DEPTNO=20 OR DEPTNO=30);
(11) 找出名字中含有 ‘O’的员工;
SELECT ENAME FROM EMP WHERE ENAME LIKE '%O%';
(12) 找出名字中第二个字母是 ‘A’的员工;
SELECT ENAME FROM EMP WHERE ENAME LIKE '_A%';
(13) 找出名字中含有下划线的员工;
LIKE '%\_%'
(14) 找出名字中最后一个字母是T的员工;
LIKE '%T'
(15) 找出名字中第三个字母是A的员工;
LIKE '__A%'
4.【排序训练】:
(1)将员工按照工资降序排列,当工资相同的时候再按照名字的升序排列。
SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC,ENAME ASC;
5.【聚合函数训练】:
(1)员工表的工资总和
SELECT SUM(SAL) FROM EMP ;
(2)员工表的最高/最低工资
SELECT MAX(SAL) FROM EMP ;
SELECT MIN(SAL) FROM EMP ;
(3)员工表的平均工资
SELECT AVG(SAL) FROM EMP ;
(4)员工表的总人数
SELECT COUNT(EMPNO) FROM EMP ;
SELECT COUNT(*) FROM EMP ;
6.找出高于平均工资的员工。
SELECT ENAME,SAL FROM EMP WHERE SAL>( SELECT AVG(SAL) FROM EMP );
7.【空处理函数(单行处理函数的一种)】:
计算每个员工的年薪。
SELECT ENAME,(SAL+IFNULL(COMM,0))*12 AS yearsal FROM EMP;
(1)统计员工一共有多少岗位(每个岗位都要具体展示出来)。
select distinct job from emp;
(2)统计员工一共有多少岗位(只显示数量)。
select count(distinct job) from emp;
9.【group by】:
(1)找出每个工作岗位的最高薪资;
SELECT JOB,Max(SAL) FROM EMP GROUP BY JOB;
(2)每个工作岗位的平均薪资;
SELECT JOB,AVG(SAL) FROM EMP GROUP BY JOB;
(3)找出每个部门不同工作岗位的最高薪资;
SELECT DEPTNO,MAX(SAL) AS maxsal FROM EMP GROUP BY DEPTNO,JOB;
(4)找出每个部门的最高薪资,要求显示薪资大于2900的数据;
select deptno,MAX(SAL) AS maxsal from emp GROUP BY DEPTNO HAVING maxsal>2900;
(5)找出每个部门的平均薪资,要求显示薪资大于2000的数据。;
select deptno,AVG(SAL) AS avgsal from emp GROUP BY DEPTNO HAVING avgsal>2000;
(6)统计每个部门的人数。
SELECT DEPTNO,COUNT(DEPTNO) FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO ASC;
(7) 统计各个岗位的平均工资,除了MANAGER。
SELECT JOB,AVG(SAL) FROM EMP WHERE JOB!='MANAGER' GROUP BY JOB;
SELECT JOB,AVG(SAL) FROM EMP GROUP BY JOB HAVING JOB!='MANAGER';
--两种写法都可以。
--where是在分组之前进行的过滤,having是在分组之后进行的过滤。
10.【总结练习】:
(1)查询名字首字母是‘A’、‘B’、‘C’的员工。(只显示一列,员工的名字需要升序)。
SELECT ENAME FROM EMP WHERE ename BETWEEN 'A' AND 'C' ORDER BY ENAME ASC;
(2)查询哪些人没有津贴,人名升序。(只显示两列:一、姓名,二、津贴 , 按照名字升序。)
SELECT ENAME,COMM FROM EMP WHERE comm=0 OR COMM IS NULL ORDER BY ENAME ASC;
(3)找出工资高于平均工资的员工,按工资升序。
SELECT ENAME,SAL FROM EMP WHERE sal>( SELECT AVG(SAL) FROM EMP ) ORDER BY SAL ASC;
(4)找出薪资小于2000 , 且不是10、20部门的员工。(按部门编号升序)。
SELECT DEPTNO,ENAME,SAL FROM EMP WHERE sal<2000 AND DEPTNO NOT IN (10,20) ORDER BY DEPTNO ASC;
11.【内连接】:
(1)查询每个员工的部门名称,要求显示员工名和部门名。
SELECT ENAME,DNAME FROM EMP e
INNER JOIN DEPT d
ON d.DEPTNO = e.DEPTNO;
(2)找出每个员工的工资等级,要求显示员工名、工资、工资等级。
SELECT ENAME,SAL,GRADE FROM EMP e
INNER JOIN SALGRADE s
ON e.SAL>=s.LOSAL AND e.SAL<=s.HISAL
ORDER BY s.GRADE,e.SAL;
(3)找出每个员工的上级领导,要求显示员工名和对应的领导名。
SELECT e.ENAME 员工, ee.ENAME 领导 FROM EMP e
INNER JOIN EMP ee
ON e.MGR=ee.EMPNO
ORDER BY ee.ENAME;
12.【外连接】:
(1)找出每个员工的上级领导。(所有员工都得显示,包括没有上级领导的)
SELECT e.ENAME , ee.ENAME AS 领导 FROM EMP e LEFT JOIN EMP ee
ON e.MGR=ee.EMPNO ORDER BY e.ENAME;
(2)找出没有员工的部门。
SELECT d.DEPTNO , d.DNAME,e.empno FROM DEPT d
LEFT JOIN EMP e
ON d.DEPTNO = e.DEPTNO
WHERE e.EMPNO is NULL;
SELECT DEPTNO , DNAME FROM DEPT WHERE deptno NOT IN
(
select DEPTNO FROM EMP GROUP BY DEPTNO
);
--【 第二种写法也是可以的~~~!!! 】
(3)找出每一个员工的部门名称以及工资等级以及上级领导。
SELECT e.ename , d.DNAME , s.GRADE , l.ENAME AS 上级领导 FROM EMP e
LEFT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
LEFT JOIN EMP l
ON e.MGR = l.EMPNO
LEFT JOIN SALGRADE s
ON e.SAL>=s.LOSAL AND e.SAL<=s.HISAL
ORDER BY e.ENAME;
(4)统计出各个部门的平均薪资 以及 平均薪资所对应的薪资等级。
SELECT d.DNAME , d.DEPTNO , l.avgsal ,s.GRADE FROM DEPT d
left JOIN (
SELECT AVG(SAL) avgsal ,DEPTNO FROM EMP GROUP BY DEPTNO
) l
ON d.DEPTNO=l.DEPTNO
LEFT JOIN SALGRADE s
ON l.avgsal>=s.LOSAL AND l.avgsal<=s.HISAL;
13.【单行函数训练】:
(1)第一列——员工姓名,第二列——员工姓名的长度 , 第三列——从姓名第二位开始截取3位。
SELECT ENAME,LENGTH(ENAME) 长度,SUBSTRING(ENAME,2,3) 截取 FROM EMP;
(2)四列,数值自己假设——绝对值,向下取整,向上取整,四舍五入。
SELECT ABS(-5) 绝对值,CEIL(5.3) 向上取整,FLOOR(5.9) 向下取整,ROUND(3.4) 四舍五入 FROM DUAL;
--dual实际就是一个伪表;
SELECT ABS(-5) 绝对值,CEIL(5.3) 向上取整,FLOOR(5.9) 向下取整,ROUND(3.4) 四舍五入;
--如果没有where条件的话,from dual 可以省略不写。
(3)求各个部门的平均薪资(向下取整);
SELECT DEPTNO , FLOOR(AVG(SAL)) avgsal from EMP GROUP BY DEPTNO;
(4)取模函数训练
SELECT 27/10 ,27%10 , MOD(27,10);
(5)展示当前时间的——[1]年月日 [2]时分秒
SELECT CURDATE(),CURTIME();
(6)年月日时分秒 的最大区别。
SELECT NOW(),SYSDATE(),SLEEP(3),NOW(),SYSDATE();
--slepp是让线程睡3秒的意思。
(7)第一列——员工姓名 , 第二列——员工薪水, 第三列——高薪/低薪。(大于2500显示高薪,否则显示低薪。)
SELECT ENAME,SAL,IF(SAL>=2500,'高薪','低薪') AS '高低' FROM EMP;
(8)求各个员工的月薪(S AL+COMM),如果是NULL的话,用0替换。
SELECT ENAME,(SAL+IFNULL(COMM,0)) AS '月薪' FROM EMP;
(9)展示nullif函数。
SELECT NULLIF(1,1) ,NULLIF(1,2) ;
-- 如果一参等于二参,则返回null , 否则返回一参。
(10)四列:[姓名]、[job] , 第三列(AS ‘岗位’)根据job来显示相应的内容如:‘CLERK’—— 店员;‘SALESMAN’——销售,‘MANAGER’——经理,其他的——其他。第四列-[SAL]。
SELECT ENAME,JOB,
CASE JOB
WHEN 'CLERK' THEN '店员'
WHEN 'SALESMAN' THEN '销售'
WHEN 'MANAGER' THEN '经理'
ELSE '-其它-'
END '岗位'
,SAL FROM EMP;
(11)case的区间判断:
SAL<=1000 , A级
SAL<=2000 , B级
SAL<=3000 , C级
其他的就按 D级来算。
SELECT ENAME,SAL,
CASE
WHEN SAL<=1000 THEN 'A'
WHEN SAL<=2000 THEN 'B'
WHEN SAL<=3000 THEN 'C'
ELSE 'D'
END '等级'
,DEPTNO FROM EMP;
(12)
查看当前数据库,查看当前用户 , 查看当前mysql版本。
SELECT DATABASE(),USER(),VERSION();
14.【 单表查询练习 】:
(1)列出各个职位中工资最小值小于2000的职位;
SELECT JOB,MIN(SAL)
FROM EMP
GROUP BY JOB
HAVING MIN(SAL) < 2000;
(2)列出平均工资大于1200元的部门和工作搭配组合。
SELECT DEPTNO,JOB,AVG(SAL)
FROM EMP
GROUP BY DEPTNO,JOB
HAVING AVG(SAL)>1200
ORDER BY DEPTNO;
(3)统计[ 人数大于4 ]的部门的平均工资。
SELECT DEPTNO,COUNT(*) AS count,AVG(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING count>4;
15.【子查询练习】:
(1)找出高于平均薪资的员工信息。
SELECT * FROM EMP WHERE SAL>(SELECT AVG(SAL) FROM EMP);
(2)找出各个部门平均薪水的薪水等级。
SELECT d.DEPTNO , t.avgsal ,s.GRADE
FROM DEPT d
LEFT JOIN
( SELECT deptno,AVG(sal) AS avgsal FROM EMP GROUP BY DEPTNO )t
ON d.DEPTNO=t.deptno
LEFT JOIN SALGRADE s
ON t.avgsal BETWEEN s.LOSAL AND s.HISAL
ORDER BY d.DEPTNO;
(3)找出每个部门平均的薪水等级。
//部门总人数的薪资等级之和 / 部门总人数 = 该部门平均的薪水等级。
SELECT e.DEPTNO , AVG(s.GRADE)
FROM EMP e
JOIN SALGRADE s
ON e.SAL BETWEEN s.LOSAL AND s.HISAL
GROUP BY e.DEPTNO
ORDER BY e.DEPTNO;
(4)找出每个员工所在的部门名称,要求显示员工名 和 部门名。
SELECT e.ENAME , ( SELECT d.DNAME FROM DEPT d WHERE e.DEPTNO = d.DEPTNO ) AS DNAME
FROM EMP e
ORDER BY e.ENAME;
//其实和下面的这中写法是相同的;
SELECT e.ENAME , d.DNAME
FROM EMP e
JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
ORDER BY e.ENAME;
(5)找出工作岗位是 SALESMAN和 MANAGER 的员工。
SELECT ENAME,JOB FROM EMP WHERE JOB='SALESMAN' OR JOB='MANAGER';
或
SELECT ENAME,JOB FROM EMP WHERE JOB IN ('SALESMAN','MANAGER');
或
SELECT ENAME,JOB FROM EMP WHERE JOB = 'SALESMAN'
UNION
SELECT ENAME,JOB FROM EMP WHERE JOB = 'MANAGER';
16.【综合复习题】:
(1)取得每个部门最高薪水的人员名称。
SELECT e.ENAME , t.DEPTNO ,t.maxsal FROM EMP e
JOIN (
SELECT DEPTNO , MAX(SAL) AS maxsal FROM EMP
GROUP BY DEPTNO
) t
ON e.DEPTNO=t.DEPTNO AND e.SAL=t.maxsal;
(2)哪些人的薪水在部门的平均薪水之上。
SELECT e.ENAME , t.DEPTNO ,e.SAL,t.avgsal FROM EMP e
JOIN (
SELECT DEPTNO , AVG(SAL) AS avgsal FROM EMP
GROUP BY DEPTNO
) t
ON e.DEPTNO=t.DEPTNO AND e.SAL>t.avgsal;
【下为自我尝试】:----//也能成功。
SELECT e.ENAME , e.SAL , e.DEPTNO
FROM EMP e
RIGHT JOIN ( SELECT deptno,avg(sal) as avgsal FROM EMP GROUP BY DEPTNO )t
ON t.deptno=e.DEPTNO
WHERE t.avgsal < e.SAL;
(3)取得部门中(所有人的)平均的薪水等级。
SELECT e.DEPTNO , e.SAL ,AVG(s.GRADE)
FROM EMP e
JOIN SALGRADE s
ON e.SAL>=s.LOSAL AND e.SAL<=s.HISAL
GROUP BY e.DEPTNO
ORDER BY e.DEPTNO;
(4)不准用组函数(Max) , 取得最高薪水。
SELECT e.ENAME , e.SAL
FROM EMP e
ORDER BY e.SAL DESC LIMIT 1;
【用表的自连接方式也可以解】:
SELECT ENAME,SAL FROM EMP WHERE SAL NOT IN
(
SELECT DISTINCT a.SAL FROM EMP a JOIN EMP b ON a.SAL<b.SAL
);
(5)取得平均薪水最高的部门的部门编号。
【第一种方案——LIMIT】:
SELECT DEPTNO,AVG(SAL) AS avgsal FROM EMP GROUP BY DEPTNO ORDER BY avgsal DESC LIMIT 1;
【第二种方案——MAX】:
SELECT MAX(t.avgsal) FROM
(
SELECT DEPTNO,AVG(SAL) AS avgsal FROM EMP GROUP BY DEPTNO
) t;
(6)取得平均薪水最高的部门的部门名称。
SELECT d.DNAME , e.DEPTNO , AVG(e.sal) AS avgsal FROM EMP e
JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
GROUP BY e.DEPTNO
ORDER BY avgsal DESC
LIMIT 1;
(7)求平均薪水的等级最低的部门的部门名称。
SELECT d.DNAME,t.DEPTNO,t.avgsal,s.GRADE FROM
(
SELECT e.DEPTNO ,avg(e.SAL) AS avgsal FROM EMP e
GROUP BY e.DEPTNO
) t
JOIN DEPT d
ON t.DEPTNO = d.DEPTNO
JOIN SALGRADE s
ON t.avgsal>=s.LOSAL AND t.avgsal<=s.HISAL
ORDER BY s.GRADE
LIMIT 1 ;
(7_2)求各个部门的员工薪水等级的平均值 ,然后选出一个最低的。
SELECT e.DEPTNO,d.DNAME,AVG(s.GRADE) AS avgrade FROM EMP e
JOIN SALGRADE s
ON e.SAL >=s.LOSAL AND e.SAL <= s.HISAL
JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
GROUP BY e.DEPTNO
ORDER BY avgrade
LIMIT 1 ;
(8)取得比普通员工( 员工代码没有在mgr字段上出现的 )的最高薪水还要高的领导人姓名。
SELECT * FROM EMP em WHERE em.empno
IN
( SELECT DISTINCT MGR FROM EMP WHERE mgr IS NOT NULL )
AND
em.SAL > (
SELECT MAX(SAL) FROM emp
WHERE EMPNO NOT IN
( SELECT DISTINCT MGR FROM EMP WHERE mgr IS NOT NULL )
)
ORDER BY em.SAL DESC
;
(9)取得薪水最高的前五名员工。
SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC LIMIT 5;
(10)取得薪水最高的第六到第十名员工。
SELECT ENAME,SAL FROM EMP ORDER BY SAL DESC LIMIT 5,5;
(11)取得最后入职的5名员工。
SELECT ENAME,HIREDATE FROM EMP ORDER BY HIREDATE DESC LIMIT 5;
(12)取得每个薪水等级有多少员工。
SELECT s.GRADE as sgrade , COUNT(s.GRADE) FROM EMP e
JOIN SALGRADE s
ON e.SAL>=s.LOSAL AND e.SAL <=s.HISAL
GROUP BY sgrade
ORDER BY sgrade;
(13)列出所有员工及领导的姓名。
SELECT a.ENAME as '员工', b.ENAME AS '领导' FROM EMP a
LEFT JOIN EMP b
ON a.MGR = b.EMPNO ;
(14)列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称。
SELECT a.EMPNO,a.ENAME,d.DNAME FROM EMP a
JOIN DEPT d
ON a.DEPTNO = d.DEPTNO
WHERE a.HIREDATE < (
SELECT b.HIREDATE FROM emp b WHERE a.MGR = b.EMPNO
);
(15)列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
SELECT * FROM DEPT d
LEFT JOIN EMP e
ON d.DEPTNO = e.DEPTNO;
(16)列出至少有5个员工的所有部门。
SELECT DEPTNO,COUNT(*) AS cou FROM EMP GROUP BY deptno HAVING cou>=5
(17)列出薪金比 “SMITH”多的所有员工信息。
SELECT * FROM EMP WHERE SAL > (
SELECT SAL FROM EMP WHERE ENAME='SMITH'
);
(18)列出所有 “CLERK”(办事员)的姓名及其部门名称,部门的人数。
SELECT t.ENAME , d.DNAME , y.cou , t.deptno FROM (
SELECT e.* FROM EMP e WHERE JOB='CLERK'
) t
JOIN DEPT d
ON t.DEPTNO = d.DEPTNO
LEFT JOIN
(
SELECT DEPTNO,COUNT(*) AS cou FROM emp GROUP BY DEPTNO
) y
ON t.DEPTNO=y.DEPTNO
ORDER BY y.cou ASC;
(19)列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数。
【视频解法】:
SELECT JOB , COUNT(*) FROM EMP GROUP BY job HAVING MIN(SAL) > 1500;
【自我探索(两个表连起来)】:
select a.* , t.minsal FROM
(
SELECT JOB,COUNT(*) AS cou FROM EMP GROUP BY JOB
) a
RIGHT JOIN
(
SELECT e.JOB,MIN(e.SAL) AS minsal FROM EMP e GROUP BY job HAVING minsal>1500
)t
ON a.JOB=t.JOB;
(20)列出在部门 “SALES”–《销售部》工作的员工的姓名,假定不知道销售部的部门呢编号。
SELECT e.ENAME ,e.DEPTNO FROM EMP e
JOIN
(
SELECT * FROM DEPT WHERE DNAME='SALES'
) t
ON e.DEPTNO = t.DEPTNO
(21)列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级。
SELECT e.ENAME,e.DEPTNO ,ee.ENAME AS '领导' , s.GRADE FROM EMP e
LEFT JOIN emp ee
ON e.MGR = ee.EMPNO
JOIN SALGRADE s
ON e.SAL>=s.LOSAL AND e.SAL<=s.HISAL
WHERE e.SAL >(
SELECT AVG(SAL) FROM EMP
)
(22)列出与“SCOTT”从事相同工作的所有员工及部门名称。
SELECT e.ENAME , d.DNAME FROM EMP e
JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
WHERE e.JOB IN
(
SELECT JOB FROM EMP WHERE ENAME='SCOTT'
) AND e.ENAME <> 'SCOTT'
(23)列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金。
SELECT ENAME , SAL FROM EMP WHERE deptno <> 30 AND SAL IN
(
SELECT SAL FROM EMP WHERE DEPTNO=30
)
//没查到东西————代表这一道题做对了~ ~ ~
(24)列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金,部门名称。
SELECT e.ENAME , e.SAL , d.DNAME FROM EMP e
JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
WHERE e.SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30)
(25)列出在每个部门工作的员工数量,平均工资和平均服务期限。
SELECT d.* , COUNT(e.ENAME) AS num , IFNULL(AVG(SAL),0) AS avgsal , IFNULL(AVG( TIMESTAMPDIFF(YEAR,HIREDATE,NOW()) ),0) AS date
FROM EMP e
RIGHT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
GROUP BY d.DEPTNO;
(26)列出所有员工的姓名、部门名称和工资。
SELECT e.ENAME , d.DNAME , e.SAL
FROM EMP e
JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
(27)列出所有部门的详细信息和人数。
SELECT d.DEPTNO , d.DNAME , d.LOC , count(e.ENAME)
FROM EMP e
RIGHT JOIN DEPT d
ON e.DEPTNO=d.DEPTNO
GROUP BY d.DEPTNO,d.DNAME,d.LOC
(28)列出各种工作的最低工资及从事此工作的雇员姓名。
//——即:列出每个部门最低薪资的工作人员。
SELECT ee.ENAME FROM EMP ee
RIGHT JOIN (
SELECT e.JOB , MIN(SAL) AS minsal FROM EMP e
GROUP BY e.JOB
) t
ON ee.SAL=t.minsal
(29)列出各个部门的 MANAGER(领导)的最低薪金。
SELECT e.DEPTNO , e.JOB , MIN( e.SAL )
FROM EMP e
WHERE JOB='MANAGER'
GROUP BY e.DEPTNO
(30)列出所有员工的年工资,按年薪从低到高排序。
SELECT ENAME , ( sal + IFNULL(COMM,0) )*12 as yearsal
FROM EMP
ORDER BY yearsal DESC
(31)求出员工领导的薪水超过3000的员工名称 与 领导名称。
SELECT a.ENAME '员工' , b.ENAME '领导' FROM EMP a
LEFT JOIN EMP b
ON a.MGR = b.EMPNO
WHERE b.SAL>3000
(32)求出部门名称中 , 带 ‘S’字符的部门员工的工资合计、部门人数。
SELECT d.DNAME, IFNULL(SUM(e.SAL),0) , count(e.ENAME) '人数' FROM EMP e
RIGHT JOIN DEPT d
ON e.DEPTNO = d.DEPTNO
WHERE d.DNAME LIKE '%S%'
GROUP BY e.DEPTNO
(33)给任职日期超过30年的员工加薪 10% 。
UPDATE EMP SET SAL=SAL*1.1
WHERE TIMESTAMPDIFF(YEAR,HIREDATE,NOW()) >30