멈추지 않는 기록

[혼자공부하는SQL] 7강 본문

웹 개발/MySQL

[혼자공부하는SQL] 7강

pangil_kim 2025. 2. 13. 04:03
728x90

03-2. 좀 더 깊게 알아보는 SELECT 문

0. 시작하기 전에

  • SELECT 문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복된 데이터를 제거하는 DISTINT등을 사용할 수 있다.
  • GROUP BY절은 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과를 추출한다.
    • HAVING 절을 통해 조건식을 추가할 수 있다.
    • HAVING 절은 WHERE 절과 비슷해 보이지만, GROUP BY 절과 함께 사용되는 것이 차이점이다.

1. ORDER BY절

1) SELECT 절의 형식

SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자
  • 위의 순서는 지켜져야 한다. (ex. Where절이 From보다 앞에 나간 경우)

2) ORDER BY

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

SELECT mem_id, mem_name, debut_date 
   FROM member 
   ORDER BY debut_date;
  • ASC 오름차순 : 작은 것에서 큰 것으로 (기본값)
  • DESC 내림차순 : 큰 것에서 작은 것으로
-- 키를 기준으로 내림차순 정렬
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC;
-- 키를 기준으로 내림차순 정렬
-- 동일한 키일 경우 데뷔 일자를 기준으로 오름차순 정렬 (데뷔 순)
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;

3) LIMIT

-- 3개의 행만 보고 싶을 경우 -> LIMIT 사용
SELECT *
FROm member
LIMIT 3;
-- 데뷔 순(오름차순)으로 3개의 행만 보고 싶을 경우
SELECT mem_name, debut_date
    FROM member
    ORDER BY debut_date
    LIMIT 3;
  • 반드시 ORDER BY 다음에 LIMIT을 사용한다.
-- 키를 내림차순으로 정렬하고, 3개를 건너 띄고 2개의 행을 보고 싶을 경우
Select * from member ORDER BY height DESC LIMIT 3, 2;
  • 정렬된 결과에서 4번째 행부터 시작하여 2개의 행을 가져온다.
  • (첫 번째 숫자는 건너뛸 행의 수, 두 번째 숫자는 가져올 행의 수)
  • 강의에서는 이 부분이 잘못되어 있었음

4) DISTINCT

: 여러 개의 중복된 것을 하나만 보여주는 구문이다.

-- addr(주소) 중 중복을 제거해서 보여준다.
select DISTINCT addr from member;

5) GROUP BY

: 그룹으로 묶어주는 역할을 한다.

-- market_db의 구매 테이블(buy)에서 회원(mem_id)이 구매한 물품의 개수를 구할 수 있다.
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;

(1) GROUP BY와 함께 사용되는 집계함수(aggregate function)

함수명 설명
SUM() 합계
AVG() 평균
MIN() 최소값
MAX() 최댓값
COUNT() 행의 개수
COUNT(DISTINCT) 행의 개수 (중복은 1개만)
-- member 별 구매한 수량을 합계로 보고 싶을 때
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;

SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수" FROM buy GROUP BY mem_id;
-- member 별 총 구매 금액을 합계로 보고 싶을 때
SELECT mem_id "회원 아이디", SUM(price * amount) "총 구매 금액" FROM buy GROUP BY mem_id;
  • 가격과 수량을 곱하여 해당 구매건의 합계를 구하고, 이를 SUM으로 합계로 구한다.
-- 평균 구매 개수
SELECT AVG(amount) "평균 구매 개수" FROM buy;
-- member 별 평균 구매 개수
SELECT mem_id, AVG(amount) "평균 구매 개수" FROM buy GROUP BY mem_id;
-- 회원의 수
SELECT COUNT(*) FROM member;

-- 핸드폰이 있는 회원의 수
SELECT COUNT(phone1) "연락처가 있는 회원" FROM member;
  • COUNT의 경우 Null인 것을 빼고 계산한다.
-- 1000만원 이상 구매한 경우 (WHERE절 사용) -> 오류 발생
SELECT mem_id "회원 아이디", SUM(price * amount) "총 구매 금액" 
FROM buy 
WHERE SUM(price * amount) > 1000
GROUP BY mem_id;

-- 1000만원 이상 구매한 경우 (HAVING절 사용) -> 정상 작동
SELECT mem_id "회원 아이디", SUM(price * amount) "총 구매 금액" 
FROM buy 
GROUP BY mem_id
HAVING SUM(price * amount) > 1000;

-- 1000만원 이상 구매한 경우 중 내림차순으로 정렬
SELECT mem_id "회원 아이디", SUM(price * amount) "총 구매 금액"
FROM buy
GROUP BY mem_id
HAVING SUM(price * amount) > 1000
ORDER BY SUM(price * amount) DESC;
  • WHERE를 사용할 수 없다.
    • GROUP 함수에서 조건을 사용할 때에는 HAVING을 사용
728x90

'웹 개발 > MySQL' 카테고리의 다른 글

[혼자공부하는SQL] 9강  (1) 2025.02.13
[혼자공부하는SQL] 8강  (0) 2025.02.13
[혼자공부하는SQL] 6강  (0) 2025.02.13
[혼자공부하는SQL] 5강  (0) 2025.02.13
[혼자공부하는SQL] 4강  (0) 2025.02.13