1. 1부터 10까지 숫자의 합
UNDEFINE N
ACCEPT N PROMT
SELECT SUM(LEVEL) AS 합계
FROM DUAL
CONNECT BY LEVEL <= &N;
2. 1부터 10까지 숫자의 곱
SQL에는 반복문이 없기 때문에 다른 방법을 이용해 숫자의 곱을 구할 수 있다.
- 먼저 밑이 자연상수(e)인 로그함수의 합을 계산한다
$$ \log_e 1 + \log_e 2 + \log_e 3 + \dots +\log_e 10 $$
-- LN : 밑이 자연 상수 e인 로그함수
SUM(LN(LEVEL))
- 1번은 로그의 성질에 의해 곱으로 나타낼 수 있다.
$$ \log_e(1\times 2\times 3\times \dots \times 10) $$
위의 식을 자연 상수의 제곱으로 만들어 준다.
$$ e^{log_e(1 \times 2\times 3\times \dots\times 10)} $$
여기서 자연상수 e와 숫자들의 곱과 자리를 바꿔 정리한다.
$$ e^{log_e(1 \times 2\times 3\times \dots\times 10)}\\= (1 \times 2\times 3\times \dots\times 10)^{log_e{e}} $$
$\log_e{e}$는 1이므로 숫자들의 곱만 남길 수 있다.
$$ 1 \times2\times3\times\dots\times10 $$
-- EXP : 자연 상수 e
EXP(SUM(LN(LEVEL)))
UNDEFINE N
ACCEPT N PROMT
-- 소수점 값은 무시하기 위해 ROUND 함수를 사용한다
SELECT ROUND(EXP( SUM( LN(LEVEL) ) ) ) AS 곱
FROM DUAL
CONNECT BY LEVEL <= &N;
3. 1부터 10까지 짝수만 출력
짝수는 2로 나누었을때 나머지가 0인 점을 이용하여 계산한다.
UNDEFINE N
ACCEPT N PROMT
SELECT LEVEL AS 짝수
FROM DUAL
WHERE MOD(LEVEL, 2) = 0
CONNECT BY LEVEL <= &N;
이를 이용하여 홀수를 출력하는 SQL도 쉽게 작성할 수 있다.
UNDEFINE N
ACCEPT N PROMT
SELECT LEVEL AS 홀수
FROM DUAL
WHERE MOD(LEVEL, 2) != 0
CONNECT BY LEVEL <= &N;
4. 1부터 10까지 소수만 출력
소수는 1과 자기 자신만으로 나누어 떨어지는 수이다.
먼저 1부터 10까지에 대해 모든 수로 나누었을때 나누어 떨어지는 수의 갯수, 즉 약수의 갯수를 구하는 과정을 계산하기 위해 WITH절과 SELF JOIN을 수행한다.
-- 1부터 10까지의 수에 대한 약수 갯수 구하기
WITH LOOP_TABLE AS (SELECT LEVEL AS NUM
FROM DUAL
CONNECT BY LEVEL <= 10)
SELECT LT1.NUM, COUNT(LT1.NUM)
FROM LOOP_TABLE LT1, LOOP_TABLE LT2
WHERE MOD(LT1.NUM, LT2.NUM) = 0
GROUP BY LT1.NUM
ORDER BY LT1.NUM;
위의 결과에서 COUNT(LT1.NUM)의 결과, 즉 약수의 개수가 2개인 숫자가 소수임을 알 수 있다. 이를 바탕으로 SELF JOIN을 이용해 입력받은 숫자 N까지의 소수를 모두 출력할 수 있다. 여기서 SELF JOIN를 할 때 모든 숫자와 조인하기 위해 조건을 WHERE절에 작성하지 않는다.
UNDEFINE N
ACCEPT N PROMT
WITH LOOP_TABLE AS ( SELECT LEVEL AS NUM
FROM DUAL
CONNECT BY LEVEL <= &N)
SELECT LT1.NUM AS 소수
FROM LOOP_TABLE LT1, LOOP_TABLE LT2
WHERE MOD(LT1.NUM, LT2.NUM) = 0
HAVING COUNT(LT1.NUM) = 2
GROUP BY LT1.NUM ;
'Study > SQL' 카테고리의 다른 글
[MySQL/ORACLE] 프로그래머스 - 나이 정보가 없는 회원 수 구하기 (0) | 2023.06.15 |
---|---|
[MySQL/ORACLE] 프로그래머스 - 강원도에 위치한 생산공장 목록 출력하기 (0) | 2023.06.14 |
[SQL] SQL로 알고리즘 문제 풀기 - 구구단 (0) | 2023.01.25 |
[SQL] 데이터 복구하기 - FLASHBACK QUERY (0) | 2023.01.25 |
[SQL] WITH절 사용하기 (0) | 2023.01.24 |