본문 바로가기
인터페이스 개발/SQL - MariaDB

SQL - 고급[MariaDB 내장 함수] - 제어 흐름 함수, 문자열 함수, 수학 함수, 날짜 및 시간 함수, 시스템 정보 함수, 파일을 이용한 데이터 조작

by cooluk 2020. 7. 28.

Chap.7-2 SQL 고급[MariaDB 내장 함수] - 제어 흐름 함수, 문자열 함수, 수학 함수, 날짜 및 시간 함수, 시스템 정보 함수, 파일을 이용한 데이터 조작

 

MariaDB 내장 함수

제어 흐름 함수, 문자열 함수, 수학 함수, 날짜 및 시간 함수, 시스템 정보 함수, 파일을 이용한 데이터 조작

 

 

제어 흐름 함수

  • IF(조건, 참, 거짓)

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

결과

 

  • IFNULL(수식1, 수식2) - ☆

    ⁃ 수식1이 NULL이 아니면 수식1 리턴, NULL이면 수식2 리턴

SELECT IFNULL(NULL, '널이군요'), IFNULL(100, '널이군요');

결과

 

  • NULLIF(수식1, 수식2)

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

SELECT NULLIF(100,100), NULLIF(200,100);

결과

 

  • CASE ~ WHEN ~ ELSE ~ END

SELECT
CASE 10
WHEN 1 THEN '일'
WHEN 5 THEN '오'
WHEN 10 THEN '십'
ELSE '모름'
END;

결과

 

 

문자열 함수

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

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

결과

 

  • BIT_LENGTH(문자열), CHAR_LENGTH(문자열), LENGTH(문자열)

SELECT BIT_LENGTH('abc'), CHAR_LENGTH('abc'), LENGTH('abc');
SELECT BIT_LENGTH('가나다'), CHAR_LENGTH('가나다'), LENGTH('가나다');

결과

CHAR_LENGTH와 LENGTH 영어는 같지만 한글은 다르다.

 

  • CONCAT(문자열1, 문자열2, …), CONCAT_WS(구분자, 문자열1, 문자열2, …),

SELECT CONCAT_WS('/', '2022', '01', '01');

결과

Python의 .join과 비슷하다.

 

 

  • ELT(위치, 문자열1, 문자열2, …)

  • FIELD(찾을 문자열 , 문자열1, 문자열2, …)

  • FIND_IN_SET(찾을 문자열 , 문자열 리스트)

  • INSTR(기준 문자열, 부분 문자열) - ☆

  • LOCATE(부분 문자열, 기준 문자열)

SELECT
	ELT(2, '하나', '둘', '셋'),      -- 둘
	FIELD('둘', '하나', '둘', '셋'), -- 2
	FIND_IN_SET('둘', '하나,둘,셋'), -- 2
	INSTR('하나둘셋', '둘'),         -- 3
	LOCATE('둘', '하나둘셋');        -- 3

결과

찾고자 하는 문자가 없으면 0

 

 

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

SELECT FORMAT(123456.123456, 4);

결과

 

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

SELECT BIN(31), HEX(31), OCT(31);

결과

 

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

SELECT INSERT('abcdefghi', 3, 4, '@@@@'), INSERT('abcdefghi', 3, 2, '@@@@');

결과

 

  • LEFT(문자열, 길이), RIGHT(문자열, 길이)

SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3);

결과

 

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

SELECT LOWER('abcdEFGH'), UPPER('abcdEFGH');

결과

 

  • LPAD(문자열, 길이), RIGHT(문자열, 길이)

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

결과

 

  • LTRIM(문자열), RTRIM(문자열)

SELECT LTRIM(' 이것이'), RTRIM('이것이 ');

결과

 

  • TRIM(문자열), TRIM(방향 자를_문자열 FROM 문자열)

SELECT TRIM(' 이것이 '), TRIM(BOTH 'ㅋ' FROM 'ㅋㅋㅋ재밌어요.ㅋㅋㅋ');

결과

 

  • REPEAT(문자열, 횟수)

SELECT REPEAT('이것이', 3);

결과

 

  • REPLACE(문자열, 원래문자열, 바꿀문자열)

SELECT REPLACE ('이것이 MariaDB다', '이것이' , 'This is');

결과

 

  • REVERSE(문자열)

SELECT REVERSE ('MariaDB');

결과

 

  • SPACE(길이)

SELECT CONCAT('이것이', SPACE(10), 'MariaDB다');

결과

 

  • SUBSTRING(문자열, 시작위치, 길이), SUBSTRING(문자열 FROM 시작위치 FOR 길이) - ☆

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

결과

 

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

SELECT
	SUBSTRING_INDEX('cafe.naver.com', '.', 2),
	SUBSTRING_INDEX('cafe.naver.com', '.', -2);

결과

 

 

수학 함수

 

  • ABS(숫수) - 절댓값

  • SIN(숫수), COS(숫수), TAN(숫수)

  • ACOS (숫수), ASIN(숫수), ATAN(숫수), ATAN2(숫수1, 숫자2)

  • CEILING(숫자), FLOOR(숫자), ROUND(숫자)

  • CONVERT(숫자, 원래 진수, 변환할 진수)

  • DEGREES(숫자), RADIANS(숫자), PI()

  • MOD(숫자1, 숫자2) 또는 숫자1 % 숫자2 또는 숫자1 MOD 숫자2 - 나머지

  • POW(숫자1, 숫자2), SQRT(숫자)

  • RAND()

  • EXP(X), LN(숫자), LOG(숫자), LOG(밑수, 숫자), LOG2(숫자), LOG10(숫자)

  • SIGN(숫자)

  • TRUNCATE(숫자, 정수)

 

 

날짜 및 시간 함수

  • ADDDATE(날짜, 차이), SUBDATE(날짜, 차이) - 실제 사용은 WHERE절에서 많이 쓴다.

SELECT
	ADDDATE('2022-01-01', INTERVAL 31 DAY),
	ADDDATE('2022-01-01', INTERVAL 1 MONTH);
SELECT
	SUBDATE('2022-01-01', INTERVAL 31 DAY),
	SUBDATE('2022-01-01', INTERVAL 1 MONTH);

결과

 

  • ADDTIEM(날짜/시간, 시간), SUBTIME(날짜/시간, 시간)

SELECT
	ADDTIME('2022-01-01 23:59:59', '1:1:1'),
	ADDTIME('15:00:00', '2:10:10');
SELECT
	SUBTIME('2022-01-01 23:59:59', '1:1:1'),
	SUBTIME('15:00:00', '2:10:10');

결과

 

 

  • CURDATE(), CURTIME(), NOW(), SYSDATE() - 날짜만, 시간만, 둘다, 둘다 ☆☆

  • YEAR(날짜), MONTH(날짜), DAY(날짜)

  • HOUR(시간), MINUTE(시간), SECOND(시간), MICROSECOND(시간)

SELECT YEAR(CURDATE()), MONTH(CURRENT_DATE()), DAYOFMONTH(CURRENT_DATE);
SELECT HOUR(CURTIME()), MINUTE(CURRENT_TIME()), SECOND(CURRENT_TIME),
	MICROSECOND(CURRENT_TIME);

결과

 

  • DATE(), TIME()

SELECT DATE(NOW()), TIME(NOW());

결과

 

  • DATEDIF(날짜1, 날짜2), TIMEDIFF(날짜1 또는 시간1, 날짜2 또는 시간2) - 날짜 차이, 시간 차이

SELECT DATEDIFF('2022-01-01', NOW()), TIMEDIFF('23:23:59', '12:11:10');

결과

 

  • DAYOFWEEK(날짜), MONTHNAME(), DAYOFYEAR(날짜) - 요일, 월, 몇번째날

SELECT DAYOFWEEK(CURDATE()), MONTHNAME(CURDATE()), DAYOFYEAR(CURDATE());

결과

 

  • LAST_DAY(날짜) - 마지막날

  • MAKEDATE(연도, 정수) - 날짜 변환

  • MAKETIME(시,분,초) - time으로 벼

  • PERIOD_ADD(연월, 개월수), PERIOD_DIFF(연월1, 연월2)

  • QUARTER(날짜)

  • TIME_TO_SEC(시간)

 

예제

employees.employees에서 이번달 생일자 명단 출력

USE employees;
SELECT * FROM employees
WHERE MONTH(birth_date) = MONTH(NOW());

결과

 

employees.employees에서 오늘 날짜 생일자 명단 출력

SELECT * FROM employees
WHERE MONTH(birth_date) = MONTH(NOW())
  AND DAY(birth_date) = DAY(NOW());

결과

 

 

시스템 정보 함수

  • CURRENT_USER(), DATABASE()

SELECT CURRENT_USER(), DATABASE();

결과

 

  • FOUND_ROWS():바로 앞의 SELECT 호출 결과 행의 수 리턴 - 직전의 실행한 행의 수

USE sqlDB;
SELECT * FROM userTBL;
SELECT FOUND_ROWS();

결과

 

  • ROW_COUNT(): INSERT, UPDATE, DELETE 호출 결과 영향 QKE은 행의 수 리턴 - 직전에 실행한

USE sqlDB;
UPDATE buyTBL SET price=price*2;
SELECT ROW_COUNT();

결과

 

 

파일을 이용한 데이터 조작

  • 테이블 → 파일

USE sqlDB;
SELECT * INTO OUTFILE 'C:/temp/userTBL.txt' FROM userTBL;

     - 컬럼 구분자 : 탭

결과

 

  • 파일 → 테이블

CREATE TABLE memberTBL LIKE userTBL;
LOAD DATA LOCAL INFILE 'C:/temp/userTBL.txt' INTO TABLE memberTBL;
SELECT * FROM memberTBL;

결과

 

 

 

댓글