본문 바로가기
Skillset/SQL

SQL SELECT 예제 - FROM, WHERE, GROUP BY, HAVING, ORDER BY

by Everly. 2022. 5. 26.

실무 SQL에서 가장 많이 사용되는 'SELECT문'에 대해 알아보자.

SELECT는 데이터 분석에 있어 가장 많이 사용되는 명령어 중 하나이다. 

 

같이 많이 사용되는 명령어로는

FROM, WHERE, GROUP BY, HAVING, ORDER BY가 있으며, 어떨 때 쓰이는지 차근차근 알아보도록 하자.

 

✔Table of Contents

     

    1. FROM : 테이블 선택

    이번 포스팅에서 사용할 테이블은 [MEMBER] 이며, 따로 제공된 데이터셋을 활용한다.

    먼저 FROM절에 테이블명을 입력하여 테이블을 선택할 수 있다.

     

    SELECT * FROM MEMBER

     

    이렇게 1,206개의 행을 가진 테이블 [MEMBER] 를 불러왔다.


    2. WHERE : 테이블 필터링 

    WHERE절을 활용하면 원하는 데이터만 따로 불러올 수 있다. 

    예시로, 위의 [MEMBER] 테이블로부터 성별이 남자인 것만 필터링하려면 다음을 입력한다.

     

    SELECT *
    FROM MEMBER
    WHERE gender = 'man'

     

    성별이 남성(gender가 'man'인 것)인 데이터 684개만 출력되었다.

     


    3. GROUP BY : 테이블 그룹화

    정말 많이 쓰이는 기능이다. GROUP BY는 특히 집계함수(COUNT, SUM 등) 와 자주 쓰이게 된다. (집계함수에 대해선 추후 포스팅)

    [GROUP BY + 특정 컬럼]으로 특정 컬럼을 기준으로 데이터를 그룹화할 수 있으며, 예제로 바로 알아보자.

     

    | Q. addr(주소지)로 그룹바이하고, 남성만 필터링하여 회원수를 집계하라.

    SELECT addr, COUNT(mem_no) AS mem_cnt
    FROM MEMBER
    WHERE gender= 'man'
    GROUP BY addr

     

    | Q. 주소지(addr), 성별(gender)로 그룹바이하여 회원수를 집계하라.

    SELECT addr, gender, count(mem_no) AS mem_cnt
    FROM MEMBER
    GROUP BY addr, gender


    4. HAVING: GROUP BY 이후 필터링

    HAVING은 반드시 GROUP BY 명령어와 같이 사용되어야만 한다.

    먼저 GROUP BY로 테이블을 그룹화한 후, 이렇게 그룹화가 된 테이블에 특정 조건으로 필터링을 한다고 보면 된다.

    예시로 알아보자.

     

    | Q. 주소지(addr)별로 회원수를 집계하되, 남자만 뽑고, 회원수가 50 이상만 나오도록 하여라.

    SELECT addr, count(mem_no) AS mem_cnt
    FROM MEMBER
    WHERE gender = 'man'
    GROUP BY addr
    HAVING count(mem_no) >= 50

     

    위와 같이, 주소지(addr 컬럼)로 GROUP BY를 먼저 해준 다음,

    HAVING으로 집계한 회원수인 COUNT(mem_no)가 50 이상으로 필터링을 해준다. 

     

    ※ 순서 주의

    그냥 HAVING mem_cnt >= 50으로 하면 안되나요? 앞에서 'mem_cnt'로 정의했는데! → 안된다.

    그 이유는 SQL은 HAVING 다음에 SELECT가 실행되기 때문이다.

    즉, HAVING mem_cnt 라고 쓴다면 아직 SELECT가 실행되기 이전이므로 mem_cnt가 뭔지 SQL은 모르기 때문에 에러가 난다. 주의하기!


    5. ORDER BY: 테이블 정렬

    ORDER BY는 그 이름에서도 알 수 있듯이, 테이블을 가지런히 정렬하는 명령어이다. 다시 말해서 sorting을 한다.

    가장 마지막에 실행되는 명령어이다.

     

    내림차순 또는 오름차순으로 정렬할 수 있는데,

    내림차순이란 데이터가 큰 것부터 → 작은 순서대로 정렬하며 (가장 대표적으로 사용됨 ex. 성적순)

    오름차순이란 데이터가 작은 것부터 → 큰 순서대로 정렬하는 것을 말한다. (ex. 순위)

     

    내림차순으로 정렬하는 경우 DESC를 써주고,

    오름차순으로 정렬하는 경우 ASC를 써준다. 오름차순이 디폴트이므로 ASC는 생략해도 된다!

     

    | Q. 주소지(addr)별로 회원수를 집계하되, 남자만 뽑고, 회원수가 50 이상만 나오도록 하고, 회원수가 큰 것부터 정렬하여라.

    SELECT addr, count(mem_no) AS mem_cnt 
    FROM MEMBER
    WHERE gender = 'man'
    GROUP BY addr 
    HAVING count(mem_no) >= 50
    ORDER BY count(mem_no) DESC

     

    이렇게 회원수가 큰 순서대로 정렬한다면 내림차순 정렬이므로 DESC로 정렬해준다.

     

    5-1) ORDER BY는 가장 마지막에 실행되는 명령어이므로, 이렇게 써도 성립한다.

    ORDER BY mem_cnt DESC

     

    SELECT 다음으로 ORDER BY가 실행되기 때문에, 꼭 COUNT(mem_no)가 아니라 mem_cnt를 써줘도 된다.

     

    5-2) 또한 더 간단하게 숫자로 정렬을 할 수도 있다. 바로 '열 번호'를 이용해 정렬하는 것이다.

    ORDER BY 2 DESC

     

    위와 같이 실행하게 되면 두번째 열, 즉 mem_cnt가 내림차순으로 정렬된다.

    길게 컬럼명을 다 칠 필요가 없어서, 나는 이 방법을 애용한다 :)

     


    [참고] SQL 문법 vs. SQL 실행 순서

    • SQL 문법 순서
      • SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY
    • SQL 실행 순서
      • FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 

     

     

    이렇게 이번 포스팅에선 SQL에서 가장 많이 쓰이는 SELECT문과 명령어들을 살펴보았다. 

    다음엔 두번째로 SQL에서 많이 쓰이는 JOIN 명령어를 살펴본다.

    반응형

    댓글