본문 바로가기
SQL 개발일지

👩‍💻 [SQL문] JOIN, UNION

by 노랑사랑팽이 2022. 7. 11.

✏️ 테이블 연결

🔎 Join

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

 

🔎 Left Join

SELECT * FROM users u 
left join point_users pu 
on u.user_id = pu.user_id

users 테이블과 point_users테이블이 겹치는 부분과

users테이블 겹치는 부분 모두 가져옴.

 

🔎 Inner Join

SELECT * FROM orders o 
inner join users u 
on o.user_id = u.user_id

교집합

orders 테이블과 users테이블이 겹치는 부분만 가져옴.

 

✏️쿼리 진행 순서 : from → join → where → group by → select

select u.name, COUNT(*) as cnt  FROM orders o 
inner join users u 
on o.user_id = u.user_id 
WHERE o.email LIKE '%naver.com'
GROUP BY u.name

 

 

select u.name, COUNT(*) as cnt_name FROM enrolleds e 
inner join users u 
on e.user_id = u.user_id 
where e.is_registered = 0
GROUP BY u.name 
order by cnt_name desc

 

결제하고 시작하지 않은 유저들을 성씨별로 세어보기

 

 

select c.title, c2.week, COUNT(*) as cnt 
FROM courses c 
inner join checkins c2 on c.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id 
WHERE o.created_at >= '2020-08-01'
GROUP by c.title, c2.week
ORDER by c.title, c2.week

group by와 order by는 위와 같이 쓸 수 있다.

앞에  언급한 c.title열이 c2.week보다 우선순위가 높다.

 

select u.name, COUNT(*) as cnt  FROM users u 
left join point_users pu on u.user_id =pu.user_id 
where pu.point_user_id is NOT NULL
GROUP BY u.name

join을 하다보면 NULL값이 생길 수 있다.

이때 NULL값을 제외하고 싶다면 IS NOT NULL이라고 써주면 된다.


🔎 Union

원하는 값을 추출한 두 테이블을 한번에 모아서 보고 싶을 경우, Union을 사용한다.

중복을 허용하지 않는다. 합집합

 

🔎 Union ALL

중복을 허용한다.

(
select '7월' as month, c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week
)
UNION all
(
select '8월' as month, c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week
)

 

🍏 KEEP, 습관 중요한 것

JOIN 및 UNION을 활용해 테이블이 범주가 넓어지면서 원하는 데이터를 추출하기 쉬워졌다.

그리고 테이블이 커져 직관적으로 개념을 익히기 힘들었다.

UNION과 UNION ALL의 차이점이 은근히 헷갈린다.

 

🍎 PROBLEM, 이슈, 에러, 오류

from → join → where → group by → select

쿼리 진행 속도가 중요.

이 순서를 지키지 않으면 오류 발생한다.

또한, JOIN문을 활용하면 테이블 별칭을 활용하는게 많아졌다.

헷갈리지 않게 조심해야겠다.

 

 

 🍉 TRY 시도

퀴즈 푸는 난이도가 초반에 비해 조금 어렵게 느껴졌다.

조건이 많아지면서 슬슬 복잡해지는 느낌!

그래도 결과값과 유사하게 추출하려고 노력하니 어찌어찌 된다.

이때 가장 뿌듯하다.

합집합, 교집합, UNION ALL 개념을 좀 더 명확하게 이해하고자 노력해야겠다.

 

 

댓글