반응형
https://solvesql.com/problems/artists-without-artworks/
https://solvesql.com/problems/artists-without-artworks/
solvesql.com
MoMA에서 등록된 작가 중 전시된 작품이 없는 작가들을 대상으로 기획전을 준비하기 위해 SQL 쿼리를 작성했습니다. 이번 블로그에서는 요구사항을 분석하고, 이를 SQL로 어떻게 구현했는지 설명하겠습니다.
문제
- MoMA에 등록된 작가이지만 전시된 작품이 없는 작가들의 마지막 작품을 전시하는 기획전을 준비하려 합니다. MoMA에 등록되어있고, 현재 살아있지 않은 작가 중 MoMA에 등록된 작품이 없는 작가의 ID와 이름을 출력하는 쿼리를 작성해주세요. 쿼리 결과에는 아래 컬럼이 있어야 합니다.
- artist_id - 작가 ID
- name - 작가 이름
요구사항 분석
- 작가 조건:
- MoMA에 등록되어 있어야 합니다. (기본적으로 artists 테이블에 있는 모든 작가)
- 현재 살아있지 않은 작가여야 합니다 (death_year IS NOT NULL 조건).
- 전시된 작품이 없는 작가:
- artworks_artists 테이블에 작가의 ID가 없어야 합니다.
- 결과 컬럼:
- 작가 ID (artist_id)
- 작가 이름 (name)
해결
SELECT artist_id, name
FROM artists
WHERE death_year IS NOT NULL
AND artist_id NOT IN (SELECT DISTINCT artist_id FROM artworks_artists)
1. SELECT artist_id, name
- 작가 ID와 이름을 결과로 출력합니다.
2. FROM artists
- MoMA에 등록된 작가 정보가 저장된 artists 테이블에서 데이터를 가져옵니다.
3. WHERE death_year IS NOT NULL
- 작가가 살아있지 않은 경우를 필터링합니다.
- death_year가 NULL이면 작가는 생존해 있으므로 제외됩니다.
4. AND artist_id NOT IN (...)
- 작가 ID가 artworks_artists 테이블에 존재하지 않는 경우를 찾습니다.
- artworks_artists 테이블에서 작품과 연결된 모든 작가 ID를 가져옵니다.
- DISTINCT를 사용하여 중복된 작가 ID를 제거합니다. (생략 가능)
SELECT DISTINCT artist_id FROM artworks_artists
다른 접근 방향 - JOIN
1. LEFT JOIN
- LEFT JOIN은 artists 테이블의 모든 행을 기준으로 결합하며, artworks_artists 테이블에 매칭되는 값이 없을 경우 NULL 값을 반환합니다.
- 이 방식으로 artists 테이블에 있지만 artworks_artists에 없는 작가를 쉽게 찾을 수 있습니다.
2. WHERE death_year IS NOT NULL
- 사망한 작가만 선택합니다.
- death_year가 NULL인 행(즉, 생존 작가)은 필터링됩니다.
3. AND aa.artwork_id IS NULL
- artworks_artists 테이블에서 매칭된 작품(artwork_id)이 없는 작가를 찾습니다.
- LEFT JOIN의 결과에서 artwork_id가 NULL이면 해당 작가는 전시된 작품이 없음을 의미합니다.
select a.artist_id, name
from artists a
left join artworks_artists aa on a.artist_id = aa.artist_id
where death_year is not null and artwork_id is null
SQLite 쿼리에서 사용된 주요 문법: NOT IN 과 JOIN
1. NOT IN 방식
NOT IN은 서브쿼리를 사용해 특정 조건에 해당하지 않는 데이터를 필터링할 때 사용됩니다. 대상 테이블의 값이 서브쿼리의 결과값에 포함되지 않는 경우 데이터를 반환합니다.
2. LEFT JOIN 방식
LEFT JOIN은 두 테이블을 결합한 후, 조건에 일치하지 않는 경우 NULL 값을 반환합니다. 이를 활용해 해당 값이 없는 데이터를 필터링할 수 있습니다.
이 쿼리를 통해 MoMA에 등록된 작가 중, 살아있지 않고 전시된 작품이 없는 작가들을 효율적으로 추출할 수 있습니다.
반응형
'SQL' 카테고리의 다른 글
| [SQL/프로그래머스] LV2. 상품 별 오프라인 매출 구하기 (1) | 2024.12.05 |
|---|---|
| [SQL/프로그래머스] LV3. 없어진 기록 찾기 (4) | 2024.12.05 |
| [SQL/solvesql] LV2. 다음날도 서울숲의 미세먼지 농도는 나쁨 😢 (6) | 2024.11.15 |
| [SQL/solvesql] sql 입문자를 위한 데이터 조회 및 정렬 (4) | 2024.11.14 |
| [SQL/solvesql] LV1. 레스토랑 영업일 (8) | 2024.11.14 |