251027 [ Day 74 ] - SQL (4)

TaeHyun·2025년 10월 27일

TIL

목록 보기
87/182

시작하며

오늘은 여러 함수들을 활용해서 데이터를 간단하게 조회하고 수정해봤는데 별거는 아니지만 데이터를 다루는 게 상당히 재미있는 것 같다. 그리고 내일 Python과 MySQL을 연동하는 것을 해보면 이제 MySQL 파트도 거의 끝난 것 같다.

내장 함수

  • MySQL에서 기본적으로 제공하는 함수 로, 데이터를 처리하고 변형할 수 있게 해주는 도구
  • 프로그래밍의 함수처럼 입력을 받아 출력을 반환하며 , 복잡한 로직을 단순화할 수 있음

함수 분류

  • 문자열 함수 : 텍스트 가공 및 처리
  • 수학 함수 : 수치 연산 및 반올림 등
  • 날짜 /시간 함수 : 시간 및 날짜 처리
  • 조건 함수 : 조건에 따라 결과 반환
  • 집계 함수 : 그룹별 계산 (예: COUNT, AVG 등)
  • 형 변환 함수 : 자료형 변환

문자열 함수

함수를 사용해서 문자열을 수정해도 원본은 수정되지 않음

CONCAT()

  • 문자열 결합 함수
SELECT name, birth_date, CONCAT(name, "(", birth_date, ")") name_with_birth
FROM users;
  • CONCAT_WS() : 구분자 사용해서 연결
SELECT name, birth_date, CONCAT_WS("-", name, birth_date) name_with_birth
FROM users;

LEFT()

  • 일부 문자열 추출(왼쪽부터)
  • RIGHT()는 반대로 적용
SELECT product_name, LEFT(product_name, 2) FROM products;

SUBSTRING()

  • 지정한 위치에서 문자열 추출
SELECT name, SUBSTRING(name, 2, 2) first_name FROM users;
  • SUBSTRING_INDEX() : 특정 문자를 기준으로 추출
    • 왼쪽은 1, 오른쪽은 -1로 숫자만큼의 단어를 선택하여 추출
SELECT email, SUBSTRING_INDEX(email, "@", -1) email_domain FROM users;

UPPER()

  • 대문자로 변환
SELECT name, email, UPPER(email) upper_email FROM users;
  • LOWER()는 반대로 적용

REPLACE()

  • 일부 문자열을 변경
SELECT name, REPLACE(name, "이", "LEE") replaced_name FROM users;

TRIM()

  • 양쪽 공백 제거

수학 함수

ROUND(x, d), CEIL(), FLOOR()

  • ROUND() : 반올림
    • x를 반올림 해서 소수점 d까지 출력
  • CEIL() : 올림
  • FLOOR() : 내림
# ROUND() = 반올림
SELECT ROUND(3.56); # 4
SELECT ROUND(1234.5678, 2); # 1234.57

# CEIL() = 올림
SELECT CEIL(3.26); # 4

# FLOOR = 내림
SELECT FLOOR(3.26); # 3

MOD()

  • 나머지
SELECT MOD(10, 3); # 1

AVG()

  • 평균

ABS()

  • 절댓값
SELECT ABS(-100); # 100

RAND()

  • 0~1 사이의 난수 생성
SELECT RAND(); # 0.10608202042624543

날짜 함수

NOW(), CURDATE(), CURTIME()

  • 현재 날짜, 시간
SELECT NOW(); # 2025-10-27 10:30:41
SELECT CURDATE(); # 2025-10-27
SELECT CURTIME(); # 10:31:13

DATEDIFF()

  • 날짜의 차이 계산
SELECT DATEDIFF(CURDATE(), "2025-10-26"); # 1

DATE_ADD()

  • 날짜에 더하기
SELECT DATE_ADD(CURDATE(), INTERVAL 3 DAY); # 2025-10-30

YEAR(), MONTH(), DAY()

SELECT YEAR(NOW()); # 2025
SELECT MONTH(NOW()); # 10
SELECT DAY(NOW()); # 27

조건 함수

IF(조건, a, b)

  • 조건이 참이면 a, 아니면 b 반환
SELECT name, gender, IF(gender = "남", "Male", "Female") gender_eng FROM student;
SELECT name, price, IF(price >= 10000, "비쌈", "저렴") price_level FROM products;
  • 서브쿼리 사용
SELECT product_name, price, IF(price > (SELECT AVG(price) FROM products), "고가", "저가") price_grade FROM products;

IFNULL(a, b)

  • a가 NULL값이면 b 반환
SELECT name, IFNULL(phone, "전화번호 없음") FROM customers;
SELECT name, IFNULL(membership_level, "Iron") FROM customers;
SELECT order_id, order_status, IFNULL(order_status, "주문취소") order_status_edit FROM orders;

NULLIF(a, b)

  • a = b 이면 NULL 반환
SELECT order_id, order_status, NULLIF(order_status, "처리중" OR "배송중") order_status_edit FROM orders;

CASE

  • IF() 보다 복잡한 조건에 적합
  • 그룹별 분류 , 등급화 , 라벨링 작업에 효과적
SELECT order_id, order_status,
CASE order_status
	WHEN "완료" THEN "결제가 완료됐어요"
	WHEN "배송" THEN "배송중이에요"
  WHEN "처리중" THEN "주문이 처리되고 있어요"
  ELSE "상태를 알 수 없어요"
END AS statuse_label
FROM orders;
  • WHEN 조건이 복잡한 경우
SELECT order_id, order_status, created_at, 
CASE
	WHEN order_status != "배송완료" THEN "대상 아님"
	WHEN DATEDIFF(NOW(), created_at) >= 250 THEN "후기 요청"
  ELSE "배송 확인"
END AS followup_status
FROM orders;

형변환

암시적 형변환

  • MySQL이 자동으로 자료형을 변환하여 처리하는 것
    • 연산이나 비교 시 자동 적용
SELECT "100" + 200; # 300
SELECT "100" + "200"; # 300

명시적 형변환

  • 사용자가 명확히 형변환을 지정하는 방식
  • CAST() : 단순한 형변환 (표준 문법)
SELECT CAST("123" AS SIGNED); # 123
SELECT CAST(3.14 AS CHAR); # 3.14
SELECT CAST("20250403" AS DATE); # 2025-04-03
  • CONVERT() : 문자셋 변환 등 MySQL 고유 기능 사용
SELECT CONVERT("123", SIGNED); # 123
SELECT CONVERT(3.14, CHAR); # 3.14
SELECT CONVERT("20250403", DATE); # 2025-04-03
SELECT CONVERT("한글" USING utf8mb4);

마치며

다음 주부터는 아두이노를 배우면서 최종 프로젝트를 준비한다고 하는데, 태양광 패널을 아두이노로 다루면서 그것을 지금까지 배웠던 내용들과 어떻게 연관시켜야 할지 지금부터 조금씩 준비해둬야겠다고 생각했다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글