[29] MySQL - JOIN(Inner join, outer join), as(별칭), 외래키 오류

minjeong·2024년 2월 6일
0
post-thumbnail

JOIN

  • 최소 두개 이상의 테이블을 묶어서 하나의 테이블을 만듦
    📌 왜?

-> 그림과 같이 두개 이상의 테이블을 엮어야 원하는 형태가 나오기 때문이다.

JOIN 종류

INNER JOIN

➡️ 조인한 테이블들의 공통된 값들이 출력된다.

SELECT 속성이름, ... FROM 테이블A INNER JOIN 테이블B ON 조인조건 WHERE 검색조건;

LEFT OUTER JOIN

SELECT 속성이름, ... FROM 테이블A LEFT OUTER JOIN 테이블B ON 조인조건

➡️ 가장 왼쪽에 있는 테이블을 기준으로 오른쪽에 새로운 테이블이 조인된다.

RIGHT OUTER JOIN

SELECT 속성이름, ... FROM 테이블A RIGHT OUTER JOIN 테이블B ON 조인조건

➡️ 가장 오른쪽에 있는 테이블을 기준으로 왼쪽으로 새로운 테이블이 조인된다.
➡️ 사실 거의 쓰이지 않음

🔴 OUTER JOINdms INNER JOIN과 다르게 공통되지 않은 row도 유지한다. 그래서 null값이 있으면 표시된다.

실습코드 (새로운 두개의 테이블 생성 및 inner, outer join)

-- 첫번째 테이블(기준이 될 테이블)
CREATE TABLE customer(
  id varchar(10) not null primary key,
  name varchar(10) not null,
  birthday date not null
);
INSERT INTO customer (id, name, birthday) VALUES
('aaa','홍길동','1990-02-03'),
('bbb','mark','1992-03-24'),
('ccc','justin','2000-12-23');

-- 두번째 테이블(참조하는 테이블)

CREATE TABLE orderlist(
  id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
  customer_id VARCHAR(10) NOT NULL,
  product_name VARCHAR(20) NOT NULL,
  quantity INT,
  FOREIGN KEY (customer_id) REFERENCES customer(id) 
  -- orderlist의 customer_id는 customer 테이블의 id를 참조하며, customer_id를 외래키로 지정
);

-- orderlist의 id는 AUTO_INCREMENT니까 값을 입력해줄 필요없음
INSERT INTO orderlist (customer_id, product_name, quantity) VALUES
('aaa','맥북프로',1),
('ccc', '모니터', 10),
('bbb','핸드폰',20),
('bbb','마우스',4),
('ccc', '키보드', 6);

JOIN 코드

SELECT customer.id, customer.name, orderlist.product_name FROM customer 
INNER JOIN orderlist ON customer.id = orderlist.customer_id
WHERE orderlist.quantity >= 5; 

▶️ 위의 코드는 길다. 별칭을 이용해서 코드길이를 줄여보자!

SELECT a.id, a.name, b.product_name FROM customer as a 
INNER JOIN orderlist as b ON a.id = b.customer_id
WHERE b.quantity >= 5;

▶️ as를 이용해서 별칭을 만들 수 있다. 훨씬 간편하다!

조인 결과(INNER JOIN)

외래키 이름 지정 방법 :
기준이 되는(참조받는) 테이블의 이름 + 조인할 값 해서 언더바 등으로 지정한다.
추가로, 다른 테이블이랑 조인할 테이블(ex. orderlist)에는 외래키가 어떤건지 명시해야한다.

에러 발생(외래키 오류)

🟢 처음에 orderlist 테이블을 생성하고 데이터를 추가해서 실행했더니 아래와 같은 에러가 발생했다. 내가 데이터를 추가할때 customer테이블에 없는 id를 orderlist 에 만들어버린 것이다. 외래키로 참조하려는 id가 막상 기준이 되는 테이블에는 없어서 오류가 생긴것이다.😂 참조받는 테이블의 id에 있는 것으로 변경하니 해결이 되었다.

INNER JOIN + OUTER JOIN 실습

CREATE TABLE departments (
  department_id INT PRIMARY KEY,
  department_name VARCHAR(255) NOT NULL
);


CREATE TABLE employees(
  employees_id INT PRIMARY KEY,
  username VARCHAR(31) NOT NULL,
  department_id INT,
  FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

INSERT INTO (department_id, department_name) VALUES
(1, '기획팀'),
(2, 'IT개발팀'),
(3, '디자인팀');

INSERT INTO (employees_id, username, department_id) VALUES
(1, '홍길동', 2),
(2, '성춘향', 3),
(3, '이몽룡', NULL),
(4, '임꺽정', 2),
(5, '황진이', 3);

📌 NULL 값이 있는 테이블을 INNER JOIN 한 경우

SELECT a.employees_id, a.username, b.department_name 
FROM employees as a INNER JOIN departments as b
ON a.department_id = b.department_id; 

➡️ 출력되어야 하는 '이몽룡' 데이터가 사라졌다.
why?
INNER JOIN은 두개의 테이블의 공통된 요소를 하나의 테이블로 만드는데 이때, 두개의 테이블에 존재하고 있는 값만 가지고 오기 때문에 NULL값은 출력이 되지 않는다.!!

📌 LEFT OUTER JOIN

SELECT a.employees_id, a.username, b.department_name
FROM employees as a LEFT JOIN departments as b
ON a.department_id = b.department_id; 

➡️ NULL값이 포함된 '이몽룡' 데이터까지 제대로 출력되었다. (employees가 기준이고 왼쪽에 department가 붙는 것)


마무리

-> 조인하면서 유난히 에러가 많이 뜬 것 같다. 아직 외래키가 익숙치 않아서 자주 발생하는 것 같다. 그래도 에러가 발생하게 되면 두번 세번 다시 확인하면서 다음에 놓치지 않게 되는 것 같다!

profile
중요한 건 꺾여도 다시 일어서는 마음

0개의 댓글