SQL

오라클 데이터베이스 SQL(6) - SELECT문 구절 / ORDER BY / GROUP BY / HAVING / 순위함수

김랑해 2023. 7. 29. 22:32

SELECT 문 구절

 

순서 SELECT, FROM, WHERE, GROUP BY , HAVING, ORDER BY 

WHERE 절은 집계함수 못씀 -> HAVING 절 사용

 

 

순서 정렬하기 ASC, DESC

Q. 이름을 기준으로 역순 정렬 조회

SELECT*FROM MEMBER ORDER BY NAME DESC;
-- 안쓰면 기본 값 ASC

Q. 회원 중에서 '박'씨 성을 가진 회원 조회( 단 나이를 오름차순으로 정렬, 나이가 같을 시 등록일 내림차순으로 정렬)

SELECT * FROM MEMBERS WHERE NAME LIKE '박%' ORDER BY AGE, REGDATE DESC;

 

집계함수와 GROUP BY

집계함수 : SUM, MIN, MAX, COUNT, AVG

 

순서 : SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY

실제 실행 순서 : FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 

 

HAVING

Q. 회원별 게시글 수를 조회하시오. 단 게시글이 2 이하인 레코드만 출력하셈

SELECT WRITER ID, COUNT(ID) FROM NOTICE
GROUP BY WRITER_ID
HAVING COUNT(ID) < 2;

 

순위함수

조회수 기준으로 정렬하고 ROWNUM을 붙여보자!

 

SELECT ROWNUM, ID, TITLE, WRITER_ID, REGDATE, HIT

FROM NOTICE

ORDER BY HIT;

 

보면 ROWNUM이 제대로 붙어지지 않았음 그 이유는 ORDER BY 때문

실제 실행 순서 : FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

ROWNUM 은 WHERE 절에서 만들어지는데 ORDER BY 때문에 순서가 섞여버린 것

 

정렬한 다음 일련번호 붙이기!!

ROW_NUMBER() OVER (PARTITION BY ~ ORDER BY ~ )

-- HIT을 기준으로 정렬하고 ROW넘버를 붙이도록 하겠다 
SELECT ROW_NUMBER () OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE;

 

일련번호가 아닌 HIT을 기준으로 정렬하고 등수를 붙이고 싶은 경우 RANK

SELECT RANK() OVER (ORDER BY HIT), ID, TITLE, WRITER ID, REGDATE, HIT
FROM NOTICE;

똑같이 조회수가 9인 행은 4라는 공동 순위가 붙고 그 다음은 6번이 붙음

그럼 같은 건 4로 그대로 두되, 다음 오는 숫자가 5가 되려면?

 

SELECT DENSE_RANK() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE;

 

-- 아이디별로 PARTITION하고 걔네 안에서 순위를 매겨보자
SELECT DENSE_RANK() OVER (PARTITION BY WRITER_ID ORDER BY HIT). ID, TITLE, WRITER_ID, REGDATE
FROM NOTICE;

https://youtu.be/8tUulJ_ARfI

이걸로 공부중