MySQL 데이터베이스 이해하기 /Join 연산

2025. 2. 28. 17:06·Cs기본지식/데이터베이스
 Join 
 두개 이상의 테이블을 연결해서 질의하는 것

 

관리하게 편하게 하나였던 테이블을 나눔
=> 사용자들이 보일 때 하나로 보여주기 위한 join 두개 이상을 하나로

 

어떤 테이블에 join 하는지에 따라서 join 방식이 달라짐

 

 - Join  종류 
    1. 데이타 추출되는 것에 따라 
 Inner Join     

조인을 위해 사용하는 비교 조건에 맞는 데이타만 조회
조인 조건에 맞지 않은 데이타는 조회 되지 않는다. 
 join할 때  outer join으로 표시 하지 않으면 기본적으로 
Inner join으로 조회된다. 

   

Outer Join 

조인을 위해 사용하는 비교 조건에 맞지 않는 데이타도 조회된다. 
 
개발자의 편의성에 의하여 선택
- left outer join  : 비교 조건에 맞지 않은 왼쪽 테이블의 데이타도 조회됨
- right outer join : 비교 조건에 맞지 않은 오른쪽 테이블의 데이타도 조회됨
- full outer join  : 비교 조건에 맞지 않은 양쪽 테이블의 모든 데이타가 조회됨 // mysql은 지원 안함

 

    2. 비교 조건에 따라서 
  Equi join 

비교하는 두 컬럼의 데이타가 정확하게 일치할 경우 
join 조건으로 = 비교 연산자를 이용할 경우 

 

Non Equi join 

비교하는 두 컬럼의 데이타가 정확하게 일치하지 경우 
join 조건으로  >, < , >= , <=, != 등

 

    3. 비교 테이블에 따라서 
     self join 

 join할 테이블이 다른 테이블이 아닌 self(한개의 테이블로 join)
테이블을 구별하기 위해 반드시 alias를 사용해야 한다.

    
    4. Natural join // 실제 사용은 안함

두 테이블에서 동일한 컬럼명을 갖는 컬럼을 조인 조건으로 사용한다. 
 inner join과 같은 결과를 갖는다     


    5. 카티시안 곱 // 실제 사용은 안함

 조인 조건을 생략했을 때 두 테이블의 모든 row를 연결한 결과가 조회된다. 
 N * M의 수만큼 행이 조회된다. 

 

- join 활용

inner join

 DB 벤더 전용
  select [distinct]   *|컬럼명 [as alias]
  from   테이블명 [alias], 테이블명 [alias] , 
  [where  조건]
  [group by 컬럼명, .. [having 조건]]
  [order by 컬럼명 [asc|desc]], ...]
  
 ANSI query  // inner join은 굳이 쓰지 않음
  select [distinct]   *|컬럼명 [as alias]
  from   테이블명 [alias]
  join   테이블명 [alias]
  on 조인 조건 | using(조인 컬럼) //조건을 여기에
  -----------------
  [where  조건]
  [group by 컬럼명, .. [having 조건]]
  [order by 컬럼명 [asc|desc]], ...]
 
  using 
   - 조인을 위한 비교 컬럼명이 동일 할 때 사용 
   - alias 없이 사용해야 한다. => 다른 DB는 alias를 사용할 경우 error발생 
   - 비교 조건은 기본적으로 = 이 적용된다. 
  
on
   - 조인을 위한 비교 컬럼명이 다르거나 비교 조건이 = 이 아닐때 사용한다. 
   - 조인을 위한 비교 컬럼이 같을 경우 alias를 사용해서 구분한다.

 

 

- 상품번호, 상품명, 상품금액, 카테고리번호,(GOODS 테이블) 카네고리이름 (CATEGORY테이블) 을 조회한다.
- CNO 동일 이름이 있음 

 

*벤더 전용

select gno, brand, price , goods.cno, name
from goods, category
where goods.cno = category.cno
order by gno;

 

* 테이블에 alias를 적용

select gno, brand, price , g.cno, name
from goods g, category c
where g.cno = c.cno
order by gno;

 

*ansi query

select gno, brand, price , g.cno, name
from goods g
join category c
on  g.cno = c.cno
order by gno;
select gno, brand , price, cno ,name
from goods
join category
using (cno) -- 컬럼명이 동일 할 때 using에 컬럼명만 넣어서 알아서
order by gno;

 

=  전부 동일한 결과 발생

    inner join으로 5번에 cno가 없어 빠져있음을 알 수있다.

 

 outer join

  left join 
  select [distinct]   *|컬럼명 [as alias]
  from   테이블명 [alias] 
  left [outer] join   테이블명 [alias]
  on 조인 조건 | using(조인 컬럼)

  right join 
  select [distinct]   *|컬럼명 [as alias]
  from   테이블명 [alias] 
  right [outer] join   테이블명 [alias]
  on 조인 조건 | using(조인 컬럼)

 

기준이 되는 테이블을 어디에 놓느냐에 따라 바뀜

 

-- emp테이블을 기준으로 left join하면 deptno가 없는 사원도 조회됨.

select EMPNO,ENAME,JOB,DEPTNO,DNAME
from emp left join dept
using(deptno);

 

self join 

한개의 테이블로 join 
테이블에 alias를 이용해서 구별한다. 
=>테이블명이 전부 같으므로 alias를 사용해 줘야한다.

 

-- 사원번호, 사원이름, 업무, 급여, 상사번호, 상사이름 조회 

select e.empno, e.ename, e.job, e.sal, e.mgr, m.ename
from emp e , emp m
where e.mgr = m.empno;

 

-- 모든 사원에 대한 사원번호, 사원이름, 업무, 급여, 상사번호, 상사이름 조회
-- (상사가 없는 사원도 조회)

select e.empno, e.ename, e.job, e.sal, e.mgr, m.ename
from emp e 
left join emp m
on e.mgr = m.empno;

 

Natural join


-- 동일한 컬럼명을 조인 조건으로 사용 , equi join

select empno, ename, deptno, dname
from emp natural join dept;

'Cs기본지식 > 데이터베이스' 카테고리의 다른 글

데이터베이스 연결 및 관리 / Spring JAVA  (1) 2025.03.05
MySQL 데이터베이스 이해하기 / DDL, DML ,TCL  (0) 2025.03.05
MySQL 데이터베이스 이해하기 / 서브 쿼리  (0) 2025.03.04
MySQL 데이터베이스 이해하기 / 집계함수와 그룹함수  (1) 2025.02.28
MySQL 데이터베이스 이해하기 / select 및 내장 함수  (0) 2025.02.27
'Cs기본지식/데이터베이스' 카테고리의 다른 글
  • MySQL 데이터베이스 이해하기 / DDL, DML ,TCL
  • MySQL 데이터베이스 이해하기 / 서브 쿼리
  • MySQL 데이터베이스 이해하기 / 집계함수와 그룹함수
  • MySQL 데이터베이스 이해하기 / select 및 내장 함수
startfront
startfront
startfront 님의 블로그 입니다.
  • startfront
    startfront 님의 블로그
    startfront
  • 전체
    오늘
    어제
    • 분류 전체보기 (42)
      • 프로젝트 (5)
        • 프로젝트 해보기 (1)
        • 디자인 알아보기 (2)
        • 프로젝트의 기본 (2)
      • 백엔드의 이해 (4)
      • React (14)
      • 프론트엔드 기본 (2)
        • Html (1)
        • Css (0)
        • JavaScript (1)
      • Cs기본지식 (14)
        • 알고리즘 (8)
        • 데이터베이스 (6)
      • Java (3)
        • Java의 이해 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
startfront
MySQL 데이터베이스 이해하기 /Join 연산
상단으로

티스토리툴바