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;
결과
댓글