进入公司 ,首先是进行SQL培训

一下是针对oracle的emp与dept表进行的基础查询

  1. --1.选择部门30中的所有员工:
  2. select * from emp where deptno=30;
  3.  
  4. --2.列出所有办事员(CLERK)的姓名,编号和部门编号:
  5. select ename,empno,deptno FROM EMP where job='CLERK';
  6.  
  7. --3.列出佣金(comm)高于薪金(sal)的员工:
  8. SELECT * FROM EMP WHERE COMM>SAL;
  9.  
  10. --4.找出佣金(comm)高于薪金百分60的员工
  11. SELECT * FROM EMP WHERE COMM>SAL*0.6;
  12.  
  13. --5.找出部门10中所有经理(MANAGER) 和部门20中所有办事员(CLERK)的详细资料
  14. SELECT * FROM emp WHERE (deptno=10 AND job='MANAGER') OR (deptno=20 AND job='CLERK');
  15.  
  16. --6.找出部门10中所有经理,部门20中所有的办事员,既不是经理又不是办事员,但是薪金大于或等于2000的所有员工的资料:
  17. SELECT * FROM emp WHERE
  18. (deptno=10 AND job='MANAGER') OR
  19. (deptno=20 AND job='CLERK') OR
  20. (job NOT IN('MANAGER','CLERK') AND sal>=2000);
  21.  
  22. --7.找出收取佣金(comm)的员工的不同工作:[DISTINCT->消除重复的关键字]
  23. SELECT DISTINCT JOB FROM EMP WHERE COMM IS NOT NULL;
  24.  
  25. --8.找出不收取佣金或者佣金小于100的员工:
  26. SELECT * FROM EMP WHERE COMM IS NULL OR COMM<100;
  27.  
  28. --9.找个各月倒数第三天受雇的所有员工:
  29. --使用LAST_DAY()函数
  30. SELECT * FROM emp WHERE (LAST_DAY(hiredate)-2)=hiredate;
  31.  
  32. --10.找出早于12年前受雇的员工:
  33. --注意使用MONTHS_BETWEEN(今天,雇佣日期)
  34. SELECT * FROM emp WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>12 ORDER BY EMPNO;
  35.  
  36. --11.按照首字母大写的方式显示员工姓名
  37. SELECT INITCAP(ENAME) FROM EMP;
  38.  
  39. --12.显示正好为5个字符的员工的姓名
  40. SELECT ENAME FROM EMP WHERE LENGTH(ENAME)=5;
  41.  
  42. --13.显示不带有"R"的员工姓名:
  43. SELECT ENAME FROM EMP WHERE ENAME NOT LIKE '%R%';
  44.  
  45. --14.显示所有员工姓名的前3个字符:
  46. SELECT SUBSTR(ENAME,1,3) FROM EMP;
  47.  
  48. --15.显示所有员工的姓名,并且用“x 替换替换所有的 A”;
  49. SELECT REPLACE(ENAME,'A','x') FROM EMP;
  50.  
  51. --16.显示满十年服务年限的员工的姓名和受雇日期:
  52. SELECT ENAME,HIREDATE FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)/12>10;
  53.  
  54. --17.显示员工的详细资料,按姓名排序:
  55. SELECT * FROM EMP ORDER BY ENAME;
  56.  
  57. --18.显示员工的姓名和受雇日期,并根据其服务年限,把资料最老的员工排在第在前面:
  58. SELECT ENAME,HIREDATE FROM EMP ORDER BY HIREDATE;
  59.  
  60. --19.显示所有员工的姓名,工作和薪金,按工作的降序排序,若工作相同则按薪金排序:
  61. SELECT ENAME,JOB,SAL FROM EMP ORDER BY JOB DESC,SAL;
  62.  
  63. --20.显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在的年排序,若年份相同则讲最早月份的员工排在最前面:
  64. --使用TO_CHAR()函数
  65. SELECT ename,TO_CHAR(hiredate,'yyyy') year,TO_CHAR(hiredate,'MM') mon FROM emp ORDER BY year,mon;
  66.  
  67. --21.显示在一个月为30天的情况所有员工的日薪金,并且忽略余数:
  68. --ROUND() 四舍五入N
  69. SELECT ename,ROUND(sal/30) 日薪金 FROM emp;
  70.  
  71. --22.找出在(任何年份)的2月受聘的所有员工:
  72. SELECT EMPNO,ENAME FROM EMP WHERE TO_CHAR(HIREDATE,'MM')=2;
  73.  
  74. --23.对于每个员工,显示其加入公司的天数:
  75. SELECT ROUND(SYSDATE-HIREDATE) FROM EMP;
  76.  
  77. --24.显示姓名字段的任何位置包含“A”的所有员工姓名:
  78. SELECT ENAME FROM EMP WHERE ENAME LIKE '%A%';
  79.  
  80. --25.以年月的方式显示所有员工的服务年限:
  81. --年:求出总共的月/12 -> 产生小数,并不能四舍五入
  82. --月:对12取余
  83. SELECT ename,TRUNC(MONTHS_BETWEEN(sysdate,hiredate)/12) year,TRUNC(MOD(MONTHS_BETWEEN(sysdate,hiredate),12)) mon FROM emp;
  84.  
  85. -------------复杂查询,子查询,多表关联--------------
  86.  
  87. --26.列出至少有三个员工的所有部门和部门信息。[!!]
  88. SELECT * FROM DEPT WHERE DEPTNO IN(
  89. SELECT DEPTNO FROM EMP GROUP BY DEPTNO HAVING COUNT(EMPNO)>3
  90. );
  91.  
  92. SELECT d.*,ed.count FROM dept d,(
  93. SELECT deptno,COUNT(empno) count FROM emp GROUP BY deptno HAVING COUNT(empno)>3) ed
  94. WHERE d.deptno=ed.deptno;
  95.  
  96. --27.列出薪金比“ALLEN”多的所有员工
  97. SELECT E.ENAME FROM EMP E,(
  98. SELECT SAL FROM EMP WHERE ENAME='ALLEN')B
  99. WHERE E.SAL>B.SAL;
  100.  
  101. SELECT sal FROM emp WHERE ename='ALLEN'; //子查询
  102. SELECT * FROM emp
  103. WHERE sal>(SELECT sal FROM emp WHERE ename='ALLEN');
  104.  
  105. --28.列出所有员工的姓名及其上级的姓名:
  106. SELECT E1.ENAME 员工,E2.ENAME 上级 FROM EMP E1,EMP E2 WHERE E1.MGR=E2.EMPNO(+);
  107. --由于KING并没有上级,所以添加一个(+)号表示左连接
  108.  
  109. --29.列出受雇日期早于直接上级的所有员工的编号,姓名,部门名称
  110. SELECT e.ename,e.empno,d.dname
  111. FROM emp e,emp m,dept d
  112. WHERE e.mgr=m.empno AND e.deptno=d.deptno AND e.hiredate<m.hiredate
  113. ;
  114.  
  115. --30.列出部门名称和这些部门员工的信息,同时列出那些没有员工的部门。
  116. ·左右关联的问题,即使没有员工也要显示
  117. SELECT d.deptno,d.dname,e.empno,e.ename
  118. FROM dept d,emp e
  119. WHERE d.deptno=e.deptno(+);
  120.  
  121. --31.列出“CLERK”的姓名和部门名称,部门人数:
  122. --找出所有办事员的姓名和部门编号:
  123. select ename,dname,B.cnt from dept d,EMP e,(
  124. select deptno,count(empno) cnt from emp group by deptno)B
  125. where B.deptno=d.deptno and e.job='CLERK' AND D.DEPTNO=e.DEPTNO;
  126.  
  127. SELECT e.ename,d.dname,ed.cou
  128. FROM emp e,dept d,(SELECT deptno,COUNT(empno) cou FROM emp GROUP BY deptno) ed
  129. WHERE e.deptno=d.deptno AND job='CLERK' AND ed.deptno=d.deptno;
  130.  
  131. --32.列出最低薪金大于1500的各种工作以及从事此工作的全部雇员人数
  132. select job,min(sal),count(empno) from emp group by job having min(sal)>1500
  133.  
  134. --按工作分组,分组条件是最低工资大于1500
  135. SELECT job,MIN(sal) FROM emp
  136. GROUP BY job HAVING MIN(sal)>1500;
  137. --在按照
  138. SELECT e.job,COUNT(empno)
  139. FROM emp e
  140. WHERE job IN(
  141. SELECT job FROM emp
  142. GROUP BY job HAVING MIN(sal)>1500
  143. )
  144. GROUP BY e.job;
  145.  
  146. --33.列出在部门销售部工作的员工姓名,假设不知道销售部的部门编号
  147. select ename from emp where deptno=(
  148. select deptno from dept where dname like 'SALES');
  149.  
  150. --根据DEPT表查询销售部的部门编号(子查询)
  151. SELECT deptno
  152. FROM dept
  153. WHERE dname='SALES';
  154. --上述为子查询
  155. SELECT ename FROM emp
  156. WHERE deptno=(
  157. SELECT deptno
  158. FROM dept
  159. WHERE dname='SALES');
  160.  
  161. --34.列出薪金高于工资平均薪金的所有员工,所在部门,上级领导,公司的工资等级。
  162. SELECT E1.EMPNO,E1.ENAME,E2.ENAME,D.*
  163. FROM EMP E1,EMP E2,DEPT D
  164. WHERE E1.MGR=E2.EMPNO(+) --自连接 求出上级领导
  165. AND E1.DEPTNO=D.DEPTNO --所在部门
  166. AND E1.SAL>(--高于平均薪资
  167. SELECT AVG(SAL) FROM EMP);
  168.  
  169. --求出平均工资:
  170. SELECT AVG(sal) FROM emp;
  171. --列出薪金高于平均工资的所有雇员信息
  172. SELECT * FROM emp WHERE sal>(
  173. SELECT AVG(sal) FROM emp
  174. );
  175. --和部门表关联,查询所在部门的信息(注意KING 是没有上级的 注意右连接)
  176. SELECT e.*,d.dname,d.loc,m.ename
  177. FROM emp e,dept d,emp m
  178. WHERE
  179. e.mgr=m.empno(+) AND
  180. e.deptno=d.deptno AND
  181. e.sal>(
  182. SELECT AVG(sal) FROM emp
  183. );
  184. --求出雇员的工资等级
  185. SELECT e.*,d.dname,d.loc,m.ename,s.grade
  186. FROM emp e,dept d,emp m,salgrade s
  187. WHERE e.mgr=m.empno(+)
  188. AND e.deptno=d.deptno
  189. AND e.sal>(
  190. SELECT AVG(sal) FROM emp)
  191. AND e.sal BETWEEN s.losal AND s.hisal;
  192.  
  193. --35.列出和“SCOTT”从事相同工作的所有员工及部门名称:
  194. select ename,job,dname from emp e,dept d
  195. where job=(
  196. select job from emp where ename like 'SCOTT'
  197. )
  198. and e.deptno=d.deptno
  199. and ename not like 'SCOTT';
  200.  
  201. --SCOTT从事的工作
  202. SELECT job FROM emp WHERE ename='SCOTT';
  203. --做子查询
  204. SELECT e.*,d.dname FROM emp e,dept d
  205. WHERE e.job=(SELECT job FROM emp WHERE ename='SCOTT')
  206. AND e.deptno=d.deptno;
  207. --以上的结果存在SCOTT,应该去掉
  208. SELECT e.*,d.dname FROM emp e,dept d
  209. WHERE e.job=(SELECT job FROM emp WHERE ename='SCOTT')
  210. AND e.deptno=d.deptno
  211. AND e.ename!='SCOTT';
  212.  
  213. --36.列出薪金等于部门30中员工薪金的所有员工的姓名和薪金
  214. --求出部门30中的员工薪金
  215. SELECT sal FROM emp WHERE deptno=30;
  216. --子查询
  217. SELECT ename,sal FROM emp
  218. WHERE sal IN (SELECT sal FROM emp WHERE deptno=30)
  219. AND deptno!=30;
  220.  
  221. --37.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称
  222. --在之前的程序进行修改使用>ALL ,比最大还大
  223. SELECT ename,sal FROM emp
  224. WHERE sal >ALL(SELECT sal FROM emp WHERE deptno=30)
  225. AND deptno!=30;
  226. --再和dept关联,求出部门名称
  227. SELECT e.ename,e.sal,d.dname
  228. FROM emp e,dept d
  229. WHERE e.sal >ALL(SELECT sal FROM emp WHERE deptno=30)
  230. AND e.deptno!=30
  231. AND e.deptno=d.deptno;
  232.  
  233. --38.列出每个部门工作的员工数量、平均工资和平均服务期限
  234. --每个部门工作的员工数量:
  235. SELECT d.dname,COUNT(e.empno)
  236. FROM emp e,dept d
  237. WHERE e.deptno=d.deptno
  238. GROUP BY d.dname;
  239. --求出平均工资和服务年限
  240. SELECT d.dname,COUNT(e.empno),AVG(sal),AVG(MONTHS_BETWEEN(sysdate,hiredate)/12)
  241. FROM emp e,dept d
  242. WHERE e.deptno=d.deptno
  243. GROUP BY d.dname;
  244.  
  245. --39.列出所有员工的姓名、部门和工资
  246. SELECT e.ename,d.dname,e.sal FROM emp e,dept d WHERE e.deptno=d.deptno;
  247.  
  248. --40.列出所有部门的相信信息和部门人数
  249. --列出所有部门的人数
  250. SELECT deptno dno,COUNT(empno) cou
  251. FROM emp
  252. GROUP BY deptno;
  253. --把上表当成临时表:【由于40部门没有雇员,所以应该使用0表示】
  254. SELECT d.*,NVL(ed.cou,0) FROM dept d,(
  255. SELECT deptno dno,COUNT(empno) cou FROM emp
  256. GROUP BY deptno
  257. ) ed
  258. WHERE d.deptno=ed.dno(+);
  259.  
  260. --41、列出各种工作的最低工资以及从事此工作的雇员姓名:
  261. --按工作分组求出最低工资
  262. SELECT MIN(sal) m FROM emp GROUP BY job;
  263. --子查询
  264. SELECT e.ename FROM emp e
  265. WHERE e.sal IN(SELECT MIN(sal) m FROM emp GROUP BY job);
  266.  
  267. --42、列出各个部门的MANAGER 的最低薪金:
  268. select deptno,min(sal) from emp where job like 'MANAGER' group by deptno ;
  269.  
  270. --求出各个部门MANAGER的工资,按照部门分组
  271. SELECT deptno,MIN(sal) FROM emp WHERE job='MANAGER' GROUP BY deptno;
  272.  
  273. --43、列出所有员工的年工资,按照年薪从低到高排序:
  274. select ename,(sal+nvl(comm,0))*12 income from emp order by income;
  275.  
  276. --44、查询出某个员工的上级主管,并要求这些主管中的薪水超过3000
  277. select distinct m.* from emp e,emp m
  278. where e.mgr=m.empno
  279. and m.sal>3000;
  280.  
  281. --45、求出部门名称中带有’S‘字符的部门员工的工资合计,部门人数
  282. SELECT SUM(SAL),COUNT(EMPNO) FROM EMP
  283. WHERE DEPTNO IN(
  284. select deptno from dept where dname like '%S%'
  285. )GROUP BY DEPTNO;
  286.  
  287. --46、给任职日期超过10年的人加薪10%;
  288. UPDATE emp SET sal=sal*1.1 WHERE MONTHS_BETWEEN(sysdate,hiredate)/12>10;

oracle sql练习 菜鸟入门!的更多相关文章

  1. oracle SQL in plsql

    刚安装好的oracle和plsql,以oracle11g为例 1.刚安装好后有两个默认的系统账号和初始密码:sys/change_on_install,system/manager 2.如果忘记了或不 ...

  2. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  3. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  4. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

  5. SQL Server2008从入门到精通pdf

    下载地址:网盘下载 内容介绍 编辑 <SQL Server 从入门到精通>从初学者的角度出发,通过通俗易懂的语言.丰富多彩的实例,详细地介绍了SQLServer2008开发应该掌握的各方面 ...

  6. oracle sql 优化大全

    转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...

  7. 【转载】SQL注入攻防入门详解

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长 ...

  8. sql索引从入门到精通(十亿行数据测试报告)

    原文:sql索引从入门到精通(十亿行数据测试报告) 导读部分 --------------------------------------------------------------------- ...

  9. 7.25实习培训日志-Oracle SQL(一)

    Oracle SQL(一) 重点 尽量避免select *,影响性能,不直观. 慎用Distinct,会排序,影响性能,用exists 排序尽量利用索引,索引有序 索引列不要加函数,会使索引失效 外连 ...

随机推荐

  1. 数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题

    基础概念 派生表是从SELECT语句返回的虚拟表.派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤. 术语:*派生表*和子查询通常可互换使用.当SE ...

  2. JavaScript数据结构-9.循环链表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. vue测试安装和配置

    npm install --save-dev @vue/test-utils mocha mocha-webpack npm install --save-dev jsdom jsdom-global ...

  4. WPF INotifyPropertyChanged

    public class OrderModel:INotifyPropertyChanged { public string _oderID; public string OrderID; { get ...

  5. Tomcat源码分析——请求原理分析(中)

    前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...

  6. Spring MVC 数据绑定流程分析

    1.    数据绑定流程原理★ ①   Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...

  7. SpringBoot Mybatis的驼峰命名

    开启驼峰命名的方法 第一种方式: 可以在配置类中进行配置.配置的Demo如下: @Bean(name="sqlSessionFactory") public SqlSessionF ...

  8. File类的常用方法和练习

    File类常用的判断方法 import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /** * Fi ...

  9. Spring MVC No converter found for return value of type 解决方法

    1.在pom中添加 jackson <properties> <jackson.version>2.8.5</jackson.version> </prope ...

  10. linux centOs中安装好数据库,客户端用plsql连接oracle

    原创作品,转载请在文章显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10030375.html 首先,回顾上篇 CenOs7安装oracle图文详细过 ...