[SQL] 언어별 개발자 분류하기(GROUP BY)

Jaewon Lim·2025년 1월 17일

📝 문제 설명

SKILLCODES 테이블은 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 테이블입니다. SKILLCODES 테이블의 구조는 다음과 같으며, NAME, CATEGORY, CODE는 각각 스킬의 이름, 스킬의 범주, 스킬의 코드를 의미합니다. 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.

Column NameTypeUniqueNullable
NAMEVARCHAR(N)YESNO
CATEGORYVARCHAR(N)NONO
CODEINTEGERYESNO

DEVELOPERS 테이블은 개발자들의 프로그래밍 스킬 정보를 담은 테이블입니다. DEVELOPERS 테이블의 구조는 다음과 같으며, ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_CODE는 각각 개발자의 ID, 이름, 성, 이메일, 스킬 코드를 의미합니다. SKILL_CODE 컬럼은 INTEGER 타입이고, 2진수로 표현했을 때 각 bit는 SKILLCODES 테이블의 코드를 의미합니다.

Column NameTypeUniqueNullable
IDVARCHAR(N)YESNO
FIRST_NAMEVARCHAR(N)NOYES
LAST_NAMEVARCHAR(N)NOYES
EMAILVARCHAR(N)YESNO
SKILL_CODEINTEGERNONO

예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.

❓ 문제

DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.

  • A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
  • B : C# 스킬을 가진 개발자
  • C : 그 외의 Front End 개발자

GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.

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

📖 예시

예를 들어 SKILLCODES 테이블이 다음과 같고,

NAMECATEGORYCODE
C++Back End4
JavaScriptFront End16
JavaBack End128
PythonBack End256
C#Back End1024
ReactFront End2048
VueFront End8192
Node.jsBack End16384

DEVELOPERS 테이블이 다음과 같다면

IDFIRST_NAMELAST_NAMEEMAILSKILL_CODE
D165JeramiEdwardsjerami_edwards@grepp.co400
D161CarsenGarzacarsen_garza@grepp.co2048
D164KellyGrantkelly_grant@grepp.co1024
D163LukaCoryluka_cory@grepp.co16384
D162CadeCunninghamcade_cunningham@grepp.co8452

다음과 같이 DEVELOPERS 테이블에 포함된 개발자들의 GRADE 및 정보가 결과에 나와야 합니다.

GRADEIDEMAIL
AD162cade_cunningham@grepp.co
AD165jerami_edwards@grepp.co
BD164kelly_grant@grepp.co
CD161carsen_garza@grepp.co

💻 코드

내코드

정답코드

🔍 분석

  1. BIT 연산 (GROUP BY와 함께 많이 쓰임)

    비트(bit)단위로 논리 연산을 할 때 사용하는 연산자.
    ex) C++(4) / JavaScript(16) / Java(128) / Python(256)

A = 20(C++, JavaScript)
B = 132(C++, Java)
C = 272(JavaScript, Python)
D = 384(Java, Python)

CASE 1) C++, Java 개발자를 찾을 때
C++(4) + Java(128) = 132
A = 20 & 132 = 0001 0100 & 1000 0100 = 00000100(4)
B = 132 & 132 = 1000 0100 & 1000 0100 = 1000 0100(132)
C = 272 & 132 = 1 0001 0000 & 1000 0100 = 0 0000 0000(0)
D = 384 & 132 = 1 1000 0000 & 1000 0100 = 0 1000 0000(128)
SOL) C++ 혹은 Java 하나라도 가진 개발자는 0보다 큰 정수 값이 나온다.

CASE 2) Python 개발자를 찾을 때
A = 20 & 256 = 0001 0100 & 1 0000 0000 = 0000 0000(0)
B = 132 & 256 = 1000 0100 & 1 0000 0000 = 0000 0000(0)
C = 272 & 256 = 1 0001 0000 & 1 0000 0000 = 1 0000 0000(256)
D = 384 & 256 = 1 1000 0000 & 1 0000 0000 = 1 0000 0000(256)

SOL) Python을 하는 개발자는 0보다 큰 정수 값이 나온다.

0개의 댓글