My SQL Study - (3)

Geun Bo Kim·2023년 3월 23일
0

My SQL

목록 보기
3/6
post-thumbnail

My SQL 공부 Start

1.여러 테이블을 연결해주는 Join

💡 join이란?

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

예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶어요!

👉위의 예시와 같이, 두 테이블의 정보를 연결해서 함께 보고싶을 때가 있을 수 있다.
그럴 때를 대비해서 무언가 연결된 정보가 있을 때, user_id 처럼 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓는다.이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 부른다.

📚Join의 종류 알아보기

- Left join :SQL에서의 Join은 두 집합 사이의 합집합관계와 같다.

  • 여기서 A와 B는 각각의 테이블을 의미. 둘 사이의 겹치는 부분은, 뭔가 테이블 A와 B의 key 값이 연결되는 부분

ex)select * from users u
left join point_users p
on u.user_id = p.user_id

👉어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있습니다.

  • 꽉찬 데이터 :해당 데이터의 user_id 필드값이 point_users 테이블에 존재해서 연결한 경우
  • 비어있는 데이터:해당 데이터의 user_id 필드값이 point_users 테이블에 존재하지 않는 경우

- inner join : SQL에서의 Join은 두 집합 사이의 교집합관계와 같다.

ex)select * from users u
inner join point_users p
on u.user_id = p.user_id

👉여기서는 비어있는 필드가 있는 데이터가 없다.
그 이유는, 같은 user_id를 두 테이블에서 모두 가지고 있는 데이터만 출력했기 때문

😎 Join 연습해보기

- Inner join 연습 :

orders 테이블에 users 테이블 연결해서 통계치 내보기

  • 주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 세어보기.
    select u.name, count(u.name) as count_name from orders o
    inner join users u
    on o.user_id = u.user_id
    where u.email like '%naver.com'
    group by u.name

👉SQL 쿼리가 실행되는 순서 : from → join → where → group by → select

  1. from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
  2. inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)
  3. where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
  4. group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
  5. select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.
  • tip 🧐 : Join의 실행 순서는 항상 from 과 붙어다닌다고 생각하면 편하다.

- Left join 연습 :

users 테이블과 ↔ point_users 테이블을 left join 해보기

select * from users u
left join point_users pu on u.user_id = pu.user_id

2.결과물 합치기 Union

💡 Union이란?

Select를 두 번 할 게 아니라, 한번에 모아서 보고싶은 경우 두 쿼리문을 묶을 때 사용

👉 Union 사용 시 조건

노란색과 파란색 박스의 필드명이 같아야 한다.

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

- Main Quiz1. checkins 테이블에 courses 테이블 연결해서 통계치 내보기

'오늘의 다짐' 정보에 과목 정보를 연결해 과목별 '오늘의 다짐' 갯수를 세어보자!
답:SELECT c1.course_id, c2.title, count(*) as cnt FROM checkins c1
inner join courses c2
on c1.course_id = c2.course_id
GROUP by c1.course_id

- Main Quiz2. point_users 테이블에 users 테이블 연결해서 순서대로 정렬해보기

많은 포인트를 얻은 순서대로 유저 데이터 정렬해서 보기
답:SELECT pu.user_id, u.name, u.email, pu.point from point_users pu
inner join users u
on pu.user_id = u.user_id
order by pu.point desc

- Main Quiz3. orders 테이블에 users 테이블 연결해서 통계치 내보기

네이버 이메일 사용하는 유저의 성씨별 주문건수 세어보기
답: 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

->위 쿼리가 실행되는 순서: from → join → where → group by → select
1. from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
2. inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)
3. where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
4. group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
5. select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.

profile
미래는 개발이다

0개의 댓글