먼저 예시 데이터를 하나 만들고 시작하겠습니다. 여러 분들도 같이 직접 해보면서 알아가 보면 더욱 재밌고 쉽다고 생각합니다.
product table 을 만들어 보겠습니다.
예시 테이블 만들기
CREATE TABLE product(
id NUMBER PRIMARY KEY,
name VARCHAR2(100) NOT NULL,
maker VARCHAR2(100) NOT NULL,
price NUMBER DEFAULT 0
)
INSERT INTO product(id,name,maker,price) VALUES(1,'불닭볶음면','삼양',1500);
INSERT INTO product(id,name,maker,price) VALUES(2,'신라면','농심',1300);
INSERT INTO product(id,name,maker,price) VALUES(3,'새우깡','농심',1200);
INSERT INTO product(id,name,maker,price) VALUES(4,'포카칩','농심',1100);
INSERT INTO product(id,name,maker,price) VALUES(5,'초코하임','롯데',1800);
INSERT INTO product(id,name,maker,price) VALUES(6,'카스테라','농심',1700);
INSERT INTO product(id,name,maker,price) VALUES(77,'참쌀선과','선과',2000);
테이블을 생성하고 이제 ROWNUM, ROW_NUMBER(), ORDER BY에 대하여 알아보겠습니다.
1. ROWNUM
SELECT ROWNUM, p.* FROM PRODUCT p
ROWNUM 에 대한 결과 값을 볼까요?
어떤가요? 데이터를 저장한 순서대로 나왔죠? 아니면 그냥 데이터가 추출된 순서라고 생각하면 됩니다.
ROWNUM 오름차순
id의 값 오름차순으로 ROWNUM의 숫자를 매기고 싶으면,
SELECT ROWNUM, p.*
FROM (
SELECT a.*
FROM PRODUCT a
ORDER BY a.id ASC
) p
FROM 부분을 오름차순으로 따로 정리하여 사용해야 합니다.
이러면 불편하다라고 느껴지죠.
그래서 ROW_NUMBER() 함수를 이용하여 쉽게 데이터를 추출할 예정입니다.
2. ROW_NUMBER() OVER(ORDER BY )
SELECT ROW_NUMBER() OVER(ORDER BY p.id) row_num, p.*
FROM PRODUCT p
ROW_NUMBER() 함수를 이용해서 id 값을 오름차순으로 정리하고 번호를 매긴다는 말입니다.
위의 ROWNUM과 같은 결과지만 SQL 문은 확실히 짧아졌죠?
그리고 위의 결과 값을 maker 이름 오름차순으로 정리하면 row_num이 어떻게 바뀌는지 알아보아요.
ROW_NUM() 다른 예제
SELECT ROW_NUMBER() OVER(ORDER BY p.id) row_num, p.*
FROM PRODUCT p
ORDER BY p.maker
기존에 있던 row_num의 숫자는 변경되지 않고 maker의 이름이 오름차순이 되었습니다.
결국 id에 따라서 row_num을 설정하는 것이 먼저 실행되고 order by가 실행되는 것입니다.
3. ORDER BY 여러 개
ORDER BY의 매개변수(?)가 하나인 것은 많이 사용해 봤는데 두 개나 여려 개는 사용해 본 적이 없었습니다. 이번에 알아보겠습니다.
위의 row_num 함수를 이용한 예시를 보겠습니다.
SELECT ROW_NUMBER() OVER(ORDER BY p.maker, p.name) row_num, p.*
FROM PRODUCT p
이러한 결과가 나오게 됩니다.
일단 먼저 maker로 줄을 세우고 다음은 name으로 줄을 세웁니다.
ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ
농심, 롯데, 삼양, 선과로 먼저 줄을 세우고,
maker별로 그 안에서 name으로 줄을 세우는 순서입니다.
ORDER BY를 여러 개 작성하면 먼저 작성한 매개변수부터 나중에 작성한 매개변수 순으로 순서를 정해줍니다.
여러 가지 column으로 연습해 보세요.
소감
order by의 순서와 row_num의 사용 방법으로 순차적으로 데이터를 생성할 수 있겠습니다. 가령 id의 값이 뒤죽박죽인 데이터들을 순차적으로 뽑아낼 수 있게 되어서 다행이라고 생각합니다.
날이 점점 추워지는데 모두 감기 조심하세요.
'코딩 개발 > ORACLE' 카테고리의 다른 글
[Oracle] MERGE INTO, USING ON, WHEN (NOT) MATCHED THEN (2) | 2024.03.29 |
---|---|
[ORACLE] DECODE, TO_CHAR(요일), TO_DATE (0) | 2024.02.20 |
[Oracle] INSTR 함수 (In String) (0) | 2023.09.24 |
[ORACLE] - NVL, NVL2 함수 (Null Value) (0) | 2023.09.24 |
DBeaver - CSV 파일 내보내기 및 한글 깨짐 이슈 해결 (1) | 2023.08.30 |