본 게시글은 Datacamp의 Introduction to SQL 코스와 패스트캠퍼스의 SQL/DB 올인원 패키지 강좌를 수강하며 제가 기억할 수 있도록 작성한 것으로, 아주 기초적인 내용으로 구성되어 있습니다.
JOIN
SQL에서는 JOIN을 통해 여러 개의 테이블의 레코드를 즉, 두개 이상의 테이블을 조합해 하나의 테이블로 표현할 수 있다. 조인의 종류는 다음과 같다.
- INNER JOIN
- SELF JOIN
- OUTER JOIN(LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN)
- CROSS JOIN
- NATURAL JOIN
이 글에서는 INNER JOIN에 대해서 정리하고, 부가적으로 CASE문과 INTO 키워드에 대해 정리할 것이다. 추후에 새로운 글을 통해 OUTER JOIN과 SELF JOIN, CROSS JOIN 등에 대한 부분을 다룰 예정이다.
INNER JOIN
왼쪽, 오른쪽 테이블 모두에 존재하는 행을 모아서 하나의 행으로 만드는 것이다. 즉, 좌우가 정확하게 매칭되는 데이터만 조회하는 JOIN의 형태이며, 기본 형태는 다음과 같다.
SELECT *
FROM left_table
INNER JOIN right_table
ON left_table.id = right_table.id;
ex. countries 테이블과 populations 테이블, economies 테이블을 INNER JOIN할 것
[조건]
- countries 테이블과 populations 테이블은 code, country_code 컬럼으로 조인
- countries 테이블과 economies 테이블은 code 컬럼으로 조인
- economies 테이블과 populations 테이블은 year 컬럼으로 조인
SELECT c.code, name, region, e.year, fertility_rate, unemployment_rate
FROM countries AS c
INNER JOIN populations AS p
ON c.code = p.country_code
INNER JOIN economies AS e
ON c.code = e.code AND e.year = p.year;
USING
조인하고자 하는 테이블들의 컬럼명이 같을 때에는 USING(컬럼명)의 형태로 사용할 수 있다.
-- USING 키워드를 이용해 조인하는 컬럼 명시
SELECT *
FROM countries
INNER JOIN economies
USING(code);
-- 기존의 ON 키워드를 이용해 조인하는 컬럼 명시
SELECT *
FROM countries
INNER JOIN economies
ON countries.code = economies.code;
ex. code 컬럼을 기준으로 countries 테이블과 language 테이블 조인
- countries 테이블의 지역명과 대륙명, languages 테이블의 언어명과 공식언어 여부 조회
SELECT c.name AS country, c.continent, l.name AS language, l.official
FROM countries c
INNER JOIN languages l
USING(code);
ex. populations 테이블을 셀프조인(참고)하되, 2010년의 규모와 2015년의 규모, 2010년에서 2015년으로의 증가율 조회
*증가율(growth_perc) : (p2.size - p1.size) / p1.size * 100.0
SELECT
p1.country_code,
p1.size AS size2010,
p2.size AS size2015,
((p2.size - p1.size)/p1.size * 100.0) AS growth_perc
From populations (alias as p1)
FROM populations AS p1
INNER JOIN populations AS p2
ON p1.country_code = p2.country_code
AND p1.year = p2.year - 5;
CASE, WHEN, THEN, ELSE, END
*Java의 CASE문과 유사
- CASE : 하나 이상의 조건과 그에 따른 결과 나열 가능(선택문)
- 'WHEN 조건문 THEN 결과'의 형태로 조건과 조건이 만족할 때 해당되는 결과를 정할 수 있으며 여러 개 나열 가능. 위에서 아래 순서대로 진행되며, 해당되는 조건을 만나면 더이상 진행되지 않고 끝남. (하나의 조건만 해당될 수 있음)
- ELSE : 나열된 조건 모두 만족하지 않을 때의 결과
- END : 하나의 CASE문이 끝났음을 의미
SELECT ...
CASE WHEN [조건 1] THEN [결과 1]
WHEN [조건 2] THEN [결과 2]
WHEN [조건 3] THEN [결과 3]
ELSE [그 외의 조건일 때 만족하는 결과] END
AS [사용할 컬럼명]
FROM [테이블명]
ex. countries 테이블에서 새로운 속성(필드)인 geosize_group을 만들되, 기존 컬럼인 surface_area의 값이 2백만 보다 클 때는 그 값을 'large'로 표현하고, 2백만 보다 크진 않지만 35만보다 클 때는 'medium', 그 외에는 'small'로 표현하기
SELECT name, continent, code, surface_area,
CASE WHEN surface_area > 2000000 THEN 'large'
WHEN surface_area > 350000 THEN 'medium'
ELSE 'small' END
AS geosize_group
FROM countries;
ex. populations 테이블에서 새로운 속성인 popsize_group을 만들되, 기존 컬럼인 size의 값이 5천만 보다 클 때는 그 값을 'large'로 표현하고, 백만 보다 클 때는 'medium', 그 외에는 'small'로 표현하기
SELECT
CASE
WHEN size > 50000000 THEN 'large'
WHEN size > 1000000 THEN 'medium'
ELSE 'small' END
AS popsize_group
FROM populations
WHERE year = 2015;
INTO
원하는 컬럼을 선택하거나 모든 컬럼을 선택하여 테이블의 정보를 새로운 테이블로 복사할 수 있다.
*INSERT INTO는 기존에 있던 테이블에 정보를 삽입할 때 사용하고, SELECT INTO는 기존의 테이블이 없을 때 조회되는 정보를 기반으로 새로운 테이블을 만들고자 할 때 사용한다.
ex. populations 테이블의 year값이 2015일 때의 country_code, size, popsize_group 컬럼의 내용을 복사하여 pop_plus라는 새로운 테이블을 만들고 조회하기
SELECT country_code, size,
CASE WHEN size > 50000000 THEN 'large'
WHEN size > 1000000 THEN 'medium'
ELSE 'small' END
AS popsize_group
INTO pop_plus
FROM populations
WHERE year = 2015;
SELECT * FROM pop_plus;
'Database > PostgreSQL' 카테고리의 다른 글
SQL) LIMIT, FETCH를 통해 행의 수 한정하기, OFFSET 키워드로 인덱스 지정하기 (0) | 2021.05.15 |
---|---|
SQL) OUTER JOIN (0) | 2021.05.11 |
SQL) GROUP BY절, HAVING절 - 그룹화하기 (0) | 2021.04.30 |
SQL) DISTINCT를 통한 중복 제거, ORDER BY 절을 통한 레코드 정렬 (0) | 2021.04.30 |
SQL) 산술연산자, 집계 함수, AS(Alias), BETWEEN (0) | 2021.04.30 |