본문 바로가기
TIL

[TIL] 2025-5-28 MySQL 내장 함수 / 조인

by Enhydra lutris 2025. 5. 28.
728x90

mysql 쓰면서도 항상 내장 함수를 많이 써보지는 않았어서 이번 시간이 매우 유용했습니다!

일주일 정도 진행된 db수업중에서 오늘이 가장 모르는게 많이 나온 날인거 같네요~

 

제어 흐름 함수

CASE ~ WHEN ~ ELSE ~ END

  • 다중 분기 처리를 위한 연산자
  • IF보다 복잡한 조건 분기에 유리

값 기반 예시

SELECT CASE 10
  WHEN 1 THEN '일'
  WHEN 5 THEN '오'
  WHEN 10 THEN '십'
  ELSE '글쎄요'
END;
-- 결과: '십'

 

조건 기반 예시

SELECT ename, sal,
  CASE
    WHEN sal >= 3000 THEN '상위급여'
    WHEN sal >= 2000 THEN '중위급여'
    ELSE '하위급여'
  END AS 급여등급
FROM emp;

문자열 함수

문자 길이 관련

CHAR_LENGTH() 문자의 개수
LENGTH() 바이트 수 (UTF-8 기준 한글은 3바이트)
 
SELECT CHAR_LENGTH('ABC'), LENGTH('ABC');
SELECT CHAR_LENGTH('가나다'), LENGTH('가나다');

 

문자열 연결

SELECT CONCAT('abc', 'ABC');
SELECT CONCAT_WS('/', '2022', '02', '22');

 

숫자 포맷팅

SELECT FORMAT(123456.7890, 4); -- 결과: '123,456.7890'

문자열 위치 함수

ELT(n, str1, str2, ...) n번째 문자열 반환
FIELD(val, str1, str2, ...) val의 위치 반환
FIND_IN_SET(val, 'str1,str2,...') CSV 문자열에서 위치 찾기
INSTR(str, substr) substr 시작 위치
LOCATE(substr, str) INSTR과 동일, 매개변수 반대
SELECT ELT(2, '하나', '둘', '셋'),
       FIELD('둘', '하나','둘','셋'),
       FIND_IN_SET('둘','하나,둘,셋'),
       INSTR('하나둘셋','둘'),
       LOCATE('둘','하나둘셋');

문자열 조작 함수

문자열 일부 대체 및 추출

SELECT INSERT('abcdefghi', 3, 3, '@@@@'); -- 결과: ab@@@@fghi
SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3);
SELECT LOWER('AbcD'), UPPER('AbcD');

문자열 채우기 및 공백 제거

SELECT LPAD('해달', 5, '&&'), RPAD('해달', 5, '##');
SELECT LTRIM(' 해달'), RTRIM(' 해달 ');
SELECT TRIM(' 해달 '), TRIM(BOTH 'ㅋ' FROM 'ㅋㅋㅋ사랑합니다ㅋㅋㅋ');
 
 

반복, 치환, 공백 생성

SELECT REPEAT('김만월', 3);
SELECT REPLACE('김만월은 1살입니다', '1살', '2살');
SELECT CONCAT('Trust', SPACE(10), 'your power');

 

부분 문자열 추출

SELECT SUBSTRING('Trust your power', 3, 2);
SELECT SUBSTRING('Trust your power' FROM 7 FOR 4); -- 'your'

 

구분자로 나누기

SELECT SUBSTRING_INDEX('www.naver.com', '.', 2); -- 'www.naver'
SELECT SUBSTRING_INDEX('www.naver.com', '.', -2); -- 'naver.com'

수학 함수

ABS(n) 절대값
CEILING(n) 올림
FLOOR(n) 내림
ROUND(n) 반올림
MOD(a, b) 또는 a % b 나머지 연산
RAND() 0 이상 1 미만의 난수
SIGN(n) 양/음/0 판별 (1, -1, 0)
TRUNCATE(n, d) d 자릿수 이하 버림
 
SELECT ABS(-100);
SELECT CEILING(4.7), FLOOR(4.7), ROUND(4.7);
SELECT MOD(157, 10), 157 % 10;
SELECT RAND();
SELECT SIGN(100), SIGN(0), SIGN(-100.123);
SELECT TRUNCATE(12345.12345, 2), TRUNCATE(12345.12345, -2);

날짜 및 시간 함수

현재 날짜/시간 관련

sql
 
SELECT CURDATE(), CURTIME(), NOW(), SYSDATE();
SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW());
SELECT DAYOFWEEK(NOW()), MONTHNAME(NOW()), DAYOFYEAR(NOW());

 

문자열 → 날짜 변환

SELECT STR_TO_DATE('2023-04-01 12:30:45', '%Y-%m-%d %H:%i:%s');

 

날짜 연산 및 포맷

SELECT DATE_ADD('2022-01-01', INTERVAL 31 DAY);
SELECT DATE_SUB('2022-01-01', INTERVAL 1 MONTH);
SELECT DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %H시 %i분 %s초');

시스템 정보 함수

조회된 행/처리된 행 개수

SELECT SQL_CALC_FOUND_ROWS * FROM userTbl LIMIT 3;
SELECT FOUND_ROWS();

UPDATE userTbl SET addr = '서울' WHERE userID = 'JYP';
SELECT ROW_COUNT();
 

환경 정보 조회

SELECT VERSION();
SELECT DATABASE(), USER(), SESSION_USER();
 

자동 증가 ID 확인

INSERT INTO tbl (name) VALUES ('test');
SELECT LAST_INSERT_ID();

 

조인의 종류

INNER JOIN 양쪽 테이블에 모두 존재하는 데이터만 반환
LEFT OUTER JOIN (LEFT JOIN) 왼쪽 테이블은 모두 표시, 오른쪽에 없으면 NULL
RIGHT OUTER JOIN (RIGHT JOIN) 오른쪽 테이블은 모두 표시, 왼쪽에 없으면 NULL
FULL OUTER JOIN 양쪽 모두 표시, 없는 쪽은 NULL (MySQL은 직접 지원 안 함)
CROSS JOIN 가능한 모든 조합 (카티션 곱)
SELF JOIN 자기 자신과 조인

INNER JOIN (내부 조인)

  • 가장 기본적인 조인 방식
  • 양쪽 테이블 모두에서 조건을 만족하는 행만 반환
 
SELECT e.ename, d.dname
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno;

LEFT JOIN (왼쪽 외부 조인)

  • 왼쪽 테이블의 모든 행을 기준으로 오른쪽 테이블과 조인
  • 오른쪽에 일치하는 값이 없으면 NULL로 표시
 
SELECT e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno;

RIGHT JOIN (오른쪽 외부 조인)

  • RIGHT JOIN은 LEFT JOIN과 반대
  • 오른쪽 테이블의 모든 행을 기준으로 왼쪽 테이블과 조인
 
SELECT e.ename, d.dname
FROM emp e
RIGHT JOIN dept d ON e.deptno = d.deptno;

 

 

FULL OUTER JOIN
  • 양쪽 테이블의 모든 행을 반환
  • 어느 한쪽에 값이 없으면 NULL로 표시
  • MySQL은 FULL OUTER JOIN을 직접 지원하지 않음 → UNION으로 구현 가능
-- MySQL에서 FULL OUTER JOIN을 흉내 내는 방식
SELECT e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno

UNION

SELECT e.ename, d.dname
FROM emp e
RIGHT JOIN dept d ON e.deptno = d.deptno;

CROSS JOIN

  • 조건 없이 두 테이블의 모든 조합(카티션 곱)을 반환
 
SELECT e.ename, d.dname
FROM emp e
CROSS JOIN dept d;
  • 결과 행 수 = 테이블1 행 수 × 테이블2 행 수

 

SELF JOIN (자기 자신과의 조인)

  • 같은 테이블을 두 번 사용하여 조인
SELECT e1.ename AS 사원명, e2.ename AS 상급자명
FROM emp e1
LEFT JOIN emp e2 ON e1.mgr = e2.empno;

 

'TIL' 카테고리의 다른 글

[TIL] 2025.5.30 알고리즘 기초  (0) 2025.06.02
[TIL] 2025-6-2 웹서비스 관점에서의 OSI7계층 / WAS  (0) 2025.06.02
[TIL] 2025-5-27 sql  (0) 2025.05.28
[TIL] 2025-5-26 DML, DCL, TCL  (0) 2025.05.28
[TIL] 2025-5-23 제약조건/정규화  (0) 2025.05.28

댓글