SQL/sql 문법(mysql, mariaDB)

1. JOIN _ CROSS JOIN, SELF JOIN, EQUI JOIN

읽히는 블로그 2024. 5. 4. 09:12

▤ 목차

     

     한 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 방법이다.

     JOIN은 관계형 데이터베이스의 가장 큰 장점이면서 대표적인 핵심 기능이라고 할 수 있다.

     일반적인 경우 행들은 PRIMARY KEY(PK)나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립된다.

     

    2개의 테이블이 존재할 때, 공통된 열을 통해 2개의 테이블을 합치는 것을 말한다.

       JOIN의 종류

    • CROSS JOIN
    • SELF JOIN
    • EQUI JOIN
    • INNER JOIN
    • OUTER JOIN

    ✔ cross join

    두 개의 테이블 사이에 모든 가능한 조합을 만들어낸다.

    💻 코드로 보기

    SELECT jikwon_name, buser_name FROM jikwon,buser;
    
    SELECT jikwon_name, buser_name FROM jikwon cross join buser;

    👏 정리

    위의 쿼리와 아래쪽 쿼리가 같은 쿼리문이다.

    아래는 명시적으로 적어준 것이다.

    카테시안 곱이 발생한다.

     

    A 테이블의 행이 10개이고 B 테이블의 행이 10개라면

    A 테이블 cross join B 테이블의 결과는 100개의 행이 나올 것이다.

     

    많은 데이터를 생성하기 때문에 다른 조인 유형을 선호한다.

    ✔self join

    스스로 JOIN이 될 수 있다. SELF JOIN은 CROSS JOIN 중 하나이다.

    JOIN을 말할때 한 개 이상의 테이블이 존재하면 JOIN이 가능하다고 했다.

    같은 테이블이 조인될 수 있기 때문이다.

    셀프 조인은 테이블의 이름을 꼭 지정해줘야 한다. (별칭을 사용할 수 있다.)

    똑같은 데이터가 있는 테이블이 2개이기에 SQL은 어떤 데이터를 가져와야 하는지 인식하지 못하기 때문이다.

    💻 코드로 보기

    SELECT a.jikwon_name, b.jikwon_name FROM jikwon a INNER JOIN jikwon b;

    🔸똑같은 테이블 조인?

    데이터를 가지고 있는데 왜 자신의 테이블을 JOIN하는 것일까?

    그 이유는 원본 테이블이 있고 그 테이블의 데이터를 복사해서 생성할 수 있기 때문이다.

    자신과 같은 테이블의 일정 부분을 가공해서 원래 테이블에 합쳐 구성을 할 수 있기 때문이다.

     


    ✔ EQUI join

    join 조건식에 ' = ' 연산자를 사용한다.

    💻 코드로 보기

    SELECT jikwon_name, buser_name FROM jikwon, buser WHERE jikwon.buser_num = buser.buser_no;

    👏 

    ✔ Non-Equi join

    Join은 JOIN조건을 = 연산자 이외의 비교(관계) 연산자를 사용하는 것을 말한다.

     

    해당 연산을 보기 위해서는 테이블을 하나 더 생성해야 한다.

    CREATE TABLE paygrade(grade INt PRIMARY KEY, lpay INT, hpay INT);
    INSERT INTO paygrade VALUES (1, 0,1999);
    INSERT INTO paygrade VALUES (2, 2000,2999);
    INSERT INTO paygrade VALUES (3, 3000,3999);
    INSERT INTO paygrade VALUES (4, 4000,4999);
    INSERT INTO paygrade VALUES (5, 5000,9999);
    SELECT * FROM paygrade;

     

    💻 사용하기

    SELECT jiktab.jikwon_name,jiktab.jikwon_pay,paytab.grade
    FROM jikwon as jiktab, paygrade as paytab
    WHERE jiktab.jikwon_pay >= paytab.lpay AND
    jiktab.jikwon_pay<= paytab.hpay;

     

    👏 정리

    = 이외의 비교 연산자 (Between, >, >=, <, <= 등)를 사용한다.

    😊정리

    SELF JOIN의 사용은 한 행에 있는 값을 같은 행에 있는 다른 값과 비교해야 할 때 사용한다.[SQL을 굉장히 잘 정리해 놓은 블로그이다. 참고하기 좋다.]

    https://kimsyoung.tistory.com/entry/SELF-JOIN-%E4%B8%8B-%EC%85%80%ED%94%84-%EC%A1%B0%EC%9D%B8%EC%9D%98-%EC%9A%A9%EB%A1%80?category=822739

     

    SELF JOIN (下) : 셀프 조인의 용례

    이전 글인 SELF JOIN (上) : 같은 테이블을 조인하기 에서는 셀프 조인의 기본적인 개념에 관해 살펴보았습니다. 셀프 조인은 같은 테이블 내의 데이터를 조인합니다. 즉, 하나의 테이블이 자기 자

    kimsyoung.tistory.com

     

     

    두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에는 EQUI JOIN을 사용할 수 없다.

    EQUI JOIN보다 더 많이 사용하는 INNER JOIN이 있다.

    왜 EQUI JOIN보다 더 많이 사용하는가?

    INNER JOIN으로 이루어진 코드는 EQUI JOIN보다  가독성이 더 높으며

    OUTER JOIN으로 수정이 가능하다.

     

    다음에는 INNER JOINOUTER JOIN를 정리해 보겠다.