서버/DB

JOIN

민밥통 2023. 11. 3. 12:34
https://velog.io/@makeitcloud/MySQL-6%ED%8E%B8-JOIN-EQUI-JOIN-NON-EUQI-JOIN-OUTER-JOIN-SELF-JOIN-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
ㄴ 참고하면서 공부함 ! 

 

equi join

>> 양쪽 테이블의 어떤 칼럼에 같은 값이 존재할 때 이것을 Equal 연산자(=)를 이용하여 양쪽에 다 존재하는 값만 결과로 출력하는 join입니다. inner join이라고도 불립니다.

create database inhouse4;
use inhouse4; 

-- 직원 정보
CREATE TABLE employee(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
team_name VARCHAR(20), 
phone_num VARCHAR(20), 
primary key(id)
);
-- 데이터 추가
INSERT into employee (name, team_name, phone_num) 
values ('김민지', '마케팅', '010-3333-3333');
INSERT into employee (name, team_name, phone_num) 
values ('김해지', '디자인', '010-3333-3334');
INSERT into employee (name, team_name, phone_num) 
values ('김지민', '영업', '010-3333-3334');
INSERT into employee (name, team_name, phone_num) 
values ('김지해', '개발', '010-3333-3335');
INSERT into employee (name, team_name, phone_num) 
values ('김민해', '디자인', '010-3333-3336');

-- 이메일
CREATE TABLE dept(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
email varchar(100),
primary key(id)
);

SELECT * from dept;

INSERT into dept (name, email) 
values ('영업',  'sales@naver.com');
INSERT into dept (name, email) 
values ('개발', 'develop@naver.com');
INSERT into dept (name, email) 
values ('디자인',  'design@naver.com');
INSERT into dept (name, email) 
values ('마케팅', 'maketing@naver.com');

DELETE FROM dept
	WHERE name LIKE '마게팅';

SELECT e.name as "사원이름", d.email as "이메일 문의 주소"
FROM employee e , dept d
WHERE e.team_name = d.name;

-- non equi join

-- 두 테이블을 서로 join 할 때 서로 다른 값을 가지거나, 한쪽 데이터가 다른 쪽 테이블의 데이터 범위 내에 있는 것만 출력을 원할 때 쓰는 것
-- 고객 정보
CREATE TABLE customer(

id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
point int,
primary key(id)
);
-- 데이터 추가
INSERT into customer (name, point)
values ('김민지', 10);
INSERT into customer (name, point)
values ('김해지', 25);
INSERT into customer (name, point)
values ('김지민', 15);
INSERT into customer (name, point)
values ('김지해', 20);
INSERT into customer (name, point)
values ('김해민', 35);
INSERT into customer (name, point)
values ('김민해', 5);
-- 선물
CREATE TABLE gift(
id INT NOT NULL AUTO_INCREMENT,
giftname VARCHAR(20),
point_from int,
point_to int,
primary key(id)
);
-- 데이터 추가
INSERT into gift (giftname, point_from, point_to)
values ('에어프라이어', 0, 5);
INSERT into gift (giftname, point_from, point_to)
values ('로봇청소기', 6, 15);
INSERT into gift (giftname, point_from, point_to)
values ('마사지기', 16, 20);
INSERT into gift (giftname, point_from, point_to)
values ('전자레인지', 21, 30);
INSERT into gift (giftname, point_from, point_to)
values ('공기청정기', 31, 40);
-- join
select c.name as 고객명, c.point as 고객포인트, g.giftname as 상품명
from customer c , gift g
where c.point between g.point_from and g.point_to;
where c.point between g.point_from and g.point_to;
고객 포인트에다가
기프트 0부터 5까지는 이 상품명을 준다는 조건을 넣음

 


-- OUTER JOIN

outer join은 한쪽을 기준으로 하여 다른 쪽에 key값이 일치하는 게 없더라도 모두 출력을 하는 join 기법입니다.
(필요시에 꼭 써야 하는 outer join이지만 필요 없을 땐 쓰지 않아야 합니다. outer join은 모든 데이터를 다 가지고 올 때 full scan을 하기 때문에 DB에 무리를 가할 수 있기 때문입니다.
예를 들어, 막 채용된 신입사원들에게 아직 부서가 주어지지 않았을 수 있습니다.
)
 
-- 직원 정보
CREATE TABLE employee(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
team_name VARCHAR(20),
phone_num VARCHAR(20),
primary key(id)
);
-- 데이터 추가
INSERT into employee (name, team_name, phone_num)
values ('김민지', '마케팅', '010-3333-3333');
INSERT into employee (name, team_name, phone_num)
values ('김해지', '디자인', '010-3333-3334');
INSERT into employee (name, team_name, phone_num)
values ('김지민', '영업', '010-3333-3334');
INSERT into employee (name, team_name, phone_num)
values ('김지해', '개발', '010-3333-3335');
INSERT into employee (name, team_name, phone_num)
values ('김민해', '디자인', '010-3333-3336');
INSERT into employee (name, team_name, phone_num)
values ('이지수', null, '010-3333-3336');
INSERT into employee (name, team_name, phone_num)
values ('박현아', null, '010-3333-3336');
-- senior
CREATE TABLE senior(
id INT NOT NULL AUTO_INCREMENT,
dept VARCHAR(20),
senior_name  VARCHAR(20),
primary key(id)
);
-- 데이터 추가
INSERT into senior (dept, senior_name)
values ('영업',  '이미희');
INSERT into senior (dept, senior_name)
values ('개발', '박영수');
INSERT into senior (dept, senior_name)
values ('디자인',  '김현미');
INSERT into senior (dept, senior_name)
values ('마케팅',  '이미희');
-- outer join
select e.name, e.team_name, s.senior_name
from employee e
left outer join senior s
on e.team_name = s.dept;
직원명, 직원팀명, 상사명
 
From 직원의 테이블을 e라고 지정
Left outer join senior s
ㄴ 왼쪽에 상사명을 출력
On 거기에 직원 팀명과 상사의 부서가 맞는 것만 출력하게 함

이런식으로 NULL까지 다 보이게 함 (NULL인데 짤리는 경우는 equi join 임 그래서 필요할 때는 꼭 쓰고 필요없을 때는 쓰지마라는 것.)