[혼공SQL] chapter 3. SQL 기본 문법 (2)

여정이·2024년 1월 16일
0

혼자 공부하는 SQL

목록 보기
7/28

📒 요약

  • SELECT문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINCT 등을 사용할 수 있다.
  • GROUP BY는 지정한 열의 데이터들을 같은 데이터끼리는 묶어서 결과를 추출할 수 있다.

좀 더 깊게 알아보는 SELECT문

1. ORDER 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은 출력하는 개수를 제한한다. 기본형은 LIMIT 시작, 개수이며, 시작은 시작하는 데이터를 의미한다.

예를 들어 회원 테이블을 조회하는데 전체 중 4번째 데이터부터 5개의 데이터만 조회하려면 다음과 같은 SQL문을 입력하면 된다.

SELECT *
FROM member
LIMIT 4, 5;

DISTINCT : 중복된 결과를 제거

DISTINCT는 조회된 결과에서 중복된 데이터를 1개만 남긴다. 열 이름 앞에 DISTINCT를 붙여 사용한다

SELECT DISTINCT addr
FROM member

2. GROUP BY

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;

HAVING : 출력 개수를 제한

앞에서 보았던 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;

0개의 댓글