3 분 소요

SQL 기본 문법

SELECT 문

SELECT 문에서는 결과의 정렬응 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT 등을 사용할 수 있다.

그리고 GROUP BY 절은 지정한 열의 데이터들을 같은 데이턲리는 묶어서 결과를 추출한다.
주로 그룹을 묶는 경우는 합계, 평균, 개수 등을 처리할 때 사용하므로 집계 함수와 함께 사용된다.
GROUP BY 절에서도 HAVING 절을 통해 조건식을 추가할 수 있다.
HAVING 절은 WHERE 절과 비슷해 보이지만, GROUP BY 절과 함께 사용되는 것이 차이점이다.

SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

ORDER BY 절

ORDER BY 절은 결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절한다.

SELECT mem_id, mem_NAME, debut_date
    FROM member
    ORDER BY debut_date;

기본값은 ASC인데 Ascending의 약자로 오름차순을 의미하고, DESC는 Descending의 약자로 내림차순을 의미한다.

SELECT mem_id, mem_name, debut_date
    FROM member
    ORDER BY debut_date DESC;

ORDER BY 절과 WHERE 절은 함께 사용할 수 있고, ORDER BY 절이 WHERE 절 다음에 나와야 한다.
평균 키(height)가 164 이상인 회원들을 키가 큰 순서대로 조회해보겠다.

SELECT mem_id, mem_name, debut_date, height
    FROM member
    WHERE height >= 164
    ORDER BY height DESC

정렬 기준은 1개 열이 아니라 여러 개 열로 지정할 수 있다.
우선 첫 번째 지정 열로 정렬한 후에 동일할 경우에는 다음 지정 열로 정렬할 수 있다.
즉, 평균 키가 큰 순서대로 정렬하되, 키가 같으면 데뷔일자(debut_date)가 빠른 순서로 정렬한다.

SELECT mem_id, mem_name, debut_date, height
    FROM member
    WHERE height >=164
    ORDER BY height DESC, debut_date ASC;

출력의 개수를 제한: LIMIT

LIMIT는 출력하는 개수를 제한한다.
예를 들어, 회원 테이블(member)을 조회하는데 전체 중 앞에서 3건만 조회할 수 있다.

SELECT *
    FROM member
    LIMIT 3;

데뷔 일자(debut_date)가 빠른 회원 3건만 추출하려면 다음과 같이 ORDER BY와 함께 사용할 수 있다.

SELECT mem_name, debut_date
    FROM member
    ORDER BY debut_date
    LIMIT 3;

LIMIT 형식은 LIMIT 시작, 개수이다.
LIMIT 3만 쓰면 LIMIT 0, 3과 동일하다.
즉, 0번째부터 3건이라는 의미이다.

필요하다면 중간부터 출력도 가능하다.
다음과 같이 평균 키(height)가 큰 순으로 정렬하되, 3번째부터 2건만 조회할 수 있다.

SELECT mem_name, height
    FROM member
    ORDER BY height DESC
    LIMIT 3, 2;

중복된 결과를 제거: DISTINCT

DISTINCT는 조회된 결과에서 중복된 데이터를 1개만 남긴다.

열 이름 앞에 DISTINCT를 써주기만 하면 중복된 데이터를 1개만 남기고 제거한다.

SELECT DIESTINCT addr
    FROM member;

GROUP BY 절

GROUP BY 절은 말 그대로 그룹으로 묶어주는 역할 을 한다.

집계 함수는 주로 GROUP BY 절과 함께 쓰이며 데이터를 그룹화(grouping)해주는 기능을 한다.

집계 함수

함수명 설명
SUM( ) 합계
AVG( ) 평균
MIN( ) 최솟값
MAX( ) 최댓값
COUNT( ) 행의 개수
COUNT(DISTINCT) 행의 개수(중복은 1개만 인정)

각 회원(mem_id)별로 구매한 개수(amount)를 합쳐서 출력하기 위해서는 집계 함수인 SUM( )과 GROUP BY 절을 사용하면 된다.
즉 GROUP BY로 회원별로 묶어준 후에 SUM( ) 함수로 구매한 개수를 합치면 된다.

SELECT mem_id, SUM(amount)
    FROM buy
    GROUP BY mem_id;

-> 결과 열의 이름 부분에 함수 이름이 그대로 나온다.

별칭(alias)을 사용해서 다음과 같이 결과를 보기 좋게 만들 수 있다.

SELECT mem_id, SUM(amount) "총 구매 개수"
    FROM buy
    GROUP BY mem_id;

회원이 구매한 금액의 총합을 출력해보겠다.
구매한 금액은 가격(price) * 수량(amount)이다.

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
    FROM buy 
    GROUP BY mem_id;

전체 회원이 구매한 물품 개수(amount)의 평균을 구해보겠다.

SELECT AVG(amount) "평균 구매 개수"
    FROM buy;

각 회원이 한 번 구매 시 평균 몇 개를 구매했는지 알아보겠다.
회원(mem_id)별로 구해야 하므로 GROUP BY 절을 사용하면 된다.

SELECT mem_id, AVG(amount) "평균 구매 개수"
    FROM buy
    GROUP BY mem_id;

회원 테이블(member)에서 연락처가 있는 회원의 수를 카운트해보겠다.
연락처가 있는 회원만 카운트하려면 국번(phone1) 또는 전화번호(phone2)의 열 이름을 지정해야 한다.
그러면 NULL 값인 항목은 제회하고 카운트하여 결국 연락처가 있는 회원의 인원만 나온다.

SELECT COUNT(phone1) "연락처가 있는 회원"
    FROM member;

HAVING 절

집계 함수는 WHERE 절에 나타날 수 없다.
이럴 때 WHERE 대시엔 사용되는 것이 HAVING 절이다.
HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 된다.
그리고 HAVING 절은 꼭 GROUP BY 절 다음에 나와야 한다.

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
    FROM buy
    GROUP BY mem_id
    HAVING SUM(price*amount) > 1000;

만약 총 구매액이 큰 사용자부터 나타내려면 ORDER BY를 사용하면 된다.

SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
    FROM buy
    GROUP BY mem_id
    HAVING SUM(price*amount) > 1000
    ORDER BY SUM(price*amount) DESC;