본문 바로가기

BackEnd/DB(SQL)

[DB_MySQL] 이것이 MySQL이다 ch07 SQL 고급 2(ifnull, nullif, case, 문자열 함수)

728x90
반응형

1. MySQL 내장 함수

◎ 내장 함수

   ▷ 흐름 함수, 문자열 함수, 수학 함수, 날짜/시간 함수, 전체 텍스트 검색 함수, 형 변환 함수, XML 함수, 비트 함수,

        보안/압축 함수, 정보 함수, 공간 분석 함수, 기타 함수 등

 

◎ 제어 흐름 함수

   ▷ 프로그램의 흐름 제어

   ▷ IF(수식, 참, 거짓)

      ▶ 수식이 참 또는 거짓인지 결과에 따라서 2중 분기

SELECT IF(100>200, '참이다', '거짓이다');

   ▷ IFNULL(수식1, 수식2)

      ▶ 수식1이 NULL이 아니면 수식1이 반환되고 수식1이 NULL이면 수식 2가 반환

-- ifnull(수식1,수식2)
-- 수식1 null이라면 수식2 반환
-- 수식1 null이 아니라면 수식1 반환
select ifnull(null, '널이군요'), ifnull(100, '널이군요');

 

   ▷ NULLIF(수식1, 수식2)

      ▶ 수식1과 수식2가 같으면 NULL을 반환, 다르면 수식1을 반환

-- nullif(수식1, 수식2) 수식1과 수식2가 같으면 null, 다르면 수식1을 반환
select nullif(100, 200), nullif(100, 100);

 

 

   ▷ CASE ~ WHEN ~ ELSE ~ END

      ▶ CASE는 내장 함수는 아니며 연산자(Operator)로 분류

      ▶ 다중 분기에 사용되므로 내장함수와 함께 알아두자

-- case ~ when ~ else ~ end : 다중 분기
select case 10
	when 1 then '일'
    when 5 then '오'
    when 10 then '십'
    else '모름'
    end as 'case연습';​


      ▶ CASE 뒤의 값이 10이므로 세 번째 WHEN이 수행되어 '십' 반환

      ▶ 만약, 해당하는 사항이 없다면 ELSE 부분이 반환

 

◎ 문자열 함수 1

   ▷ 문자열 조작, 활용도높음

1. ASCII(아스키 코드) : 문자의 아스키 코드 값 반환
2. CHAR(숫자) : 숫자의 아스키 코드 값에 해당하는 문자 반환
3. BIT_LENGTH(문자열), CHAR_LENGTH(문자열), LENGTH(문자열)
   ▷ 할당된 Bit 크기 또는 문자 크기 반환
   ▷ CHAR_LENGTH()는 문자의 개수 반환
   ▷ LENGTH()는 할당된 Byte 수 반환

4. CONCAT(문자열1, 문자열2,...), CONCAT_WS(구분자, 문자열1, 문자열2,...)
   ▷ CONCAT() : 문자열을 이어줌
   ▷ CONCAT_WS() :  구분자와 함께 문자열을 이어주는 역할
SELECT CONCAT_WS('/', '2025', '01', '01');

-- 출력 : 
-- 2025/01/01​


5. ELT,  FIELD, FIND_IN_SET, INSTR, LOCATE
   ▷ ELT(위치, 문자열1, 문자열2, ...) : 위치값이 해당하는 문자열을 반환
   ▷ FIELD(찾을 문자열, 문자열1, 문자열2, ...) : 찾을 문자열이 있는 문자열의 위치 값을 반환
   ▷ FIND_IN_SET(찾을 문자열, 문자열 리스트) : 찾을 문자열이 있는 문자열리스트의 위치 값을 반환
       ▶ 문자열 리스트는 콤마(,)로 구분되고 공백이 없어야합니다.
   ▷ INSTR(기준 문자열, 부분 문자열) : 부분 문자열이 기준 문자열의 몇번째 위치하는지 위치 값을 반환
   ▷ LOCATE(부분 문자열, 기준 문자열) : 부분 문자열이 기준 문자열의 몇번째 위치하는지 위치 값을 반환
       ▶ INSTR과 LOCATE는 동일하지만 파라미터의 순서가 반대

select ELT(2, '하나', '둘', '셋'), FIELD('둘','하나', '둘', '셋'),
		find_in_set('둘', '하나,둘,셋'), INSTR('하나둘셋', '둘'), LOCATE('둘', '하나둘셋');


6. FORMAT(숫자, 소수점 자리수)
   ▷ 숫자를 소수점 아래 자릿수까지 표현, 1000단위마다 콤마 표시해줌

-- FORMAT (숫자, 소수점자리수) : 1000단위, 콤마(,) 표시되고 소수점자리수만큼 소수점 표시
select format(123456.123456, 4); 
select format(123456.123456, 2);
format(숫자, 2) 출력 결과

 

◎ 문자열 함수 2 (숫자 이용)

1. FORMAT(숫자, 소수점 자리수)
   ▷ 숫자를 소수점 아래 자릿수까지 표현, 1000단위마다 콤마 표시해줌
-- FORMAT (숫자, 소수점자리수) : 1000단위, 콤마(,) 표시되고 소수점자리수만큼 소수점 표시
select format(123456.123456, 4); 
select format(123456.123456, 2);​

format(숫자, 2) 출력 결과


2.  BIN(숫자), HEX(숫자), OCT(숫자)
   ▷ 2진수, 16진수, 8진수의 값을 반환
-- BIN(숫자) : 숫자 10진수 -> 2진수
-- HEX(숫자) : 숫자 10진수 -> 16진수	4bit
-- OCT(숫자) : 숫자 10진수 -> 8진수	3bit
select bin(31), hex(31), oct(31);​​

 

 

◎ 문자열 함수 3

1. INSERT(기준 문자열, 위치, 길이, 삽입할 문자열)
   ▷ 기준 문자열의 위치부터 길이만큼 지우고 삽입할 문자열 끼워 넣음
-- INSERT(기준문자열, 위치, 길이(만큼 삭제), 삽입할 문자열)
select insert('abcdefghi', 3, 4, '@@@@'), INsert('abcdefghi', 3, 2, '@@@@');

-- 'ab@@@@ghi'와 'ab@@@@efghi' 반환​


2. LEFT(문자열, 길이), RIGHT(문자열, 길이)
   ▷ 왼쪽 또는 오른쪽에서 문자열의 길이만큼 반환
-- LEFT(문자열, 길이) : 문자열 왼쪽에서 길이만큼 문자반환
-- RIGHT(문자열, 길이) : 문자열 오른쪽에서 길이만큼 문자반환
select LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3);

-- 'abc'와 'ghi' 반환​


3. UPPER(문자열), LOWER(문자열)
   ▷ 소문자를 대문자로, 대문자를 소문자로 변경

-- UPPER(문자열) : 문자열을 대문자로 반환
-- LOWER(문자열) : 문자열을 소문자로 반환
select LOWER('abcdEFGH'), UPPER('abcdEFGH');

-- 'abcdefgh'와 'ABCDEFGH' 반환


4. LPAD(문자열, 길이, 채울 문자열), RPAD(문자열, 길이, 채울 문자열)
   ▷ 문자을 길이만큼 늘린 후에 빈 곳을 채울 문자열로 채웁니다.

-- LPAD(문자열, 길이, 채울문자열)
	: 문자열을 길이 만큼 전체 크기를 지정해서 빈공간을 채울 문자열로 채운다(왼쪽부터)
-- RPAD(문자열, 길이, 채울문자열)
	: 문자열을 길이 만큼 전체 크기를 지정해서 빈공간을 채울 문자열로 채운다(오른쪽부터)

select LPAD('이것이', 5, '##'), RPAD('이것이', 5, '##');

-- '##이것이'와 '이것이##' 반환

5. LTRIM(문자열), RTRIM(문자열)
   ▷ 문자열의 왼쪽/오른쪽 공백을 제거
-- LTRIM(문자열) : 공백 제거(왼쪽 공백)
-- RTRIM(문자열) : 공백 제거(오른쪽 공백)
select ltrim('    이것이'), rtrim('이것이     ');

-- '이것이'와 '이것이' 반환​


6. TRIM(문자열), TRIM(방향 자를_문자열 FROM 문자열)
   ▷ TRIM(문자열)은 문자열의 앞뒤 공백을 모두 없앰
   ▷ TRIM(방향 자를_문자열 FROM 문자열)에서 방향은 LEADING(앞), BOTH(양쪽), TRAILING(뒤)로 표시

-- TRIM(문자열) : 공백 제거 : 왼쪽, 오른쪽에 공백을 제거
-- TRIM(방향 자를_문자열 FROM 문자열) : BOTH(양쪽), LEADING(앞), TRAILING(뒤)
select trim('     이것이     '), trim(both 'ㅋ' from 'ㅋㅋㅋ재밌어요.ㅋㅋㅋ');

-- '이것이'와 '재밌어요' 반환

 

 

◎ 문자열 함수 4

1. REPEAT(문자열, 횟수)
   ▷ 문자열을 횟수만큼 반복
-- REPEAT(문자열, 횟수) : 문자열을 횟수만큼 반복 출력
select repeat('이것이', 3);

-- '이것이이것이이것이' 반환​


2. REPLACE(문자열, 원래 문자열, 바꿀 문자열)
   ▷ 문자열에서 원래 문자열을 찾아서 바꿀 문자열로 바꿈
-- REPLACE(문자열, 원래 문자열, 바꿀 문자열) : 치환 문자열에서 원래 문자열을 찾아 바꿀 문자열로 변환
select replace('이것이 MySQL이다', '이것이', 'This is');

-- 'This is MySQL이다' 반환​


3. REVERSE(문자열)
   ▷ 문자열의 순서를 거꾸로 바꿈
-- REVERSE(문자열) : 문자열을 거꾸로 출력
select reverse('MySQL');

-- 'LQSyM' 반환​


4. SPACE(길이)
   ▷ 길이만큼의 공백을 반환
-- SPACE(길이) : 공백을 원하는 길이만큼 추가
select concat('이것이', space(10), 'MySQL이다');

-- '이것이          MySQL이다' 반환​


5. SUBSTRING(문자열, 시작위치, 길이) 또는 SUBSTRING(문자열 FROM 시작위치 FOR 길이)
   ▷ 시작위치부터 길이만큼 문자를 반환, 길이가 생략되면 문자열의 끝까지 반환
-- SUBSTRING(문자열, 시작위치, 길이) : 문자열에서 원하는 문자를 추출
-- SUBSTRING(문자열 FROM 시작위치 FOR 길이)
-- 주민번호 상의 성별 구분 : 7번째 숫자
-- SUBSTRING(), SUBSTR(), MID() 동일한 문자 추출 함수
select substring('대한민국만세', 3, 2);

-- '민국' 반환​


6. SUBSTRING_INDEX(문자열, 구분자, 횟수)
   ▷ 문자열에서 구분자가 왼쪽부터 횟수 번째까지 나오면 그 이후의 오른쪽은 버림
   ▷ 횟수가 음수면 오른쪽부터 세고 왼쪽을 버림

-- SUBSTRING_INDEX(문자열, 구분자, 횟수) :
-- 횟수가 양수이면 구분자 오른쪽을 버린다.
select substring_index('cafe.naver.com', '.', 2);

-- 'cafe.naver' 반환

-- 횟수가 음수이면 구분자 왼쪽을 버린다.
select substring_index('cafe.naver.com', '.', -2);

-- 'naver.com' 반환​

 

SQL의 ifnull, nullif, case, 문자열 함수 등을 공부해보았습니다!!

 

ifnull, nullif는 자바의 if문, case는 switch문과 비슷하네요!

 

다른 구문들에 대해서도 정리해 보겠습니다!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형