4. SQL 고급 문법 - 2. 두 테이블을 묶는 조인.

하쮸·2024년 10월 14일

SQL

목록 보기
5/6
post-thumbnail

1. 두 테이블을 묶는 조인.

  • 조인(join)이란 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것.
    • Ex) 회원 테이블과 구매 테이블
      • 회원 테이블에는 회원의 이름과 연락처, 주소가 있고, 구매 테이블에는 구매한 물건이 있음.
      • 두 테이블을 엮어서 하나의 배송을 위한 정보를 추출하는 것이 대표적인 조인.
  • 조인은 두 테이블을 엮어서 정보를 추출하는 것.

1-1. 내부 조인(INNER JOIN).

  • 두 테이블을 연결할 때 가장 많이 사용되는 것이 내부 조인.

1-1-1. 일대다 관계의 이해.

  • 두 테이블의 조인을 위해서는 테이블이 일대다(one to many)관계로 연결되어야 함.
    • 데이터베이스의 테이블은 하나로 구성되는 것보다는 여러 정보를 주제에 따라 분리해서 저장하는 것이 효율적.
    • 이렇게 분리된 테이블은 서로 관계(relation)을 맺고 있음.
  • 일대다 관계란 한쪽 테이블에는 하나의 값만 존재하지만, 연결된 다른 테이블에는 여러개의 값이 존재할 수 있는 관계를 말함.
    • 일대다 관계는 주로 PK(기본 키)FK(외래 키, Foreign Key)관계로 맺어져있음.
    • 주로 하나의 값만 존재하는 값을 PK(기본 키, Primary Key), 여러 개의 값으로 된 것을 FK(외래 키, Foreign Key)라고 함.

1-1-2. 내부 조인의 기본.

  • 일반적으로 조인이라고 부르는 것은 내부 조인(INNER JOIN)을 말하는 것.

내부 조인의 형식

SELECT < 목록>
FROM < 번째 테이블>
INNER JOIN < 번째 테이블>	-- INNER JOIN을 JOIN이라고만 써도 됨.
ON <조인될 조건>
[WHERE 검색 조건]
  • 두 개의 테이블을 조인하는 경우 동일한 이름의 열이 존재한다면 꼭 테이블 이름.열 이름 형식으로 표기 해야 됨.
    • 이를 간단하게 표현하려면 테이블 이름 뒤에 별칭(alias)을 주면 됨.
  • 내부 조인(INNER JOIN)은 두 테이블에 모두 있는 내용만 조인되는 방식.
    • 만약 한쪽에만 내용이 있을 때는 외부 조인(OUTER JOIN)을 사용해야 됨.

1-2. 외부 조인(OUTER JOIN).

  • 외부 조인(OUTER JOIN)은 한쪽에만 데이터가 있어도 결과가 나옴.

1-2-1. 외부 조인의 기본.

  • 외부 조인(OUTER JOIN)은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있임,

외부 조인의 형식

SELECT < 목록>
FROM < 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN < 번째 테이블(RIGHT 테이블>
ON <조인될 조건>
[WHERE 검색 조건];
  • LEFT OUTER JOIN문의 의미는 '왼쪽 테이블의 내용은 모두 출력되어야 한다'로 해석.
    • FROM절에 있는 첫 번째 테이블의 모든 행을 포함 함.
  • RIGHT OUTER JOIN은 왼쪽, 오른쪽 테이블 위치만 바뀐 것.
    • JOIN절에 있는 두 번째 테이블의 모든 행을 포함 함.
  • FULL OUTER JOINLEFT 외부 조인RIGHT 외부 조인이 합쳐진 것이라고 생각.
    • 왼쪽이든 오른쪽이든 한쪽에 들어 있는 내용이면 출력.

1-3. 상호 조인(CROSS JOIN)

  • 상호 조인(CROSS JOIN)은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능.
    • CROSS JOIN 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 됨.
    • 상호 조인(CROSS JOIN)가티션 곱(cartesian product)이라고도 부름.
  • 상호 조인은 아래와 같은 특징을 가짐.
    • ON구문을 사용할 수 없음.
    • 결과의 내용은 의미가 없음.
      • 랜덤으로 조인하기 때문.
    • 상호 조인의 주 용도는 테스트 하기 위해 대용량의 데이터를 생성할 때.
  • 대용량의 테이블을 만들고 싶다면 CREATE TABLE ... SELECT문을 사용.
CREATE TABLE cross_table
SELECT *
FROM sakila.actor			-- 200개
CROSS JOIN world.country;	-- 239개

실행 결과 -> 47,800개의 행이 생성.

1-4. 자체 조인(SELF JOIN).

  • 자체 조인(SELF JOIN)은 자신이 자신과 조인한다는 의미.
    • 자체 조인은 1개의 테이블을 사용함.
    • Ex) 회사의 조직 관계

자체 조인의 형식

SELECT < 목록>
FROM <테이블> A
INNER JOIN <테이블> B		-- FROM절과 INNER JOIN절의 테이블은 같은 테이블.
ON <조인될 조건>
[WHERE 검색 조건]
  • 하나의 테이블에 같은 데이터가 있지만 2개 이상의 열로 존재할 때 자체 조인(SELF JOIN)을 할 수 있음.
CREATE TABLE emp_table (emp CHAR(4), manager CHAR(4), phone VARCHAR(8));

INSERT INTO emp_table VALUES('대표', NULL, '0000');
INSERT INTO emp_table VALUES('영업이사', '대표', '1111');
INSERT INTO emp_table VALUES('관리이사', '대표', '2222');
INSERT INTO emp_table VALUES('정보이사', '대표', '2222');
INSERT INTO emp_table VALUES('영업과장', '영업이사', '1111-1');
INSERT INTO emp_table VALUES('경리부장', '관리이사', '2222-1');
INSERT INTO emp_table VALUES('인사부장', '관리이사', '2222-2');
INSERT INTO emp_table VALUES('개발팀장', '정보이사', '3333-1');
INSERT INTO emp_table VALUES('개발주임', '정보이사', '3333-1-1');

SELECT A.emp AS "직원", B.emp AS "직속상관", B.phone AS "직속상관연락처"
FROM emp_table A
INNER JOIN emp_table B
ON A.manager = B.emp
WHERE A.emp = '경리부장';

실행결과
직원			직속상관		직속상관연락처
경리부장	    관리이사		2222

2. 참고

profile
Every cloud has a silver lining.

0개의 댓글