[DQL] 조인

sesame·2021년 8월 11일
0

sql

목록 보기
5/24

조인

조인이란? 두개 이상의 테이블을 연결하여 데이터를 검색할 수 있는 방법이다!

🧐 조인에는 두가지 방법이 있다.

-- 1번 WHERE절을 이용하는 JOIN
SELECT *
FROM student st, school sc
WHERE st.stuno = sc.stuno;
-------------------------------
-- 2번 ON절을 이용하는 JOIN
SELECT *
FROM student st JOIN school sc
ON st.stuno = sc.stuno;

, 와 WHERE절을 사용하는 조인과 ANSI 방식의 JOIN을 이용하여 조인하는 방법을 비교하며 공부해보자

등가 조인(EQUI JOIN)

공통적으로 컬럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인으로 가장 일반적인 = 에 의한 조인이다.

SELECT *
FROM stuedent st JOIN school sc
ON st.stuno = sc.stuno;  --공통된 컬럼

비등가 조인(NON-EQUI JOIN)

동일 컬럼이 없이 다른 조건을 사용하여 조인할 때 사용한다.

SELECT *
FROM stuedent st JOIN school sc
ON st.score BETWEEN sc.lograde AND sc.higrade;  --범위안의 값!

① INNER JOIN

사용된 같은 이름의 칼럼 두개로 처리하는 JOIN으로 INNER 키워드는 생략이 가능하다.

SELECT *
FROM student st, school sc
WHERE st.stuno = sc.stuno;
-------------------------------
SELECT *
FROM student st JOIN school sc
ON st.stuno = sc.stuno;

② OUTER JOIN

비등가 조인의 경우 한쪽 컬럼에 값이 없으면 해당 행은 조회되지 않는데 조인 조건을 만족하지 못하는 행들을 같이 조회하기 위해서 OUTER JOIN을 사용한다. NULL이 있어도 무조건 출력!
조인 조건을 만족하는 값이 없어도 조회하려는 쪽에 (+)를 사용

SELECT *
FROM stuedent st, school sc
WHERE stuedent st(+) = school sc;
-------------------------------------------
SELECT *
FROM stuedent st RIGHT OUTER JOIN school sc
ON st.stuno = sc.stuno;
-------------------------------------------
SELECT *
FROM student st1, student st2
WHERE st1.leaderno = st2.stuno(+); --left outer join
  • LEFT OUTER JOIN : 조인 수행 시 왼쪽 테이블의 데이터를 읽은 후, 오르쪽 테이블에서 JOIN 대상 데이터 읽어 온다. 오른쪽에 같은 값 없으면 NULL

  • RIGHT OUTER JOIN : 조인 수행 시 오른쪽 테이블의 데이터를 읽은 후, 왼쪽 테이블에서 JOIN 대상 데이터를 읽어 온다. 왼쪽에서 같은 값이 없으면 NULL

  • FULL OUTER JOIN : 조인 수행 시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 하여 결과를 생성한다 (중복 데이터는 삭제)

③ NATURAL JOIN

등가조인과 비슷하지만 추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없다

  • SQL server에서 지원하지 않는 기능
  • ALIAS나 테이블명과 같은 접두사 X
  • 사용된 같은 이름의 칼럼 하나로 처리❗❗❗
  • 조인 조건의 제어가 어려운 단점

④ USING 조건절

FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수가 있다
같은 이름의 칼럼 하나로 처리
ALIAS나 테이블명과 같은 접두사 X

SELECT st.stuno, st.stuname, sc.majorname
FROM student st INNER JOIN school sc
ON st.stuno = sc.stuno;
------------------------------------
SELECT st.stuno, st.stuname, sc.majorname
FROM student st INNER JOIN school sc
USING (majorname);  --sc.majorname 에러!

⑤ ON 조건절

JOIN 서술부(ON 조건절)와 비 JOIN 서술부(WHERE 조건절) 분리하여 이해가 쉬우며, 칼럼명이 다르더라도 JOIN 조건을 사용할 수 있는 장점이 있다
임의의 JOIN 조건을 지정하거나, 이름이 다른 칼럼명을 JOIN 조건으로 사용하거나, JOIN 칼럼을 명시하기 위해서 사용
ALIAS나 테이블명과 같은 접두사 사용하여 SELECT에 사용되는 칼럼을 논리적으로 명확하게 지정해 줘야 함

⑥ CROSS JOIN

WHERE 절에 JOIN 조건을 추가할 수 있으나 이 경우에는 CROSS JOIN이 아니라 INNER JOIN과 같은 결과를 얻기 때문에 CROSS JOIN을 사용하는 의미가 없어지므로 권고하지 않는다

  • 카테시안 곱
    동일한 테이블의 데이터를 구분값에 따라 카운트하고 싶을 때 사용
    각 컬럼의 결과가 경우의 수 개수 형태로 곱셈이 되어 출력되는 것
과목
수학
영어
국어

학생
김철수
김영희

↓ 카테시안 곱

학생과목
김철수수학
김철수영어
김철수국어
김영희수학
김영희영어
김영희국어

⑦ SELF JOIN

자신의 테이블과 등가 조인이 발생하는 것
alias를 이용하여 두개의 테이블인 것 처럼 조인

ex) 해당 사원을 담당하는 상사 검색하기..

0개의 댓글