오라클 데이터베이스 SQL(6) - SELECT문 구절 / ORDER BY / GROUP BY / HAVING / 순위함수
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;
이걸로 공부중