본문 바로가기

SQL - Mysql & Oracle

SQL - 실전 문제 풀이(Basic & Advanced Join) - 난이도 하

반응형

이번에는 SQL JOIN 개념을 알아보고, 실전 코딩테스트 문제를 풀어보면서 실습까지 해보는 포스팅입니다. 

 

 

1. SQL에서 Table 간 병합의 기본 원리

 

SQL에서 TABLE 간 병합할 때 기억해야 할 것은 '병합 기준'과 '병합 방법'입니다. 

 

1-1. 병합의 기준. Parent Key와 Foreigen Key

 

Parent Key(PK)는 제가 데이터를 원래 조회하고자 하는 Table에서 하나의 Column이라고 생각하시면 됩니다. 즉 PK를 하나의 기준으로 잡고 다른 Table과 연결하는 것입니다. 

 

Foreign Key(FK)는 병합하고자 하는 데이터 테이블에서 하나의 column을 선정하는 것입니다. 

 

가장 중요한 것은 PK와 FK는 동일한 데이터 성질을 가지고 있어야 한다는 점입니다. 즉 Column 간 연결 지점이기 때문에 데이터 간 공유되어 있는 성질이 있어야, 연결을 할 수 있다는 뜻이죠. 이해를 위해서 아래의 그림을 보겠습니다. 

 

이 예시는 기본 환율 정보를 가지고 있는 Table과 회사 내 매출 정보를 가지고 있는 Table입니다. 이들 간의 데이터를 연결할 때 무작정할 수 없겠죠??

 

그래서 Currency Rate를 기준 Table로 삼았고, PK를 Currency Rate ID로 잡았습니다. 즉 이 환율이 원/달러 환율인지, 원/엔 환율인지 표시해주는 것이죠. 

 

병합하고자 하는 테이블에서도 동일한 성질의 데이터 Column이 있습니다. 친절하게도 Column이름까지 같네요. 보통 회사에서는 column 이름을 동일하게 설정하지만, 극악무도한 코딩 테스트의 세계에서는 그딴거 없습니다. 

 

PK와 FK의 예시 - URL참조(Essential SQL)

 

그러면 기준 Table의 PK는 Currency Rate ID가 되겠고, 병합 대상 Table의 FK는 Currency Rate ID가 되겠네요.

 

그럼 코드에서 이 조건을 어떻게 설정하는가를 알아야겠죠?? 가장 간단한 방법은 Join문에서 바로 넣어주는 것입니다. 

 

자세한 문법은 실전 문제 풀이에서 다루기로 하겠습니다. 

 

 

1 - 2. 병합의 방법. Join - (Inner Join, Left Outer Join, Right Outer Join)

 

병합할 때는 예전에 배운 집합의 개념을 생각하시면 이해가 빠르실 것 같아요. 

 

(1) Inner Join - 교집합

 

Inner Join - 교집합

즉 '두 테이블에 동시에 있는 데이터만 가져와라'라는 명령어입니다. 

 

(2) Left Outer Join 

 

Left Outer Join

Left Outer Join은 보시다 시피, 오직 왼쪽 Table에 해당하는 것만 가져오라는 방법입니다. 

 

(3) Right Outer Join 

 

 

Right Outer Join

 

Right Outer Join은 오른쪽 테이블에 있는 데이터들 + 교집합에 해당하는 애들만 가져와라 라는 명령어입니다. 

 

 

 

그래서 '병합 기준'과 '병합 방법'만 알았다면, 이제 모든 코드를 풀 수 있는 준비가 되었습니다. 물론 심화 문제는 Join만 문제로 걸지 않기 때문에 더 알아야겠지만, 오늘 만나볼 문제에서는 이 것들만 알면 될 것 같습니다. 

 

 

 

2. Hacker Rank 실전 문제 풀이

 

그럼 거두 절미하고 문제 상황으로 들어가겠습니다. 

 

 

문제 링크 - African Cities

 

 

Given the CITY and COUNTRY tables, query the names of all cities where the CONTINENT is 'Africa'.

Note: CITY.CountryCode and COUNTRY.Code are matching key columns.

Input Format

The CITY and COUNTRY tables are described as follows: 

 

문제의 요는 아프리카 대륙에 있는 city(도시)이름만 뽑아 달라는 것입니다. 

 

1-1. 병합 기준

 

우선 기준 Table은 City로 두겠습니다. 이때 City Table과 Country Table에서 어떠한 데이터 Column을 공유하는지 파악하는게 가장 우선순위가 될 것입니다. 

 

City Table에서의 Country Code가 Country Table에서도 보이네요. 약간 문제가 졸렬하긴 한데, 동일한 이름은 아니지만 Country Table에서도 'Code'라는 Column이 존재합니다. 두 Column도 모두 VARCHAR2이고, 저장 되어 있는 데이터의 종류가 3개인 것을 보니 '동일한 성질의 데이터'라고 판단됩니다. 무엇보다 이름이 너무 직관적이죠.... CountryCode나 Country Table의 Code나. 그러나 이렇게 판단하는거는 옳바른 문제 풀이라 생각되지 않기에, 데이터 성질을 보는 것이 훨씬 중요하다고 생각됩니다. 

 

 

1-2. 병합 방법. Inner Join 

 

여기에서는 오직 아프리카의 도시 이름만 불러와야 하기에 굳이 Outer Join을 쓸 필요가 없습니다. 왜냐하면 City Table 안에서 이미 Africa 이외의 다른 도시의 이름도 있기 때문이죠. 그래서 Inner Join 방법을 쓸 것 같습니다. 

 

정답 코드는 아래와 같아요. 

1
2
3
4
select c1.NAME
from city as c1
inner join country as c2 on c1.COUNTRYCODE = c2.CODE
where c2.CONTINENT = 'Africa';
cs

 

기본 문법은  [Join 병합할 테이블 (AS) 단축이름 ON 기준테이블.Column = 병합대상테이블.Column] 순으로 작성해주시면 됩니다. 

 

이때 where이라는 조건문에서 오직 아프리카에 있는 아이들만 데려와 달라고 명령어를 입력해주면 쉽게 문제를 풀 수 있습니다. 

 

결과를 보시죠. 

 

 

문제풀이 결과

 

 

네 역시 성공적으로 문제가 풀렸네요. 여러분도 이렇게 한 번 시도해보시기 바랍니다. 

 

 

참고로 웹사이트 내에서 해답 보면 포인트가 쌓이지 않으니 조심하시고, 되도록이면 제 블로그에서 해답 복붙해서 실험해보세요. 아니면 아까운 포인트만 날라가요.

 

 

긴 글 읽어보시느라 고생하셨어요. 항상 정독하시지 마시고, 필요한 부분만 읽고 배껴가세요. 우리 모두 Stack Over Flow에서 다 그러잖아요. 효율적으로 ㅋㅋㅋ

 

그럼 다음에 더 좋은 풀이로 돌아오겠습니다!!

반응형