设为首页 收藏本站
查看: 669|回复: 0

[经验分享] Java38: 数据库二(Oracle)

[复制链接]

尚未签到

发表于 2018-9-8 06:28:31 | 显示全部楼层 |阅读模式
  group by 分组
--每个工作的人数  
select count(job) from emp group by job;
  
--有多少工作
  
select count(coutn(job)) from emp group by job;
  
--每个工作的最高工资
  
select max(sal) from emp group by job;
  
--每个工作的最低工资
  
select min(sal) from emp group by job;
  
--每个工作的平均工资
  
select avg(sal) from emp group by job;
  
--所有工作中最大的平均工资
  
select max(avg(sal)) from emp group by job;
  使用having  根据条件过滤组
select job,count(job) from emp group by job having count(job)>=3;  where 用在group by 之前
select job,count(job) from emp where sal>1000 group by job having count(job)>=3;  decode 函数
decode(value1 if1 then1 if2 then2 ... else)  decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
  如果 value1=if1 返回then1
  否则 如果 value1=if2 返回 then2
  默认的返回值是else
select decode(sal,1600,'一千六',5000,'五千','其他') from emp;  

  
--按照job的内容分类统计其中部门ID是30的人数
  
select job,count(decode(DEPTNO,30,1,null)) deptno from emp group by(job);
  
--按照部门分类 统计每个部门中工作是CLERK的人数
  
select deptno,count(decode(job,'CLERK',1,null)) counts from emp group by(deptno);
  
--按照部门分类 计算每个每部中工作是CLERK的平均工资
  
select deptno,avg(decode(job,'CLERK',sal,null)) CLERK_AVG_SAL from emp group by(deptno);
insert into emp values(8000,'lmdtx','CLERK',8080,to_date('1980/09/09','yyyy/mm/dd'),30000,null,null);  
insert into emp values(8880,'dsy','CLERK',8980,to_date('1982/02/02','yyyy/mm/dd'),3000,null,null);
  表的关联
  外键 在一个表中 存着对应另外一张表的主键
  连接表
  1·笛卡尔积  emp 表中 deptno 为空的查询不到
--emp表中的所有的行* dept中的所有的行  
select * from emp,dept;
  
--需要写过滤条件 过滤掉不需要的
  
select * from emp,dept where emp.deptno=dept.deptno;
  

  
select * from emp e.dept d where e.deptno=d.deptno;
  2·内连接   这个结果和笛卡尔积 用条件后的结果一样
  inner join 和 join 一样(省略 inner) 默认就是 内连接
join...on...  
from emp e inner join dept d on e.deptno=d.deptno
  两个表的一个外键的名字 和 另一张表的主键的名字一样
from emp inner join dept using(deptno)select * from emp e inner join dept d on e.deptno=d.deptno;  

  
select * from emp inner join dept using(deptno);
  3·外连接
  1·左外连(左边表的数据必须是全都有的,没有的地方补null)
from emp left outer join dept using(deptno)select * from emp left outer join dept on emp.deptno=dept.deptno;  
select ename,nvl(dname,'还没有部门') from emp2 left outer join dept2 using(deptno);
  2·右外连
select * from emp right outer join dept using(deptno);  

  
--查询所有部门的名称和部门人数按人数的降序排
  
select dname,count(empno) num
  
from emp2 right join dept2 Using(deptno)
  
group by dname
  
order by num desc;
  3·全外连(全都有)
emp full outer join deptselect * from emp full outer join dept using(deptno);  
--查询所有部门的名称以及部门的人数 没有部门的人 化为 未分配
  
select nvl(dname,'未分配'),count(empno)
  
from emp2 full outer join dept2 using(deptno)
  
group by dname
  
order by dname;
  

  

  
select nvl(dname,'未分配部门') 部门名字,decode(count(empno),0,'未分配人手',count(empno)) 人数
  
from emp2 full outer join dept2 using(deptno)
  
group by dname
  
order by dname;
  4·自连接
select e1.ename,e2.ename from emp2 e1 inner join emp2 e2 on e1.mgr=e2.empno;select e1.ename, e2.ename from emp2 e1 left join emp2 e2 on e1.mgr = e2.empno;  
select nvl(e1.ename,'没有手下')  , e2.ename MGR from emp2 e1 right join emp2 e2 on e1.mgr=e2.empno;
  

  
select e2.ename,decode(count(e1.ename),0,'没有手下',count(e1.ename))from emp2 e1 right join emp2 e2 on e1.mgr=e2.empno group by e2.ename
  子查询
用在where 子句中,单行单列  
select e1.ename from emp2 e1 inner join emp2 e2 on e1.mgr=e2.empno where e2.ename='KING';
  

  
select distinct dname from emp2 e1 join dept2 d2 ON e1.deptno= d2.deptno where e1.ename like '%S%';
  

  
select dname from dept2 where deptno in(select deptno from emp2 where ename like '%S%');
  ANY() 任意一个
  ALL() 所有
select ename,job,sal from emp2 where sal>all(select DISTINCT sal from emp2 where job='MANAGER') and job'MANAGER';  

  
select ename job,sal from emp2 where sal>any(select distinct sal from emp2 where job='CLERK') and job'CLERK';
  exists 用于判断后面的子查询是否有行 有true 没有false
  
select ename from emp2 e1 where EXISTS(select 1 from emp2 e2 where e2.mgr= e1.empno);
  

  
select ename from emp2 e1 where not exists(select 1 from emp2 e2 where e2.mgr=e1.empno);
  3 in (1,2,3) true
  3 in (1,2,null) false
  5 not in (1,2,3) true
  5 not in (1,2,null) false
  5 in (1,2,null) false
  5 not in (null) false
  5in (null) false
  not in 的子查询中不能出现null值
  where 中的多列 查询
select e.ename,e.sal, d.deptno,d.dname from emp2 e inner join dept2 d on e.deptno= d.deptno where (e.deptno,e.sal) in (select deptno,min(sal) from emp2 where deptno is not null group by deptno);  

  
select * from emp2 where (deptno,sal)in (select deptno,min(sal) from emp2 where deptno is not null group by deptno);
  

  
select deptno,min(sal) from emp2 where deptno is not null group by deptno;
  用在having
from emp where deptno is not null group by deptno having avg(sal)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-567216-1-1.html 上篇帖子: oracle 导入导出 下篇帖子: Linux系统安装Oracle 11g-hiyang
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表