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 |