두 개 이상의 테이블의 연관 있는 행들끼리 연결해서 새로운 가상의 테이블을 생성하고, 그 가상의 테이블에서 데이터를 조회하는 것이다.
조인을 하게 되면 카티션 곱으로 전체의 행이 합해지는 가상의 테이블이 생성되기 때문에 어떤 column이 연결이 되는지 알고 있어야한다.
같은 테이블이던, 다른 테이블이던 참조하고 있는 외래키가 존재하고 있기 때문에 함께 join을 진행해주면 된다.
RDBMS는 모든 정보를 하나의 테이블에 저장하는 것이 아니라, 데이터가 정규화되어 여러 테이블에 분산되어있다.
데이터가 여러 테이블에 흩어져 있기 때문에 사용자가 원하는 데이터를 찾기 위해서는 여러 테이블을 다 조회해야한다.
SELECT
5
FROM
1
WHERE
2(조건절에서 먼저 거르고)
GROUP BY
3(그룹핑을 진행 후 )
HAVING
4(필터링을 진행한다. )
ORDER BY
6
조인은 데이터의 무결성과 중복방지로 테이블이 정규화되어 나눠져 있는 것을 통합하여 조회해야할 일이 많기 떄문에 조인은 필수불가결로 사용하게 된다.
조인은 여러테이블에 흩어져있는 정보중에서 사용자가 원하는 정보만 가져와서 가상의 테이블처럼 만들어서 데이터를 조회하는 것이다.
카티션 곱 : FROM절에 조회할 데이터 테이블만 입력해놓은 상태이다.
조건을 따로 지정해놓지 않았기 때문에
그냥 둘이 붙어있는 행의 형태가 출력된다. 이것을 카티션 곱이라고 한다.
조인의 종류 : 등가 조인, 비등가 조인, 셀프조인, 포괄조인
등가 조인 : 값이 같은 행끼리 연결 짓는 것을 등가 조인이라고 한다.
테이블 조인하기 SELECT 테이블1.컬럼명, 테이블2.컬럼명, ... FROM 테이블 1, 테이블 2 WHERE 조인조건;
조인 조건이 반드시 포함되어야한다. 조인조건이 없으면 불필요한 행들이 연결된 것이다.
등가조인 : 값이 같은 것끼리 연결되게 하는 것 조인 조건에서 = 연산자를 사용해서 선행 테이블과 후행테이블의 연관있는 행을 조인시킨다.
비등가 조인 : TABLE을 하나 만들어야한다.
테이블을 조인할 때 같은 값을 가진 행끼리 조인하는 것이 아니라, 크다/작다 조건을 이용해서 행을 조인시키는 방식이다.
등급(등급마다 보통 최소값/ 최대값 정해져있고, 해당 범위에 속할 때 그 등급이 부여된다. )을 조회할 때 활용된다.
해당 등급을 계산할 때 사용을 한다. 거의 그 구간의 부여되는 등급 계산시에 사용됨
셀프조인 : 같은 table에서 역활을 나눠서 join하는 것, 상위정보를 알기위해서 self join을 진행한다.
하나의 테이블 이용해서 조인을 구성하는 것
하나의 테이블 안에 상위데이터, 하위 데이터가 있는 경우 상위데이터와 하위데이터를 서로 연관지어서 조회할 때 셀프 조인을 사용한다.
하나의 테이블의 역활을 각각 나누어서 조인에 참여시켜야 한다.
SELECT E1.EMPLOYEE_ID, E1.FIRST_NAME EMP_NAME, E2.FIRST_NAME MGR_NAME FROM EMPLOYEES E1, EMPLOYEES E2 WHERE E1.MANAGER_ID = E2.EMPLOYEE_ID AND E1.DEPARTMENT_ID = 60;
테이블안에 연관된 행이 있다.
조직도 메뉴, 카테고리 구성된 계층적인 구조를 가지고, 같은 테이블내에 존재하여, 관계선이 Self조인으로 참조할 행이 안에 존재하게 된다.
직원테이블안에 상사의 아이디가 있고, 상사의 아이디는 직원의 아이디로 존재하고 있다.
역활을 나눠서 같은 것끼리 연결한다.
상위정보를 알기위해서 Self join을 진행한다.
가전제품이 어떤건지 알고 싶다면 상위번호 1000번을 확인하면 하위의 갯수가 나오는 것과 동일하다.
하위를 찾기 위해 상위를 선택하는 것이다.
상위를 찾기 위해서는 self join을 사용한다.
포괄 조인(outer join)
포괄조인은 한쪽테이블에는 데이터가 있고, 다른쪽 테이블에는 데이터가 없는 경우에 데이터가 있는 쪽 테이블의 내용을 null이 없는 행에 (+) 를 붙여 null의 데이터가 출력되게 하는 방법이다.
비등가, 등가 조인의 경우 null이 없는 행은 출력이 되지 않기 때문에, 포괄조인을 이용하면 null의 항목을 출력할 수 있다.
쿼리의 실행속도를 많이 떨어뜨리기 때문에 되도록 포괄조인이 되지 않도록,
null값이 없도록 해야한다. default로 값을 설정하는 것이 좋다.
양쪽 모두에 (+)를 붙일 수 없다.
null행이 필요한 곳에 붙인다.
null이라고 출력되어있는 곳은 (+)를 붙이지 않는다. 그 반대편에 붙여준다
SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, D.MANAGER_ID, E.FIRST_NAME FROM DEPARTMENTS D, EMPLOYEES E WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID(+) ORDER BY DEPARTMENT_ID ASC;