join 과 집합연산자의 차이점
- join - 데이터를 양 옆으로 연결하여 출력
- 집합연산자 - 데이터를 위아래로 연결해서 출력
위아래로 연결할때 지켜주어야 할 조건
- 위쪽 쿼리문의 컬럼의 갯수와 아랫쪽 쿼리의 컬럼의 갯수가 동일해야한다.
- 위쪽 쿼리문의 컬럼의 데이터 타입과 아래쪽 쿼리문의 컬럼의 데이터 타입이 동일해야한다.
- 결과로 출력되는 컬럼명은 위쪽 쿼리의 컬럼명으로 출력 된다.
- order by 절은 맨 마지막 쿼리문 아래쪽에만 작성할 수 있습니다.
UNION ALL 과 UNION 의 차이점
만약 A = {1,2,3,4,5}, B = {3,4,5,6,7} 이라면 UNION ALL 은
A + B = {1,2,3,4,5}+{3,4,5,6,7,} 이런식으로 중복데이터들도 다 함께 출력된다.
그래서 데이터들의 타입이 동일 해야 출력이 된다는 의미이다.
실행속도는 union all 이 조금 더 빠르다.
예제 67 deptno 별 총월급과, deptno 를 출력하고, union 을 사용하여, 그 밑에 월급 총 합계를 출력하여라
select deptno , sum(sal)
from emp
group by deptno
union all
select to_number(null)as deptno, sum(sal)
from emp;
위아래 쿼리끼리 컬럼의 갯수나, 데이터가 같아야하기때문에
총합계에 열에 null 이 나와야하므로 null 이라 작성하고 데이터 타입을 to_number 로 위에있는 쿼리의 데이터타입을 맞추어 준다.
그리고 마지막으로 별칭도 deptno 로 동일하게 해 주면 좋다. (안해도 나옴)
해당 쿼리문의 같은 결과값은
select deptno, sum(sal)
from emp
group by rollup (deptno);
rollup 집계를 사용한것과 결과 가 같다.
문제 319 : union all 이용해서 데이터를 위아래로 연결해서 출력,
삶의 주관적 만족도가 남자의 데이터와 여자의 데이터를 다음과 같이 위아래로 연결하여 출력
select feature2, extr_satifi + few_satifi as 만족도,
rank () over( order by extr_satifi + few_satifi desc) 순위
from satisfy_table
where feature1 = '연령*성별' and feature2 like '%남자%'
unionall
select feature2, extr_satifi + few_satifi as 만족도,
rank() over (oredr by extr_satifi + few_satifi desc) as 순위
from satisfy_table
where feature1 = '연령*성별' and feature2 like '%여자%'
order by 3 desc ;
select 절의 feature2 의 데이터 타입이 모두 문자,
extr_satifi + few_satifi as 만족도는 숫자 ,
rank () over (order by extr_satifi + few_satifi desc) 순위 는 숫자.
order by 절은 두번째 쿼리문 맨 마지막에만 작성 , 중간에 입력할 수 없다.
문제 320 : 혼인상태에 대한 만족도 순위와 경제활동상태에 대한 만족도와 순위쿼리문의 결과를위아래로 연결해서 출력
select feature2, extr_satifi + few_satifi as 만족도,
rank() over ( order by extr_satifi + few_satifi desc) 순위
from satisfy_table
where feature1 = '혼인상태'
union all
select feature2, extr_satifi + few_satifi as 만족도,
rank() over ( order by extr_satifi + few_satifi desc) 순위
from satisfy_table
where feature1 = '경제활동상태'
order by 3 asc;
문제 322 rollup 을 사용한 SQL 을 UNION ALL 로 출력하시오
select job, sum(sal)
from emp
group by rollup(job);
—> order by 안써도 정렬됐음
select job, sum(sal)
from emp
group by job
union all
select to_char(null)as job, sum(sal)
from emp
order by 1 asc;
첫번째 컬럼인 job 과 데이터 타입을 맞추어 주기 위해 두번째 컬럼의 null 을 to_char 로 변환해 주었다.
**** union all 은 현업에서 잘 안쓴다. (emp table 을 두번이나쓰기때문에)
rollup 을 더많이씀.
문제 323 : cube 로 작성한 것을 union all 로 바꾸시오
select to_char(hiredate, 'RRRR') , sum(sal)
from emp
group by cube(to_char(hiredate, 'RRRR'));
select to_char(hiredate, 'RRRR') as 입사년도, sum(sal)
from emp
group by to_char(hiredate, 'RRRR')
union all
select to_char (null)as 입사년도, sum(sal)
from emp
order by 1 asc nulls first;
order by 절은 맨아래의 쿼리문에만 사용가능, order by 입사한년도 asc nulls first 는 입사한년도를 asc 하게 정렬하고 null 값은 맨위로 출력하겠다는뜻
'Oracle > SQL' 카테고리의 다른 글
SQL 집합연산자 Intersect 교집합 (0) | 2021.11.28 |
---|---|
SQL 집합연산자 UNION 데이터 중복 X 합집합 (0) | 2021.11.28 |
SQL ANSI /ISO STANDARD JOIN - CROSS Join (0) | 2021.11.28 |
SQL ANSI /ISO STANDARD JOIN - Full Outer Join / in line view 복습문제 (0) | 2021.11.28 |
SQL ANSI /ISO STANDARD JOIN - Left/ Right outer join (0) | 2021.11.25 |