sql练习1

这是一系列关于SQL查询的练习,涉及了选择特定部门的员工、查找特定职位的员工、比较佣金与薪金、查找部门10和20的特定职位员工等操作。还涵盖了日期操作、排序、分组、连接查询、子查询等SQL概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**一、使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下: 
emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号) 
dept部门表(deptno部门编号/dname部门名称/loc地点) 
工资 = 薪金 + 佣金**

SELECT * FROM “SCOTT”.”EMP”; 
1. 选择部门30中的所有员工. 
SELECT EMPNO,ENAME,deptno FROM emp WHERE DEPTNO=30; 
2. 列出所有办事员(CLERK)的姓名,编号和部门编号. 
SELECT ename,empno,deptno from emp where job=’CLERK’; 
3. 找出佣金高于薪金的员工. 
SELECT empno,ename,comm,sal FROM emp WHERE COMM>SAL; 
4. 找出佣金高于薪金的60%的员工. 
SELECT empno,ename,comm,sal,SAL*0.6 FROM emp WHERE COMM>0.6*SAL; 
5. 找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料. 
SELECT * from emp WHERE deptno=10 and job=’MANAGER’ or deptno=20 and job=’CLERK’; 
6. 找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料. 
SELECT * from emp WHERE deptno=10 and job=’MANAGER’ or deptno=20 and job=’CLERK’ OR job!=’MANAGER’ and job!=’CLERK’ AND SAL>=2000; 
7. 找出收取佣金的员工的不同工作. 
SELECT DISTINCT job FROM emp WHERE COMM is not null; 
8. 找出不收取佣金或收取的佣金低于100的员工. 
SELECT ename,COMM FROM emp WHERE COMM is null or COMM<100; 
9. 找出各月倒数第3天受雇的所有员工. 
SELECT ename,hiredate FROM emp where HIREDATE=LAST_DAY(HIREDATE)-2; 
10. 找出早于12年前受雇的员工. 

SELECT ename,hiredate from emp WHERE TO_NUMBER(TO_CHAR(sysdate,'YYYY'))>TO_NUMBER(to_char(hiredate,'YYYY'))+10;


SELECT *FROM emp ORDER BY ENAME;
-- ORDER BY 语句用于根据指定的列对结果集进行排序。该语句默认按照升序对记录进行排序。 使用 DESC 关键字可以反序排列记录。
-- 如果要排序的是多个字段,结果的顺序由靠前的字段优先决定。


SELECT ename,TO_CHAR(hiredate,'yyyy-mm-dd') from emp ORDER BY hiredate;


SELECT ename,job,sal from emp ORDER BY job DESC,SAL;


SELECT ename,TO_CHAR(hiredate,'yyyy-mm') FROM emp ORDER BY TO_CHAR(HIREDATE,'mm'),TO_CHAR(HIREDATE,'yyyy');


SELECT  trunc(sal/30) from emp ;
--trunc(x[,y]) 返回x按精度y截取后的值
SELECT ename from emp WHERE TO_NUMBER(TO_CHAR(HIREDATE,'mm'))=2;


SELECT ename,TRUNC(SYSDATE-HIREDATE) from emp;


SELECT ename from emp WHERE ENAME LIKE '%A%';




--1. 列出在每个部门工作的员工数量、平均工资和平均服务期限。
select deptno "部门号", count(ename) "员工数量", avg(sal + nvl(comm, 0)) "平均工资", trunc(avg(sysdate-hiredate)) "平均服务期限(天)" from emp group by deptno; 
--2. 列出所有员工的姓名、部门名称和工资。 
SELECT ename,dname,sal+ nvl(comm, 0)"工资" from emp,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO;
--连接两个表
--3. 列出从事同一种工作但属于不同部门的员工的一种组合。
SELECT DISTINCT e.DEPTNO,e.job from emp e,emp m WHERE e.job=m.job and e.deptno!=m.deptno ORDER BY job;
--   ORDER BY 语句用于根据指定的列对结果集进行排序。
--4. 列出所有部门的详细信息和部门人数。 [*]
SELECT DEPT.*,(SELECT COUNT(EMPNO)from emp where DEPT.DEPTNO=EMP.DEPTNO )"部门人数" from DEPT;
--5. 列出各种工作的最低工资。
SELECT JOB,MIN(sal+nvl(comm, 0))"最低工资" FROM emp GROUP BY job;
--6. 列出各个部门的MANAGER(经理)的最低薪金。
select DEPTNO,MIN(sal)"经理最低薪金" from emp WHERE job='MANAGER' GROUP BY DEPTNO;
--7. 列出所有员工的年工资,按年薪从低到高排序。
SELECT ENAME,(sal+ nvl(comm, 0))*12 "年工资" from emp ORDER BY 2;
--ORDER BY 2按制定序列的第二个排序
--8. 找出月薪相同的员工
SELECT  e.ename,e.sal from emp e,emp m WHERE (e.SAL=m.SAL) ORDER BY SAL;
--9. 列出至少有一个员工的所有部门。
SELECT dname from emp e,dept d WHERE e.deptno=d.DEPTNO GROUP BY DNAME; 
--10. 列出薪金比“SMITH”多的所有员工。
SELECT ename,sal from emp WHERE sal>(SELECT sal from emp where ename='SMITH');
--11. 列出所有员工的姓名及其直接上级的姓名。
SELECT e.ename,m.ename "直接上级" from emp e,emp m where e.MGR=m.EMPNO; 
--12. 列出受雇日期早于其直接上级的所有员工。
SELECT e.ename from emp e,emp m WHERE e.MGR=m.EMPNO and e.HIREDATE<m.HIREDATE;
--13. 列出所有“CLERK”(办事员)的姓名及其部门名称。  
select DISTINCT ename,dname,JOB from emp e,DEPT d WHERE e.DEPTNO=d.DEPTNO and JOB='CLERK';
--14. 列出最低薪金大于1500的各种工作。
SELECT job from emp  GROUP BY job having MIN(sal)>1500;
--having 分组后进行筛选
--15. 列出在部门“SALES”(销售部)工作的员工的姓名, 假定不知道销售部的部门编号。 
SELECT ename,DNAME from emp e,dept d WHERE e.DEPTNO=d.DEPTNO and DNAME='SALES';
--16. 列出薪金高于公司平均薪金的所有员工。
SELECT ename,sal from emp  where sal>(SELECT AVG(sal) from EMP); 
--17. 列出与“SCOTT”从事相同工作的所有员工。
SELECT ename,job from emp WHERE job in (SELECT job from emp WHERE ENAME='SCOTT');  
--SCOTT可能从事多种工作     IN 操作符允许我们在 WHERE 子句中规定多个值。
--18. 列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。   
SELECT ename,sal from emp WHERE sal in (SELECT sal from emp WHERE deptno=30);
--19. 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
SELECT ename,sal from emp WHERE sal >(SELECT MAX(sal) from emp WHERE deptno=30);
--20. 列出比“SCOTT”大两个月以上的员工姓名  
SELECT ename from emp WHERE (SELECT HIREDATE from emp WHERE ENAME='SCOTT')-HIREDATE>60;   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值