본문 바로가기
DataBase/MySQL

[MySQL] JOIN 과 UNION_INNER JOIN , LEFT/RIGHT OUTER JOIN, UNION, UNION ALL

by coding-choonsik 2023. 3. 20.
728x90
반응형
SMALL

1. JOIN

  • 두 개 이상의 테이블을 묶어서 하나의 결과 집합으로 만들어 내는 것
  • 서로 다른 테이블에서 데이터를 가져올 때 사용
  • SELECT와 더불어 가장 많이 사용하는 옵션 중 하나
select 필드명1, 필드명2, ... from 테이블1 
[inner join/ left / right] join 
테이블2 on 테이블1.연결할필드(pk) = 테이블2.연결할필드(fk);

1-1. INNER JOIN

  • 조인하는 테이블의 on 절의 조건이 일치하는 결과만 출력 
  • join, inner join,  cross join 모두 같은 의미로 사용됨

 

✅ member 태이블과 profile 테이블을 userid로 inner join 해보기!

select * from member;

select * from profile;

 

📍 select절에 userid가 어느 테이블의 userid인지 모호함, 테이블의 별명을 설정하여 작성

 

/* 에러
select userid, username, hp, height, weight, mbti from member 
inner join profile on member.userid = profile.userid;
*/

select m.userid, m.username, m.hp, p.height, p.weight, p.mbti from member as m 
inner join profile as p on m.userid = p.userid;

두 테이블의 공통된 userid 데이터 5개의 데이터 출력

 

profile 테이블 데이터는 memeber 테이블의 데이터가 있는 경우만 입력가능하기 때문에 inner join의 결과와 같음

 


1-2. LEFT OUTER JOIN

  • 두 테이블이 조인될 때 왼쪽 테이블을 기준으 왼쪽 테이블의 데이터를 모두 출력함
  • left outer join은 왼쪽 테이블의 on 절의 조건 데이터를 모두 가져옴

 

✅ member 테이블과 profile 테이블을 userid로 left outer join 해보기!

select m.userid, m.username, m.hp, p.height, p.weight, p.mbti from member as m 
left outer join profile as p on m.userid = p.userid;

 

left 테이블인 member테이블의 갯수 만큼 출력되고 profile테이블에 없는 데이터는 null로 입력됨


1-3. RIGHT OUTER JOIN

  • 두 테이블이 조인될 때 오른쪽 테이블을 기준으 오른쪽 테이블의 데이터를 모두 출력함
  • right outer join은 오른쪽 테이블의 on 절의 조건 데이터를 모두 가져옴

✅ member 테이블과 profile 테이블을 userid로 right outer join 해보기!

select m.userid, m.username, m.hp, p.height, p.weight, p.mbti from member as m 
right outer join profile as p on m.userid = p.userid;

 

right 테이블인 profile 테이블의 갯수만큼 출력됨


2. UNION

  • 합집합을 나타내는 연산자로, 중복된 값을 제거함
  • 서로 같은 종류의 테이블(컬럼이 같아야 함)에서만 적용이 가능
select 컬럼명1, 컬럼명2,... 테이블1 
union 
select 컬럼명1, 컬럼명2,... from 테이블2

2-1. UNION

✅ product 테이블과 product_new 테이블을 생성하고 데이터 입력하기

create table product(
	code varchar(6) not null,
    name varchar(50) not null,
    detail varchar(1000),
    price int default 0,
    regdate datetime default now()
);

insert into product values('100000', '아이폰14', '예뻐요', 1500000, now());
insert into product values('100001', '갤럭시23', '좋아요', 1300000, now());
insert into product values('100002', '맥북에어', '가벼요', 1400000, now());

select * from product;

product 테이블

 

create table product_new(
	code varchar(6) not null,
    name varchar(50) not null,
    detail varchar(1000),
    price int default 0,
    regdate datetime default now()
);

insert into product_new values('200000', '엘지그램', '가벼워요', 1500000, now());
insert into product_new values('200001', '삼성모니터', '잘보여요', 500000, now());
insert into product_new values('100001', '갤럭시23', '좋아요', 1300000, now());

select * from product_new;

product_new 테이블

 

✅ product 테이블과 product_new 테이블을 union 해보자!

select code, name, price from product 
union 
select code, name, price from product_new;

100001 갤럭시23에 대한 중복된 데이터는 1건만 출력됨

 

📍 두 테이블을 union 할 때 데이터가 동일한 필드만 출력하면 중복된 데이터는 제거되지만, 서로 다른 데이터가 들어있는 필드를 출력하면 중복값이 아니기 때문에 모두 출력됨.

select code, name, price, regdate from product 
union all
select code, name, price, regdate from product_new;

100001 갤럭시23의 regdate의 값이 중복이 아님.


2-2) UNION ALL

  • 합집합을 나타내는 연산자로, 중복된 값을 제거하지 않음
select code, name, price from product 
union all
select code, name, price from product_new;

중복된 값이 제거되지 않음

 

 

728x90
반응형
LIST