[Basic] Join 함수

고보·2024년 1월 23일

1 조인 개념

1-1 조인

  • 여러 테이블에 저장된 데이터를 한 번에 조회. 2개 이상의 테이블을 '결합(JOIN)한다는 의미.
  • INNER JOIN: 두 테이블의 공통된 값에 기초해 데이터 결합. 두 테이블에서 일치하는 행만 결과에 포함.
  • OUTER JOIN: 두 테이블의 모든 행 포함. 두 테이블 중 하나에만 있는 행도 결과에 포함.
    ex) 학생 명부에 학과번호만 있고, 학과 데이터에 학과 번호와 이름이 같이 있다. => 학과 이름으로 학과별 학생을 보고 싶다.
SELECT s.studno, s.name, s.deptno, d.dname
FROM student s, department d
WHERE s.deptno = d.deptno

1-2 칼럼 이름의 애매모호성

  • 서로 다른 테이블에 동일 테이블 => student.deptno처럼 테이블명.칼럼명 구조로.
  • FROM 절에 별명 이용 FROM student AS ss.deptno로 처리 가능. 여기서 AS는 생략해서 FROM student s로도 가능.
    해당 별명은 해당 SQL 명령문 내에서만 유효하다.

2 종류

2-1 카티션 곱(Cartesian product)

  • 2개 이상의 테이블에 대해 연결 가능한 행을 모두 결합.
    16개행의 테이블과 7개 행의 테이블을 카티션곱하면, 16*7개 112건의 데이터가 나온다.
  • 사실상 조건을 잘못 설정한 경우다. 모두 결합시켜 의미도 없고, 너무 대용량.
  • 조인 조건 WHERE을 생략하면 발생하고, CROSS JOIN으로도 실행 가능.
SELECT s.name, s.deptno, d.dname, d.loc
FROM student s, department d;

SELECT s.name, s.deptno, d.dname, d.loc
FROM student s CROSS JOIN department d;

2-2 EQUI JOIN

  • join attribute: 조인할 때 사용되는 열(속성)
  • 각각의 테이블의 공통 칼럼(조인 애트리뷰트)에서 '=' 비교로 같은 값을 가지는 행을 연결하여 결과 생성

2-2-1 WHERE절 이용

SELECT s.studno, s.name, s.deptno, d.dname
FROM student s, department d
WHERE s.deptno = d.deptno;

2-2-2 NATURAL JOIN 이용

  • NATURAL JOIN 키워드 사용 => 자동적으로 테이블의 모든 칼럼을 대상으로 공통 칼럼을 조사 => 내부적으로 생성
    주의: 다른 건 별명 사용해도 되지만, 조인 애트리뷰트는 어차피 합쳐질 것이기 때문에 별명 사용하지 않는다.
SELECT s.studno, s.name, s.deptno, d.dname, deptno 
		(deptno로 합쳐질 것이기 때문에 이것만 별명 X)
        (별명 적용하면 오류 뜬다)
FROM student s NATURAL JOIN department d;

2-2-3 JOIN USING 이용

  • 칼럼 이름이 동일한 이름으로 정의되어 있을 때 => USING절로 조인
    주의: 마찬가지로 조인 애트리뷰트는 테이블 별명 사용하지 않는다.
SELECT s.studno, s.name, deptno, d.name
			(마찬가지로 deptno로 합쳐질 것이기에 별명 X)
FROM student s
JOIN department d 
USING (deptno);

2-2-4 JOIN ON 이용 (INNER JOIN)

  • JOIN은 default가 INNER JOIN
  • INNER JOIN: 두 테이블의 공통된 값에 기초해 데이터 결합. 두 테이블에서 일치하는 행만 결과에 포함.
SELECT s.studno, s.name, s.deptno, d.name
FROM student s
INNER JOIN department d 
ON s.deptno = d.deptno;

2-3 NON-EQUI JOIN

  • '='가 아닌 <, BETWEEN, AND 같은 비교 연산자 사용.
SELECT p.profno, p.name, p.sal, s.grade
FROM professor p, salgrade s
WHERE p.sal BETWEEN s.losal AND s.hisal
AND p.deptno = 101;

2-4 OUTER JOIN

  • OUTER JOIN: 두 테이블의 모든 행 포함. 두 테이블 중 하나에만 있는 행도 결과에 포함.
  • 양측 칼럼 중 어느 하나라도 NULL이면 '=' 결과가 무조건 거짓 => NULL 값 출력 불가 (NULL에 대해 어떤 연산의 결과도 NULL)
    => 하나가 NULL이지만 출력할 필요 있을 때 OUTER JOIN을 사용한다
    ex) 지도교수가 배정 안된 학생에게 지도 교수를 배정해야 할 때
  • 주의: IN 연산자 사용 불가
    다른 조건과 OR 연산자 결합 불가

2-4-1 (+) 이용

  • 데이터가 없을 수도 있는 쪽에 (+)를 붙인다(빈 것 뜻으로 해석).
    즉, 안붙은 쪽이 기준이 된다. 기준이 되는 쪽은 모든 행이 출력되고, 거기 결합하는 행은 NULL이 있어도 매칭되서 나오는 것.
    한 쪽에만 붙일 수 있다.

1: p.profno(+)이기 때문에, 학생쪽이 기준 => 지도교수가 없는 학생들 출력

SELECT s.name, s.grade, p.name, p.position
FROM student s, professor p
WHERE s.profno = p.profno(+) 
ORDER BY p.profno;

2: s.profno(+)이기 때문에, 교수쪽이 기준 => 지도학생이 없는 교수들 출력

SELECT s.name, s.grade, p.name, p.position
FROM student s, professor p
WHERE s.profno(+) = p.profno 
ORDER BY p.profno;

2-4-2 LEFT, RIGHT, FULL OUTER JOIN

  • FROM 절에서 기준이 되는 쪽을 적는다.
    왼쪽이 기준이면 LEFT(즉, 오른쪽에 (+)를 붙인 것).
    오른쪽이 기준이면 RIGHT(즉, 왼쪽에 (-)를 붙인 것.

위의 1번

SELECT s.name, s.grade, p.name, p.position
FROM student s
	LEFT OUTER JOIN professor p
    ON s.profno = p.profno
ORDER BY p.profno;

위의 2번

SELECT s.name, s.grade, p.name, p.position
FROM student s
	RIGHT OUTER JOIN professor p
    ON s.profno = p.profno
ORDER BY p.profno;
  • FULL OUTER JOIN은 LEFT와 OUTER 실행 결과를 UNION한 결과. 즉, 어느 쪽이 NULL 이 있어도 출력
    ex) 지도교수가 없는 학생, 지도학생이 없는 교수 모두 출력.

2-5 SELF JOIN

  • 하나의 테이블 내의 칼럼끼리 연결. => 자신이 하나라는 것 외에 EQUI JOIN과 동일.
    ex) department 테이블에 deptno와 그 상위 기관인 college가 있다. 그걸 연결시켜서 표기할 떄
SELECT c.deptno, c.dname, c.college, d.dname college_name
FROM department c, department d
WHERE c.college = d.deptno;

SELECT c.deptno, c.dname, c.college, d.dname college_name
FROM department c
JOIN department d
ON c.college = d.deptno;
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글