데이터 및 C언어/SQL 공부

[SQL] SQL 공부 : SQL문 정리하기 - 기본 난이도(3)

  • -
반응형

 

 

 

 

[SQL] SQL 공부 : SQL문 정리하기 - 기본 난이도(3)

 


 

 

∇ 공부 겸 정리 목표

 

       (1)에서 정리한 내용들.

             

      - SELECT , FROM, LIMIT 

      - WHERE

      - ORDER BY

      - 중복 제거[DISTINCT / GROUP BY/ 서브쿼리

      - 집계 함수 [ SUM, COUNT, AVG 등 ] 

      - GROUP BY [ 데이터 그룹화 ] 

 

 

    (2) 글에서 정리한 내용들,

      - 소수점 처리 [ ROUND / TRUNCATE / CAST, CONVERT ] 

      - SQL 숫자 연산

      - HAVING

      - 조건문[ CASE, IF() ]

      - UNION, UNION ALL

 

 

 

 # 이번 글에서 정리 내용들,

      - INNER JOIN

      - LEFT JOIN, RIGHT JOIN

      -셀프 조인

 

++ AARRR/ RFM 

 

 

 

 


 

 

       8.JOIN.

          -  JOIN은 쉽게 이야기하면, '집합'의 개념과 매우 유사합니다.

             테이블 간의 관련 열을 기반으로, 두 개 이상의 테이블에서 행을 결합하는 데 사용됩니다.

 

          - JOIN의 종류에는

             [ INNER JOIN, LEFT JOIN(LEFT OUTER JOIN), RIGHT JOIN(RIGHT OUTER JOIN), FULL OUTER JOIN ]

 

 

 

 

 

 

∂ JOIN 절을 사용하기 위한 기본 구문. !

             - 테이블 두개를 JOIN으로 연결해주는게 기본적인 형태.

                      - 테이블 1과 테이블 2는 데이터 구조도 동일하게 하는 것을 권장합니다.

                      - Bigquery에서는 데이터 구조가 다르면 join시 Error가 발생.

 

                    - SELECT column_list : 결과에 포함할 열들을 지정.

                               - 여러 테이블의 열을 선택 가능

                               - 테이블 이름이나 별칭을 사용하여 명확히 할 수 있음. (AS 별칭)

 

                    - FROM table1 :  첫 번째(기준점) 테이블을 지정.

 

                    -  [ JOIN TYPE ] : 사용할 JOIN의 유형을 지정

                               - ex) INNER , LEFT, RIGHT ,FULL OUTER 등....

 

                    - JOIN table2 : JOIN할 두번째 테이블을 지정.

 

                    - ON join_condition : 두 테이블을 연결한 조건을 지정/ 

                                - 보통, 두 테이블의 관련된 열(공통된 열)을 비교하는 조건을 사용.

 

 

                                                   ex)

                                                         - Employees와 Departments는 JOIN된 두 테이블.

                                                         - e,d를 별칭으로 사용.

                                                         - On e.DepartmentID = d. DepartmentID 는 JOIN 조건.

 

 


            ∇ JOIN 구문을 작성할 때 주의할 점.

                     1. 테이블 별칭 사용 : 긴 테이블 이름을 짧게 만들어서 쿼리의 가독성을 높일 것!

                     2. 적절한 JOIN 유형 선택 : 데이터 요구사항에 맞게 적절한 JOIN 유형 선택.

                     3. JOIN 조건 최적화 :

                             - 올바른 열을 사용하여 JOIN 조건을 설정.

                             - 필요한 경우 인덱스를 사용하여 쿼리 성능을 향상시킬 수 있음.

                      4. 다중 테이블 JOIN : 필요한 경우 두개 이상의 테이블 JOIN 가능.

 

 

 


   ±실습용 더미 테이블

-- 직원 테이블
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50),
    DepartmentID INT
);

-- 부서 테이블
CREATE TABLE Departments (
    DepartmentID INT PRIMARY KEY,
    DepartmentName VARCHAR(50)
);

-- 데이터 삽입
INSERT INTO Employees VALUES (1, '김철수', 1), (2, '이영희', 2), (3, '박지성', 1), (4, '최민지', NULL);
INSERT INTO Departments VALUES (1, '영업부'), (2, '개발부'), (3, '인사부');

 

 

 

     

            8-1. INNER JOIN : 두 테이블에서 일치하는 값을 가진 행을 반환합니다.

                         - 교집합에 해당하는 개념.

           

                     

          

                          - Employees => e   // Department => d 로 별칭 지정하고 JOIN

                          - e의 DepartmentID와 d의 DepartmentID가 동일한 행을 반환.

                         

 

 

 

 


∇ OUTER JOIN

 

             8-2. LEFT (OUTER) JOIN  : 

                   : 기본적으로 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환하는데,

                     일치하는 항목이 없으면 오른족 테이블의 열에 대해 NULL값이 반환합니다!

 

     * FROM "Tabel"에 초점을 맞춘 JOIN입니다.

 

 

                             + 왼쪽(첫 번째) 테이블[FROM테이블]의 모든 레코드를 반환하고, 

                                 JOIN을 걸은 오른쪽(두번째) 테이블에서 일치하는 레코드가 있으면 그 정보도 함께 반환!!

                                 [ 자식 테이블의 데이터를 모두 보존하면서, 부모 테이블의 데이터를 조회 ] 

 

- 왼쪽 테이블[table1]의 모든 행이 결과 집합에 포함.

- 오른쪽 테이블[table2]에서 일치하는 행이 없는 경우, 결과출력에서 오른쪽 테이블의 열은 NULL값으로 채워집니다.

 

 

+ 사용 케이스 예시.

         - 주 테이블을 기준으로 관계가 없는 데이터를 포함하여 모든 데이터를 조회할 때 유용.

     

               ex) 모든 직원 정보[Employees]와 해당 부서 정보[Departments]를  부서아이디를 기준으로 조회하되,

                       부서가 없는 직원도 포함해서 출력해서 같이 보고 싶을 때.

                     

                               - 최민지는 부서가 없지만, LEFT JOIN으로 걸었기 때문에,

                                   NULL값으로 포함된 것을 확인 할 수 있습니다.                     

 

                          

 

 

                                  - LEFT JOIN은 왼쪽 테이블의 모든 행을 포함하게 되므로,

                                       대용량 데이터셋에서는 조회 성능에 영향을 줄 수 있어서 주의 요망.

 

                                  # INNER JOIN과의 차이 : INNER JOIN은 양쪽 테이블이 일치하는 값만 출력하는 반면,

                                           LEFT (OUTER) JOIN은 기준(왼쪽) 테이블의 모든 행을 반환.

 

 

 

 


 

 

                    8-3. RIGHT (OUTER) JOIN  :

                                - RIGHT JOIN(RIGHT OUTER JOIN)은 LEFT JOIN과 유사하지만 방향이 반대.

                                    [ 부모테이블의 값을 모두 보존하면서 자식 데이터를 조회 ]

 

                                - RIGHT JOIN은 오른쪽(두번째)테이블의 모든 레코드를 반환하고,

                                                             왼쪽(첫 번째) 테이블에서 일치하는 레코드가 있으면 그 정보도 함께 반환!

 

                                           # LEFT와 반대로, table2가 중점, table2의 모든 값을 불러옴.

 

                                  - 오른족 테이블의 모든 행이 결과에 포함.

                                  -  FROM으로 연결한 왼쪽 테이블에서 일치하는 행이 없는 경우,

                                          결과에서 왼쪽 테이블의 열은 NULL값으로 채워집니다.

 

 

                                  -  LEFT와 RIGHT JOIN의 결과와 거의 동일한데, 

                                      그 방향성이 FROM으로 연결한 테이블에 있는지

                                                           JOIN으로 연결한 테이블에 있는지의 차이!!

 

 


                      8-4 FULL (OUTER) JOIN  :

                          : 모든 데이터 조회를 위한 합집합 개념  . 

 

                             - LEFT JOIN과 RIGHT JOIN을 결합한 것과 같은 효과!

                                [합치면서, 양쪽 각 테이블에 서로 존재하지 않는 것들은 NULL값으로 표기]

             

                            - 양쪽 테이블의 모든 레코드를 반환, 일치하는 코드가 있으면 연결하고

                                               없으면 NULL 값으로 채워서 반환합니다.

 

 

                              - 연결한 두 개의 테이블의 모든 행이 결과에 포함됩니다.

                                   - 일치하는 행이 없는 경우, 해당 테이블의 열은 NULL값으로 채워짐.

 

 

                                           - '최민지'는 부서가 없지만(Employees 테이블에 있음) 결과에 포함.

                                           - '인사부'는 소속 직원이 없지만(Departments 테이블에 있음) 결과에 포함/

 

                           ++ 두 테이블 간의 모든 관계와 불일치를 한번에 볼 때 유용!!

                           ++ MY SQL이나 ORACLE에서는 지원됨.

                                  - 지원되지 않는 곳에서는 LEFT JOIN과 RIGHT JOIN을 UNION ALL으로 결합하는 방식으로! 

 

 

 


 

 

∇ CROSS JOIN(교차 결합)

            : CROSS JOIN은 간략하게 설명하면, 테이블A와 테이블B를  

               조건 없이 모두 매칭한 결과를 만들어앱니다. [ 모든 가능한 조합을 만들어냅니다 ]

 

                               - 테이블 A의 각 행에 테이블B의 모든 행이 조합되는 것!


∇ FULL OUTER JOIN과 CROSS JOIN의 차이점 집고 넘어가기!

                  1. FULL OUTER JOIN

                        - 양쪽 테이블의 모든 행을 결과에 포함.

                       - 일치하는 행이 있으면 연결하고, 없으면 NULL로 채우기.

                       - 조인 조건(ON절)을 사용.

                      - 결과 행의 수는 두 테이블의 고유한 행의 합계를 초과하지 않습니다.

 

                  2. CROSS JOIN.

                       - 두 테이블의 모든 가능한 조합을 생성 ( 카다시안 곱 )                         

                      - 조인 조건을 사용하지 않음

                     - 결과로 나온 행의 수는 두 이플의 행수를 곱한 것과 같음(교차)

                     

 

                   √ FULL OUTER JOIN은 일치하는 행과 일치하지 않는 행을 모두 포함하며,

                          조인과 조건에 따라 결과를 생성.

 

                  √ 반면, CROSS JOIN은 모든 가능한 조합을 만들어냄.

 

 

 


 

∇ SELF JOIN

             8-5. SELF(자체) JOIN : 자신이 자신을 조인하다는 의미로, 1개의 테이블만을 사용합니다.

                     [ 자기 자신에게 테이블을 조인하는 법 ]

                        - 주로 같은 테이블 내의 레코드 간 관계의 표혈할 때 사용.

 

           >기본 개념.

                   - 동일한 테이블을 두번 참조하여 조인.

                 - 테이블에 별칭을 사용하여 인스턴스 구분.

 

             > 주요 사용 사례

                 - 계층 구조 표현 (EX: 직원-관리자 관계)

                 - 순차적 관계 표현(이전, 다음 항목)

 

 

 

 

 

 

 

  • SELF JOIN의 특징:
    • 같은 테이블을 두 번 이상 참조할 수 있습니다.
    • 다양한 JOIN 유형(INNER, LEFT, RIGHT 등)을 사용할 수 있습니다.
    • 복잡한 계층 구조나 관계를 표현할 수 있습니다.
  • 주의사항:
    • 별칭 사용이 필수적입니다. 그렇지 않으면 열 이름 충돌이 발생합니다.
    • 복잡한 SELF JOIN은 성능에 영향을 줄 수 있으므로 주의가 필요합니다.
    • 순환 참조나 무한 루프에 주의해야 합니다.

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.