일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 앱
- yml
- mysql
- expo
- EAS
- 자바스크립트
- sql
- 시놀로지
- string
- sts
- 안드로이드
- springboot
- 시큐리티
- Navigation
- sdk
- DB
- Android
- Java
- 폰트
- 스프링
- react
- 배포
- Admob
- 이클립스
- thymeleaf
- YAML
- sqlite
- 로또
- Native
- spring
- Today
- Total
Dev JS Blog
[SQL] JOIN 에 대해서 본문
JOIN 에 대해서
오늘은 쿼리의 기초라고 할수있는 조인(JOIN) 2가지를 알아보겠습니다.
조인이란..?
사전적의미로 연결하다,잇다,합쳐지다 .. 등등 의 뜻이 있습니다.
즉 조인은 테이블 두개를 합쳐주는 역할을 합니다.
제일 기초적인 두가지 조인 방식만 소개해드리겠습니다.
두 조인은 INNER JOIN 과 OUTER JOIN 이 있습니다.
어떤 역할을 하는지 알아보겠습니다.
1. 직원 정보 테이블인 ex_emp 테이블 입니다.
name(이름), dept_no(부서번호)를 가지고 있는 테이블 입니다.
SELECT
name,
dept_no,
FROM ex_emp
직원정보 테이블에는 name 과 dept_no(부서번호) 를 갖고있는 테이블 입니다.
2. 부서정보 테이블 ex_dept
dept_no(부서번호), dept_name(부서명) 을 가지고 있는 테이블 입니다.
SELECT
dept_no,
dept_name
FROM ex_dept
여기서 직원들의 부서를 알고싶다면 부서정보를 갖고있는 부서 테이블과 조인을 해봐야겠죠?
일단 INNER JOIN 해보겠습니다.
SELECT
name,
dept_no,
dept_nm
FROM ex_emp a
inner join ex_dept b on a.dept_no = b.dept_no
기준이 되는 테이블을 먼저 쓰고 그 다음 조인을 할 테이블을 쓰는게 일반적입니다.
조인 쿼리 사용방법은
inner join (조인할 테이블) ON 어떤 조건들에 엮이게 할것인지 를 씁니다.
저는 부서명이 궁금했으니 각각 테이블에 dept_no 가 맞는 조건으로 조인이 되도록 하였습니다.
dept_no를 기준으로 잘 합쳐졌습니다.
여기서 한가지 inner join 과 outer join 의 차이는 null 값을 허용하느냐 마느냐의 차이입니다.
그게 무슨 말이냐 하면 부서 테이블을 기준으로 다시 조인해보겠습니다.
SELECT
a.dept_no,
a.dept_name,
b.name
FROM ex_dept a
inner join ex_emp b on a.dept_no = b.dept_no
머가 바꼈을까요?
각각 부서에 있는 사람들이 엮여서 데이터가 나왔습니다.
여기서 주목할건 dept_no 7번인 영업팀에는 엮이는 직원이 없으니 데이터 가 나오지 않았습니다.
그렇다면 기준이 되는 테이블에 엮이는게 없더라도 다 나오게 하고싶을때
OUTER JOIN 을 사용합니다.
outer join 조인도 두가지 방법으로 사용됩니다.
LEFT OUTER JOIN 과 RIGHT OUTER JOIN 으로 사용이 됩니다.
이말이 무슨 말이냐면 LEFT 왼쪽 테이블을 기준으로 NULL값을 허용한 조인을 한다.
RIGHT 는 그 반대이죠
무슨 말이냐면
SELECT
a.dept_no,
a.dept_name,
b.name
FROM ex_dept a LEFT OUTER JOIN ex_emp b on a.dept_no = b.dept_no
제가 부서 테이블을 기준으로 두고 LEFT OUTER JOIN 을 하였습니다.
즉 부서테이블이 엮이는게 없더라도 부서테이블 데이터는 다 나오게 해달라는 거죠
어때요?
아까 inner join 때는 없던 부서가 다시 나오게 되었죠?
영업팀에는 직원이 없어서 엮일게 없지만 null 값으로 부서 테이블의 정보는 다 나오게 되었습니다.
반대로 right outer join 도 사용이 가능은 하지만
보통은 left outer join 을 주로 사용하시기 바랍니다.
그래야
SELECT
*
FROM 기준테이블
LEFT OUTER JOIN 조인테이블1 ON 조건
LEFT OUTER JOIN 조인테이블2 ON 조건
이런식으로 기준 테이블을 기준으로 쿼리를 짜는 습관이 좋기 때문이죠
LEFT RIGHT 를 남용하다간 어지러워지기 때문에
LEFT 만 쓰도록 합시다.
처음 조인할때는 헷갈리기도 하지만 자주 사용하다보면
하나도 안헷갈리게 됩니다.
'옛날 창고 > SQL' 카테고리의 다른 글
[Oracle] ORA - 01861 에러 (0) | 2019.01.05 |
---|---|
[Oracle] lead(), lag()는 뭐지? (0) | 2018.12.26 |
[Oracle] row_number() over() 활용 (0) | 2018.12.21 |
[Oracle] order by 기초 (0) | 2018.12.20 |
[MySQL] with rollup 기능 (0) | 2018.06.27 |