컴퓨터 활용/노년에 즐기는 코딩
[MySQL] 100편의 시를 모으기까지
easyfly
2025. 10. 4. 12:59
반응형
터미널에서 명령어 구조: mysql -H -u [사용자명] -p -D madang -e "..." > poems.html
명령어 구성 요소 설명
mysql: MariaDB 또는 MySQL 데이터베이스 클라이언트를 실행하는 명령어입니다.-H(또는--html): 쿼리의 출력(Output)을 HTML<table>형식으로 만들라는 옵션입니다. 이 옵션이 가장 핵심적인 부분입니다.-u [사용자명]: 데이터베이스에 접속할 사용자 계정(User)을 지정하는 옵션입니다.[사용자명]부분에 실제 DB 계정 이름을 입력합니다.-p: 비밀번호(Password)를 입력하겠다는 옵션입니다. 명령어를 실행하면 비밀번호를 묻는 프롬프트가 나타나 안전하게 입력할 수 있습니다.-D madang: 접속할 데이터베이스(Database)를madang으로 지정하는 옵션입니다.-e "...": 실행할(Execute) SQL 쿼리를 지정하는 옵션입니다. 터미널에서 바로 쿼리를 실행하며,"..."안에 실행하고 싶은 전체 SQL 문장을 넣습니다.>: 리디렉션(Redirection) 기호입니다. 좌측에 있는 명령어의 실행 결과를 화면에 출력하는 대신, 우측에 지정된 파일에 저장하라는 의미입니다.poems.html: 결과를 저장할 파일 이름입니다. 이 경우poems.html이라는 이름의 HTML 파일이 생성됩니다.
전체 흐름 요약 ➡️
요약하자면, 이 명령어는 "madang 데이터베이스에 [사용자명]으로 접속하여, "..." 안의 SQL 쿼리를 실행한 뒤, 그 결과를 HTML 테이블로 변환하여 poems.html 파일에 저장하라"는 의미입니다.
SQL 쿼리
WITH QualifyingPoets AS (
-- 1단계: 10편 이상 시를 쓴 시인들의 id를 찾고, 그 중 11명을 무작위로 고릅니다.
SELECT
poet_id
FROM
poem_poem
GROUP BY
poet_id
HAVING
COUNT(*) >= 10
ORDER BY
RAND()
LIMIT 11 -- 이 부분을 10에서 11로 수정했습니다.
),
RankedPoems AS (
-- 2단계: 위에서 고른 시인들의 모든 작품에 대해, 시인별로 무작위 순번을 매깁니다.
SELECT
p.title,
p.content,
p.poet_id,
ROW_NUMBER() OVER (PARTITION BY p.poet_id ORDER BY RAND()) as rn
FROM
poem_poem p
JOIN
QualifyingPoets qp ON p.poet_id = qp.poet_id
)
-- 3단계: 시인별로 매겨진 순번이 10번 이하인 작품만 선택하여 총 110편을 만듭니다.
SELECT
rp.title AS '제목',
po.name AS '시인',
rp.content AS '본문'
FROM
RankedPoems rp
JOIN
poem_poet po ON rp.poet_id = po.id
WHERE
rp.rn <= 10;

정리
1000편의 시에서 10편 이상 작성된 시인을 선택하여 각 10편의 시를 뽑아내는 작업을 MySQL 언어로 쉽게 할 수 있는 방법이었습니다. 이 코딩을 시마당에 적용하면 앞으로 여러 변용된 방법 사용이 가능할 것 같습니다.
반응형