문제
MYSQL
내가 작성한 정답
SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS D
JOIN SKILLCODES S ON D.SKILL_CODE & S.CODE != 0
WHERE S.CATEGORY = 'Front End'
ORDER BY ID ASC;
ON D.SKILL_CODE & S.CODE != 0
DEVELOPERS 테이블에 SKILL_CODE과
SKILLCODES 테이블의 CODE를 비교해서,
두 코드가 겹치는 비트를 가지고 있는지 확인하여 겹치는 비트를 가진 해당 개발자는 그 기술을 가지고 있다고 판단
→ 한 사람이 여러 기술을 가지면 여러 개의 row로 출력된다.
→ front end 기술을 여러 개 가지고 있다면 여러 개의 row로 출력될 수 있으므로 distinct 필요

EXIST이용한 다른 방법
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS D
WHERE EXISTS (
SELECT 1
FROM SKILLCODES S
WHERE S.CATEGORY = 'Front End'
AND (D.SKILL_CODE & S.CODE) != 0
)
ORDER BY ID ASC;
카테고리가 Front End'이고
DEVELOPERS 테이블에서 SKILL_CODE와
DEVELOPERS 테이블의 CODE를 비교하여
겹치는 비트를 가지면 true를 반환하여 이 조건을 만족하면 결과에 출력된다.
SELECT 1: 서브쿼리에서 SELECT 1을 사용하는 이유는, 실제로 어떤 데이터를 선택하는지가 중요하지 않고 결과의 행 수만 확인하므로, 어떤 값을 선택하든 상관없이 1을 선택하는 것이 일반적이다.
예를 들어, SELECT *를 사용하면 모든 열의 데이터를 가져오지만, EXISTS에서는 데이터의 내용이 필요 없고, 단순히 "결과가 존재하는가?"만 확인하면된다. 그러므로 SELECT 1을 사용하는 것이 더 간단하고 효율적이다.
EXISTS
서브쿼리의 결과가 하나 이상의 행을 반환하는지를 확인.
서브쿼리가 결과를 반환하면 TRUE, 그렇지 않으면 FALSE를 반환하여 주로 특정 조건을 만족하는 데이터가 존재하는지를 체크할 때 사용된다.
EXISTS는 상위 쿼리의 컬럼을 참조할 수 있다.
Share article