zoukankan      html  css  js  c++  java
  • Oracle 学习笔记(四)

    ​oracle表查询

    使用逻辑操作符号 

    查询工资高于 500 或者是岗位为 MANAGER 的雇员,同时还要满足他们的姓名首字母为大写 J

    SELECT * FROM emp WHERE (sal >500 or job = 'MANAGER') and ename LIKE 'J%'; 

    使用 order by 子句   默认 asc 

    按照工资的从低到高的顺序显示雇员的信息

    SELECT * FROM emp ORDER by sal; 

    按照部门号升序而雇员的工资降序排列

    SELECT * FROM emp ORDER by deptno, sal DESC; 

    使用列的别名排序

    按年薪排序

    select ename, (sal+nvl(comm,0))*12 "年薪" from emp order by "年薪" asc;  别名需要使用“”号圈中,英文不需要

    oracle表复杂查询 

    在实际应用中经常需要执行复杂的数据统计,需要显示多张表的数据。

     数据分组 ——max,min, avg, sum, count  

    查询所有员工中最高工资和最低工资

    SELECT MAX(sal),min(sal) FROM emp ; 

    最高工资那个人

    错误写法:select ename, sal from emp where sal=max(sal);

    正确写法:select ename, sal from emp where sal=(select max(sal) from emp);

    注意:select ename, max(sal) from emp;这语句执行的时候会报错,说ORA-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数;但select min(sal), max(sal) from emp;是可以执行的,因为min和max都是分组函数。

    查询最高工资员工的名字,工作岗位 

    SELECT ename, job, sal FROM emp e where sal = (SELECT MAX(sal) FROM emp); 

    查询工资高于平均工资的员工信息 

    SELECT * FROM emp  where sal > (SELECT AVG(sal) FROM emp); 

    group by 和 having子句 

    group by 用于对查询的结果分组统计;。

    having 用于限制分组显示结果。

    显示每个部门的平均工资和最高工资

    SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP by deptno; 

    注意:如果你要分组查询的话,分组的字段 deptno 一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话,就没办法分组了。

    查询每个部门的每种岗位的平均工资和最低工资

    SELECT min(sal), AVG(sal), deptno, job FROM emp GROUP by deptno, job; 

    查询平均工资低于 2000 的部门号和它的平均工资

    SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP by deptno having AVG(sal) < 2000; 

    对数据分组的总结

    1. 分组函数只能出现在选择列表、having、order by 子句中,不能出现在 where 中;

    2. 如果在 select 语句中同时包含有 group by, having, order by 那么它们的顺序是 group by, having, order by;

    3. 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在 group by 子句中,否则就会出错。

      如SELECT deptno, AVG(sal), MAX(sal) FROM emp GROUP by deptno HAVING AVG(sal) < 2000; 

            这里 deptno 就一定要出现在 group by 中 

    多表查询  

    说明:多表查询是指基于两个和两个以上的表或是视图的查询。在实际应用中,查询单个表可能不能满足需求,如查询 sales 部门位置和其员工的姓名,这种情况下需要使用到 dept 表和 emp 表

    查询雇员名,雇员工资及所在部门的名字【笛卡尔集】

    规定:多表查询的条件是至少不能少于表的个数-1 才能排除笛卡尔集

    (如果有N张表联合查询,必须得有N-1个条件,才能避免笛卡尔集合) 

    SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; 

    查询部门号为 10 的部门名、员工名和工资

    SELECT d.dname, e.ename, e.sal FROM emp e, dept d WHERE e.deptno = d.deptno and e.deptno = 10; 

    查询各个员工的姓名,工资及工资的级别

    SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal; 

    查询雇员名,雇员工资及所在部门的名字,并按部门排序

    SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno ORDER by e.deptno; 

    (如果用 group by,要把 e.deptno 放到查询列里)

    自连接 

    说明:自连接是指在同一张表的连接查询 

    查询某个员工的上级领导的姓名,比如显示员工‘Stephen’的上级 

    SELECT worker.ename, boss.ename FROM emp worker,emp boss WHERE worker.mgr = boss.empno AND worker.ename = 'Stephen'; 

    今天笔记做到这,后续有空继续。

    【微信公众号:Stephen】一个毕业三年后自学 Java 入行的程序员。
  • 相关阅读:
    jquery笔记
    JavaScript 运动框架 Step by step(转)
    js中获取页面元素方法总结
    图片缩放效果IE和火狐兼容模式
    js循环运动效果实现
    网页捕捉错误
    (图文介绍)Virtualbox下实现Ubuntu虚拟机和win7主机文件共享(很简单,亲自试用,按此步骤一般都会成功)
    FFT算法实现(fft算法)快速傅里叶变换算法实现
    $_SESSION跨页面问题
    暂别ACM,转移阵地
  • 原文地址:https://www.cnblogs.com/stephen-java/p/10759397.html
Copyright © 2011-2022 走看看