본문 바로가기
🛢 3. Database/3-1 Mysql

[Database] 14. SELECT 구절 순서와 처리 과정

by 달님🌙 2021. 9. 28.
반응형

 

1. SELECT 구절 작성 순서

 

1. SELECT 구절 작성 순서

 

 

 

2. SELECT 구절 처리 과정

 

0. 처리 순서 

FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

 

1. FROM city : 데이터 가공 처리를 위한 격자형 데이터 구조(테이블/레코드 연산)를 마련

 

2. WHERE `Population` > 200000 : 레코드 필터링

 

3. GROUP BY `CountryCode`  : 집계(COUNT/AVG/MIN/MAX)

 

4. HAVING `CNT` >= 2 : 집계된 레코드에서 필터링

 ★집계함수(COUNT/AVG/MIN/MAX)는 WHERE 절에서 사용 할 수 없다.

 

5. SELECT 

 

6. ORDER BY `CNT` DESC : 정렬



7) 다 합치면 ? 

    SELECT COUNTRYCODE, COUNT(COUNTRYCODE) CNT

    FROM CITY

    WHERE POPULATION > 5000000

    GROUP BY COUNTRYCODE

    HAVING CNT >=2

    ORDER BY CNT DESC, COUNTRYCODE ASC;

 

 

3. SELECT 구절 사용

 

1. 정렬하기(ORDER BY)  : 오름차순(ASC) / 내림차순(DESC)

 

    > 공지사항 테이블에서 조회수가 가장 많은 순서로 출력하시오     

SELECT ID, TITLE, WRITER_ID, HIT, REGDATE
FROM NOTICE
ORDER BY HIT;

-- 2차 정렬
SELECT ID, TITLE, WRITER_ID, HIT, REGDATE
FROM NOTICE
ORDER BY HIT DESC, REGDATE DESC;

         

2. 집계 함수와 GROUP BY : SUM, MIN, MAX, COUNT, AVG

1) 컬럼 전체를 대상으로 집계(분석)

SELECT SUM(HIT) FROM NOTICE;
SELECT AVG(HIT) FROM NOTICE;

 

2) 소규모 그룹으로 나눠서 집계(분석)

SELECT COUNT(ID) FROM NOTICE;
SELECT COUNT(ID) FROM NOTICE GROUP BY WRITER_ID;

 

3) HAVING 절     

> 공지사항 테이블에서 작성자별 글 올린 개수를 출력하시오 (단, 게시글 수가 2회 이상인 작성자만 출력)

-- 틀린 예시
SELECT WRITER_ID, COUNT(ID)
FROM NOTICE
WHERE COUNT(ID) >= 2;
GROUP BY WRITER_ID;      

-- 맞는 예시
SELECT WRITER_ID, COUNT(ID) CNT
FROM NOTICE
GROUP BY WRITER_ID
HAVING CNT >= 2 
ORDER BY CNT DESC;

-- 순서: 
FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY
		       |----- 집계함수 사용가능 영역 ------>



> city 테이블에서 population이 최대인 행을 출력하시오

-- 틀린 예시 (이유 : where절에는 집계함수를 쓸 수 없음)
select * from city where population = max(population);

 

 

3. 순위함수

1) ROW_NUMBER() OVER()

2) RANK OVER()

3) DENSE_RANK OVER()

 

 > 조회수에 따른 순위    

-- 1. ROW_NUMBER() : 말 그대로 row number을 출력해줌
SELECT TITLE, WRITER_ID, HIT, 
ROW_NUMBER() OVER(ORDER BY HIT DESC) `RANK`
FROM NOTICE;

        
-- 2. RANK() : 순위를 나타냄(20등이 3개 일 경우 그 다음 순위는 23등)
(RANK()는 똑같은 hit를 가진 애들을 같은 순위를 나타내게 해줌)
SELECT TITLE, WRITER_ID, HIT,
RANK() OVER(ORDER BY HIT DESC) `RANK`
FROM NOTICE;


-- 3. DENSE_RANK() : 순위를 나타냄 (20등이 3개 일 경우 그 다음 순위는 21등)
SELECT TITLE, WRITER_ID, HIT,
DENSE_RANK() OVER(ORDER BY HIT DESC) `RANK`
FROM NOTICE;


-- 4. PARTITION : 순위를 나타냄 (20등이 3개 일 경우 그 다음 순위는 21등)
SELECT WRITER_ID, TITLE, HIT,
DENSE_RANK() OVER(PARTITION BY WRITER_ID 
ORDER BY HIT DESC) `RANK`
FROM NOTICE;

 

반응형

댓글