코딩 개발/ORACLE

[ORACLE] ROWNUM, ROW_NUMBER(), ORDER BY 여러개 알아보기

호소세 2023. 9. 26. 16:37
728x90
반응형

먼저 예시 데이터를 하나 만들고 시작하겠습니다. 여러 분들도 같이 직접 해보면서 알아가 보면 더욱 재밌고 쉽다고 생각합니다.

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의 값이 뒤죽박죽인 데이터들을 순차적으로 뽑아낼 수 있게 되어서 다행이라고 생각합니다.

날이 점점 추워지는데 모두 감기 조심하세요.


출처 : https://gent.tistory.com/170

https://endorphin0710.tistory.com/77

반응형