본문 바로가기
카테고리 없음

MySQL 공부 2일차|집계함수부터 JOIN까지

by proprocess-manager 2026. 9. 16.
반응형

어제는 MySQL의 기본 명령어를 공부하면서 SELECT, WHERE, ORDER BY, LIMIT 등의 기본적인 사용 방법을 정리했습니다.

오늘 교육에서는 여기에서 한 단계 더 나아가 데이터를 계산하고, 그룹으로 묶고, 조건을 적용하고, 문자열과 날짜를 가공하고, 여러 테이블을 연결하는 방법을 배웠습니다.

2일차에는 기본 조회 명령어에서 조금 더 확장된 SQL 문법을 다루면서 데이터베이스의 데이터를 어떻게 계산하고 가공하는지 중심으로 내용을 정리했습니다.

1. 2일차에 배운 내용 한눈에 보기

분류 배운 문법
집계 COUNT(), SUM(), AVG(), MAX(), MIN()
그룹화 GROUP BY
그룹 조건 HAVING
중복 데이터 처리 INSERT IGNORE, ON DUPLICATE KEY UPDATE
데이터 타입 SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL, CHAR, VARCHAR, TEXT, LONGTEXT, DATE, TIME, DATETIME
사용자 변수 @변수
형변환 CAST(), CONVERT()
문자열 CONCAT(), SUBSTRING(), LENGTH(), LOWER(), UPPER(), REPLACE()
날짜/시간 NOW(), CURDATE(), CURTIME(), DATEDIFF(), DATE_ADD(), DATE_FORMAT()
조건 처리 IF(), IFNULL(), CASE
테이블 연결 INNER JOIN, LEFT/RIGHT OUTER JOIN, CROSS JOIN, SELF JOIN

2. 집계 함수

오늘 교육에서는 여러 행의 데이터를 계산하여 하나의 결과를 만드는 집계 함수를 배웠습니다.

  • COUNT() → 개수
  • SUM() → 합계
  • AVG() → 평균
  • MAX() → 최대값
  • MIN() → 최소값

예를 들어 상품 테이블의 전체 상품 개수를 확인할 때 COUNT()를 사용할 수 있습니다.

SELECT COUNT(*)
FROM member;
SELECT SUM(price)
FROM product;
SELECT AVG(price)
FROM product;
SELECT
    MAX(price) AS max_price,
    MIN(price) AS min_price
FROM product;

3. GROUP BY

COUNT(), SUM(), AVG() 등의 집계 함수는 전체 데이터를 대상으로 계산할 수도 있지만, 특정 기준으로 데이터를 묶은 후 계산할 수도 있습니다.

오늘 교육에서는 데이터를 특정 컬럼을 기준으로 그룹화하는 GROUP BY를 배웠습니다.

SELECT category, COUNT(*)
FROM product
GROUP BY category;

위와 같이 작성하면 category를 기준으로 데이터를 그룹화하고 각 카테고리에 속한 데이터의 개수를 계산할 수 있습니다.

4. WHERE와 HAVING

오늘 교육에서 WHERE와 HAVING의 차이도 확인했습니다.

  • WHERE → 개별 행에 조건 적용
  • HAVING → GROUP BY로 만들어진 그룹에 조건 적용

따라서 WHERE는 데이터를 그룹화하기 전에 적용되는 조건이고, HAVING은 그룹화한 결과에 적용되는 조건으로 정리할 수 있습니다.

SELECT category, COUNT(*)
FROM product
GROUP BY category
HAVING COUNT(*) >= 5;

5. 중복 데이터 처리

데이터를 입력할 때 이미 존재하는 PRIMARY KEY와 동일한 값이 입력되는 경우가 있습니다.

오늘 교육에서는 이러한 중복 데이터를 처리하는 방법으로 INSERT IGNORE와 ON DUPLICATE KEY UPDATE를 배웠습니다.

INSERT IGNORE

중복 등의 오류가 발생하는 상황에서 해당 행의 입력을 건너뛰도록 할 수 있습니다.

INSERT IGNORE INTO member
(member_id, name)
VALUES
(101, '김민수');

ON DUPLICATE KEY UPDATE

데이터가 존재하지 않으면 INSERT하고, 중복되는 경우에는 지정한 값을 UPDATE하는 방식입니다.

INSERT INTO member
(member_id, name)
VALUES
(101, '김민수')
ON DUPLICATE KEY UPDATE
name = '김민수';

6. MySQL 데이터 타입

테이블을 만들 때는 각 컬럼에 어떤 종류의 데이터를 저장할 것인지 데이터 타입을 지정해야 합니다.

종류 주요 데이터 타입
정수형 SMALLINT, INT, BIGINT
실수형 FLOAT, DOUBLE, DECIMAL
문자형 CHAR(N), VARCHAR(N), TEXT, LONGTEXT
날짜/시간형 DATE, TIME, DATETIME

특히 숫자 데이터라고 하더라도 용도에 따라 적절한 데이터 타입을 선택해야 한다는 내용을 함께 확인했습니다.

7. 사용자 정의 변수 @변수

MySQL에서는 @변수명 형태로 사용자 정의 변수를 사용할 수 있습니다.

SQL 실행 과정에서 값을 잠시 저장해 두고 사용할 때 사용자 정의 변수를 활용할 수 있다는 내용을 배웠습니다.

SET @price = 5000;

SELECT @price;

8. CAST와 CONVERT를 이용한 형변환

데이터를 다룰 때 기존 데이터 타입을 다른 형태로 변환해야 하는 경우가 있습니다.

오늘 교육에서는 이러한 형변환에 사용하는 CAST()와 CONVERT()를 배웠습니다.

  • CAST(값 AS 데이터타입)
  • CONVERT(값, 데이터타입)
SELECT CAST(2026 AS CHAR);

9. 문자열 함수

문자열을 연결하거나 필요한 부분을 추출하고, 문자열의 형태를 변경하는 함수도 배웠습니다.

  • CONCAT() → 문자열 연결
  • SUBSTRING() → 문자열 일부 추출
  • LENGTH() → 문자열의 바이트 수
  • LOWER() → 소문자로 변환
  • UPPER() → 대문자로 변환
  • REPLACE() → 문자열 치환

CONCAT()

SELECT CONCAT(name, ' - ', grade)
FROM member;

SUBSTRING()

SELECT SUBSTRING(product_name, 1, 3)
FROM product;

10. 날짜와 시간 함수

날짜와 시간 데이터를 다루는 함수도 정리했습니다.

  • NOW() → 현재 날짜와 시간
  • CURDATE() → 현재 날짜
  • CURTIME() → 현재 시간
  • DATEDIFF() → 날짜 사이의 일수 차이
  • DATE_ADD() → 날짜에 기간 더하기
  • DATE_FORMAT() → 날짜 형식 변경

현재 날짜와 시간

SELECT NOW();

두 날짜의 차이 계산

SELECT DATEDIFF('2026-09-16', '2026-09-01');

11. IF와 IFNULL

조건에 따라 다른 값을 표시하거나 NULL 값을 다른 값으로 변경하는 함수도 배웠습니다.

  • IF(조건식, 참일 때 값, 거짓일 때 값)
  • IFNULL(검사할 값, 대체 값)
SELECT
    product_name,
    price,
    IF(price >= 10000, '고가', '일반') AS price_type
FROM product;

12. CASE 구문

IF()가 하나의 조건을 처리하는 데 활용된다면, 여러 조건을 단계적으로 처리할 때는 CASE 구문을 사용할 수 있습니다.

CASE
    WHEN 조건식1 THEN 결과1
    WHEN 조건식2 THEN 결과2
    ELSE 그 외의 결과
END
SELECT
    product_name,
    price,
    CASE
        WHEN price >= 20000 THEN 'PREMIUM'
        WHEN price >= 10000 THEN 'STANDARD'
        ELSE 'BASIC'
    END AS product_grade
FROM product;

13. JOIN으로 여러 테이블 연결하기

실제 데이터베이스에서는 회원 정보, 주문 정보, 상품 정보 등이 여러 테이블로 나누어져 있는 경우가 많습니다.

이처럼 서로 관련된 테이블을 연결하여 데이터를 조회하는 방법으로 JOIN을 배웠습니다.

  • INNER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • CROSS JOIN
  • SELF JOIN
SELECT
    M.name,
    O.order_price
FROM member AS M
INNER JOIN orders AS O
    ON M.member_id = O.member_id;

위와 같이 INNER JOIN을 사용하면 두 테이블의 연결 조건을 만족하는 데이터를 함께 조회할 수 있습니다.

14. 2일차 MySQL 핵심 문법 정리

하고 싶은 일 문법
데이터 개수 COUNT()
합계 SUM()
평균 AVG()
최대값 MAX()
최소값 MIN()
그룹으로 묶기 GROUP BY
그룹 결과에 조건 적용 HAVING
중복 입력 무시 INSERT IGNORE
중복이면 수정 ON DUPLICATE KEY UPDATE
사용자 변수 @변수
형변환 CAST(), CONVERT()
문자열 연결 CONCAT()
문자열 추출 SUBSTRING()
문자열 길이 LENGTH()
문자열 대소문자 변환 LOWER(), UPPER()
문자열 치환 REPLACE()
현재 날짜와 시간 NOW()
현재 날짜 CURDATE()
현재 시간 CURTIME()
날짜 차이 DATEDIFF()
날짜 더하기 DATE_ADD()
날짜 형식 변경 DATE_FORMAT()
조건 처리 IF()
NULL 대체 IFNULL()
여러 조건 처리 CASE
테이블 연결 JOIN

마무리|MySQL 교육 2일차

오늘은 어제 배운 기본적인 데이터 조회에서 조금 더 확장하여 데이터를 계산하고 그룹화하고 가공하는 SQL 문법을 배웠습니다.

특히 GROUP BY와 HAVING을 비롯해 형변환, 문자열 함수, 날짜 함수, CASE, 그리고 JOIN까지 다양한 문법을 확인했습니다.

아직 모든 문법이 익숙한 단계는 아니지만, 2일차 교육을 통해 MySQL이 단순히 데이터를 조회하는 것뿐만 아니라 데이터를 계산하고 가공하고 여러 테이블의 정보를 연결하는 데 활용된다는 점을 확인할 수 있었습니다.

어제 정리한 MySQL 기본 명령어

1일차에는 MySQL의 기본 명령어를 중심으로 정리했습니다. 기본적인 조회 문법을 다시 확인할 필요가 있다면 아래 글을 함께 참고할 수 있습니다.

MySQL 기본 명령어 정리|정의·문법·예시 한눈에 보기

※ 이 글은 2026년 9월 16일 MySQL 교육에서 배운 내용을 다시 정리한 개인 학습 기록입니다.

교육에서 다룬 내용을 중심으로 정리했으며, 실제 데이터베이스 환경에서는 테이블 구조와 데이터에 따라 SQL 문법을 다르게 조합할 수 있습니다.

반응형