2&3&5&7
의 형식으로 출력하는 문제를 풀어보겠습니다. 소수를 구하는 다양한 방법이 있지만 쿼리문으로 작성하기에 가장 편안한 방법으로 소수를 구하기로 했습니다. 바로 1000이하의 수에서 무언가의 배수가 되는 수를 발라내는 방식으로 소수를 구하는 것.
CREATE TABLE Nonprimenumber(num INT PRIMARY KEY); --빈 테이블 만들기
먼저 빈 Nonprimenumber라는 이름의 빈 테이블을 만들어줍니다. 이 테이블에 num
이라는 칼럼이 있고 데이터 형식은 INT
라는 것을 명시해줍니다.
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의 수가 차례대로 채워진 것을 확인할 수 있습니다.
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;
소수만 남은 것을 확인했습니다.
먼저 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)
만약 중복값을 제거하거나 정렬을 하고 싶다면 위와 같이 작성하면 됩니다.
SELECT GROUP_CONCAT(num separator '&') FROM Nonprimenumber; --형식에 맞춰 출력
따라서 이렇게 쿼리문을 작성하면 2&3&5&···
으로 출력이 됩니다.
💡 Mysql에서 WHILE문을 이용해서 파이썬의 for문 구현하기
💡 GROUP_CONCAT의 사용법 학습