테이블 합치기

오상윤·2023년 1월 27일
0

SQL

목록 보기
7/10

테이블 합치기(JOIN)

JOIN

  • 같은 의미를 가지는 컬럼의 값을 기준으로 테이블을 합칠 때 사용하느 키워드

기준으로 테이블 합치기(INNER JOIN)

INNER JOIN

  • 두 테이블 모두에 있는 값만 합치기
    SELECT[컬럼 이름]
    FROM[테이블 A 이름]
    INNER JOIN[테이블 B 이름]
    ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
    WHERE 조건식;

한쪽을 기준으로 테이블 합치기 (LEFT, RIGHT JOIN)

LEFT JOIN

  • 왼쪽 테이블에 존재하는 모든 값을 합치기
    SELECT[컬럼 이름]
    FROM[테이블 A 이름]
    LEFT JOIN[테이블 B 이름]
    ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
    WHERE 조건식;

RIGHT JOIN

  • 오른쪽 테이블에 존재하는 모든 값 합치기
    SELECT[컬럼 이름]
    FROM[테이블 A 이름]
    RIGHT JOIN[테이블 B 이름]
    ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
    WHERE 조건식;

다양한 방식으로 테이블 합치기 (OUTER,CROSS,SELF JOIN)

OUTER JOIN

  • 두 테이블에 있는 모든 값 합치기
  • OUTER JOIN은 MySQL 키워드에 없다
    - LEFT JOIN UNION RIGHT JOIN 으로 사용
    - UNION : 두 쿼리의 결과를 중복 제외하고 합쳐서 보여주는 집합 연산자
    SELECT[컬럼 이름]
    FROM[테이블 A 이름]
    LEFT JOIN[테이블 B 이름]
    ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
    UNION
    SELECT[컬럼 이름]
    FROM[테이블 A 이름]
    RIGHT JOIN[테이블 B 이름]
    ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름];

CROSS JOIN

  • 두 테이블에 있는 모든 값을 각각 합치기
    SELECT[컬럼 이름]
    FROM[테이블 A 이름]
    CROSS JOIN[테이블 B 이름]
    WHERE 조건식;

SELF JOIN

  • 같은 테이블에 있는 값 합치기
    SELECT[컬럼 이름]
    FROM[테이블 A 이름] AS T1
    INNER JOIN[테이블 B 이름] AS T2
    ON T1.[컬럼 A 이름] = T2.[컬럼 B 이름]
    WHERE 조건식;

실습1

DROP DATABASE IF EXISTS pokemon;
CREATE DATABASE pokemon;
USE pokemon;
CREATE TABLE mypokemon(
		number int,
        name varchar(20),
        type varchar(20),
        height float,
        weight float,
        attack float,
        defense float,
        speed int
        );
INSERT INTO mypokemon(number, name, type)
VALUES (10,'caterpie', 'bug'),
	(25,'picachu','electric'), 
    (27,'raichu','electric'),
    (133,'eevee','normal'),
    (152,'chikoirita','grass');
CREATE TABLE ability(
		number int,
        height float,
        weight float,
        attack float,
        defense float,
        speed int
        );
INSERT INTO mypokemon(number, height, weight, attack, defense, speed)
VALUES (10,0.3,2.9,.30,35,45),
	(25,0.4,6,55,40,90), 
    (27,0.8,30,90,55,110),
    (133,0.3,6.5,55,50,55),
    (152,0.9,6.4,49,65,45),
    (153,1.2,15.8,62,80,60),
    (172,0.3,2,40,15,60),
    (470,1,25.5,110,130,95);    
  1. 포켓몬 테이블과 능력치 테이블을 합쳐서 포켓몬 이름, 공격력, 방어력을 한번에 가져와 주세요. 이 때, 포켓몬 테이블에 있는 모든 포켓몬의 데이터를 가져와 주세요. 만약, 포켓몬의 능력치 데이터를 구할 수 없다면, NULL을 가져와도 좋습니다
SELECT name, attack, defense
FROM mypokemon
LEFT JOIN ability
ON mypokemon.number = ability.numer;
  1. 포켓몬 테이블과 능력치 테이블을 합쳐서 포켓몬 번호와 이름을 한번에 가져와 주세요. 이 때, 능력치 테이블에 있는 모든 포켓몬의 데이터를 가져와 주세요. 만약, 포켓몬의 능력치 데이터를 구할 수 없다면, NULL을 가져와도 좋습니다
SELECT ability.number, name
FROM mypokemon
RIGHT JOIN ability
ON mypokemon.number = ability.number;

실습2

  1. 내 포켓몬의 타입 별 키의 평균을 가져와 주세요
SELECT type, AVG(height)
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
GROUP BY type;
  1. 내 포켓몬의 타입 별 몸무게의 평균을 가져와 주세요
SELECT type, AVG(weight)
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
GROUP BY type;
  1. 내 포켓몬의 타입 별 키의 평균과 몸무게의 평균을 함께 가져와 주세요
SELECT type, AVG(height), AVG(weight)
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
GROUP BY type;
  1. 번호가 100 이상인 내 포켓몬들의 번호, 이름, 공격력, 방어력을 가져와 주세요
SELECT mypokemon.number, name, attack, defense
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
WHERE mypokemon.number >= 100;
  1. 공격력과 방어력의 합이 큰 순서대로 내 포켓몬들의 이름을 나열해 주세요
SELECT name
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
ORDER BY attack + defense DESC;
  1. 속도가 가장 빠른 내 포켓몬의 이름을 가져와 주세요
SELECT name
FROM mypokemon LEFT JOIN ability
ON mypokemon.number = ability.number
ORDER BY speed DESC
LIMIT 1;
profile
가보자가보자~

0개의 댓글