한화시스템 BEYOND SW Camp_0625

퍼킹락스타·2025년 6월 25일

SQL 함수를 나가봅시당~! 근데 어떻게 정리해야할 지 모르겠어요..
오늘은 형 변환 함수 실습을 진도로 시작합니당

1. 형 변환 함수

  • 숫자 데이터를 문자로 데이터로 형 변환
SELECT 123456789;
SELECT CAST(123456789 AS CHAR);
SELECT CONVERT(123456789, CHAR);
  • SELECT 123456789;
    -> 아무런 형 변환 없이, 그대로 출력됨
  • SELECT CAST(123456789 AS CHAR);
    -> 123456789 → '123456789' (문자열처럼 인식됨)

cf) CAST(... AS CHAR): 숫자를 문자(CHAR 데이터형)로 변경하는 함수.

  • usertbl 테이블에서 birthYear 열의 데이터를 문자 데이터로 형 변환
SELECT 'name',
		CONVERT('birthYear', CHAR)
FROM usertbl;
  • 실수 데이터를 정수 데이터로 형 변환
    buytbl 테이블에서 평균 구매 개수를 정수형으로 변환해서 조회
SELECT AVG ((amount), INT)
FROM buytbl;
  • 문자 데이터를 숫자 데이터로 형 변환
SELECT CONVERT('10000000', INT); -- int타입으로 변경할 거야.
SELECT CONVERT('10,000,000', INT); -- 10 출력됨
SELECT REPLACE('10,000,000', ',', ''); -- 먼저 ,를 찾고 ,를 지울거임.
  • 아래의 쿼리가 정상적으로 연산되도록 변환하기
SELECT '1,000,000' - '500,000';
-- 정답
SELECT REPLACE ('1,000,000', ',', '');
SELECT CONVERT(REPLACE('1,000,000', ',', ''), INT)
		- CONVERT(REPLACE('500,000', ',', ''), INT)
  • usertbl 테이블에서 mobile1의 데이터를 숫자 데이터로 형 변환
SELECT 'name',
		CONVERT('mobile1', INT)
FROM usertbl;
  • 오늘 날짜 출력
SELECT CURDATE();
  • 현재 시각 띄우기
SELECT NOW();
  • 아래 3가지 전부, 동일하게 출력됨.
SELECT CONVERT('2025-06-25', DATE);
SELECT CONVERT('2025/06/25', DATE);
SELECT CONVERT('2025%06%25', DATE);
  • DATE, TIME, DATETIME
SELECT CONVERT('11:10:30', DATE);
SELECT CONVERT('2025-06-25','11:10:30', DATE);

SELECT (20250625, DATE);
SELECT (111525, TIME);
SELECT CONVERT(20250625111525, DATETIME);
  • 모든 데이터 타입에 대해서 형 변환이 가능한 것은 아니다.
SELECT CONVERT(2025,SMALLINT);
SELECT CONVERT(2025 AS YEAR);
SELECT CONVERT(123, TINYINT);
SELECT CONVERT(12345, SMALLINT);
  • 묵시적 형 변환
SELECT '100' + '200';
SELECT CONCAT('100', '200');
SELECT 1 > '2mega'; -- 0(FALSE)이 출력될 거임.
SELECT 3 > '2mega'; -- 정수 2로 변환되어서 비교. 1 출력됨.
SELECT 0 = 'mega'; -- 문자는 0으로 변환된다. (1 출력됨)

2. 제어 흐름 함수

  • IF 함수를 써봅시당!
-- IF 함수
SELECT IF(100<200, '참','거짓');

=> IF(조건식, 참일 때 값, 거짓일 때 값)
-> 3가지의 조건을 갖는다고 보면 됨.
cf) 반환된다: 호출한 쪽으로 다시 보낸다.

  • buytbl 테이블에서 고객 별 구매 개수의 합계 조회
    단, 구매 개수가 10개 이상이면 'VIP 고객',
    10개 미만이면, '일반 고객'으로 출력.
SELECT userid AS '아이디', 
		SUM(amount) AS '구매 개수의 합',
		IF(SUM(amount) >= 10, 'VIP 고객', '일반고객') AS '고객 유형'
FROM buytbl;
GROUP BY userid;
ORDER BY 2;
  • IFNULL 함수
SELECT IFNULL(NULL, '값이 없음'), IFNULL(100, '0');
SELECT NYL(NULL, '값이 없음'), NYL(100, '값이 없음'); -- 10.3버전부터 지원.(위와 같음)
  • buytbl 테이블에서 모든 데이터를 출력
    단, groupName 열의 값이 NULL인 경우, '없음'으로 출력
SELECT num,
		userid,
		prodName,
		IFNULL(groupName, '없음'),
		price,
		amount
FROM buytbl;
  • NVL2 함수
SELECT NVL2(NULL, 100,200), NVL2(300,100,200);

cf) NVL2
: 값이 NULL인지 아닌지에 따라 다른 값을 주는 조건 함수.

따라서 위의 예제로 보자.

NVL2(NULL, 100, 200)

표현식이 NULL 값이 아니면 100, NULL 값이라면 200을 출력.
그럼으로 표현식에 NULL이 들어가 있으니까(TRUE), 200이 출력된다.

NVL2(300, 100, 200);

표현식에 NULL이 아닌, 300이 들어 가 있다. 따라서 FALSE임.
그럼으로 100이 출력된다.

  • NVL2를 활용해보장!

  • employee 테이블에서 보너스를 0.1로 동결해서, 직원명, 보너스,
    동결된 보너스, 보너스가 포함된 연봉을 조회

SELECT emp_name,
		NVL2(bonus, 0.1, 0), -- 값이 있는 걸, 0.1로 동결. 보너스 없는 값은 0으로.
		salary + (salary*bonus(NVL2(bonus, 0.1, 0)))*12
FROM employee;
  • CASE 연산자
SELECT CASE 10
		WHERE 1 THEN '일' -- WHERE 뒤에 숫자값, THEN 뒤에는 문자값을 입력.
		WHERE 5 THEN '오'
		WHERE 10 THEN '십'
		ELSE '모름'
		END AS '결과';
  • JAVA의 다중 IF문 처럼 사용
SELECT CASE
		WHERE 10 < 20 THEN '10 < 20'
		WHERE 10 = 20 THEN '10 = 20'
		ELSE '모름'
		END AS '결과';
  • 활용해보기
SELECT CASE
-- 급여가 500만원 초과일 경우 1등급
	WHERE 500000000 < 'salary' THEN '1등급'
	-- 급여가 500만원 이하 350만원 초과일 경우 2등급
	WHERE 350000000 < 'salary' THEN '2등급'
	-- 급여가 350만원 이하 200만원 초과일 경우 3등급
	WHERE 200000000 < 'salary' THEN '3등급'
	-- 그 외의 경우 4등급
	ELSE '4등급'
	END AS 'grade'
FROM employee;
ORDER BY

3. 문자열 함수

  • ASCII, CHAR 함수
SELECT ASCII('A'), CHAR(65), ASCII('홍');

-- BIT_LENGTH, CHAR_LENGTH, LENGTH 함수
-- MaraiDB는 기본적으로 UTF-8 코드를 사용하기 때문에
-- 영문은 1B, 한글은 3B를 할당한다.
SELECT BIT_LENGTH('ABC'), CHAR_LENGTH('ABC'), LENGTH('ABC');
SELECT BIT_LENGTH('홍길동'), CHAR_LENGTH('홍길동'), LENGTH('홍길동'); -- 한글을 한 글자를 3B로 인식.
  • CONCAT, CONACT_WS 함수
SELECT CONCAT('2025', '06', '25'),
			CONCAT_WS('/', '2025', '06', '25');
		
-- usertbl 테이블에서 아이디, 이름, 전화번호 조회
SELECT 'userid',
			'name',
			CONCAT('mobile1','mobile2') AS 'mobile'
			-- CONCAT AS ('-', 'mobile1', 'mobile2') AS 'mobile'
FROM usertbl;
  • ELT, FIELD, FIND_IN_SET, INSTR, LOCATE 함수
SELECT ELT(2, '하나', '둘','셋'); -- 둘을 반환
SELECT FIELD('둘', '하나', '둘', '셋'); -- 2를 반환한다.
SELECT FIND_IN_SET('둘', '하나, 둘, 셋'); -- 2를 반환한다.
SELECT INSTR('하나 둘 셋', '둘'); -- 4를 반환함. WHY? 공백도 카운트함.
  • employee 테이블, 이메일 주소의 @의 위치값을 찾아내기
SELECT email
SELECT INSTR((email, '@') AS 'email');
FROM employee;
  • FORMAT 함수
SELECT CONVERT(1234567, CHAR);
  • INSERT 함수
SELECT INSERT('abcdefghi', 3, 4, '####'); -- 코드 이해 안 감.
SELECT INSERT('990525-1234567', 9, 6, '******');
  • employee 테이블에서 사원명, 주민등록번호(뒷자리 마스킹 처리) 조회
SELECT INSERT emp_name,
SELECT INSERT(emp_no, 8, 7, '*******')
FROM employee;
  • UPPER, LOWER 함수
SELECT UPPER('abcdeFGHI'), LOWER('abcdeFGHI'); -- UPPER:대문자로 만들어줌, LOWER: 소문자로 만들어줌
  • LEFT, RIGHT 함수
SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3); -- LEFT는 왼쪽부터 반환, RIGHT는 오른쪽부터 반환
  • employee 테이블에서 사원명, 이메일, 아이디 출력
SELECT INSERT emp_name,
					email
					LEFT(email, INSTR(email, '@') -1) AS 'id'
FROM employee;
  • LPAD, RPAD 함수
SELECT LPAD('Hello', 10);
			LPAD('Hello', 10, ' '),
			LPAD('Hello', 10, '#'),
			LPAD('Hello', 4, '#'); 
            -- 잘려서 나오는 걸 확인 할 수 있음
  • employee 테이블에서 사원명, 주민등록번호(뒷자리 마스킹 처리) 조회
SELECT emp_name,
		RPAD(LPAD(emp_no,8), 13, '*')
FROM employee
  • employee 테이블에서 사원명, 주민등록번호(뒷자리 마스킹 처리) 조회
SELECT emp_name,
		RPAD(LPAD(emp_no,8), 13, '*')
FROM employee
  • LTRIM, RTRIM, TRIM 함수
SELECT TRIM(BOTH ' ' FROM '     HELLO     ')
			TRIM(BOTH 'z'FROM('zzzzzHELLOzzzzzz'))
			TRIM(LEADING 'z' FROM('zzzzzHELLOzzzzzz'))
			TRIM(TRAILING 'z'FROM('zzzzzHELLOzzzzzz'))
  • REPEAT, REVERSE, SPACE 함수
SELECT REPEAT('HELLO', 3),
			REVERSE('HELLO'),
			CONCAT('Maria', SPACE(5), 'DB');
  • REPLACE 함수
SELECT REPLACE('hong@gmail.com', 'gmail', 'naver'),
			REPLACE('hong@gmail.com', '@gmail.com','');
  • employee 테이블에서 이메일의 kh.or.kr을 beyond.com으로 변경
SELECT emp_name
	REPLACE(email, 'kh.or.kr', 'beyond.com'),
	REPLACE(email, 'kh.or.kr', '')
FROM employee;
  • SUBSTRING 함수
SELECT SUBSTRING('대한민국만세', 3),
			SUBSTRING('대한민국만세', 3, 2),
			SUBSTRING('대한민국만세', -2, 2); -- 음수를 주면, 거꾸로 간다.
  • employee 테이블에서 사원명, 아이디, 성별 조회.
SELECT emp_name,
			SUBSTRING(email, 1, INSTR(email, '@') -1), 
			CASE
				WHEN SUBSTRING(emp_no, 8, 1) IN ('1', '3') THEN '남자'
			END AS 'gender'
FROM employee
  • SUBSTRING_INDEX 함수
SELECT SUBSTRING_INDEX('cafe.naver.com', '',2)
SELECT SUBSTRING_INDEX('cafe.naver.com', '',-2);
  • employee 테이블에서 사원명, 아이디, 이메일 조회
SELECT emp_name,
		SUBSTRING_INDEX(email, '@', 1) AS 'id',
		email
FROM employee;

4. 수학 함수

  • CEILING, FLOOR 함수
SELECT CEILING(4.3), FLOOR(4.7);
  • ROUND 함수
SELECT ROUND(4.355)
		ROUND(4.355, 0),
		ROUND(4.355, 2),
		ROUND(4.355, -1);
  • TRUNCATE 함수
SELECT TRUNCATE(123.456, 0);
			TRUNCATE(123.456, 2);
			TRUNCATE(123.456, -1);
  • MOD 함수, % 연산자
    : 숫자 2개를 입력 받아서, 나머지를 구한다.
SELECT MOD(157, 10),
		157 % 10,
		157 MOD 10;       
  • RAND() 함수 쓰기.
    1 ~ 100 사이의 랜덤 값을 출력
SELECT RAND(), -- 0.0~0.999...까지의 값을 가져옴.
			RAND() * 100, -- 0.0~99.9999~
			FLOOR((RAND()*100 +1)) -- 1~100값이 나온다.

적다보니, 그냥 쓴 거 복붙하느라 시간이 다 갔네요.
코드 하나씩 설명 남기고 싶었는뎅ㅠㅠㅠ
오늘 집가서, 스터디해야해서 말벌 아저씨 마냥 가볼게요.
오늘도 수고하셨습니당!!

profile
메가우쿨렐레는 나의 것

0개의 댓글