Join
여러 개의 테이블을 하나로 합쳐서 원하는 데이터를 조회할 때 사용하는 SQL 연산
inner join
두 테이블에서 일치하는 행만 반환
- `on` 조건을 만족하는 경우만 결과로 출력
select A.*, B.*
from employees A
inner join departments B
on A.department_id = B.department_id;
left outer join
왼쪽 테이블의 모든 행을 가져오고, 오른쪽 테이블에서 일치하는 행이 있으면 가져오며, 없으면 `null`을 반환
select A.*, B.*
from employees A
left outer join departments B
on A.department_id = B.department_id;
right outer join
오른쪽 테이블의 모든 행을 가져오고, 왼쪽 테이블에서 일치하는 행이 있으면 가져오며, 없으면 `null`을 반환
select A.*, B.*
from employees A
right outer join departments B
on A.department_id = B.department_id;
full outer join
양쪽 테이블의 모든 행을 포함하고, 일치하는 행이 없으면 `null`을 반환
select A.*, B.*
from employees A
full outer join departments B
on A.department_id = B.department_id;
self join
같은 테이블을 조인하여 데이터를 비교하는 방식
- 테이블에 별칭을 사용하여 두 개의 테이블처럼 다룸
select E1.employee_id, E1.name as Employee, E2.name as Manager
from employees E1
inner join employees E2
on E1.manager_id = E2.employee_id;
view
가상의 테이블
- 실제 데이터를 저장하지 않지만, SQL 쿼리를 실행할 때 테이블처럼 사용 가능
- 복잡한 SQL을 간단하게 만들거나, 특정 데이터만 접근할 수 있도록 제한하는 용도
view 생성 권한 부여
grant create view to kh15;
view 생성
create view employee_department as
select e.employee_id, e.name, d.department_name
from employees e
inner join departments d
on e.department_id = d.department_id;
view 수정
create or replace view employee_department as
select e.employee_id, e.name, e.salary, d.department_name
from employees e
inner join departments d
on e.department_id = d.department_id;
view 삭제
drop view employee_department;
view 조회
select * from employee_department where department_name = 'Sales';
view 장점
- sql 단순화: 복잡한 쿼리를 한 번 정의하고, 쉽게 사용 가능
- 보안성 향상: 특정 컬럼만 보이도록 설정 가능
- 데이터 무결성 유지: 원본 테이블을 변경하지 않고도 특정 데이터를 가공하여 제공 가능
view vs dual 차이
구분 | view | dual |
생성 방식 | 사용자가 직접 생성 | 오라클에서 기본 제공 |
데이터 저장 | ❌ | ❌ |
용도 | 테이블처럼 사용, 복잡한 쿼리 단순화 | 함수 실행, 연산 결과 조회 |
사용 예시 | `select * from view_name;` | `select sysdate from dual;` |
join, view 사용 예시
게시글, 회원 테이블 조인
- 게시글 목록을 조회하면서 회원 정보를 연결해서 조회
- 상위 게시글 테이블과 `self join`
- 둘 다 모두 `outer join`을 이용하여 조인조건이 부합하지 않으면 `null`값을 부여
- 뷰를 생성하거나 수정
grant create view to kh15;
create or replace view board_list_view as
select
T.board_no target_no, T.board_title target_title,
B.board_no, B.board_title, B.board_content,
B.board_writer, B.board_wtime, B.board_etime,
B.board_like, B.board_read, B.board_reply,
B.board_group, B.board_target, B.board_depth,
M.*
from board B
left outer join member M
on B.board_writer = M.member_id
left outer join board T
on T.board_no = B.board_target;
select * from board_list_view;
'Oracle' 카테고리의 다른 글
[Oracle] hierarchy query (0) | 2025.02.10 |
---|---|
[Oracle] rownum과 top n query (0) | 2025.02.10 |
[Oracle] group query (0) | 2025.02.10 |
[Oracle] dual (0) | 2025.02.10 |
[Oracle] 외래키 (0) | 2025.02.10 |