일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 시놀로지
- 시큐리티
- EAS
- Native
- yml
- Android
- 스프링
- 이클립스
- string
- 로또
- 앱
- expo
- sql
- YAML
- Java
- Navigation
- spring
- mysql
- 안드로이드
- DB
- thymeleaf
- sdk
- 자바스크립트
- react
- sts
- Admob
- 폰트
- 배포
- springboot
- sqlite
- Today
- Total
Dev JS Blog
[Oracle] order by 기초 본문
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 |
5 | 라디오 | KOR |
4 | banana | ENG |
3 | apple | ENG |
2 | 나비 | KOR |
1 | 다람쥐 | 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() 의 또다른 사용법에 대해 포스팅 하겠습니다.
'옛날 창고 > 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 |