Recent Posts
Recent Comments
Archives
반응형
250x250
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Yesterday

Total
05-05 03:02
관리 메뉴

Hey Tech

[SQLite] JOIN#1(INNER JOIN): 두 테이블의 교집합 출력하기! 본문

AI & 빅데이터/SQLite

[SQLite] JOIN#1(INNER JOIN): 두 테이블의 교집합 출력하기!

Tony Park 2021. 2. 12. 09:37
728x90
반응형

안녕하세요, 오늘은 SQL에서 테이블 간의 교집합인 데이터만 출력해 주는 INNER JOIN 기능에 대해 소개해 드립니다.

이번 포스팅에서도 SQLite Studio를 기반으로 연습용 데이터셋을 활용하여 설명해 드리고자 합니다.

SQLite Studio 및 연습용 데이터셋 설치는 아래 포스팅을 참고해 주세요.

heytech.tistory.com/11?category=453619

 

[SQL] SQLite 및 연습용 데이터셋 설치하기!

오늘부터 SQLite 데이터베이스를 활용하여 SQL의 기본적인 문법을 빠르고 쉽게 전달해 드립니다. 바로 시작하죠! 목차 1. SQLite란? 2. SQLite 설치 3. SQLite Studio 설치 4. 연습용 DB 설치: Baseball Databank..

heytech.tistory.com

그럼 바로 시작하죠!

JOIN 기능이란?

JOIN은 하나의 데이터베이스 내의 여러 테이블의 데이터를 조합하여 하나의 칼럼으로 표현해 주는 기능을 말합니다.

아래 예제를 통해 더욱 직관적으로 이해하실 수 있도록 설명하겠습니다.

JOIN 종류

 

그림 1. SQL JOINS (출처: https://commons.wikimedia.org/wiki/File:SQL_Joins.svg)

위의 그림1 에서 보실 수 있듯이 SQL JOIN에는 여러 종류가 있으며 크게는 아래와 같이 4가지로 구분할 수 있습니다.

 

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN

오늘은 위 4가지 중 첫 번째로 INNER JOIN에 대해 알아보고자 합니다.

INNER JOIN 이란?

그림 2. INNER JOIN 도식화 (출처: https://commons.wikimedia.org/wiki/File:SQL_Joins.svg)

INNER JOIN그림 1 에서 중앙 상단에 해당하는 기능으로서 두 테이블의 교집합(공통 칼럼)만 출력합니다.

예시 문제 1

이제 아래와 같은 문제가 주어졌다고 가정해보죠.

 

Q1.  주어진 연습용 데이터셋을 통해 선수 이름별 연봉정보를 하나의 테이블로 출력하시오. 첫 번째 칼럼은 선수 이름 정보를, 두 번째 칼럼은 선수별 연봉을 출력하시오. 단, 선수 이름은 First name과 Last name을 조합한 Full name으로 출력할 것.

문제를 풀기에 앞서 연습용 데이터셋 내 테이블을 살펴보죠.

선수 이름(First/Last Name)People 테이블 (see Table 1 )에 playerID 별로 주어져 있으며,

연봉정보(salary) 역시 Salaries 테이블 (see Table 2 )에 playerID 별로 주어져 있습니다.

따라서 하나의 테이블 형태로 선수이름별 연봉정보를 출력하기 위해서는 두 테이블의 교집합playerID 를 기준으로 JOIN 해야 합니다.

 

Table 1. People 테이블
Table 2. Salaries 테이블

코드 예시

-- #1 INNER JOIN: t1과 t2의 교집합 출력
    SELECT
    	-- 선수별 Full Name 설정 후 출력
        t1.nameFirst || ' ' || t1.nameLast AS FullName,
        -- 연봉정보 출력
        t2.salary
        
    -- t1: 선수 신상 정보를 담은 테이블
    FROM
        People t1
    
    -- t2: 선수 연봉 정보를 담은 테이블
	INNER JOIN
    	Salaries t2
        -- 두 테이블에서 playerID가 일치하는 경우에만 데이터 출력
     	ON t1.playerID = t2.playerID
        
    -- 연봉이 높은 순으로 나열
    ORDER BY 
        salary DESC
        
    -- 상위 20개의 데이터만 출력 
    LIMIT 20;

위 전략을 바탕으로 소스코드를 작성해 보겠습니다.

먼저 People 테이블을 t1으로, Salaries 테이블을 t2로 치환하였으며 각 구문별 설명은 다음과 같습니다.

 

1) SELECT

- 출력할 선수 이름 및 연봉정보를 각각 입력하였습니다.

- 선수 이름은 Full Name으로 출력하기 위해 First name과 Last name을 nameFirst 및 nameLast 칼럼 데이터를 띄어쓰기 한 칸을 사이로 병합하였습니다(병합 방법은 아래 포스팅 참고).

heytech.tistory.com/28

 

[SQL] 서로 다른 칼럼의 데이터 병합하기!

안녕하세요, 오늘은 서로 다른 칼럼의 데이터를 병합하는 방법에 대해 공유해 드립니다. 이번 포스팅에서도 SQLite 및 연습용 데이터셋(MLB 선수 정보)을 기반으로 설명해 드립니다. SQLite 및 연습

heytech.tistory.com

2) FROM

- People 테이블(t1)을 기준 테이블로 설정하였습니다.

 

3) INNER JOIN

- Salaries 테이블(t2)을 t1에 INNER JOIN 할 것을 지정합니다(*참고: INNER 표기 생략 가능).

- ON 키워드를 통해 어떤 공통 칼럼을 기준으로 JOIN 할 것인지 지정합니다.

 

4) ORDER BY

- 연봉이 높은 순으로 테이블을 정렬합니다.

- ORDER BY 구문의 자세한 내용은 아래 포스팅을 참고해 주세요.

heytech.tistory.com/22

 

[SQL] ORDER BY: 데이터 정렬하기(내림차순/오름차순)

안녕하세요, 지난 시간에는 SELECT 구문을 통해 데이터를 출력하는 방법에 대해 다루어 보았습니다. heytech.tistory.com/12 [SQL] SELECT: 데이터 출력하기! (Feat. LIMIT) 안녕하세요, 오늘부터 SQLite Studio..

heytech.tistory.com

5) LIMIT

- 상위 20개의 데이터만 출력할 것을 지정합니다.

출력 결과

위와 같이 선수 Full Name별로 연봉정보가 출력된 것을 확인하실 수 있습니다.

예시 문제 2

Q2. 2016년에 팀별로 최대 연봉을 받고 있는 선수의 이름과 연봉을 한 테이블로 출력하시오. 첫 번째 칼럼은 팀 이름을, 두 번째 칼럼은 선수의 Full Name을, 세 번째 칼럼은 선수 연봉 액수를 출력하시오.

앞서 살펴본 예시와 마찬가지로,

선수 이름(First/Last Name) People 테이블 (see Table 1 )에 playerID 별로 주어져 있으며,

연봉정보(salary) 역시 Salaries 테이블 (see Table 2 )에 playerID 별로 주어져 있습니다.

따라서 하나의 테이블 형태로 선수 이름별 연봉정보를 출력하기 위해서는 두 테이블의 교집합 playerID 를 기준으로 JOIN 해야 합니다.

  /*
      1st column: 팀 이름
      2nd column: 선수 이름(Full Name)
      3rdcolumn: 연봉 정보
  */
  SELECT
      t1.teamID AS teamName,
      t2.nameFirst || ' ' || t2.nameLast AS PlayerFullName,
      MAX(salary)

  -- People 테이블을 t1으로 치환
  FROM
      People t1

  -- Salaries 테이블을 t2로 치환
  -- playerID 칼럼을 기준으로 INNER JOIN
  INNER JOIN
      Salaries t2 ON t1.playerID = t2.playerID

  -- 2016년 연도 조건 설정
  WHERE
      t1.yearID = 2016

  -- 소속 팀별로 데이터를 그룹화
  GROUP BY 
      t1.teamID;

위 전략을 바탕으로 소스코드를 작성해 보겠습니다.

먼저 People 테이블을 t1으로, Salaries 테이블을 t2로 치환하였으며 각 구문별 설명은 다음과 같습니다.

 

1) SELECT

- 출력할 선수 이름 및 연봉정보를 각각 입력하였습니다.

- 선수 이름은 Full Name으로 출력하기 위해 nameFirst 및 nameLast 칼럼 데이터를 병합하였습니다.

- 칼럼 병합 방법은 아래 포스팅을 참고해 주세요 :)

heytech.tistory.com/28

 

[SQL] 서로 다른 칼럼의 데이터 병합하기!

안녕하세요, 오늘은 서로 다른 칼럼의 데이터를 병합하는 방법에 대해 공유해 드립니다. 이번 포스팅에서도 SQLite 및 연습용 데이터셋(MLB 선수 정보)을 기반으로 설명해 드립니다. SQLite 및 연습

heytech.tistory.com

2) FROM

- People 테이블(t1)을 기준 테이블로 설정하였습니다.

 

3) INNER JOIN

- Salaries 테이블(t2)을 t1에 INNER JOIN 할 것을 지정합니다(*참고: INNER 표기 생략 가능).

- ON 키워드를 통해 어떤 공통 칼럼을 기준으로 JOIN 할 것인지 지정합니다.

 

4) WHERE

- 연도 조건으로서 2016년을 지정합니다.

- WHERE 구문의 자세한 내용은 아래 포스팅을 참고해 주세요.

heytech.tistory.com/23

 

[SQL] WHERE: 특정 조건에 해당하는 값만 출력하기!

안녕하세요, 오늘은 WHERE 구문을 활용하여 조건문을 만드는 방법을 공유해 드립니다. 바로 시작하죠! WHERE: 특정 조건을 가진 데이터 선별 이번 시간에 사용할 테이블(Salaries)은 미국 야구 메이저

heytech.tistory.com

5) GROUP BY

- 팀별 최고액 연봉을 받고 있는 출력하기 위해 데이터를 팀별로 그룹화해 줍니다.

- GROUP BY 구문의 자세한 내용은 아래 포스팅을 참고해 주세요 :D

heytech.tistory.com/30

 

[SQL] GROUP BY: 데이터를 그룹화하기! (Feat. HAVING)

안녕하세요, 오늘은 GROUP BY 구문을 통해 데이터를 그룹화하는 방법에 대해 공유해 드립니다. 바로 시작하죠! GROUP BY는 언제 쓸까? 이전 포스팅에서 서로 다른 두 칼럼을 병합하는 방법에 대해 다

heytech.tistory.com

마치며...

오늘은 SQL JOIN 구문 중 두 테이블 간의 교집합을 출력하는 INNER JOIN에 대해 다루어 보았습니다.

다음 포스팅에서는 LEFT/RIGHT JOIN에 대해 다루도록 하겠습니다.

참고할 만한 포스팅

1.  [SQL] JOIN#1(INNER JOIN): 두 테이블의 교집합 출력하기!
2.  [SQL] JOIN#2(LEFT/RIGHT JOIN): 교집합+ 좌/우 테이블 출력하기!
3.  [SQL] JOIN#3(FULL OUTER JOIN): 두 테이블 데이터 모두 출력하기!

포스팅 내용에 오류가 있다면 댓글 남겨주시면 감사드리겠습니다.

그럼 오늘도 건강한 하루 보내시길 바랍니다.

고맙습니다 :)

 

728x90
반응형
Comments