DQL训练题目

【前言】:

这套题目已经是第三次刷了 , 前前后后每一遍过的时候都有不同的心情,最开始是在B站《动力结点》–老杜那里看到的 , 后来了解了这是ORACLE的一套教程,好多教学视频都把它搬过来,单、多表查询,外连接,子查询等均有涉及。

【内容】:

  1. 从EMP表中查询 员工编号、员工名字信息。
SELECT EMPNO,ENAME FROM EMP;
  1. 查询员工的年薪。
SELECT ENAME,SAL*12 FROM EMP;
  1. 【条件查询训练】:

(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
  • 这里是不能count(*)的,要统计有人的那一列才行!!!

(33)给任职日期超过30年的员工加薪 10% 。

UPDATE EMP SET SAL=SAL*1.1
WHERE TIMESTAMPDIFF(YEAR,HIREDATE,NOW()) >30
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值