[Oracle] 오라클 #5 SELECT문 - distinct, case문

[distinct]

- 컬럼리스트에서 사용

- distinct 컬럼명

- 중복값 제거.

- null도 데이터의 한 종류로 인식한다. -> null을 가지는 레코드들도 중복값 제거가 된다.


ex ) tblCountry에는 어떤 대륙들이 있습니까?

select 대륙 from tblCountry;

>> tblCountry 테이블이 다음과 같다고할 때!

 국가

대륙 

 대한민국

아시아

 이탈리아

유럽 

 미국

북아메리카 

 독일

유럽 

다음과 같은 테이블에서 select 대륙 from tblCountry; 쿼리를 날리면 결과는


아시아

유럽

북아메리카

유럽


>> 이런 결과가 나오게 됩니다. 즉, (**) 유럽이라는 데이터가 2개로 겹치게 됩니다. 유럽이라는 문자열 데이터는 같으나 순수 테이블 레코드개념에서는 명백히 다른 레코드입니다. 하지만 단순 select 대륙 이라는 키워드로 쿼리를 날리게 되면 이러한 중복문제가 발생하게 됩니다. 이러한 문제를 해결해주는 키워드가 바로 distinct 키워드입니다.


ex ) 

select distinct continent from tblcountry; 

>>  아시아

유럽

북아메리카 


주의점

- distinct는 컬럼리스트에 딱 1번만 적을 수 있다.

- distinct키워드 뒤의 모든 컬럼리스트를 합쳐서 중복값 검사를 한다.

ex ) 

select distinct price,qty from tblhousekeeping; 

>> 이렇게하면 qty(개수) 컬럼의 값은 2개가 존재하는데 (물론 물리적으로 같은 값을 가지는 데이터일 수도 있지만 명백히 다른 레코드로 분류되었으므로 별개의 레코드입니다.) price가 같은 값이면 이상한 구조가 되어버리는 것이죠.


next.


[case]

- 컬럼리스트에서 사용

- 조건절에서 사용

- 사용횟수 자유.

- 자바 : if+switch 문


tblName 이라는 테이블이 다음과 같은 데이터가 있다고 합니다.

이름 

성별

국가

몸무게 

 홍길동

 m

 ko

 60

아무개 

 f

 jp

 70

 하하하

 m

 us

 55

 호호호

 f

 hk

 65

 후후후

 f

 ch

 45


테이블들의 컬럼값들이 조화가 좀 이상하지만.... 설명을 해보겠습니다.


그냥 select * from tblName; >> 위의 결과가 나오게 됩니다. 근데 보시면 성별의 경우는 m, f로 나뉘어져 있습니다. 이러한 값을 코드값이라고 부르는데, 이렇게 코드데이터로 잡혀있는 경우에 (물론 성별의 경우는 유추가 가능합니다만) 확실한 정보로써 알기는 힘듭니다. 따라서 case 문을 이용해서 남성여성으로 바꾸어 보겠습니다.


select 이름,

case 

    when 성별 = 'm' then '남자' 

    when 성별 = 'f' then '여자' 

end as 성별

from tblName;


>> 이렇게 쿼리를 날리게 된다면 m 값에 걸리는 컬럼은 성별값을 '남자'로 채워넣고 , f 값에 걸리는 컬럼은 성별값을 '여자'로 채워넣게 됩니다.

이것은 테이블의 값을 변경하는 것이 아닙니다. 즉, select * from tblName을 다시 날려보면 위의 테이블처럼 나옵니다. 단지, select 문으로 보여주는 수준에서 데이터를 가공하는 것 뿐입니다.


select name, 

case

    when 국가 = 'ko' then '대한민국'

    when 국가 = 'jp' then '일본'

    when 국가 = 'us' then '미국'

    else '기타'

end as 국가

from tblName;


>> 이렇게 ko, jp, us가 아닌 그외의 값들은 else 절로 처리가 가능합니다.


next


추가지식

case 문을 쓸때 'as OO'이라고 나와있는것은 무엇인가요?

>> as 는 alias의 약자로 별칭이라는 것입니다. 즉, 테이블에서 저 'as 성별' 키워드를 제거하게되면 보여주는 select문에서 컬럼명이 case문 전체가 쓰여집니다.

ex) 

 이름

 case when 성별 = 'm' then '남자' when 성별 = 'f' then '여자' end

 홍길동

남자 

아무개 

여자 

하하하 

남자 

호호호 

여자 


이런식으로 됩니다. 이렇게 길어지는 컬럼명을 'as 성별' 키워드를 통해 성별이라는 컬럼명으로 별칭을 붙여주는 것이랍니다.^^




댓글

Designed by JB FACTORY