JOIN
JOIN은 여러개의 테이블에서 데이터를 모아서 보여줄 때 사용됩니다.
JOIN에는 INNER JOIN, LEFT JOIN, RIGHT JOIN이 있습니다.
MAKE TEST TABLE & DATA
- create table & data
1
2
3
4
5CREATE TABLE user (
user_id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(30) DEFAULT NULL,
PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;1
2
3
4
5
6CREATE TABLE addr (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
addr varchar(30) DEFAULT NULL,
user_id int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;1
2
3
4
5
6
7
8
9
10
11
12INSERT INTO user(name)
VALUES ("jin"),
("po"),
("alice"),
("petter");
INSERT INTO addr(addr, user_id)
VALUES ("seoul", 1),
("pusan", 2),
("deajeon", 3),
("deagu", 5),
("seoul", 6);
INNER JOIN
두 테이블 사이에 공통된 값이 없는 row는 출력하지 않는다.
두 테이블을 합쳐 id, name, addr 출력
1
2
3
4SELECT id, user.name, addr.addr
FROM user
JOIN addr
ON user.user_id = addr.user_idworld 데이터베이스에서 도시이름과 국가이름을 출력
1
2
3
4SELECT city.name AS country_name, country.name AS city_name
FROM city
JOIN country
ON city.CountryCode = country.code아래와 같이 사용할수도 있다.
1
2
3SELECT city.name AS country_name, country.name AS city_name
FROM city, country
WHERE city.CountryCode = country.code
LEFT JOIN
왼쪽 테이블을 기준으로 왼쪽 테이블의 모든 데이터가 출력되고 매핑되는 키값이 없으면 NULL로 출력된다.
두 테이블을 합쳐 id, name, addr 출력
1
2
3
4SELECT id, user.name, addr.addr
FROM user
LEFT JOIN addr
ON user.user_id = addr.user_id
RIGHT JOIN
오른쪽 테이블을 기준으로 왼쪽 테이블의 모든 데이터가 출력되고 매핑되는 키값이 없으면 NULL로 출력된다.
두 테이블을 합쳐 id, name, addr 출력
1
2
3
4SELECT id, user.name, addr.addr
FROM user
RIGHT JOIN addr
ON user.user_id = addr.user_id
JOIN과 DISDINCT의 사용
지역과 대륙별 사용하는 언어 출력
1
2
3
4SELECT DISTINCT country.Region, country.continent, countrylanguage.Language
FROM country
JOIN countrylanguage
ON countrylanguage.CountryCode = country.Code대륙과 지역별 사용하는 언어의 수 출력
1
2
3
4
5
6
7
8SELECT sub1.region, sub1.continent, count(*) as count
FROM (
SELECT DISTINCT country.Region, country.continent, countrylanguage.Language
FROM country
JOIN countrylanguage
ON countrylanguage.CountryCode = country.Code
) AS sub1
GROUP BY sub1.region, sub1.continent
테이블 세개 조인하기
- 국가별, 도시별, 언어의 사용율
1
2
3
4
5
6
7
8
9
10
11
12SELECT country.name as country_name, city.name as city_name,
countrylanguage.language, countrylanguage.percentage
FROM country
JOIN city
ON country.code = city.countrycode
JOIN countrylanguage
ON country.code = countrylanguage.countrycode
SELECT country.name as country_name, city.name as city_name,
countrylanguage.language, countrylanguage.percentage
FROM country, city, countrylanguage
WHERE country.code = city.countrycode and country.code = countrylanguage.countrycode
UNION
UNION은 SELECT 문의 결과 데이터를 하나로 합쳐서 출력합니다.
컬럼의 갯수와 타입, 순서가 같아야 합니다.
UNION은 자동으로 distinct를 하여 중복을 제거해 줍니다.
중복제거를 안하고 컬럼 데이터를 합치고 싶으면 UNION ALL을 사용합니다.
또한 UNION을 이용하면 Full Outer Join을 구현할수 있습니다.
UNION
- user 테이블의 name 컬럼과 addr 테이블의 addr 컬럼의 데이터를 하나로 함쳐서 출력
1
2
3
4
5SELECT name
FROM user
UNION
SELECT addr
FROM addr
- user 테이블의 name 컬럼과 addr 테이블의 addr 컬럼의 데이터를 하나로 함쳐서 출력
UNION ALL
- 중복데이터를 제거하지 않고 결과 데이터 합쳐서 출력
1
2
3
4
5SELECT name
FROM user
UNION ALL
SELECT addr
FROM addr
- 중복데이터를 제거하지 않고 결과 데이터 합쳐서 출력
FULL OUTER JOIN
- union을 이용하여 full outer join 구현
1
2
3
4
5
6
7
8
9SELECT id, user.name, addr.addr
FROM user
LEFT JOIN addr
ON user.user_id = addr.user_id
UNION
SELECT id, user.name, addr.addr
FROM user
RIGHT JOIN addr
ON user.user_id = addr.user_id
- union을 이용하여 full outer join 구현