Dev JS Blog

[Oracle] order by 기초 본문

옛날 창고/SQL

[Oracle] order by 기초

Dev JS 2018. 12. 20. 20:58
728x90

Order by 기초



현재 프로젝트 하는 곳에선 오라클을 쓰고 있어서 

오늘은 간단히 오라클에서 쓰이는 order by 에 대해서 

제가 알고 있는 몇가지 활용법에 대해 알려드리겠습니다.


ORDER BY는 SELECT 한 데이터를 마지막으로 정렬 해주는데 사용합니다.

제가 마지막이라고 한 이유는 SQL 문에서 가장 마지막 실행을 하게 됩니다.

마지막인것을 강조한 이유는 이따가 다시 한 번 알아보겠습니다.


우리가 사용할 테이블은 ex_table 입니다. (시스템적으로 있는 테이블 아닙니다. 혹시 오해하실수도 있으니..)

ex_table 테이블에는 num, word, country 라는 컬럼을 갖고있는 테이블이 있습니다.


기본적인 SELECT 쿼리!


SELECT

num,

word,

country

FROM ex_table


로 실행한다면 기본적인 ex_table의 데이터 들이 나오겠지요?

결과)


 ex_table

 num

word 

country 

1

다람쥐

KOR

3

apple

ENG 

6

가방 

KOR 

4

banana 

ENG 

2

나비 

KOR 

5

라디오 

KOR 






이제 알아볼 order by를 이용해서 정렬을 해보겠습니다.

num 를 기준으로 정렬 해보겠습니다.



SELECT

num,

word,

country

FROM ex_table

ORDER BY num


결과) num 데이터 순서대로 정렬이 되었습니다.


 ex_table

 num

word 

country 

1

다람쥐

KOR

2

 나비

KOR 

3

apple

ENG 

4

banana

ENG

5

 라디오

KOR

6

 가방

KOR 


order by 에선 ASC(오름차순),DESC(내림차순)이 있습니다.

기본적으로 order by 후 아무것도 안쓰면 오름차순이 기본입니다.

그래서 내림차순으로 해본다면 

SELECT

num,

word,

country

FROM ex_table

ORDER BY num DESC


결과) 앞전 결과와 반대로 내림차순으로 바뀌는 결과


 ex_table

 num

word 

country 

6

가방 

KOR 

라디오 

KOR 

banana 

ENG 

apple 

ENG 

나비 

KOR 

다람쥐 

KOR





그럼 이제 무얼 또 해봐야 할까요?? 

정렬 기준 컬럼이 딱 1개만 가능 하지는 않겟죠??????

바로 정렬을 2개 기준으로 해보겠습니다.

어떻게 하느냐 order by 1순위, 2순위 이런 방법으로 사용하면 됩니다.


정렬 기준을 country 를 1순위 word를 2순위로 해보겠습니다.


SELECT

num,

word,

country

FROM ex_table

ORDER BY country DESC, word ASC


결과) country가 우선순위로 정렬되고(내림차순으로 KOR 먼저) 이 그다음 word 컬럼들의 기준(오름차순 이므로 가나다..abc..)으로 데이터가 정렬됩니다.


 ex_table

 num

word 

country 

 6

 가방

 KOR

 2

 나비

 KOR

 1

 다람쥐

 KOR

 5

 라디오

 KOR

 3

 apple

 ENG

 4

 banana

 ENG



그리고 null 데이터가 있을경우에는 어떻게 될까요?

word 컬럼에 라디오 대신 null 값이였다면 어떻게 될까요?


결과) 기본적으로 null값이 다른값보다 우선순위로 됩니다.


 ex_table

 num

word 

country 

 5

 null

 KOR

 6

 가방

 KOR

 2

 나비

 KOR

 1

 다람쥐

 KOR

 3

 apple

 ENG

 4

 banana

 ENG



난 null값을 최후순위로 하고싶은데? 한다면 당연히 방법이 있습니다.

NULLS LAST (null값 후순위), NULLS FIRST(null값 선순위) 를 써주면 됩니다.



SELECT

num,

word,

country

FROM ex_table

ORDER BY country DESC NULLS LAST, word ASC


결과) null 값이 가장 뒤로 갔습니다.


 ex_table

 num

word 

country 

 6

 가방

 KOR

 2

 나비

 KOR

 1

 다람쥐

 KOR

 5

null

 KOR

 3

 apple

 ENG

 4

 banana

 ENG






오라클에는 rownum 이란게 있습니다.

말그대로 데이터 결과 행마다 순서대로 넘버를 주는 것인데요.


SELECT

rownum,

num,

word,

country

FROM ex_table


결과) rownum 이라고 각 행마다의 순서대로 넘버를 부여해준 rownum 컬럼이 생겨납니다.


 ex_table

 rownum

 num

word 

country 

 1

1

다람쥐

KOR

 2

3

apple

ENG 

 3

6

가방 

KOR 

 4

4

banana 

ENG 

 5

2

나비 

KOR 

 6

5

라디오 

KOR 



여기서 가장 중요한건 처음 설명할때 ORDER BY 는 마지막에 실행되는거라고 강조했었습니다.

그 이유는 여기서 확인해 볼 수 있습니다.


SELECT

rownum,

num,

word,

country

FROM ex_table

ORDER BY num

이렇게 실행한다면 어떤 결과가 나올까요?????



결과)


 ex_table

 rownum

 num

word 

country 

 1

1

다람쥐

KOR

 5

2

 나비

KOR 

 2

3

apple

ENG 

 4

4

banana

ENG

 6

5

 라디오

KOR

 3

6

 가방

KOR 



자 생각한대로 나왔나요???

뭔가 이상하지 않나요??????

rownum 을 보면 1 2 3 4 5 순서대로 나오지 않습니다.

rownum 은 order by 보다 먼저 넘버가 부여되고 그 후 order by로 인해 정렬이 되다보니

rownum 은 순서대로 되지 않는 이런 상황이 발생하게 됩니다.

처음 쿼리 할때 흔히 하는 실수라 잘 기억하시기 바랍니다. 

order by 는 마지막에 실행된다!


그러면 rownum을 순서대로 넘버를 주고 싶다면..?

첫번째 방법

SELECT

rownum,

num

word,

country

FROM(

SELECT

num,

word,

country

FROM ex_table

ORDER BY num)

한번 묶어주고 rownum 을 해주는 겁니다.

이런 방법으로 한다면 안에 있는 쿼리에서 이미 정렬이 된 후 rownum 을 주니까

순서대로 나오게 됩니다.


두번째 방법

SELECT

ROW_NUMBER() OVER(ORDER BY num) AS rownum,

num,

word,

country

FROM ex_table


row_number() over()를 사용해주는 겁니다.

row_number() over(order by 정렬순서) 로 사용하면 됩니다.

이 방법이 좋은이유는 한번더 묶을 필요도 없고 over 안에 기존 order by 쓰듯이 써주면

정렬된 데이터에 rownum을 부여된 데이터 값이 나옵니다.


결과)


 ex_table

 rownum

 num

word 

country 

 1

1

다람쥐

KOR

 2

2

 나비

KOR 

 3

3

apple

ENG 

 4

4

banana

ENG

 5

5

 라디오

KOR

 6

6

 가방

KOR


저는 주로 row_number를 이용합니다. 보통 order by를 하고서 rownum 을 얻을려면 한번 더 묶어야하는데

이 방법은 묶지 않아도 되니까 편한 방법이죠?


쿼리 툴 없이 집에서 직접 글로 쓰려니 힘드네요..

다음엔 툴 결과를 캡쳐해서 올려야겠습니다.


생각보다 시간이 오래걸려서.. 여기까지 하고


다음에는 row_number() over() 의 또다른 사용법에 대해 포스팅 하겠습니다.




728x90

'옛날 창고 > SQL' 카테고리의 다른 글

[SQL] JOIN 에 대해서  (0) 2018.12.23
[Oracle] row_number() over() 활용  (0) 2018.12.21
[MySQL] with rollup 기능  (0) 2018.06.27
[MySql] 두 날짜 일 수 차이 구하기  (0) 2018.05.14
[MySQL] 날짜 더하기 빼기 date_add  (0) 2018.04.05
Comments