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

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 데이터형)로 변경하는 함수.
SELECT 'name',
CONVERT('birthYear', CHAR)
FROM usertbl;
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)
SELECT 'name',
CONVERT('mobile1', INT)
FROM usertbl;
SELECT CURDATE();
SELECT NOW();
SELECT CONVERT('2025-06-25', DATE);
SELECT CONVERT('2025/06/25', DATE);
SELECT CONVERT('2025%06%25', DATE);
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 출력됨)

-- IF 함수
SELECT IF(100<200, '참','거짓');
=> IF(조건식, 참일 때 값, 거짓일 때 값)
-> 3가지의 조건을 갖는다고 보면 됨.
cf) 반환된다: 호출한 쪽으로 다시 보낸다.
SELECT userid AS '아이디',
SUM(amount) AS '구매 개수의 합',
IF(SUM(amount) >= 10, 'VIP 고객', '일반고객') AS '고객 유형'
FROM buytbl;
GROUP BY userid;
ORDER BY 2;
SELECT IFNULL(NULL, '값이 없음'), IFNULL(100, '0');
SELECT NYL(NULL, '값이 없음'), NYL(100, '값이 없음'); -- 10.3버전부터 지원.(위와 같음)
SELECT num,
userid,
prodName,
IFNULL(groupName, '없음'),
price,
amount
FROM buytbl;
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;
SELECT CASE 10
WHERE 1 THEN '일' -- WHERE 뒤에 숫자값, THEN 뒤에는 문자값을 입력.
WHERE 5 THEN '오'
WHERE 10 THEN '십'
ELSE '모름'
END AS '결과';
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



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로 인식.
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;
SELECT ELT(2, '하나', '둘','셋'); -- 둘을 반환
SELECT FIELD('둘', '하나', '둘', '셋'); -- 2를 반환한다.
SELECT FIND_IN_SET('둘', '하나, 둘, 셋'); -- 2를 반환한다.
SELECT INSTR('하나 둘 셋', '둘'); -- 4를 반환함. WHY? 공백도 카운트함.
SELECT email
SELECT INSTR((email, '@') AS 'email');
FROM employee;
SELECT CONVERT(1234567, CHAR);
SELECT INSERT('abcdefghi', 3, 4, '####'); -- 코드 이해 안 감.
SELECT INSERT('990525-1234567', 9, 6, '******');
SELECT INSERT emp_name,
SELECT INSERT(emp_no, 8, 7, '*******')
FROM employee;
SELECT UPPER('abcdeFGHI'), LOWER('abcdeFGHI'); -- UPPER:대문자로 만들어줌, LOWER: 소문자로 만들어줌
SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3); -- LEFT는 왼쪽부터 반환, RIGHT는 오른쪽부터 반환
SELECT INSERT emp_name,
email
LEFT(email, INSTR(email, '@') -1) AS 'id'
FROM employee;
SELECT LPAD('Hello', 10);
LPAD('Hello', 10, ' '),
LPAD('Hello', 10, '#'),
LPAD('Hello', 4, '#');
-- 잘려서 나오는 걸 확인 할 수 있음
SELECT emp_name,
RPAD(LPAD(emp_no,8), 13, '*')
FROM employee
SELECT emp_name,
RPAD(LPAD(emp_no,8), 13, '*')
FROM employee
SELECT TRIM(BOTH ' ' FROM ' HELLO ')
TRIM(BOTH 'z'FROM('zzzzzHELLOzzzzzz'))
TRIM(LEADING 'z' FROM('zzzzzHELLOzzzzzz'))
TRIM(TRAILING 'z'FROM('zzzzzHELLOzzzzzz'))
SELECT REPEAT('HELLO', 3),
REVERSE('HELLO'),
CONCAT('Maria', SPACE(5), 'DB');
SELECT REPLACE('hong@gmail.com', 'gmail', 'naver'),
REPLACE('hong@gmail.com', '@gmail.com','');
SELECT emp_name
REPLACE(email, 'kh.or.kr', 'beyond.com'),
REPLACE(email, 'kh.or.kr', '')
FROM employee;
SELECT SUBSTRING('대한민국만세', 3),
SUBSTRING('대한민국만세', 3, 2),
SUBSTRING('대한민국만세', -2, 2); -- 음수를 주면, 거꾸로 간다.
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
SELECT SUBSTRING_INDEX('cafe.naver.com', '',2)
SELECT SUBSTRING_INDEX('cafe.naver.com', '',-2);
SELECT emp_name,
SUBSTRING_INDEX(email, '@', 1) AS 'id',
email
FROM employee;


SELECT CEILING(4.3), FLOOR(4.7);
SELECT ROUND(4.355)
ROUND(4.355, 0),
ROUND(4.355, 2),
ROUND(4.355, -1);
SELECT TRUNCATE(123.456, 0);
TRUNCATE(123.456, 2);
TRUNCATE(123.456, -1);
SELECT MOD(157, 10),
157 % 10,
157 MOD 10;
SELECT RAND(), -- 0.0~0.999...까지의 값을 가져옴.
RAND() * 100, -- 0.0~99.9999~
FLOOR((RAND()*100 +1)) -- 1~100값이 나온다.
적다보니, 그냥 쓴 거 복붙하느라 시간이 다 갔네요.
코드 하나씩 설명 남기고 싶었는뎅ㅠㅠㅠ
오늘 집가서, 스터디해야해서 말벌 아저씨 마냥 가볼게요.
오늘도 수고하셨습니당!!
