Oracle(2)

显式数据类型转换:
需要我们指定数据类型
在这里插入图片描述在这里插入图片描述select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss"今天是"day’) from dual;
在这里插入图片描述查询员工的薪水:两位小数,千位符,本地货币代码
select to_char(sal,‘L9,999.99’) from emp;
在这里插入图片描述在这里插入图片描述通用函数:
在这里插入图片描述
select ename 姓名,nvl(comm,0) 奖金 from emp order by 奖金 desc;
在这里插入图片描述nvl2(a,b,c) 当a=null的时候,返回c;否则返回b;
select ename 姓名,sal*12+nvl2(comm,comm,0) 年收入 from emp order by 奖金 desc;
在这里插入图片描述nullif(a,b) 当a=b,返回null;否则返回a
select nullif(‘abc’,‘abcd’) 值 from dual;
在这里插入图片描述
coalesce(a,b,c) 从左到右找到第一个不为null的值
select comm,sal,coalesce(comm,sal) “第一个不为null的值” from emp;
在这里插入图片描述
条件表达式:
在这里插入图片描述
给员工涨工资,总裁1000,经理800,其他100
在这里插入图片描述
select ename,job,sal 涨前,case job when ‘president’ then sal+1000
when ‘manager’ then sal+800
else sal+400
end涨后 from emp;
在这里插入图片描述select ename,job,sal 涨前,
decode(job,‘president’,sal+1000,
‘manager’,sal+800,
sal+400) 涨后
from emp order by 涨后

在这里插入图片描述


多行函数

多行函数作用于一组数据,并返回一个值.

平均工资:
在这里插入图片描述

平均奖金:
在这里插入图片描述null值: 组函数会自动滤空;可以嵌套滤空函数来屏蔽他的滤空功能.

select count(*),count(nvl(comm,0)) from emp;
在这里插入图片描述查不重复的条数
select count(distinct job) from emp;
在这里插入图片描述
分组查询:
按部门查询:
select deptno,avg(sal) from emp group by deptno order by deptno;
在这里插入图片描述按职位查询:
select job,avg(sal) 平均薪水 from emp group by job order by 平均薪水 desc;
在这里插入图片描述查询多列
在这里插入图片描述查询多列时,所有未包含在组函数中的列都必须包含在group by子句中, 否则会出错
在这里插入图片描述
在这里插入图片描述包含在group by子句中的列不必包含在select列表中
在这里插入图片描述
所有包含于select列表中,而未包含于组函数中的列都必须包含于group by子句中.
在这里插入图片描述多个列的分组
多个列的分组:先按照第一个列分组,如果相同,再第二个列分组,以此类推
在这里插入图片描述过滤分组数据
查询平均工资大于2000的部门
在这里插入图片描述where和having 的区别:
where子句中不能使用多行函数和组函数

查询10部门的平均工资
在这里插入图片描述当having和where都可以使用时,尽量使用where;

group by 语句的增强:

select deptno,avg(sal) from emp group by deptno,job;
+
select deptno,sum(sal) from emp group by deptno;
+

select sum(sal) from emp;

=
select deptno,job,sum(sal) from emp group by rollup(deptno,job)

抽象:

group by rollup(a,b)

=
group by a,b
+
group by a
+
没有group

break on deptno skip 2
相同的部门号只显示一次,不同的部门号跳过两行
在这里插入图片描述break on null 恢复默认格式

select可以相加减,通过集合运算


多表查询(重要)

什么是笛卡尔积?
两张表,列数相加,行数相乘.
连接条件(至少有n-1个,n代表表的个数):两张表的相等的列
从笛卡尔积中选出正确的结果

oracle的连接条件的类型:

  • 等值连接
  • 不等值连接
  • 外连接(重点)
  • 自连接(重点)

等值连接例子:
在这里插入图片描述
查询员工信息:员工表 姓名 月薪 部门名称

select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno
在这里插入图片描述不等值连接:
查询员工信息:员工表 姓名 月薪 工资级别
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal
在这里插入图片描述
外连接:希望把某些不成立的记录(40号部门),任然包含在最后的结果中===>外连接

  • 左外连接:当 where e.deptno=d.deptno不成立的时候,等号左边的表仍然被包含在最后的结果中
  • 写法: where e.deptno=d.deptno(+)
  • 右外连接:当 where e.deptno=d.deptno不成立的时候,等号右边的表仍然被包含在最后的结果中
  • 写法: where e.deptno(+)=d.deptno

按部门统计员工信息:部门号 部门名称 人数
右外连接:
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;
在这里插入图片描述自连接:
查询员工信息:员工姓名 老板姓名
select e.ename 员工姓名,b.ename 老板姓名 from emp e,emp b where e.mgr=b.empno;
在这里插入图片描述自连接就是通过表的别名,将同一张表视为多张表
自连接不适合操作大表.

层次查询: 单表查询
select level,empno 员工号,ename 员工姓名,mgr 老板姓名 from emp connect by prior empno = mgr start with mgr is null order by 1;
在这里插入图片描述
自连接比较直观,不适合查询大表;层次查询速度快,可以查询大表,但是查询出来的东西不明显.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章