단일 행 함수 — 문자
▶▶ 단일 행 함수 — 문자
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의 출력 간격을 통일함.
→ 아직 안배운 기술이므로 뒤에 가서 자세히 다루겠음. 일단 이렇게도 가능하다 정도로만 알아두기.
✓ 실행 결과