JOIN(조인)은 테이블(뷰)과 테이블(뷰)을 합치는 것을 말하는데
행(ROW) 과 행(ROW)을 합치는 것이 아니라, 컬럼(COLUMN) 과 컬럼(COLUMN)을 합치는 것을 말한다.
위에서 말한 행(ROW) 과 행(ROW)을 합치는 것은 UNION 연산자를 사용하는 것이다.
-- 면접 예상 질문 : INNER JOIN(내부조인) 과 OUTER JOIN(외부조인)의 차이점에 대해 말해보세요.
-- 면접 예상 질문 : JOIN 과 UNION 의 차이점에 대해서 말해보세요.
A = {1, 2, 3} 원소가 3개
B = {a, b} 원소가 2개
A ⊙ B = { (1,a), (1,b)
,(2,a), (2,b)
,(3,a), (3,b) }
데카르트곱(수학) ==> 원소의 곱 : 3 * 2 = 6개(모든 경우의 수)
--> 수학에서 말하는 데카르트곱을 데이터베이스에서는 Catersian Product 라고 부른다.
JOIN => SQL 1992 CODE 방식 --> 테이블(뷰) 과 테이블(뷰) 사이에 콤마(,)를 찍어주는 것.
콤마(,)를 찍어주는 것을 제외한 나머지 문법은 데이터베이스 밴더(회사) 제품마다 조금씩 다르다.
JOIN => SQL 1999 CODE 방식(ANSI) --> 테이블(뷰) 과 테이블(뷰) 사이에 JOIN 이라는 단어를 넣어주는 것.
ANSI(표준화) SQL
[CROSS JOIN] 사용 예시
1. CROSS JOIN 은 프로야구를 예로 들면 10개 팀이 있고 각 1팀당 경기를 몇번 해야 하는지 경우의 수를 구할 때 쓰인다.
1팀당 모든 다른 팀과 경기를 펼쳐야 한다.
2. CROSS JOIN 은 그룹함수로 나온 1개의 행을 가지고 어떤 데이터 값을 얻으려고 할 때 사용한다.
employees 에는 107개 행이 있고, departments 에는 27개 행이 있다.
select *
from employees
select count(*)
from employees; -- 107개 행
select *
from departments;
select count(*)
from departments; -- 27개 행
employees 에는 107개 행이 있고, departments 에는 27개 행이 있으므로 JOIN을 하면 컬럼의 개수는
107*29인 2889개가 됨.
SQL 1992 CODE 방식으로 컬럼 합치기
select *
from employees, departments; --> SQL 1992 CODE 방식, Catersian Product
select count(*)
from employees, departments; --> SQL 1992 CODE 방식
-- 2889개
select 107 * 27 -- 2889개
from dual;
SQL 1999 CODE 방식으로 컬럼 합치기
select *
from employees CROSS JOIN departments; --> SQL 1999 CODE 방식, Catersian Product
select count(*)
from employees CROSS JOIN departments; --> SQL 1999 CODE 방식
-- 2889개
select 107 * 27 -- 2889
from dual;
-- [CROSS JOIN 사용 예]
사원번호 사원명 부서번호 기본급여 기본급여전체평균 기본급여평균과의차액 이 나오도록 하기
아래의 방법은 오류가 발생한다.
기본급여전체평균을 제외한 컬럼들은 다수의 값을 가지고 있는데,
기본급여전체평균은 하나의 값을 가지고 있기 때문이다.
select employee_id 사원번호
, first_name || ' ' || last_name 사원명
, department_id 부서번호
, salary 기본급여
, trunc(avg(salary))기본급여전체평균 -- 오류 발생
from employees;
select employee_id 사원번호
, first_name || ' ' || last_name 사원명
, department_id 부서번호
, salary 기본급여
from employees; -- 107개 행
select trunc(avg(salary)) 기본급여전체평균
from employees; -- 1개 행
-- 사원번호 사원명 부서번호 기본급여 기본급여전체평균 기본급여평균과의차액
-- ============================== + ----------------------
-- A(107개 행) B(1개 행)
-- A CROSS JOIN ==> 107*1 = 107개 행
select A.employee_id as 사원번호 , A.ENAME as 사원명, A.department_id as 부서번호, A.salary as 기본급여
, A.salary-B.avg_salary as 기본급여평균과의차액
-- A. 는 생략가능
from
(
select employee_id
, first_name || ' ' || last_name as ENAME
, department_id
, salary
from employees
) A
CROSS JOIN
(
select trunc( avg(salary) ) as avg_salary
from employees
) B
order by 5;
select employee_id as 사원번호 , ENAME as 사원명, department_id as 부서번호, salary as 기본급여
, salary-B.avg_salary as 기본급여평균과의차액
from
(
select employee_id
, first_name || ' ' || last_name as ENAME
, department_id
, salary
from employees
) A
CROSS JOIN
(
select trunc( avg(salary) ) as avg_salary
from employees
) B
order by 5;
'SQL' 카테고리의 다른 글
NON-EQUI JOIN (0) | 2022.07.08 |
---|---|
EQUI JOIN (0) | 2022.07.08 |
상관서브쿼리(== 서브상관쿼리) (0) | 2022.07.07 |
PairWise(쌍) Sub Query (0) | 2022.07.07 |
Sub Query (서브쿼리)에서 사용되는 ANY, ALL (0) | 2022.07.07 |