새소식

SQL

SQL | MySQL | JOIN - inner, left, right

  • -

 

 

 

01. MySQL에서의 JOIN

 

 

MySQL에서 JOIN은 두 개 이상의 테이블에서 데이터를 검색하는 데 사용됨.

두 개 이상의 테이블의 자료를 결합

 

✅JOIN의 종류

 ① (INNER) JOIN

       👉  EQUI JOIN : 주어진 (열에 대한) 조인 조건을 만족하는 자료(행)

                  - 양쪽 모두에 값이 있는 행(NOT NULL) 반환

                  - 만약 동일 조인 내에 있는 컬럼들이 동일한 이름을 가지고 있으면, USING 함수를 사용할 수 있음.

       👉  CROSS JOIN

                   - 두 개 이상의 테이블에서 모든 조합을 반환

                   - 왼쪽 테이블의 모든 행이 오른쪽 테이블의 모든 행과 결합

 

       👉  NATURAL JOIN 

                  - EQUI JOIN의 한 유형으로 조인 구문이 조인된 테이블에서 동일한 컬럼명을 가진 2개의 테이블에서

                    모든 컬럼들을 비교함으로써, 암시적으로 일어나는 구문 

                  - 결과적으로 나온 조인된 테이블은 동일한 이름을 가진 컬럼의 각 쌍에 대한 단 하나의 컬럼만 포함

                  - 사용안하는 것이 좋음.

 

 ②  OUTER JOIN       

       👉 LEFT [OUTER] JOIN 

                 - 왼쪽 테이블에서 모든 행을 반환하고, 오른쪽 테이블에서는 일치하는 행만 반환

                 - 오른쪽 테이블에 일치하는 행이 없으면 NULL 값을 반환

       👉 RIGHT [OUTER] JOIN

                 - 오른쪽 테이블에서 모든 행을 반환하고, 왼쪽 테이블에서는 일치하는 행만 반환

                 - 왼쪽 테이블과 일치하는 행이 없으면 NULL 값을 반환

 

      👉 FULL  OUTER  JOIN 

                - 왼쪽과 오른쪽 테이블에서 일치하는 행을 모두 반환

                - 일치하지 않는 행은 NULL 값을 반환

 

table_references:
    escaped_table_reference [, escaped_table_reference] ...

escaped_table_reference: {
    table_reference
  | { OJ table_reference }
}

table_reference: {
    table_factor
  | joined_table
}

table_factor: {
    tbl_name [PARTITION (partition_names)]
        [[AS] alias] [index_hint_list]
  | [LATERAL] table_subquery [AS] alias [(col_list)]
  | ( table_references )
}

joined_table: {
    table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
  | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

join_specification: {
    ON search_condition
  | USING (join_column_list)
}

join_column_list:
    column_name [, column_name] ...

index_hint_list:
    index_hint [, index_hint] ...

index_hint: {
    USE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
  | {IGNORE|FORCE} {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
}

index_list:
    index_name [, index_name] ...

 

 

 

 

 

02. JOIN 실습

 

 

✅ 예제 테이블 생성 

 

예제 테이블 출처

➡️ https://ko.wikipedia.org/wiki/Join_(SQL) 

 

Join (SQL) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. join(조인) 또는 결합 구문은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것이다. 따라서 조인은 테이블로서 저장되거나, 그 자

ko.wikipedia.org

 

CREATE TABLE department
(
 DepartmentID INT,
 DepartmentName VARCHAR(20)
);

CREATE TABLE employee
(
 LastName VARCHAR(20),
 DepartmentID INT
);

INSERT INTO department(DepartmentID, DepartmentName) 
VALUES(31, '영업부'),
           (33, '기술부'),
           (34, '사무부'),
           (35, '마케팅');
         
INSERT INTO employee(LastName, DepartmentID)
VALUES('Rafferty', 31),
           ('Jones', 33),
           ('Steinberg', 33),
           ('Robinson', 34),
           ('Smith', 34),
           ('John', NULL);

 

 

 


✅ INNER JOIN

 

 ① JOIN

✔️JOIN 키워드 사용

SELECT * 
FROM employee a 
JOIN department b
ON a.DepartmentID = b.DepartmentID;

 

SELECT * 
FROM employee a 
JOIN department b 
USING (DepartmentID);

 

✨조인하려는 테이블의 키값이 같으면 USING 함수를 사용할 수 있음

 

 

 

✔️WHERE문 사용 

SELECT * 
FROM employee a, department b
WHERE  a.DepartmentID = b.DepartmentID;

 

 

 

 ② CROSS JOIN

 

✔️ CROSS JOIN 사용 

SELECT *
FROM employee CROSS JOIN department;

 

 

✔️ CROSS JOIN 사용 X

SELECT *
FROM employee, department;

 

 


 

✅ OUTER JOIN

 

 ①  LEFT [OUTER] JOIN

SELECT * 
FROM employee a 
LEFT JOIN department b
ON a.DepartmentID = b.DepartmentID;

 

 

 

②  RIGHT [OUTER] JOIN

SELECT * 
FROM employee a 
RIGHT  JOIN department b
ON a.DepartmentID = b.DepartmentID;

 

 

 

③  FULL [OUTER] JOIN

SELECT * 
FROM employee a 
FULL OUTER JOIN department b
ON a.DepartmentID = b.DepartmentID;

 

✨ORACLE의 경우 FULL OUTER JOIN 구문을 지원하지만 , MySQL의 경우 지원하지 않음

 

 

✔️ Oracle 에서 FULL OUTER JOIN

SELECT * 
FROM employee a 
FULL OUTER JOIN department b
ON a.DepartmentID = b.DepartmentID;

 

 

 

✔️ MySQL 에서 FULL OUTER JOIN

SELECT *
FROM employee a 
LEFT OUTER JOIN department b
ON a.DepartmentID = b.DepartmentID

UNION ALL   /* 중복허용 합집합*/

SELECT *
FROM employee a 
RIGHT OUTER JOIN department b
ON a.DepartmentID = b.DepartmentID
WHERE a.DepartmentID IS NULL;

 

 

 

 

 


출처 및 참고 문헌(reference)

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.