[SQL] HackerRank - Basic Join
[ MySQL 구문 ]
오늘은 조인(Join
)에 대해 알아보자
JOIN
은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현한다.
- JOIN은 보통 SELECT 문과 함께 자주 사용된다.
- JOIN은 다음 4가지로 구분된다.
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL OUTER JOIN
1. INNER 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;
2. LEFT JOIN (부분집합)
첫 번째 테이블을 기준으로, 두 번째 테이블을 조합하는 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';
3. RIGHT JOIN (부분집합)
LEFT JOIN과는 반대로, 두 번째 테이블을 기준으로 첫 번째 테이블을 조합하는 JOIN이다.
첫번째테이블이름
LEFT JOIN 두번째테이블이름
ON 조건
📌 예제
Customer
테이블의 Name
필드를 기준으로 Reservation
테이블의 Name
필드와 일치하는 레코드만을 RIGHT JOIN
으로 가져와라.
SELECT *
FROM Reservation
RIGHT JOIN Customer
ON Reservation.Name = Customer.Name;
4. FULL OUTER JOIN (외부 조인; 합집합)
A, B 테이블을 JOIN할 경우, 조건에 맞지 않은 데이터도 표시하고 싶을 때 OUTER JOIN을 사용한다.
- MySQL은
FULL OUTER JOIN
이 없어서,LEFT JOIN
과RIGHT JOIN
을UNION
해서 사용한다. OUTER JOIN
은USING
,ON
조건절을 필수적으로 사용해야 한다.
SELECT *
FROM 첫번째테이블명
LEFT JOIN 두번째테이블명
UNION
SELECT *
FROM 첫번째테이블명
RIGHT JOIN 두번째테이블명2
UNION
여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용한다.
- 이때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야 하며, 필드의 순서 또한 같아야 한다.
SELECT 필드이름
FROM 테이블이름
UNION
SELECT 필드이름
FROM 테이블이름
💡 문제마다 추가적으로 필요한 개념들은 따로 정리해보도록 하겠다!
[ Basic Join ]
Population Census
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
가 일치한다.
💡 Solve
SELECT SUM(CITY.POPULATION)
FROM CITY
INNER JOIN COUNTRY
ON CITY.COUNTRYCODE = COUNTRY.CODE
WHERE COUNTRY.CONTINENT = 'Asia';
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.
CONTINENT
필드값이'Africa'
인 모든 도시의 이름을 쿼리하라.CITY.CountryCode
와COUNTRY.Code
가 일치한다.
💡 Solve
SELECT CITY.NAME
FROM CITY
INNER JOIN COUNTRY
ON CITY.COUNTRYCODE = COUNTRY.CODE
WHERE COUNTRY.CONTINENT = 'Africa';
Average Population of Each Continent
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
가 일치한다.
💡 Solve
SELECT COUNTRY.CONTINENT, FLOOR(AVG(CITY.POPULATION))
FROM CITY
INNER JOIN COUNTRY
ON CITY.COUNTRYCODE = COUNTRY.CODE
GROUP BY COUNTRY.CONTINENT;
[ 참고자료 ]
http://tcpschool.com/mysql/mysql_multipleTable_join
Author And Source
이 문제에 관하여([SQL] HackerRank - Basic Join), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mmy789/Basic-Join저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)