Oracle基础(四):单表查询
- select 【distinct】 * | {列名...} from 表名 【where {条件}】
- 指查询的字段数据,全部一致,才算重复。
SELECT distinct deptno,job,empno FROM EMP order by deptno;
- 查询的这(deptno,job,empno)三个字段需要一样,才算重复。
SELECT a.deptno,a.job FROM EMP a; SELECT distinct a.deptno,a.job FROM EMP a order by a.deptno
- 查询的这(deptno,job)2个字段需要一样
SELECT a.deptno,a.job FROM EMP a; SELECT distinct a.deptno,a.job FROM EMP a order by a.deptno
- 查询的这(deptno,job)2个字段需要一样
- ABS(x) :绝对值
- sign(x) :判断正负。
- 正值返回1,负值返回-1,0返回0
- ceil(x):向上取整。
- select ceil(3.1),ceil(0),ceil(-3.9) from dual; --4、0、-3
- floor(x) :向下取整。
- power(x,y) :返回x的y次幂
- mod(x,y) :返回x除以y的余数
- round(x[,y]) :返回四舍五入后的值
- trunc(x[,y]) :返回x按精度y截取后的值 。*
select trunc(5555.66666,2.1),trunc(5555.66666,-2.6),trunc(5555.033333) from dual;
- 显示:5555.66、5500、5555
- sqrt(x) :返回x的平方根
- 语句:
SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪", a.ename||'-'||(a.sal*13+nvl(a.comm,0)*13) as "拼接字串"FROM EMP a ;
- comm:为奖金
- 注意:
- nvl(字段,0):处理null值
- as "" :增加别名
- ||:拼接字串
SELECT * FROM EMP a WHERE to_char(a.hiredate,'yyyy-mm-dd') > '1981-11-17';
SELECT * FROM EMP a WHERE a.sal between 2000 and 2500;--包含本身,都是闭区间SELECT * FROM EMP a WHERE a.sal >= 2000 and a.sal <= 2500;
SELECT * FROM EMP a WHERE a.empno in (7369,7521,7654);
SELECT * FROM EMP a WHERE a.mgr IS NULL;
SELECT * FROM EMP a WHERE (a.sal >500 or a.job='MANAGER') and a.ename like 'J%';
- and 与 or的优先级:NOT > AND > OR
- where 后面如果有or的条件,则or自动会把左右的查询条件分开
- 用()来区分执行顺序
- asc-升序(默认)/desc-降序
- 排序实例
SELECT * FROM EMP a order by a.sal;--一个条件 SELECT * FROM EMP a order by a.deptno , a.hiredate desc;--2个条件
- 先按deptno 排序
- 在第一个排序结果中,按第二个条件。
- 按列的别名排序
SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪" FROM EMP a order by 年薪;
- 这边可以按照列的编号排序
SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪" FROM EMP a order by 1;
- 这边的编号,不能超出显示的列的数量。
SELECT max(a.sal),min(a.sal) FROM emp a ; SELECT max(a.sal*13) , min(a.sal*13) FROM emp a ;
- --放在一起,前提条件是max 和min都返回一个值
SELECT round(avg(a.sal),2),sum(a.sal) FROM emp a ;
- round:四舍五入
SELECT avg(a.comm) FROM emp a ; SELECT sum(a.comm)/count(*) FROM emp a ;
- 为空的参与,可以这么解决
SELECT count(*) FROM emp a ;SELECT count(a.empno) FROM emp a ;
SELECT count(a.comm) FROM emp a ;
- 不统计 null 的列。
SELECT a.ename,a.job FROM emp a WHERE a.sal = (SELECT max(a.sal) FROM emp a);
- 子查询
- 可以先查出最高工资
- 然后查出哪位员工的工资是这么多
- 分析执行顺序
- sql执行默认是从右到左执行
- 先执行:SELECT max(a.sal) FROM emp a 得到 5000
- 再执行:SELECT a.ename,a.job FROM emp a WHERE a.sal =5000;
SELECT a.ename,a.job FROM emp a WHERE a.sal > (SELECT avg(a.sal) FROM emp a);
- group by:对查询的结果进行分组统计
- having:修饰分组的条件,限制分组显示结果。
- 不支持别名
- SQL:
SELECT avg(a.sal), max(a.sal),a.deptno FROM emp a group by a.deptno;
- 分析:
- SELECT avg(a.sal), max(a.sal),a.deptno FROM emp 报错
- avg(a.sal) 和max(a.sal)为一个结果,而 a.deptno 很多结果。
- SQL:
SELECT avg(a.sal), max(a.sal),a.deptno,a.job FROM emp a group by a.deptno ,a.job order by a.deptno ;
- 分析:
- 先对【部门】分组,再对【岗位】分组。
- 【排序】都是放在末尾
- SQL:
SELECT avg(a.sal) as "平均工资", a.deptno FROM emp a group by a.deptno having avg(a.sal)<2000
- 分析:
- having:限制分组显示结果。后面不支持别名,只能重新计算。
- 先分组,计算各个部门的平均工资。再利用having对分组后的结果进行删选。
- SELECT avg(a.sal), max(a.sal),a.deptno,a.job FROM emp a group by a.deptno, a.job;
- 这边的 deptno 和 job 必须都要 出现在 group by 中。
- 原因为聚合函数 每次返回一个结果
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。