1. JOIN이란?
- JOIN 연산은 다른 테이블을 가지고 와서 열을 늘리는 집합 연산입니다.
- JOIN 연산은 원하는 데이터가 하나의 테이블이 아닌 복수의 테이블에 분산되어 있는 데이터를 선택할 수 있게 해줍니다.
2. JOIN의 종류
- (INNER) JOIN: 두 테이블에 일치하는 값이 있는 레코드를 반환합니다.
- LEFT (OUTER) JOIN: 왼쪽 테이블에서 모든 레코드를 반환하고 오른쪽 테이블에서 일치하는 레코드를 반환합니다.
- RIGHT (OUTER) JOIN: 오른쪽 테이블에서 모든 레코드를 반환하고 왼쪽 테이블에서 일치하는 레코드를 반환합니다.
- FULL (OUTER) JOIN: 왼쪽 또는 오른쪽 테이블에 일치 항목이 있을 때 모든 레코드를 반환합니다.
3. 내부결합(INNER JOIN) 연산 사용법
- JOIN을 사용하기 위해서 두 가지 결합 포인트를 지정해 주어야 합니다.
3-1. 결합 지점 1. FROM
FROM 다음에 결합 하고자 하는 테이블들을 지정해야합니다. 두 테이블을 내부결합할 것이기 때문에 INNER JOIN
을 씁니다.
FROM CITY INNER JOIN COUNTRY
필수는 아니지만 AS
로 테이블의 별명을 지정하기도 합니다.
FROM CITY AS CI INNER JOIN COUNTRY AS CR
3-2. 결합 지점 2. ON
두 개의 테이블을 연결할 열(결합 키)를 지정합니다.
ON CITY.COUNTRYCODE = COUNTRY.CODE
3-3. SQL 연습문제 1
- HackerRank. Asian Population 문제를 보겠습니다.
- CONTINENT가 Asia인 COUNTRY의 POPULATION 합을 구해야합니다.
- 문제의 Note에 CITY.CountryCode와 COUNTRY.Code가 매칭 Key라고 합니다.
- 즉, CITY.CountryCode에 속하는 열을 다리로 사용해서 COUNTRY.Code 열을 하나의 결과에 포함시키는 것입니다.
- 이렇게 두 개의 테이블을 결합할 수 있습니다. 결합한 테이블에서 CONTINENT가 Asia인 조건을 주어야 합니다. 이는
WHERE
다음에 조건을 작성하면 됩니다.
SELECT
SUM(CITY.POPULATION)
FROM
CITY INNER JOIN COUNTRY
ON
CITY.COUNTRYCODE = COUNTRY.CODE
WHERE
COUNTRY.CONTINENT = 'Asia';
- 주의! ON은 FROM과 WHERE 사이에 작성해야 합니다.
3-4. SQL 연습문제 2
- 프로그래머스. 있었는데요 없었습니다 문제를 보겠습니다.
- 문제 요약을 하면 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해야합니다. 또한 보호 시작일이 빠른 순으로 조회해야합니다.
- 문제에 ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키라고 합니다. ANIMAL_ID를 이용해서 INNER JOIN 하면 됩니다.
SELECT
ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM
ANIMAL_OUTS INNER JOIN ANIMAL_INS
ON
ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE
ANIMAL_OUTS.DATETIME < ANIMAL_INS.DATETIME
ORDER BY
ANIMAL_INS.DATETIME ASC
- FROM 구에서 ANIMAL_OUTS와 ANIMAL_INS를 INNER JOIN할 것이라고 표현했습니다.
- ON 구에서 ANIMAL_ID를 이용하여 두 테이블을 결합합니다.
- WHERE구 DATETIME은 부등호를 이용해서 대소 관계를 비교하면 됩니다.
- ORDER BY를 이용해서 DATETIME을 정렬하면 됩니다. ASC를 쓰지 않더라도 오름차순으로 정렬되지만, 저는 혼돈을 막기 위해서 ASC라고 표현하는 편입니다.
4. 왼쪽 결합(LEFT JOIN) 연산 문제
- 프로그래머스. 없어진 기록 찾기 문제를 보겠습니다.
- 본 문제에서 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해야 합니다.
- 문제에 ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키라고 합니다. ANIMAL_ID를 이용해서 INNER JOIN 하면 됩니다.
- ANIMAL_OUTS에 기록은 있지만, ANIMAL_INS 기록이 없는 동물을 찾으려고 합니다.
- ANIMAL_OUTS을 기준으로 JOIN 하려고 합니다.
SELECT
ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME, ANIMAL_INS.ANIMAL_ID
FROM
ANIMAL_OUTS LEFT JOIN ANIMAL_INS
ON
ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
- JOIN 하듯이 ON에 두 테이블을 연결할 조건을 작성하여 LEFT JOIN을 하면 위와 같이 결과가 나옵니다.
- ANIMAL_ID에 NULL 값이 있는 열도 불려와 지는 것을 볼 수 있습니다.
- LEFT(RIGHT) JOIN을 하면 필수적으로 WHERE절에서 ANIMAL_INS.ANIMAL_ID IS NULL 이렇게 NULL 조건을 지정해 주어야 합니다.
SELECT
ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM
ANIMAL_OUTS LEFT JOIN ANIMAL_INS
ON
ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE
ANIMAL_INS.ANIMAL_ID IS NULL
출처
'Covenant LAB 강의 > 용감한 강의' 카테고리의 다른 글
JPA 기본편 스터디 강의자료 (8) | 2021.08.14 |
---|---|
11번가 스프링 & 오브젝트 스터디 강의자료 (3) | 2021.06.16 |
🏁 거침없는 코딩테스트 DFS BFS 문제 추천 (24) | 2020.04.05 |
🔥 용감하게 시작하는 코딩테스트 3편 (6) | 2020.03.29 |
🔥 용감하게 시작하는 코딩테스트 2편 (9) | 2020.03.28 |