SQL

!!!!!!!!!!! 중요 JOIN 중요 !!!!!!!!!!!

에어팟맥스 2022. 7. 7. 23:47

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