DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요. 결과는 ID를 기준으로 오름차순 정렬해 주세요.
# 풀이1 - 조인 후 조건을 걸어줌
SELECT DISTINCT(D.ID), D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D JOIN SKILLCODES AS S
ON D.SKILL_CODE & S.CODE
WHERE S.NAME IN ('PYTHON', 'C#')
ORDER BY D.ID;
# 풀이2 - where문에서 조건을 걸어줌
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT SUM(CODE)
FROM SKILLCODES
WHERE NAME IN ('Python', 'C#'))
ORDER BY ID;
# 풀이3 - 조건을 걸어준 쿼리를 조인함
SELECT DISTINCT(D.ID), D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D JOIN (SELECT CODE
FROM SKILLCODES
WHERE NAME IN ('PYTHON','C#')) AS S
ON D.SKILL_CODE & S.CODE
ORDER BY D.ID
처음 이 문제를 접했을 때, code컬럼을 이진수로 변환하려는 시도를 했었다. 이후 &연산을 사용한 비트연산으로 문제를 풀어야 된다는 사실을 알게 되었고, 위와 같이 3가지 풀이법을 사용해 해결했다.
여기서 주의할 점은 풀이2에서는 Python과 C#에 해당하는 코드를 이미 합쳐주었기 때문에 하나의 값으로 결과가 나온다. 하지만 풀이1과 풀이3은 WHERE문에서 Python과 C#에 해당하는 튜플이 두 줄로 나온다. 따라서 JOIN 후에 같은 행이 중복으로 나타나는 걸 방지하기 위해(개발자가 Python과 C#스킬을 모두 가지는 경우) SELECT문에서 DISTINCT를 사용해주어야 한다.
추가적으로, 문제를 풀면서 JOIN의 ON절에 꼭 = 연산자뿐만 아니라 다양한 비교연산자(>,<,<=,>=), BETWEEN, LIKE, IN등 여러 연산자가 사용가능하다는 사실을 알게 되었다.