꿈은 데이터분석가, 취미는 계획

[MY SQL] 2개 테이블로 조건에 맞는 사람 찾기 본문

SQL/sql문풀

[MY SQL] 2개 테이블로 조건에 맞는 사람 찾기

data_2080 2024. 4. 6. 14:27
728x90

출처: [프로그래머스 스쿨 - 코딩테스트 연습 - 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
728x90