SQL

[SQL] join(left join, inner join), NULL, union + group by, order by

희난 2022. 7. 12. 03:19
1. join

left join, inner join

 

0) join이란?

연결하려는 두 테이블의 공통된 정보(key 값)을 기준으로 테이블을 연결해서 한 테이블처럼 보는 것

 

1) left join

출처: 스파르타코딩클럽 수업 자료

왼쪽에 있는 테이블(A)을 기준으로 테이블 연결

 

select * from 기준 테이블 a(알리아스)

left join 붙이려는 테이블 b(알리아스) on a.key값 = b.key값

orders 테이블을 기준으로 users 테이블 연결

이때 key 값은 user_id

 

+ 이때 기준 테이블에 붙이려는 테이블의 필드 내용이 없으면 NULL 값 출력됨

=> 어떤 테이블에 어떤 테이블을 붙이는지 그 순서가 중요

 

2) inner join

출처: 스파르타코딩클럽 수업 자료

두 테이블의 교집합

 

select * from 붙이려는 테이블 a(알리아스)

inner join 붙이려는 테이블 b(알리아스) on a.key값 = b.key값

+ 붙이려는 두 테이블에서 값이 있는 정보만 출력됨 => NULL 값이 출력될 일이 없음

교집합이므로 순서가 중요하지 않음.

select from 옆에 쓸 테이블이나, inner join 옆에 쓸 테이블 순서 바뀌어도 상관x

 

 

+) 두 테이블에 공통적으로 있는 필드 쓸 땐 해당 필드 앞에 알리아스 꼭 붙이기!

 

group by에서 user_id 앞 u. 붙여줌

안 그러면 왼쪽처럼 ambiguous 하다는 error창 나옴

 

2. NULL

1) left join 하고 NULL 출력된 부분 찾는 방법

where 필드명 is NULL

 

2) left join 하고 NULL 출력 안 된 부분 찾는 방법

where 필드명 is not NULL

 

3. Union

모든 필드가 똑같을 때 세로로 이어주는 것

왼쪽의 테이블과 오른쪽의 테이블의 모든 필드가 같으므로 하나의 테이블로 보기 위해 Union 사용

 

연결하려는 테이블을 괄호() 로 묶고 그 사이에 Union all을 입력해주면 됨

 

*Union 안에서는 정렬이 안 됨(order by가 먹히지 않음)

=> 순서 정렬은 합치고 난 이후에 해야지 합치기 전에 하는 건 x


 

+ 새로운 필드 넣는 법

select '넣고 싶은 필드 내용' as 필드제목 from 테이블 이름

ex) '7월' as month

 

+ 두 가지 이상으로 범주화/정렬 하기

group by A, B -> A로도 범주화하고 또 B로도 범주화

 

order by A', B' -> A'로도 정렬하고 또 B'로도 정렬(title 나열되고, 그 안에서 week 1, 2, 3 순으로 나열)

+ order by c2.course_id, c2.week desc 로 해서 week는 3, 2, 1 순으로 나열하는 것도 가능