[SQL] HackerRank - Basic Join

mmy789·2022년 3월 30일
0

HackerRank

목록 보기
3/4
post-thumbnail

[ 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 테이블의 NameCustomer 테이블의 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 JOINRIGHT JOINUNION해서 사용한다.
  • OUTER JOINUSING, 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.CountryCodeCOUNTRY.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.CountryCodeCOUNTRY.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.CountryCodeCOUNTRY.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

profile
Backend Developer

0개의 댓글