📒 요약
- SELECT문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT 등을 사용할 수 있다.
- GROUP BY는 지정한 열의 데이터들을 같은 데이터끼리는 묶어서 결과를 추출할 수 있다.
ORDER BY는 결과의 값이나 개수에 대해서는 영향을 미치지 않지만, 결과가 출력되는 순서를 조절한다. (오름차순, 내림차순) 기본값으로는 오름차순인 ASC인데, 내림차순으로 정렬할 때는 DESC으로 설정하면 된다.
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date; -> 오름차순으로 정렬
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date DESC; -> 내림차순으로 정렬
ORDER BY와 WHERE를 함께 사용할 수 있는데, 이 때 WHERE절을 ORDER BY 앞에 써야 한다. 아래의 예시는 평균 키가 164 이상인 회원들의 키가 큰 순서대로 출력하는 SQL문이다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY debut_date;
출력할 데이터의 순서를 고려할 때 우선순위를 지정할 수 있는데, ORDER BY 안에 여러 조건을 지정하는 것이다. 다음 내용은 평균 키가 큰 순서대로 정렬하되, 평균 키가 같으면 데뷔 일자가 빠른 순서대로 정렬한다.
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;
LIMIT은 출력하는 개수를 제한한다. 기본형은 LIMIT 시작, 개수이며, 시작은 시작하는 데이터를 의미한다.
예를 들어 회원 테이블을 조회하는데 전체 중 4번째 데이터부터 5개의 데이터만 조회하려면 다음과 같은 SQL문을 입력하면 된다.
SELECT *
FROM member
LIMIT 4, 5;
DISTINCT는 조회된 결과에서 중복된 데이터를 1개만 남긴다. 열 이름 앞에 DISTINCT를 붙여 사용한다
SELECT DISTINCT addr
FROM member
GROUP BY절은 그룹으로 묶어주는 역할을 한다. 주로 집계 함수와 함께 사용하는데, 데이터를 그룹화하는 기능이 있다. 주로 사용하는 집계 함수는 다음과 같다.
함수명 | 설명 |
SUM() | 합계를 구한다. |
AVG() | 평균을 구한다. |
MIN() | 최솟값 구한다. |
MAX() | 최대값을 구한다. |
COUNT() | 행의 개수를 구한다. |
COUNT(DISTINCT) | 중복된 데이터는 1개만 인정하여 행의 개수를 구한다. |
집계 함수를 사용한 예시는 아래 내용과 같다.
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;
SELECT mem_id, SUM(price*amount) FROM buy GROUP BY mem_id;
SELECT AVG(amount) "평균 구매 개수" FROM buy;
SELECT COUNT(*) FROM member;
앞에서 보았던 WHERE절에 조건을 달아 필요한 조건을 충족하는 데이터만 조회할 수 있었다. 그러나 WHERE은 집계 함수와는 사용할 수 없는데, 이 때 WHERE 대신 사용하는 것이 HAVING이다. HAVING은 WHERE과 비슷한 개념으로 조건을 제한하는 것인데, 집계 함수에 대해 조건을 제한하는 것이다. 그러므로 반드시 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;