[Mysql] SQL에서 for문 구현하기

dataong·2021년 2월 3일
4

SQL 스터디

목록 보기
2/5

시작하며

🔎문제 설명

소수를 구하는 다양한 방법이 있지만 쿼리문으로 작성하기에 가장 편안한 방법으로 소수를 구하기로 했습니다. 바로 1000이하의 수에서 무언가의 배수가 되는 수를 발라내는 방식으로 소수를 구하는 것.

🔎풀이순서

  1. 1000이하의 수가 담긴 테이블(Nonprimenumber)을 만든다.
  2. 어떤 수의 배수가 되는 수는 모조리 Nonprimenumber에서 삭제한다. (ex. 2의 배수 모두 제거, 3의 배수 모두 제거, 4의 배수 모두 제거···999의 배수 제거)
  3. Nonprimenumber의 데이터를 형식에 맞게 출력

💻코드 설명

1. 1000이하의 수가 담긴 테이블 만들기

빈테이블 만들기

CREATE TABLE Nonprimenumber(num INT PRIMARY KEY); --빈 테이블 만들기

먼저 빈 Nonprimenumber라는 이름의 빈 테이블을 만들어줍니다. 이 테이블에 num이라는 칼럼이 있고 데이터 형식은 INT라는 것을 명시해줍니다.

for문을 통해 1부터 1000까지의 수 채워주기

DELIMITER $$ 
CREATE PROCEDURE myFunction() -- ⓐ myFunction이라는 이름의 프로시져
BEGIN
    DECLARE i INT DEFAULT 1; -- ⓑ i변수 선언, defalt값으로 1설정
    WHILE (i <= 1000) DO -- ⓒ for문 작성(i가 1000이 될 때까지 반복)
        INSERT INTO `Nonprimenumber` VALUE (i); -- ⓓ 테이블에 i값 넣어주기
        SET i = i + 1; -- ⓔ i값에 1더해주고 WHILE문 처음으로 이동
    END WHILE;
END$$
DELIMITER ; -- ⓕ구분 기호를 다시 ;로 바꿔주기

myFunction이라는 for문 역할을 하는 프로시저를 만들었습니다. 여기서DELIMITER $$이란 $$로 문장을 구분한다는 약속을 해주는 것입니다. 위의 예시에선 PROCEDURE을 마치는 구분자 기호로 $$을 사용했습니다.

프로시저 실행

CALL myFunction(); -- 프로시저 실행, 테이블에 1~1000까지 숫자 채워주기
SELECT * FROM Nonprimenumber; -- 출력

결과값
다음과 같이 테이블 안에 1~1000의 수가 차례대로 채워진 것을 확인할 수 있습니다.

2. 배수는 Nonprimenumber에서 삭제한다.

배수 삭제하는 for문 만들기

DELIMITER $$
CREATE PROCEDURE loop_test()
BEGIN 
    DECLARE k INT DEFAULT 2; --k가 2부터 시작
    WHILE(k <= 1000) DO --k가 1000이 될 때까지 반복 
        DELETE FROM Nonprimenumber WHERE num%k = 0 AND num/k>1 ;
        SET k = k+1 ;
    END WHILE;
    DELETE FROM Nonprimenumber WHERE num = 1;
END$$
DELIMITER ;

2의 배수부터 1000의 배수까지 모두 삭제해주는 for문입니다. DELETE FROM Nonprimenumber WHERE num%k = 0 AND num/k>1 ;WHERE절에 두개의 조건을 걸었습니다.

Nonprimenumber 테이블에 있는 각 숫자를 k로 나누었을 때 몫이 1보다 크고, 나머지가 0인 값들을 제거해줍니다. 몫이 1보다 큰 것을 남겨둔 이유는 이 조건이 없다면 k=2일 때 Nonprimenumber에서 2의 경우 삭제되기 때문입니다.

아래의 예시를 보면 이해가 더 빠를 것 같습니다.

두 조건이 모두 충족되는 4, ···, 54, 56,···, 1000, 즉 2를 제외한 2의 배수들이 모두 삭제되는 것을 확인할 수 있습니다.

프로시저 실행

CALL loop_test(); 
SELECT * FROM Nonprimenumber;


소수만 남은 것을 확인했습니다.

3. group_concat으로 형식에 맞게 출력

GROUP_CONCAT이란?

먼저 GROUP_CONCAT에 대해서 살펴보겠습니다.

GROUP_CONCAT은 서로 다른 행에 있는 데이터를 한 줄로 합쳐줄 때 사용합니다. 'GROUP'에서 알 수 있다시피 특정 GROUP에 해당하는 데이터를 모아 한 줄로 출력해줍니다. 여기서 GROUP을 설정하지 않으면 모든 행을 합쳐준다는 원리를 이용해서 for문 없이 모든 행을 한줄로 출력했습니다.

GROUP_CONCAT의 대표적인 사용법을 살펴보겠습니다.

기본 구성은 GROUP_CONCAT(칼럼명 separator '구분자') FROM 테이블명 (GROUP BY 그룹명)입니다. 만약 GROUP BY를 설정하지 않으면 모든 행을 한 GROUP으로 보고 합쳐주게 됩니다.
구분자는 separator을 통해 지정할 수 있습니다.

SELECT Type, GROUP_CONCAT(DISTINCT Food separator ‘|’ ORDER BY Food )FROM Test GROUP BY Type)

만약 중복값을 제거하거나 정렬을 하고 싶다면 위와 같이 작성하면 됩니다.

GROUP_CONCAT 적용

SELECT GROUP_CONCAT(num separator '&') FROM Nonprimenumber; --형식에 맞춰 출력

따라서 이렇게 쿼리문을 작성하면 2&3&5&···으로 출력이 됩니다.

🎉TAKEAWAYS

💡 Mysql에서 WHILE문을 이용해서 파이썬의 for문 구현하기
💡 GROUP_CONCAT의 사용법 학습

참고자료

DELIMITER 참고자료
GROUP_CONCAT 참고자료

profile
올리고 보는 데이터 분석 TIL

0개의 댓글