본문 바로가기
Database/MariaDB

MariaDB: JOIN절에 대해서

by 코딩쥐 2024. 10. 15.

JOIN절은 SQL에서 두 개 이상의 테이블을 결합하여 관련된 데이터를 함께 조회하는 데 사용된다. 

 

CROSS JOIN

테이블 간의 관계성을 정의하지 않고 특정 기준 없이 테이블 간 가능한 모든 조합에 대한 결과를 도출한다.

SELECT * FROM emp INNER JOIN dept 
ON emp.deptno = dept.deptno;

 

INNER JOIN

  • SELECT 그룹함수(칼럼명) FROM 테이블 INNER JOIN 테이블 ON 조건; 

EQUI JOIN

두 테이블의 공통된 데이터를 결과로 도출한다. 조건에 맞지 않는 행은 결과에서 제외된다.

# emp에는 직원에 대한 정보, dept에는 부서에 대한 정보가 들어 있는 테이블
# 이름이 SMITH인 사람의 사원번호, 사원명, 부서명을 출력
# 사원번호와 사원명은 emp, 부서명의 경우 deptno를 통해서 dept에서 얻을 수 있음
SELECT empno, ename, dname
FROM emp
INNER JOIN dept ON emp.deptno = dept.deptno
WHERE ename = 'SMITH';

 

INNER JOIN을 통해서 공통된 데이터 결과를 도출할 때, 각각의 테이블에서 공통된 칼럼명을 가지고 있을 경우에는 어디서 데이터를 가지고와서 사용할 것인지에 대해서 '테이블명.칼럼명'으로 명시를 해줘야 한다. 

# emp에는 직원에 대한 정보, dept에는 부서에 대한 정보가 들어 있는 테이블
# deptno 키로 연결되어 있다. 
# 이름이 SMITH인 사원의 deptno(부서번호), ename(사원이름), dname(부서이름)을 출력
SELECT emp.deptno, ename, dname
FROM emp
INNER JOIN dept ON emp.deptno = dept.deptno
WHERE ename = 'SMITH';

 

테이블명의 경우에는 별칭을 설정해서 사용할 수 있다.

SELECT e.deptno, ename, dname
# emp 테이블은 e, deptno 테이블은 d로 별칭을 설정함
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
WHERE ename = 'SMITH';

 

NON-EQUI JOIN

특정 범위와 등급을 지정하고 해당 범위에 들었을 때 등급으로 데이터를 표현할 때 사용하는 방법이다. 

# salgrade를 통해서 emp에 있는 sal(급여)에 대한 등급을 가져올 수 있다.
# salgrade 테이블에는 grade(등급)과 해당 급여 범위가 설정되어 있다.
# ename(사원명), sal(급여), grade(등급) 출력
SELECT ENAME, SAL, GRADE
FROM emp e
INNER JOIN salgrade s
ON e.SAL BETWEEN s.LOSAL AND s.HISAL;

 

 

SELF JOIN

동일한 테이블을 두 번 참조하여, 테이블 내의 행을 서로 비교하거나 결합하는 방법이다. 

# emp 테이블 내에서 mgr(매니저사원번호)를 참조하여
# 사원들의 사원명, 사원번호, 매니저사원번호, 매니저이름을 출력

SELECT e1.ename, e1.empno, e1.mgr, e2.ename
FROM emp e1 
INNER JOIN emp e2
ON e1.mgr = e2.empno;


다중 JOIN

여러 개의 테이블을 결합하여 관련 데이터를 조회하는 방법이다. 여러 테이블에서 필요한 데이터를 하나의 결과로 반환한다.

# dept : 부서정보, emp : 사원정보
# dept를 통해 부서위치, emp를 통해 사원명, 매니저명은 self join을 통해서 시행
# 부서의 위치(loc)가 'CHICAGO'인 부서 사원들의 사원명, 매니저명

SELECT 
	e1.ename 사원명,
	e2.ename 매니저명
FROM emp e1
INNER JOIN emp e2 ON e1.mgr = e2.EMPNO
INNER JOIN dept d ON e1.DEPTNO = d.DEPTNO
WHERE d.loc = 'CHICAGO';

 

OUTER JOIN

MariaDB에서는 OUTER JOIN의 종류에는 LEFT JOIN, RIGHT JOIN이 있다. 아우터 조인은 두 테이블의 공통영역을 포함하여 한쪽 테이블의 다른 데이터를 포함하는 방식이다. 일치하는 데이터가 없으면 NULL로 표시된다.

 

LEFT JOIN

왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다. 오른쪽 테이블에 일치하는 데이터가 없으면 NULL로 표시된다.

# 사원명과 매니저명을 출력 
# 일치하는 항목이 없으면 NULL 출력
SELECT
	e1.ename 사원명,
	e2.ename 매니저명
FROM emp e1 
LEFT OUTER JOIN emp e2 
ON e1.mgr = e2.empno;

 

RIGHT JOIN 

오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다. 왼쪽 테이블에 일치하는 데이터가 없으면 NULL로 표시된다. 아래 예시의 경우 왼쪽 테이블은 emp, 오른쪽 테이블은 dept이다. 

 

# 사원명과 부서명을 출력
# 해당하는 부서에 사원이 없어도 출력(RIGHT OUTER)
SELECT 
	e.ename,
	d.dname
FROM
	emp e
RIGHT OUTER JOIN
	dept d ON e.deptno = d.deptno;

 

UNION

두 개 이상의 SELECT 쿼리의 결과를 결합하여 하나의 결과 집합으로 만드는 데 사용한다.  UNION을 사용할 때 각 쿼리는 동일한 수의 열을 가져야하고, 각 열의 데이터 타입은 호환되어야 한다. 각 쿼리의 칼럼명이 다를 경우 결과에서는 첫번째 SELECT 쿼리의 칼럼명이 된다.

  • SELECT 칼럼명1, 칼럼명2 FROM 테이블1
    UNION
    SELECT 칼럼명1, 칼럼명2 FROM 테이블2;
# dept
SELECT * FROM dept;

# otherdept
SELECT * FROM otherdept;

# UNION으로 두 테이블 합치기
SELECT deptno 부서번호, dname 부서명, loc 위치 FROM dept
UNION
SELECT deptno, dn, loc FROM otherdept;