JOIN

0ㅑ채
|2024. 1. 23. 19:29

 

A. 내부 조인

1) 일대다 관계의 이해 (PK-FK 관계)

1명의 회사원이 여러 번의 급여를 받는다. 

학생 테이블과 학점테이블도 1명의 학생이 여러 과목의 학점을 받아야 하므로 일대다 관계

 

2) 내부 조인의 기본

  • 두 테이블에 모두 있는 내용만 조인되는 방식
SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블>
    ON <조인될 조건>
[WHERE 검색 조건]
USE market_db;
SELECT *
FROM buy
	INNER JOIN member
    ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'GRL';

 

3) 별칭

USE market_db;
SELECT mem_id --에러! buy.mem_id
FROM buy
	INNER JOIN member
    ON buy.mem_id = member.mem_id;

Error Code: 1052. Column 'mem_id' in field list is ambiguous

  • SELECT할 때 겹치는 열 이름은 어떤 테이블의 열인지 명확하게 표현해야 함!
  • 그런데 이러면 코드가 너무 길어진다는 문제가 있다.
  • FROM 절 뒤에 별칭을 주자!
SELECT B.mem_id, M.mem_name
FROM buy B 
	INNER JOIN member M 
    ON B.mem_id = M.mem_id;

 

 

4) 내부 조인 활용

SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM buy B 
	INNER JOIN member M 
    ON B.mem_id = M.mem_id
ORDER BY M.mem_id;

  • 한번도 구매하지 않은 회원의 정보는 없다. 
  • 구매하지 않은 회원의 정보도 같이 검색되려면 외부조인을 사용해야 한다.

 

 

B. 외부 조인

1) 외부조인의 기본

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
[WHERE 검색 조건]
  • LEFT OUTER JOIN: 왼쪽 테이블(member)의 내용은 모두 출력되어야 한다.
  • RIGHT OUTER JOIN: 반대. 오른쪽에 있는 회원테이블을 기준으로 외부조인.
  • FULL OUTER JOIN: 한쪽에 들어 있는 내용이면 출력. 자주 사용되진 않음.
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM member M
	LEFT OUTER JOIN buy B
    ON M.mem_id = B.mem_id
ORDER BY M.mem_id;

 

2) 외부 조인의 활용

SELECT DISTINCT M.mem_id, M.mem_name, B.prod_name, M.addr
FROM member M
	LEFT OUTER JOIN buy B
    ON M.mem_id = B.mem_id
WHERE B.prod_name IS NULL
ORDER BY M.mem_id;

 

 

 

C. 기타 조인

1) 상호조인 (cartesian product)

  • 한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 조인시키는 기능
  • 그래서 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.
SELECT *
FROM buy
CROSS JOIN member;
  • ON 구문은 사용할 수 없다.
  • 결과의 내용은 의미가 없다. 랜덤으로 조인하기 때문이다. 
  • 상호 조인의 주 용도는 테스트하기 위해 대용량의 데이터를 생성할 때!

 

2) 자체조인 (self join)

  • 자신이 자신과 조인한다는 의미
  • 1개의 테이블만 사용
  • 실무에서는 많이 사용하지 않지만, 회사의 조직 관계가 대표적
    • 직원의 직속 상관은 또한 회사의 직원이기도 하다. 
    • 그래서 직원의 직속 상관의 정보를 조회할 때 사용한다.
SELECT <열 목록>
FROM <테이블> 별칭A
	INNER JOIN <테이블> 별칭B
    ON <조인될 조건>
[WHERE 검색 조건]

 

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('경리부장', '관리이사', '1122');
insert into emp_table values('인사부장', '관리이사', '1133');
SELECT A.emp "직원", B.emp "직속상관", B.phone "직속상관연락처"
FROM emp_table A
	INNER JOIN emp_table B
    ON A.manager = B.emp
WHERE A.emp = '경리부장';

 

 

 

 

 

 

 

 

 

 

 

 

'SQL' 카테고리의 다른 글

NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10