# fullstack/database/p240610/select_join.sql
select * from dept_manager;
select * from departments;
수평 조인
from 절에 테이블명을 , 로 구분하여 여러 개
- 다대다 조인
# 다대다 조인 : M x N
# 있는 row 를 다 연결
select * from dept_manager, departments;
컬럼명을 다 써보자 !
select emp_no, dept_no, from_date, to_date, dept_no, dept_name
from dept_manager, departments;
어라 근데 error ! Column 'dept_no' in field list is ambiguous
select 절에 dept_no 가 2개(여러 개)가 있어서 구분하기 어려움 !
원래 컬럼명에서 테이블명이 생략된 거라
테이블명을 명시해주면 잘 실행이 됨
join 을 쓸 때 조심해야 되는 이유 : 같은 컬럼명이 있는 경우 error
select emp_no, dept_manager.dept_no, from_date, to_date, departments.dept_no, dept_name
from dept_manager, departments;
코드가 길어지는데 이걸 줄일 수 없을까 ! 그럴 때 as 사용 !
as 는 생략 가능 ! 원래 테이블명이 생략된건데 as 를 써서 테이블명을 명시해준 것
select emp_no, dm.dept_no, from_date, to_date, de.dept_no, dept_name
from dept_manager dm, departments de;
수직 조인
where 절에 조인 조건(징검 다리)
[문제 1] 부서번호가 같은 row 수평 조인
# 1)
select emp_no, dm.dept_no, from_date, to_date, dp.dept_no, dept_name
from dept_manager as dm, departments as dp
where dm.dept_no = dp.dept_no; # 조인 조건
[문제 2] 특정 칼럼만 조회!
select dept_name, emp_no
from dept_manager dm, departments dp
where dm.dept_no = dp.dept_no;
[문제 3-1] 부서의 현재 매니저 정보 조회
dept_manager 와 departments 의 join 조건은 dept_no
근데 어느 테이블의 dept_no 인지 알기 위해서 별칭(ALIAS) 사용 !
as 는 생략 가능
from dept_manager dm, departments dp
where dm.dept_no = dp.dept_no
코드는 위에서 아래로 왼쪽 기준으로 코드를 읽기 때문에
생각을 하고 쿼리문을 작성해야함 !
그래서 코드를 작성할 때 먼저 작성한 테이블 컬럼에 따라 시간 차이가 발생함
테이블의 모든 컬럼을 보는게 아니라 부서명과 사번을 보는거니까
select dept_name as '부서명', emp_no as '사번'
지금 DB 에는 과거에 일했던 매니저, 현재 근무 중인 매니저 다 포함되어 있기 때문에
현재 매니저만 DB 를 가져 오기 위해서 조건 걸기 !
to_date like '9999-01-01'
그럼 실행해보자 !
select dept_name as '부서명', emp_no as '사번', to_date
from dept_manager dm, departments dp
where dm.dept_no = dp.dept_no and to_date like '9999-01-01';
확인했으니까 to_date 는 이제 빼주고 끝 -
select dept_name as '부서명', emp_no as '사번'
from dept_manager dm, departments dp
where dm.dept_no = dp.dept_no and to_date like '9999-01-01';
[문제 3-2] 사원의 사번, 이름, 직책 조회 단, 현재 직책만 조회
사원의 사번과 이름은 employees 테이블에 ! 직책은 titles 테이블에 있다
여러 개의 테이블을 콤마(,) 로 해주는데 join 된 것 !
여기서 주의 점은 emp_no 는 employees 테이블에도 있고, titles 테이블에두 있다.
select emp.emp_no, first_name, title
from employees emp, titles t
그럼 다대다 조인이 되기 때문에 시간이 오래 걸리니까
조건을 걸어주자
select emp.emp_no, first_name, title
from employees emp, titles t
where emp.emp_no = t.emp_no
employees 는 30만개쯤, titles 는 44만개 정도 나오는데 실행해보면 titles 과 묶다보니까 불필요한 데이터까지 나옴 ..!
과거 직책도 있기 때문에 현재 직책에 맞는 row 만 추출해주자
select emp.emp_no, first_name, title
from employees emp, titles t
where emp.emp_no = t.emp_no and t.to_date = '9999-01-01';
수직 조인 - union, union all
합집합 : union - 중복 제거, union all - 중복 모두 표시
- 테이블 구조로 type 확인하기
desc dept_emp;
desc departments;
- union : 중복 제거
select dept_no, emp_no
from dept_manager
union
select dept_no, dept_name
from departments;
select dept_no
from dept_manager
union
select dept_no
from departments;
- union all : 중복 모두 표시
DBMS 에서 중복이란 row 가 똑같은 데이터가 들어간 row 여야 함
select dept_no, emp_no
from dept_manager
union all
select dept_no, dept_name
from departments;
select dept_no
from dept_manager
union all
select dept_no
from departments;
SQL JOINS
select * from customer;
select * from order_list;
# database/p240617/join.sql
1. INNER JOIN : 교집합
# INNER JOIN ===========================================================
# cf)
select *
from customer c, order_list o
where c.id = o.id; # 조인 조건(조인 조건을 where 에 두는 건 사실 맞지는 않음)
# 조인 조건이 from 절에 들어옴
# 이 방법을 더 권장
# 근데 나머지 데이터는 조회가 안됐는데 이러한 현상을 참여하지 않은 row 라 부름
# inner join
select *
from customer c inner join order_list o on c.id = o.id;
2. LEFT JOIN
# LEFT JOIN ===========================================================
# from 절 기준으로 왼쪽 오른쪽을 구분
# 조인에 참여하지 않은 로우 포함
# on : join 조건
# ex) 시크릿 쿠폰
select *
from customer c left join order_list o on c.id = o.id;
# 조인에 참여하지 않은 로우만 표시
select *
from customer c left join order_list o on c.id = o.id
where o.id is null;
3. LIGHR JOIN
# right JOIN ===========================================================
# from 절 기준으로 왼쪽 오른쪽을 구분
select *
from customer c right join order_list o on c.id = o.id;
# 조인에 참여하지 않은 로우만 표시
select *
from customer c right join order_list o on c.id = o.id
where c.id is null;
4. 합집합 : 모든 로우 조회
# full outer join =====================================================
# MySQL 은 full outer join 지원 x
# Error Code: 1064. You have an error in your SQL syntax;
# check the manual that corresponds to your MySQL server version for the right syntax to use near
# 'full outer joinorder_list o on c.id = o.id' at line 1
# select * from customer c full outer joinorder_list o on c.id = o.id;
full outer join은 오라클문법 ..!
mysql 에서는 left join 과 right join 을 합쳐주면 된다 !
중복이 되는 부분을 제거해서 데이터 조회를 하면 된다 !
union 을 쓰면 중복된 값을 제외해줄 것
cf) union all = 중복된 값 모두 출력
select *
from customer c left join order_list o on c.id = o.id
union
select *
from customer c right join order_list o on c.id = o.id;
5. 합집합 - 교집합 : 조인에 참여하지 않은 모든 로우 조회
합집합에서 교집합을 빼주면 된다 !
빼는 방법들이 있긴 한데 그 중 방법 하나만 .. !
select *
from customer c left join order_list o on c.id = o.id
where o.id is null
union
select *
from customer c right join order_list o on c.id = o.id
where c.id is null;
'Others > 데이터베이스' 카테고리의 다른 글
[SQL] 그룹 함수 집계 함수 문법 정리 및 예제 (0) | 2024.06.16 |
---|---|
[SQL] SubQuery : 서브 쿼리 문법 정리 및 예제 (0) | 2024.06.16 |
[SQL] 데이터형 (0) | 2024.06.16 |
[SQL] 연산자 종류와 문법 정리 (0) | 2024.06.16 |
[SQL] TCL (트랜잭션 제어어) 문법 정리 및 예제 (0) | 2024.06.16 |