어제는 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 JOINLEFT OUTER JOINRIGHT OUTER JOINCROSS JOINSELF 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 문법을 다르게 조합할 수 있습니다.