DATA101
[SQLite] JOIN#1(INNER JOIN): 두 테이블의 교집합 출력하기! 본문
안녕하세요, 오늘은 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 JOIN에는 여러 종류가 있으며 크게는 아래와 같이 4가지로 구분할 수 있습니다.
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
오늘은 위 4가지 중 첫 번째로 INNER JOIN에 대해 알아보고자 합니다.
INNER JOIN 이란?
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 해야 합니다.
코드 예시
-- #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 칼럼 데이터를 띄어쓰기 한 칸을 사이로 병합하였습니다(병합 방법은 아래 포스팅 참고).
[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 구문의 자세한 내용은 아래 포스팅을 참고해 주세요.
[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 칼럼 데이터를 병합하였습니다.
- 칼럼 병합 방법은 아래 포스팅을 참고해 주세요 :)
[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 구문의 자세한 내용은 아래 포스팅을 참고해 주세요.
[SQL] WHERE: 특정 조건에 해당하는 값만 출력하기!
안녕하세요, 오늘은 WHERE 구문을 활용하여 조건문을 만드는 방법을 공유해 드립니다. 바로 시작하죠! WHERE: 특정 조건을 가진 데이터 선별 이번 시간에 사용할 테이블(Salaries)은 미국 야구 메이저
heytech.tistory.com
5) GROUP BY
- 팀별 최고액 연봉을 받고 있는 출력하기 위해 데이터를 팀별로 그룹화해 줍니다.
- GROUP BY 구문의 자세한 내용은 아래 포스팅을 참고해 주세요 :D
[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): 두 테이블 데이터 모두 출력하기!
포스팅 내용에 오류가 있다면 댓글 남겨주시면 감사드리겠습니다.
그럼 오늘도 건강한 하루 보내시길 바랍니다.
고맙습니다 :)
'AI & 빅데이터 > SQLite' 카테고리의 다른 글
[SQLite] JOIN#3(FULL OUTER JOIN): 두 테이블 데이터 모두 출력하기! (0) | 2021.02.19 |
---|---|
[SQLite] JOIN#2(LEFT/RIGHT JOIN): 교집합+ 좌/우 테이블 출력하기! (0) | 2021.02.18 |
[SQLite] GROUP BY: 데이터를 그룹화하기! (Feat. HAVING) (0) | 2021.02.11 |
[SQLite] DINTINCT: 중복을 제외한 데이터 찾기! (0) | 2021.02.10 |
[SQLite] 서로 다른 칼럼의 데이터 병합하기! (0) | 2021.02.09 |