[MY SQL] 2개 테이블로 조건에 맞는 사람 찾기
출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] : 조건에 맞는 개발자 찾기
링크: https://school.programmers.co.kr/learn/courses/30/lessons/276034
문제(일부): 테이블에서 Python 이나 C# 스킬을 가진 개발자의 정보 조회
*SKILLCODES테이블에 스킬 이름이 있음, CODE는 십진수로 표현
DEVELOPERS테이블에는 개발자 정보 있음, SKILL_CODE는 십진수 값을 더한 것
ex) SKILL_CODE가 8452 = 8192 + 256 +4 로 Vue, Python, Cpp 스킬을 보유
0_1. &연산자 이해하기
비트 단위의 AND연산을 수행하는 연산자
각 비트에 대해 둘 다 1일 때만 결과가 1이 됨, 그 외에는 0이 됨
ex) 5와 3에 &연산자 사용
a = 5 (이진수: 0101)
b = 3 (이진수: 0011)
0101
& 0011
=> 0001 (결과)
0_2. OR와 IN의 차이 이해하기
OR와 IN모두 작성한 피연산자 중 값이 1개라도 있으면 출력
OR 연산자는 각각의 조건을 독립적으로 평가하여 조건을 충족하는 모든 레코드를 출력,
IN 연산자는 주어진 값들 중 하나만 충족해도 해당 레코드를 출력
ex) NAME과 COL (종류1, 1), (종류2,3) 피연산자로 1,3을 둔 경우
IN => 종류1,1 만 출력
OR => (종류1,1) , (종류2,3) 출력
1. FROM 테이블2개를 WHERE로 필터링
2개 기술 모두 보유한 경우 ID가 중복되므로 DISTINCT처리
SELECT DISTINCT D.ID
, D.EMAIL
, D.FIRST_NAME
, D.LAST_NAME
FROM DEVELOPERS D, SKILLCODES S
WHERE
(D.SKILL_CODE & S.CODE) != 0
AND S.NAME IN ("Python", "C#")
ORDER BY D.ID
2. 보유기술 필터링을 서브쿼리로 진행
SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D
WHERE EXISTS (
SELECT 1
FROM SKILLCODES AS S
WHERE (S.NAME = 'Python' OR S.NAME ='C#')
AND (D.SKILL_CODE & S.CODE) != 0
)
ORDER BY D.ID
3. JOIN 조건과 WHERE조건절로 필터링
SELECT DISTINCT D.ID
, D.EMAIL
, D.FIRST_NAME
, D.LAST_NAME
FROM DEVELOPERS AS D
INNER JOIN SKILLCODES AS S
ON (D.SKILL_CODE & S.CODE) != 0
WHERE S.NAME IN ('Python','C#')
ORDER BY D.ID