- 이 글은 도서 '초보자를 위한 SQL 200제'라는 책을 바탕으로 작성되었습니다.
- 이전 과정의 연습문제를 확인하고 싶으면 다음을 참고하시기 바랍니다.
023 반올림해서 출력하기(ROUND)
숫자를 출력 시 반올림을 하기 위해서는 ROUND 함수를 사용합니다.
SELECT ROUND(숫자, 반올림해 나태내고 싶은 자리)
FROM DUAL;
ROUND 함수에는 반올림할 숫자를 적고, 반올림을 통해 나타내고 싶은 자릿수를 적습니다.
EX) 693.281을 소수점 이후 첫째 자리까지 나타내고 싶은 경우
소수 둘째 자리에서 반올림을 하여 693.281 -> 693.3가 되어야 합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,2)
FROM DUAL;
EX) 693.281을 첫째 자리(일의 자리)까지 나타내고 싶은 경우
소수점을 기준으로 두고 소수점 이후 첫 번째 자리에서 반올림을 하여 693.281 -> 693가 되어야 합니다.
이때 기준은 소수점이기 때문에 반올림해 나타내고 싶은 자리를 0으로 두고 반올림합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,0)
FROM DUAL;
SELECT ROUND(693.281)
FROM DUAL;
ROUND(숫자, 0)의 결과는 ROUND(숫자)의 결과와 동일합니다. (ROUND의 디폴트가 0)
EX) 693.281을 둘째 자리(십의 자리)까지 나타내고 싶은 경우
첫째 자리(일의 자리)에서 반올림을 하여 693.281 -> 690이 되어야 합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
SELECT ROUND(693.281,-1)
FROM DUAL;
Q. 876.567 숫자를 출력하라, 단 소수점 두 번째 자리인 6에서 반올림해서 출력하라.
소수점 두 번째 자리에서 반올림하여 소수점 첫 번째 자리까지 나타낼 것이므로 자릿수는 1이다.
SELECT 876.567, ROUND(876.567,1)
FROM DUAL;
024 숫자를 버리고 출력하기 (TRUNC)
숫자 출력 시 특정 자리의 숫자를 버리고 출력하기 위해 TRUNC 함수를 사용합니다.
SELECT TRUNC(숫자, 나타내고 싶은 자리 수)
FROM DUAL;
TRUNC 함수에는 특정 자리 숫자를 버릴 숫자와 남기고 싶은 자릿수를 입력합니다.
EX) 693.281에서 소수점 이후 첫 번째 자리 이후 두 번째 자리부터 버리고 출력하고 싶은 경우 693.281 → 693.2가 되어야 합니다
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 3 | . | 2 |
자리 | -3 | -2 | -1 | 0 | 1 |
SELECT TRUNC(693.281,1)
FROM DUAL;
EX) 693.281에서 첫 번째 자리 이후 소수점 자리부터 버리고 출력하고 싶은 경우 693.281 → 693가 되어야 합니다.
0의 자리는 소수점 자리이기 때문에 소수점을 기준으로 두고 소수점 이후를 전부 버리고 출력합니다.
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 3 | . |
자리 | -3 | -2 | -1 | 0 |
SELECT TRUNC(693.281,0)
FROM DUAL;
SELECT TRUNC(693.281)
FROM DUAL;
TRUNC(숫자, 0)의 결과는 TRUNC(숫자)의 결과는 동일합니다. (TRUNC의 디폴트가 0)
EX) 693.281에서 십의 자리 이후 일의 자리부터 버리고 출력하고 싶은 경우 693.281 → 690가 되어야 합니다
숫자 | 6 | 9 | 3 | . | 2 | 8 | 1 |
자리 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
▼
숫자 | 6 | 9 | 0 |
자리 | -3 | -2 | -1 |
SELECT TRUNC(693.281,-1)
FROM DUAL;
Q. 876.567 숫자를 출력하라. 단 소수점 두 번째 자리인 6과 그 이후의 숫자들은 모두 버리고 출력하라
소수점 주 번째 자리부터 버리고 소수점 첫 번째 자리까지 남기기 때문에 함수 안에 들어갈 자리 수는 1이다.
SELECT TRUNC(876.567,1)
FROM DUAL;
025 나눈 나머지 값 출력하기 (MOD)
숫자 값을 나눈 나머지의 값을 출력할 때 MOD 함수를 사용합니다.
SELECT MOD(나눠지는 수, 나누는 수)
FROM DUAL;
EX) 15를 4로 나눈 나머지의 값을 출력하라
SELECT MOD(15,4)
FROM DUAL;
Q. 숫자 10을 3으로 나눈 나머지 값을 출력하라
나누는 수 = 3, 나누어지는 수 =10
SELECT MOD(10,3)
FROM DUAL;
Q. 사원 번호와 사원 번호가 홀수이면 1, 짝수이면 0을 출력하라.
홀수는 2로 나누었을 때 나머지가 1, 짝수는 나머지가 0인 점을 이용하여 계산한다.
SELECT EMPNO, MOD(EMPNO,2)
FROM EMP;
Q. 사원번호가 짝수인 사원들의 사원 번호와 이름을 출력하라.
WHERE 절을 활용하여 사원번호를 2로 나누었을 때 나머지가 0인 사원번호와 사원 이름을 출력하면 된다.
SELECT EMPNO, ENAME
FROM EMP
WHERE MOD(EMPNO,2) = 0;
나머지를 구하는 함수가 MOD 함수라면 나눈 몫을 구하는 FLOOR 함수가 있습니다.
SELECT FLOOR(나눠지는 수 / 나누는 수)
FROM DUAL;
EX) 15를 4로 나눈 몫을 출력하라
SELECT FLOOR(15 / 4)
FROM DUAL;
15를 나눈 값은 3.75이지만 FLOOR 함수는 3과 4 사이에서의 제일 바닥에 해당하는 값인 3을 출력합니다.
Q. 숫자 10을 3으로 나눈 몫을 출력하라
SELECT FLOOR(10 / 3)
FROM DUAL;
026 날짜 간 개월 수 출력하기 (MONTHS_BETWEEN)
날짜와 날짜 사이의 개월 수를 출력할 때 MONTHS_BETWEEN 함수를 사용합니다.
SELECT MONTHS_BETWEEN('날짜1', '날짜2')
'날짜 1'과 '날짜 2'에는 날짜 값을 입력받아 숫자 값을 출력합니다. MONTHS_BETWEEN 함수에 날짜 값을 입력할 때 '날짜 1' 자리에는 최신의 날짜를, '날짜 2'에는 예전 날짜로 입력해야 합니다. 즉 '날짜 1'이 '날짜 2' 보다 최신이어야 합니다.
EX ) 2019년 9월 1일에서 2021년 6월 30일 사이의 개월 수를 출력하시오.
SELECT MONTHS_BETWEEN('2021-06-30','2019-09-30') AS MONTH_BTEWEEN
FROM DUAL;
Q. 사원의 이름과 입사한 날짜부터 오늘 총 몇 달을 근무했는지 출력하라.
※ 오늘 날짜를 출력하는 함수는 SYSDATE 함수입니다.
SELECT ENAME, ROUND(MONTHS_BETWEEN(SYSDATE, HIREDATE),4) AS 근무
FROM EMP;
SYSDATE는 오늘 날짜를 확인하는 함수로 2021년 6월 29일을 기준으로 출력된 결과입니다.
소수점 밑에 자리 숫자가 길어 넷째 자리까지 만을 출력하여 이를 근무라는 별칭을 두었습니다.
MONTHS_BETWEEN 함수를 이용하지 않고 날짜만으로 연산을 해야 할 경우 다음과 같이 날짜와 산술 연산만을 이용하여 산술식을 작성해야 합니다.
SELECT TO_DATE('날짜1', '날짜 형식') - TO_DATE('날짜2', '날짜 형식')
FROM DUAL;
날짜 형식은 지난 008번 연습문제를 참고하면 좀 더 자세히 알 수 있습니다.
EX) 2019년 6월 1일에서 2021년 6월 30일 사이의 총일수를 출력하라
2019년 6월 1일에서 2021년 6월 30일 사이의 총일수를 출력하려면 최신인 날짜 2021년 6월 30일부터 작성합니다.
SELECT TO_DATE('2021-06-30','YYYY-MM-DD') - TO_DATE('2019-06-01','YYYY-MM-DD') AS 날짜계산
FROM DUAL;
Q. 2018년 10월 1일에서 2019년 6월 1일 사이의 총일수를 출력하라.
SELECT TO_DATE('2018-10-01','YYYY-MM-DD') - TO_DATE('2019-06-01','YYYY-MM-DD')
FROM DUAL;
위에서 구한 일수를 이용하여 총 주(Week) 수를 구할 수 있습니다. 총일수를 구한 후, 구한 값을 7로 나누어 반올림하면 총주수를 구할 수 있습니다.
SELECT ROUND((TO_DATE('날짜1', '날짜 형식') - TO_DATE('날짜2', '날짜 형식')) / 7)
FROM DUAL;
EX) 2019년 6월 1일에서 2021년 6월 30일 사이의 총주수를 출력하라
2019년 6월 1일에서 2021년 6월 30일 사이의 총주수를 출력하려면 최신인 날짜 2021년 6월 30일부터 작성합니다.
SELECT ROUND((TO_DATE('2021-06-30', 'YYYY-MM-DD') - TO_DATE('2019-06-01', 'YYYY-MM-DD')) / 7) AS 총_주수
FROM DUAL;
Q. 2018년 10월 1일에서 2019년 6월 1일 사이의 총 주(Week) 수를 출력하라.
SELECT ROUND((TO_DATE('2019-06-01', 'YYYY-MM-DD') - TO_DATE('2018-10-01', 'YYYY-MM-DD')) / 7) AS 총_주수
FROM DUAL;
027 개월 수 더한 날짜 출력하기 (ADD_MONTHS)
특정 날짜에서 개월 수를 더한 날짜를 출력할 때 ADD_MONTHS 함수를 사용합니다.
SELECT ADD_MONTHS(TO_DATE('날짜','날짜 형식'), 더할 개월 수)
FROM DUAL;
EX) 2021년 6월 1일부터 40달 뒤의 날짜는 어떻게 되는지 출력하라
SELECT ADD_MONTHS(TO_DATE('2021-06-01','YYYY-MM-DD'), 40)
FROM DUAL;
Q. 2019년 5월 1일로부터 100달 뒤의 날짜는 어떻게 되는지 출력하라.
SELECT ADD_MONTHS(TO_DATE('2019-05-01','YYYY-MM-DD'), 100)
FROM DUAL;
만약 더하는 기준이 달(MONTH)이 아닌 일(DAY)인 경우 일반적인 날짜형 TO_DATE의 값에 숫자를 더해주면 더한 숫자만큼의 일수 이후의 날짜를 출력한다.
SELECT TO_DATE('날짜','날짜 형식') + 숫자
FROM DUAL;
EX ) 2021년 12월 25일로부터 100일 전 날짜는 어떻게 되는지 출력하라.
SELECT TO_DATE('2021-12-25','RRRR-MM-DD') - 100
FROM DUAL;
빼기(-) 연산을 통해 21년 12월 25일로부터 100일 전은 21년 9월 16일임을 확인할 수 있다.
Q. 2019년 5월 1일로부터 100일 후에 돌아오는 날짜는 어떻게 되는지 출력하라.
SELECT TO_DATE('2019-05-01','RRRR-MM-DD') + 100
FROM DUAL;
028 특정 날짜 뒤에 오는 요일 날짜 출력하기 (NEXT_DAY)
특정 날짜 다음에 돌아오는 특정 요일의 날짜를 출력하기 위해서는 NEXT_DAY 함수를 사용합니다.
SELECT NEXT_DAY('날짜', '요일')
FROM DUAL;
EX ) 2021년 6월 30일로부터 바로 돌아올 화요일의 날짜가 어떻게 되는지 출력하라
SELECT '21-06-30' AS 날짜, NEXT_DAY('21-06-30', '화요일')
FROM DUAL;
달력을 통해서 6월 30일로부터 바로 돌아오는 화요일은 7월 6월임을 확인할 수 있습니다.
Q. 2019년 5월 22일로부터 바로 돌아올 월요일의 날짜가 어떻게 되는지 출력하라
SELECT '19-05-22' AS 날짜, NEXT_DAY('19-05-22', '월요일')
FROM DUAL;
Q. 오늘부터 앞으로 돌아올 화요일의 날짜를 출력하라
오늘 날짜를 나타내는 함수 SYSDATE를 이용하여 출력합니다.
SELECT SYSDATE, NEXT_DAY(SYSDATE, '화요일')
FROM DUAL;
NEXT_DAY 함수의 경우 중첩해서 사용이 가능합니다. 예를 들어 앞에서 배웠던 개월 수를 더한 날짜를 출력했던 ADD_MONTHS 함수와 함께 사용한 예제를 풀어보겠습니다.
EX ) 2021년 6월 29일로부터 3달 뒤에 돌아오는 월요일의 날짜를 출력하라
먼저 2021년 6월 29일로부터 3달이 지난 날짜를 출력해야 합니다. → ADD_MONTH('2021-06-20', 3)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTH('2021-06-20', 3), '월요일')
이를 바탕으로 SQL을 작성하면 다음과 같습니다.
SELECT NEXT_DAY(ADD_MONTHS('2021-06-29', 3), '월요일')
FROM DUAL;
Q. 2019년 5월 22일부터 100달 뒤에 돌아오는 화요일의 날짜를 출력하라
먼저 2019년 5월 22일로부터 100달이 지난 날짜를 출력해야 합니다. → ADD_MONTH('2019-05-22', 100)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTHS('2019-05-22', 3), '화요일')
SELECT NEXT_DAY(ADD_MONTHS('2019-05-22', 100), '화요일')
FROM DUAL;
Q. 오늘로부터 100달 뒤에 돌아오는 월요일의 날짜 출력
먼저 오늘로부터 100달이 지난 날짜를 출력해야 합니다. → ADD_MONTH(SYSDATE, 100)
위에서 구한 날짜로부터 요일을 구해야 합니다 → NEXT_DAY(ADD_MONTHS(SYSDATE, 3), '월요일')
SELECT NEXT_DAY(ADD_MONTHS(SYSDATE, 3), '월요일')
FROM DUAL;
029 특정 날짜가 있는 달의 마지막 날짜 출력하기 (LAST_DAY)
특정 날짜가 있는 달의 마지막 날짜를 출력할 때 LAST_DAY 함수를 사용합니다.
SELECT LAST_DAY('DATE')
FROM DUAL;
EX) 2021년 4월 13일 해당 달의 마지막 날짜가 어떻게 되는지 출력하라
SELECT '21/04/13' AS 날짜 , LAST_DAY('2021/04/13') AS 마지막날짜
FROM DUAL;
Q. 2019년 5월 22일 해당 달의 마지막 날짜가 어떻게 되는지 출력하라
SELECT '19/05/22' AS 날짜 , LAST_DAY('19/05/22') AS 마지막날짜
FROM DUAL;
Q. 오늘부터 이번 달 말일까지 총 며칠 남았는지 출력하라
오늘 날짜를 나타내는 함수 SYSDATE ( =21년 6월 29일) 기준으로 결과를 출력한다
SELECT LAST_DAY(SYSDATE) - SYSDATE
FROM DUAL;
Q. 이름이 KING인 사원의 이름, 입사일, 입사한 달의 마지막 날짜를 출력하라
WHERE 절을 이용하여 이름이 KING인 사원만의 정보를 출력합니다.
SELECT ENAME, HIREDATE, LAST_DAY(HIREDATE)
FROM EMP
WHERE ENAME = 'KING';