서버/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 JOINouter 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 임 그래서 필요할 때는 꼭 쓰고 필요없을 때는 쓰지마라는 것.)