Java 38: 데이터베이스 2 (Oracle)


그룹 별 그룹
--       
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, 부족 값)
 value 1 = if1 이 then 1 로 돌아 오 면
    그렇지 않 으 면 value 1 = if2 가 then 2 로 돌아 가면
        기본 반환 값 은 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 과 마찬가지 로 기본 값 은 내부 연결 입 니 다.
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 dept
select * 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 () 임의의 하나
모든 () 소유
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;

쓰다
from emp where deptno is not null group by deptno having avg(sal) 
  
select max(avg(sal)) from emp2 group by deptno;
select deptno,round(avg(sal)) from emp2 where deptno is not null group by deptno HAVING avg(sal) 
  
select dname,deptno from emp2 join dept2 using(deptno) where deptno is not null group by deptno,dname having avg(sal)=(select max(avg(sal)) from emp2 group by deptno);

페이지 를 나누다
    위조 하여 열거 하 다
select empno,ename,rownum from emp2 order by ename;
select * from emp2 where rownum<=10;
select * from (select empno,ename, rownum n from emp2 where rownum<=10) where n>5 and n<=10
select * from (select empno,ename, rownum n from emp2 ) where n>5 and n<=10
select * from (select empno,ename, rownum n from emp2 where rownum<=10) where n>5
select * from (select empno,ename,sal, rownum n from (select * from emp2 order by sal) where rownum <=10) where n>5;

내 연 보기 (Inner View)
바로 select 후의 결 과 를 표 로 삼 는 것 이다.
select ename   ,job   ,emp_num      from emp2 join(select deptno d,count(empno) emp_num from emp2 inner join dept2 using(deptno) group by deptno) on deptno=d where job='MANAGER';
select ename   ,job   ,dname   ,deptno     ,emp_num      from emp2 inner join(select deptno d,count(empno) emp_num,dname from emp2 inner join dept2 using(deptno) group by deptno, dname) on deptno=d where job='MANAGER'

group by 여러 열 그룹
이 두 열 은 모두 부서 에 대한 유일한 표지 로 서 조별 에 영향 을 주지 않 는 다.

좋은 웹페이지 즐겨찾기