CS/데이터베이스

SQL(7) 문자열 관련 내장 함수

hyomee2 2024. 7. 31. 18:23

1. 문자열 관련 함수

(1) ASCII(아스키 코드), CHAR(숫자)

SELECT ASCII('A'), CHAR(65);

 

(2) Bit, Char, Byte 수

- 한글값은 3byte이다. 

SELECT BIT_LENGTH('pie'), CHAR_LENGTH('pie'), LENGTH('pie');

 

(3) CONCAT(문자열1, 문자열2, ...), CONCAT_WS(구분자, 문자열1, 문자열2, ...)

- 문자열을 이어준다.

- CONCAT_WS는 문자열 사이에 구분자를 넣어서 이어준다.

SELECT CONCAT('호랑이', '기린', '토끼');
SELECT CONCAT_WS(',', '호랑이', '기린', '토끼'); # 첫번째 매개변수가 구분자가 된다.

 

(4) ELT(숫자, 문자열1, 문자열2,...)

: 첫번째 인자 위치의 문자열 반환

SELECT
       ELT(2, '사과', '딸기', '바나나');  -- 딸기

 

(5) FIELD(문자열1, 문자열2, 문자열3,...)

: 첫번째 인자와 같은 문자열의 위치 반환

SELECT
	FIELD('딸기', '사과', '딸기', '바나나');  -- 2

 

(6) FIND_IN_SET(문자열1, 문자열2(쉼표로 구분된 문자열))

: 첫번째 인자의 문자열이 문자열2 SET 내부의 위치 숫자 반환 (없을 경우 0 반환)

SELECT
	FIND_IN_SET('사과', '사과,딸기,바나나');  -- 3

- 주의할 점: 두번째 문자열 set에서 콤마 뒤에 띄어쓰기를 하면 안된다!

 

(7) INSTR(문자열1, 문자열2)

: 두번째 인자가 첫번째 인자 문자열 내부에서 시작 위치 반환

SELECT
	INSTR('사과딸기바나나', '딸기');  -- 3

 

(8) LOCATE(문자열1,문자열2)

- INSTR()과 같지만,인자 순서만 반대이다.

SELECT
	LOCATE('딸기', '사과딸기바나나');  -- 3

 

(9) FORMAT(숫자, 소수점 자리)

: 숫자를 소수점 자리까지 반올림

SELECT FORMAT(123123123123.567567, 3);  -- 123,123,123,123.568

 

(10) BIN(숫자), OCT(숫자), HEX(숫자)

-- 순서대로 2진수, 8진수, 16진수
SELECT BIN(65), OCT(65), HEX(65);

 

(11) INSERT(기준문자열, 위치, 길이, 삽입할 문자열)

SELECT INSERT('내 이름은 아무개입니다.', 7, 3, '홍길동');
-- 위치 7에서부터 3글자를 홍길동으로 바꾼다.

-- 아래와 같이 길이가 삽입될 문자열 길이보다 커도 에러가 발생하지 않는다.
SELECT INSERT('내 이름은 아무개입니다.', 7, 4, '홍길동');  -- 내 이름은 홍길동니다.
SELECT INSERT('내 이름은 아무개입니다.', 7, 10, '홍길동');  -- 내 이름은 홍길동

 

(12) LEFT(문자열, 숫자), RIGHT(문자열, 숫자)

: 왼쪽에서부터 숫자개, 오른쪽에서부터 숫자개 문자열 반환

SELECT LEFT('Hello World!', 3), RIGHT('Hello World!', 3);

-- 아래와 같이 숫자가 문자열 길이보다 크더라도 문자열 길이만큼만 반환한다.
SELECT LEFT('Hello World!', 30), RIGHT('Hello World!', 3);
SELECT LENGTH(LEFT('Hello World!', 30))  -- 12

 

(13) UPPER(문자열), LOWER(문자열)

: 문자열을 대문자/소문자로 변경

SELECT UPPER('Hello World!'), LOWER('Hello World!');

 

(14) LPAD(문자열1, 숫자, 문자열2), RPAD(문자열1, 숫자, 문자열2)

: LPAD의 경우, 문자열1의 왼쪽을 문자열2로 채워 숫자 길이만큼의 문자열을 반환. RPAD의 경우 반대

SELECT LPAD('왼쪽',6, '@'), RPAD('오른쪽', 6, '@');  
-- @@@@왼쪽   -- 오른쪽@@@

SELECT LPAD('왼쪽',6, '안녕하세요'), RPAD('오른쪽', 6, '@');
-- 안녕하세왼쪽  -- 오른쪽@@@

 

(15) LTRIM(문자열), RTRIM(문자열), TRIM(문자열)

: 문자열의 왼쪽(LTRIM)/오른쪽(RTRIM)/양쪽(TRIM)의 공백을 제거

- BOTH, LEADING, TRAILING으로 방향 설정 가능

SELECT LTRIM('   왼쪽')
      , RTRIM('오른쪽   ')
      , TRIM('   mariadb   ')
      , TRIM(BOTH '@' FROM '    mariadb@@@@')
      , TRIM(LEADING '@' FROM '@@@mariadb@@@@')
      , TRIM(TRAILING '@' FROM '@@@mariadb@@@@');

 

(16) REPEAT(문자열, 숫자)

: 문자열을 숫자만큼 반복

SELECT REPEAT("재밌어", 3);   -- 재밌어재밌어재밌어

 

(17) REPLACE(문자열1, 문자열2, 문자열3)

: 문자열1에 있는 문자열2을 문자열3으로 바꿈

SELECT REPLACE('마리아DB', '마리아', 'MARIA');   -- MARIADB

 

(18) REVERSE(문자열)

: 문자열의 역순으로 반환

SELECT REVERSE('stressed');   -- desserts

 

(19) SPACE(길이)

: 길이만큼의 공백 반환

SELECT CONCAT('제 이름은', SPACE(5), '이고 나이는', SPACE(3), '세입니다.');
-- 제 이름은     이고 나이는   세입니다.

 

(20) SUBSTRING(문자열, 시작위치, 길이)

: 시작위치부터 길이 만큼의 문자열 반환

- 길이 생략 시 문자열을 끝까지 반환

SELECT 
       SUBSTRING('안녕하세요 반갑습니다.', 7, 2),  -- 반갑
       SUBSTRING('안녕하세요 반갑습니다.', 7);     -- 반갑습니다.

 

(21) SUBSTRING_INDEX(문자열, 구분자, 횟수)

: 횟수가 양수일 경우, 왼쪽에서부터 횟수번째 구분자까지의 문자열을 반환하고,

  횟수가 음수일 경우, 오른쪽에서부터 횟수번째 구분자까지의 문자열을 반환

SELECT
       SUBSTRING_INDEX('hong.test@gmail.com', '.', 2)     -- hong.test@gmail
	  , SUBSTRING_INDEX('hong.text@gmail.com', '.', -2);  -- text@gmail.com