오늘은 조인(Join
)에 대해 알아보자
JOIN
은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현한다.
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL OUTER JOIN
ON
절과 함께 사용되며,ON
절의 조건을 만족하는 데이터만을 가져온다.첫번째테이블명 INNER JOIN 두번째테이블명 ON 조건
INNER
를 생략하고 JOIN
만 써도 INNER JOIN
으로 인식한다.첫번째테이블명
JOIN 두번째테이블명
ON 조건
ON
절에서는 WHERE
절에서 사용할 수 있는 모든 조건을 사용할 수 있다.Reservation
테이블의 Name
과 Customer
테이블의 Name
이 일치하는 데이터를 가져와서 하나의 테이블로 합쳐라.
SELECT *
FROM Reservation
INNER JOIN Customer
ON Reservation.Name = Customer.Name;
INNER JOIN
의 경우 표준 SQL 방식과는 별도로 MySQL에서만 사용할 수 있는 방법이 존재한다. 아래 코드는 위의 코드와 동일한 실행 결과를 보여준다.SELECT *
FROM Reservation, Customer
WHERE Reservation.Name = Customer.Name;
alias
)을 써서 위의 코드를 더 간략화할 수 있다.SELECT *
FROM Reservation AS r, Customer AS c
WHERE r.Name = c.Name;
첫 번째 테이블을 기준으로, 두 번째 테이블을 조합하는 JOIN이다.
이때 ON
절의 조건을 만족하지 않는 경우에는
NULL
로 표시된다.첫번째테이블명
LEFT JOIN 두번째테이블명
ON 조건
Reservation
테이블의 Name
필드를 기준으로 Customer
테이블의 Name
필드와 일치하는 레코드만을 LEFT JOIN
으로 가져온 후, 그 중에서 ReserveDate
필드의 값이 2016년 02월 01일
이후인 레코드만을 선택하라.
SELECT *
FROM Reservation
LEFT JOIN Customer
ON Reservation.Name = Customer.Name
WHERE ReservationDate > '2016-02-01';
LEFT JOIN과는 반대로, 두 번째 테이블을 기준으로 첫 번째 테이블을 조합하는 JOIN이다.
첫번째테이블이름
LEFT JOIN 두번째테이블이름
ON 조건
Customer
테이블의 Name
필드를 기준으로 Reservation
테이블의 Name
필드와 일치하는 레코드만을 RIGHT JOIN
으로 가져와라.
SELECT *
FROM Reservation
RIGHT JOIN Customer
ON Reservation.Name = Customer.Name;
A, B 테이블을 JOIN할 경우, 조건에 맞지 않은 데이터도 표시하고 싶을 때 OUTER JOIN을 사용한다.
FULL OUTER JOIN
이 없어서, LEFT JOIN
과 RIGHT JOIN
을 UNION
해서 사용한다.OUTER JOIN
은 USING
, ON
조건절을 필수적으로 사용해야 한다.SELECT *
FROM 첫번째테이블명
LEFT JOIN 두번째테이블명
UNION
SELECT *
FROM 첫번째테이블명
RIGHT JOIN 두번째테이블명2
여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용한다.
SELECT 필드이름
FROM 테이블이름
UNION
SELECT 필드이름
FROM 테이블이름
💡 문제마다 추가적으로 필요한 개념들은 따로 정리해보도록 하겠다!
Given the CITY and COUNTRY tables, query the sum of the populations of all cities where the CONTINENT is 'Asia'.
Note: CITY.CountryCode and COUNTRY.Code are matching key columns.
CONTINENT
필드값이 'Asia'
인 모든 도시의 인구의 총합을 쿼리하라.CITY.CountryCode
와 COUNTRY.Code
가 일치한다.SELECT SUM(CITY.POPULATION)
FROM CITY
INNER JOIN COUNTRY
ON CITY.COUNTRYCODE = COUNTRY.CODE
WHERE COUNTRY.CONTINENT = 'Asia';
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.
CONTINENT
필드값이 'Africa'
인 모든 도시의 이름을 쿼리하라.CITY.CountryCode
와 COUNTRY.Code
가 일치한다.SELECT CITY.NAME
FROM CITY
INNER JOIN COUNTRY
ON CITY.COUNTRYCODE = COUNTRY.CODE
WHERE COUNTRY.CONTINENT = 'Africa';
Given the CITY and COUNTRY tables, query the names of all the continents (COUNTRY.Continent) and their respective average city populations (CITY.Population) rounded down to the nearest integer.
Note: CITY.CountryCode and COUNTRY.Code are matching key columns.
COUNTRY.Continent
)과 각각의 평균 도시 인구(CITY.Population
)을 가장 가까운 정수로 내림하여 쿼리하라.CITY.CountryCode
와 COUNTRY.Code
가 일치한다.SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION))
FROM CITY
INNER JOIN COUNTRY
ON CITY.COUNTRYCODE = COUNTRY.CODE
GROUP BY COUNTRY.CONTINENT;