DB/MySQL

단일 행 함수 — 문자

태로미 2023. 2. 7. 10:11

 

 

 

 

 

 

 

 

 

 

▶▶   단일 행 함수 —   문자

 

 

 

1.   ASCII   /   CHAR

2.   LENGTH   /   BIT_LENGTH   /   CHAR_LENGHT

3.   CONCAT   /   CONCAT_WS

4.   INSTR

5.   UPPER   /   LOWER

6.   LEFT   /   RIGHT

7.   LPAD   /   RPAD

8.   LTRIM   /   RTRIM

9.   TRIM

10.   REPLACE

11.   SPACE

12.   SUBSTR / SUBSTRING

 

 

 

 

 

 

 

 

 

 

▶   ASCII   /   CHAR

   ASCII (아스키코드)    문자의 아스키 코드값을 반환.
   CHAR (숫자)    숫자의 아스키 코드값을 반환.

EX   )

SELECT ascii('A'), char(65);

→   MySQL에서는 단순한 함수 결과나 계산 결과를 출력하는 경우,

      즉 접근해야하는 테이블이 없는 출력구문인 경우 select절만 작성 가능.

   실행 결과

 

 

 

 

 

 

 

 

 

 

▶   LENGTH   /   BIT_LENGTH   /   CHAR_LENGHT

   LENGTH (문자열)    문자열의 'byte' 수를 반환.   알파벳, 숫자는 글자당 1byte,  기타 언어는 2~3byte를 사용.
   BIT_LENGTH (문자열)    문자열의 크기를 bit 단위로 출력.
   CHAR_LENGHT (문자열)    문자의 개수,  즉 문자열의 글자수를 숫자로 출력.

EX   )

SELECT length('abc'), bit_length('abc'), char_length('abc');

   실행 결과

SELECT length('가나다'), bit_length('가나다'), char_length('가나다');

→   알파벳과 한글의 데이터를 비교해보았을때,  알파벳 'a'는 1byte의 크기고, 한글 '가'는 3byte의 크기를 가짐.

→   char_length는 문자의 개수를 반환해주는 함수이므로 값이 같음.

   실행 결과

 

 

 

 

 

 

 

 

 

 

▶   CONCAT   /   CONCAT_WS

   CONCAT (문자열1, 문자열2, ...)   문자열을 연결해줌
   CONCAT_WS (구분자, 문자열1, 문자열2, ...)   맨 처음의 구분자와 함께 문자열을 연결해줌.

EX1   )   문자열을 연결해줌

SELECT employee_id, concat(first_name, last_name) AS "이름"
FROM employees;

   실행 결과

SELECT employee_id, concat(first_name, ' ', last_name) AS "이름"
FROM employees;

→   가운데에 공백(' ')이 포함되어 결과가 이름과 성을 구분해주는 띄어쓰기로 적용됨.

   실행 결과

 

 

 

EX2   )    구분자와 함께 문자열을 연결해줌

SELECT concat_ws('/', '2025', '01', '01') AS alias;

→   입력받은 문자열들을 모두 연결하여 출력함.

✓   실행 결과

SELECT concat_ws('--', last_name, job_id, salary) AS alias
FROM employees;

→   맨 처음에 나오는 구분자로 문자들을 연결하여 출력함.

   실행 결과

 

 

 

 

 

 

 

 

 


▶   INSTR

–   INSTR (기존 문자열,  부분 문자열)

–   인스트링

–   문자열에서 찾는 특정 문자열이 위치한 자리값을 출력.
–   자리값의 시작은 1부터 시작함.
–   찾는 부분문자열이 포함되어 있지 않는 경우 0을 돌려준다.


EX   )

SELECT instr('하나둘셋', '둘')

   실행 결과

SELECT last_name, instr(last_name, 'a')
FROM employees;

   실행 결과

SELECT last_name, job_id
FROM employees 
WHERE instr(job_id, 'MAN') != 0;

→   WHERE절의 'job_id에 'MAN'이라는 글자가 0이 아니다' 라는 뜻은 결국 'MAN'이라는 글자가 들어가야 한다라는 뜻

   실행 결과

 

 


 

 

Q   )    사원들 중에서 last_name에 'a'없는 사원만 출력하시오.

 

A   )

 

방법1

SELECT last_name
FROM employees
WHERE last_name NOT LIKE '%a%';

→   LIKE연산자를 사용하여 last_name  'a'가 들어있는 조건을 적어 찾아내고, 앞에 NOT연산자를 붙여줌.

   실행 결과

 

방법2

SELECT last_name
FROM employees 
WHERE INSTR(last_name, 'a') = 0;

→   INSTR함수는 찾는 부분문자열이 없을 경우 0을 돌려주므로 WHERE절에 사용하여 찾아냄.

   실행 결과

 

 

 

 

 

 

 

 

 


▶   UPPER   /   LOWER

   UPPER (문자열)    문자열을 대문자로 변환
   LOWER (문자열)    문자열을 소문자로 변환

EX   )

SELECT lower('abcdEFGH'), upper('abcdEFGH');

   실행 결과

SELECT employee_id, upper(last_name) AS "L-name", lower(job_id) AS "Job",
		phone_number, lower(email) AS "E-mail"
FROM employees;

→   UPPER함수가 들어간 문자열은 모두 대문자로 출력, LOWER함수가 들어간 문자열은 모두 소문자로 출력됨.

   실행 결과

 

 

 

 

 

 

 

 

 

▶   LEFT   /   RIGHT

   LEFT (문자열,  길이)    왼쪽방향에서부터 입력한 길이만큼 문자열을 추출함.
   RIGHT (문자열,  길이)    오른쪽방향에서부터 입력한 길이만큼 문자열을 추출함.

EX   )

SELECT left('abcdefghi', 3), right('abcdefghi', 3);

✓   실행 결과

SELECT last_name, left(last_name, 2), right(last_name, 2)
FROM employees;

✓   실행 결과

 

 

 

 

 

 

 

 

 


▶   LPAD   /   RPAD

   LPAD (문자열,  길이,  채울 문자)    문자열을 길이만큼 늘린 후, 빈 곳을 왼쪽부터 채울 문자로 채움 (오른쪽 정렬 함수)
   RPAD (문자열,  길이,  채울 문자)    문자열을 길이만큼 늘린 후, 빈 곳을 오른쪽부터 채울 문자로 채움 (왼쪽 정렬 함수)

EX   )

SELECT lpad('가나다', 5, '#'), rpad('가나다', 5, '#');

   실행 결과

SELECT lpad(last_name, 20, '_') AS "L-name", rpad(first_name, 20, '_') AS "F-name"
FROM employees;

   실행 결과

 

 

 

 

 

 

 

 

 


▶   LTRIM   /   RTRIM

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

EX   )

SELECT char_LENGTH('          문법      '),
char_LENGTH(ltrim('          문법      ')), char_LENGTH(rtrim('          문법      '));

→   char_length로 문장의 길이를 먼저 파악하고, 
       char_length(ltrim)기능을 넣어서 몇 개의 공백을 제거했는지 알 수 있음.

   실행 결과

 

 

 

 

 

 

 

 

 

 

▶   TRIM

   TRIM    양 방향의 바깥 공백을 한번에 제거
   TRIM (방향    '제거문자'    FROM   '전체문자')    –  방향 : leading (앞),  trailing (뒤),  both (양쪽)
   –  문자열로부터 해당 방향의 자를 문자열을 제거

EX   )

SELECT trim('      SQL 문법   '), trim(BOTH '_' FROM '__SQL_문법__');

   실행 결과

 

 

 

 

 

 

 

 

 


▶   REPLACE

–   REPLACE (전체문자열,  '부분'문자열,  '대체'문자열)

–   전체 문자열에 기존 문자열을 바꿀 문자열로 교체해줌.


EX   )

SELECT employee_id, phone_number, REPLACE(phone_number, '.', '-') AS "전화번호"
FROM employees;

✓   실행 결과

 

 

 

 

 


▶   SPACE

–  길이만큼의 공백을 반환해 주는 함수


EX   )

SELECT concat('MySQL', SPACE(10), 'DBMS');

✓   실행 결과

 

 

 

 

 

 

 

 

 


▶   SUBSTR / SUBSTRING

–  SUBSTR ( '전체 문자열',  자리값,  글자수)

     → 자리값은 1부터 시작하며,  글자수는 마지막 자리값을 포함시킴.

–  문자열의 일부를 추출해주는 함수.

–  둘 다 기능 똑같음.


EX   )

SELECT substr('대한민국만세', 3, 2);

→   3번째자리 '포함'해서 2자리만큼 추출함.

   실행 결과

 

 

 

EX2   )

SELECT last_name, substr(last_name, 2, 3), substring(last_name, 2, 3)
FROM employees;

   실행 결과

 

 


 

 

Q1   )  employees 테이블로부터 사원들의 last_name과 last_name의 길이를 출력하되,
           last_name이 'J', 'A', 'M'으로 시작되는 사원만 출력하시오.
           또한 last_name을 기준으로 오름차순 정렬해서 출력하시오.

 

 A1   )

SELECT last_name "Name", char_LENGTH(last_name) "Length"
FROM employees
WHERE substr(last_name, 1, 1) = 'J' OR substr(last_name, 1, 1) = 'A' OR substr(last_name, 1, 1) = 'M';

→   last_name에서 첫글자르 골라내야하므로 where절을 사용함.  근데 너무 길다!

SELECT last_name "Name", char_LENGTH(last_name) "Length"
FROM employees
WHERE substr(last_name, 1, 1) IN ('J', 'A', 'M')
ORDER BY Name ASC;

→  IN연산자를 사용, 묶어서 간단하게 표현함.

   실행 결과

 

 


 

 

Q2   )  employee 테이블로부터 사원들의 last_name과 salary를 출력하되,
           특히 급여는 15자리로 표시하고, 왼쪽부터 $기호가 채워지도록 지정하시오.

 

A2   )

SELECT last_name, lpad(salary, 15, '#')
FROM employees;

   실행 결과

 

 


 

 

Q3   )    employees 테이블로부터 last_name과 급여 액수를 별표(*)로 나타내는 query를 작성하시오.
             각 별표는 $1,000를 의미하며 백단위 이하는 표시하지 않습니다.
             또한 급여의 내림차순으로 데이터를 정렬하여 출력하고,
             컬럼 제목을 EMPLOYEES_AND_THEIR_SALARIES로 지정하시오.

 

A3   )

– 수도코드 작성 – 
별표갯수는 어떻게 지정할까, 별표는 1,000단위니까 급여에 1000을 나눠서 몫을 구해줌
근데 몫을 구하면 소수점자리가나옴.  몫을 정수로 처리해야함.  소수점 버려야함.
last name + salary = 별표로 바꾸기

SELECT truncate(salary/1000, 0), lpad('', truncate(salary/1000, 0), "*") AS "EMPLOYEE_AND_THEIR_SALARIES"
FROM employees
ORDER BY salary DESC;

→   truncate는 소수점 자리 지정해서 버리는 함수

   실행 결과

→   별표갯수 = 1000단위마다 별표1개로 찍은 것

 

이제 concat으로 원하는 형식대로 합쳐줌.

'  ' 이것도 출력내용은 없지만 문자열로 인식함.

SELECT concat(last_name, ' ', lpad('', truncate(salary/1000, 0), "*")) AS "EMPLOYEE_AND_THEIR_SALARIES"
FROM employees
ORDER BY salary DESC;

   실행 결과

 

근데 last_name길이가 젤 긴 사원을 기준으로 별표 시작점을 좀 이쁘게 맞추고 싶음.

SELECT concat(rpad(last_name,(SELECT max(char_length(last_name))
FROM employees), ' ') , lpad('', truncate(salary / 1000, 0), '*')) "EMPLOYEES_AND_THEIR_SALARIES"
FROM employees
ORDER BY salary DESC;

→   last_name의 최대 길이에 맞춰 모든 last_name의 출력 간격을 통일함.

→   아직 안배운 기술이므로 뒤에 가서 자세히 다루겠음.  일단 이렇게도 가능하다 정도로만 알아두기.

✓   실행 결과