[SQL_Q] Python 개발자 찾기

Hyunjun Kim·2025년 10월 25일
0

SQL

목록 보기
85/90

https://school.programmers.co.kr/learn/courses/30/lessons/276013

1. 문제 설명

DEVELOPER_INFOS 테이블은 개발자들의 프로그래밍 스킬 정보를 담은 테이블입니다. DEVELOPER_INFOS 테이블 구조는 다음과 같으며, ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_1, SKILL_2, SKILL_3는 각각 ID, 이름, 성, 이메일, 첫 번째 스킬, 두 번째 스킬, 세 번째 스킬을 의미합니다.

NAMETYPEUNIQUENULLABLE
IDVARCHAR(N)YN
FIRST_NAMEVARCHAR(N)NY
LAST_NAMEVARCHAR(N)NY
EMAILVARCHAR(N)YN
SKILL_1VARCHAR(N)NY
SKILL_2VARCHAR(N)NY
SKILL_3VARCHAR(N)NY

1-1. 문제

DEVELOPER_INFOS 테이블에서 Python 스킬을 가진 개발자의 정보를 조회하려 합니다. Python 스킬을 가진 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.

결과는 ID를 기준으로 오름차순 정렬해 주세요.

예시

예를 들어 DEVELOPER_INFOS 테이블이 다음과 같다면

IDFIRST_NAMELAST_NAMEEMAILSKILL_1SKILL_2SKILL_3
D165JeramiEdwardsjerami_edwards@grepp.coJavaJavaScriptPython
D161CarsenGarzacarsen_garza@grepp.coReact
D164KellyGrantkelly_grant@grepp.coC#
D163LukaCoryluka_cory@grepp.coNode.js
D162CadeCunninghamcade_cunningham@grepp.coVueC++Python

다음과 같이 Python 스킬을 가진 개발자의 정보가 결과에 나와야 합니다.

IDEMAILFIRST_NAMELAST_NAME
D162cade_cunningham@grepp.coCadeCunningham
D165jerami_edwards@grepp.coJeramiEdwards

2. 문제 풀이

문제 풀이 방법이 너무 다양하지만 가장 효율적인 방법은 무엇일지 고민해 보아야 한다.

2.1 가능한 주요 방법들

방식예시 쿼리특징
① OR 조건sql SELECT ID, EMAIL, FIRST_NAME, LAST_NAME FROM DEVELOPER_INFOS WHERE SKILL_1 = 'Python' OR SKILL_2 = 'Python' OR SKILL_3 = 'Python' ORDER BY ID; 가장 일반적이고 효율적
각 컬럼이 인덱스 되어 있다면 인덱스 병합(Index Merge)으로 처리 가능
② IN 조건 (비권장)sql WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3) 🚫 MySQL 등에서는 성능상 OR와 동일하거나 더 느림
③ UNION ALLsql SELECT ID, EMAIL, FIRST_NAME, LAST_NAME FROM DEVELOPER_INFOS WHERE SKILL_1 = 'Python' UNION ALL SELECT ... (SKILL_2)... UNION ALL SELECT ... (SKILL_3)... ORDER BY ID; 🚫 중복 제거 없이 3번 풀스캔함. 효율 낮음.
④ UNPIVOT (테이블 구조 변환)sql SELECT ID, EMAIL, FIRST_NAME, LAST_NAME FROM (SELECT ID, EMAIL, FIRST_NAME, LAST_NAME, SKILL FROM DEVELOPER_INFOS UNPIVOT (SKILL FOR SKILL_COL IN (SKILL_1, SKILL_2, SKILL_3))) AS U WHERE SKILL = 'Python' ORDER BY ID; ✅ 구조적으로 깔끔하지만, UNPIVOT 지원 안 하는 DB(MySQL)에서는 불가.
⑤ JSON / ARRAY 구조 활용sql WHERE JSON_CONTAINS(JSON_ARRAY(SKILL_1, SKILL_2, SKILL_3), '"Python"') ✅ 스키마가 JSON 기반이라면 효율적
🚫 일반 문자열 컬럼에서는 오히려 느림

2.2 효율성 비교 (MySQL 기준)

방법쿼리 속도 (대략적)인덱스 사용주로 쓰이는 환경
OR 조건🔹빠름✅ 가능✅ 일반 RDBMS에서 표준
IN 조건🔸보통❌ 거의 안 됨단순한 경우만
UNION ALL🔸보통~느림스키마 변환 테스트용
UNPIVOT🔸보통Oracle, SQL Server 등에서 구조적 쿼리 작성용
JSON_CONTAINS🔹빠름 (JSON 인덱스 있을 때만)JSON 스키마 기반 DB

결론

가장 효율적인 방법

SELECT
  ID,
  EMAIL,
  FIRST_NAME,
  LAST_NAME
FROM DEVELOPER_INFOS
WHERE
  SKILL_1 = 'Python'
  OR SKILL_2 = 'Python'
  OR SKILL_3 = 'Python'
ORDER BY ID;
profile
Data Analytics Engineer 가 되

0개의 댓글