SQL 2주차+ 3주차 Alias, Join(left, inner)
2023-02-16 목요일 14:56
어제 써놓고 올린 줄 알았는데 발행 안하고 꺼버렸는지 글이 안 올라가 있네요
기록이 중요하니 다시 적어 봅시다!
2주차 마지막 부분에는 퀴즈와 Alias에 대하여 간단히 알아보았습니다
Alias는 별칭 기능입니다
user 테이블에 u라는 별칭을 적용하기 위해서는
SELETE * FROM user u
한 칸 띄우고 별칭으로 사용할 것을 적어 줍니다
이제 저 쿼리문에서 u는 user 테이블을 의미합니다
사용하는 이유는 첫 째로 다음에 배울 join에서 테이블 명을 착각하는 것을 막기 위해서고 둘 째로는 편의성 때문입니다.
도출하는 결과의 필드 명도 Alias를 이용하여 변경이 가능합니다
SELECT payment_method, COUNT(*) AS cnt FROM order o
WHERE o.course_title = '앱개발 종합반'
GROUP BY payment_method
payment_method는 결제 수단을 의미합니다 order는 주문 테이블을 의미합니다
o.course_title의 o는 order를 별칭한 것으로 order 테이블에 있는 course_title컬럼을 의미합니다 course_title는 강의명을 의미합니다
주문 테이블에서 강의명이 앱개발 종합반인 것을 찾고 결제 수단을 그룹화합니다 결제수단은 kakaopay, money, card, taxbill이 있습니다
결제수단을 출력하고 각 결제수단을 이용한 수를 출력합니다
이때 as 를 사용하여 count(*) 필드명을 cnt로 변경합니다
이제 join으로 넘어가 보겠습니다
join은 테이블끼리 하나의 공통된 것을 통해 묶는 것을 의미합니다 (교집합)
user 테이블에는 user_num이라는 컬럼이 있고 order 테이블에도 user_num이라는 컬럼이 있습니다
만약 사이트에서 토끼의 해를 기념하여 토끼 띠인 회원에게 할인 쿠폰을 주는 이벤트를 한다고 할 때
회원의 나이가 적힌 age컬럼은 user 테이블에 회원이 가진 쿠폰을 관리하는 coupon컬럼은 order 테이블에 있다고 하면 SELETE를 이용하여 user 테이블에서 해당되는 나이의 회원의 number를 통해 oreder 테이브에 있는 coupon 컬럼에 쿠폰을 추가해 주어야 하는 과정이 필요합니다
이럴 때 두 테이블이 가진 공통된 user_num 컬럼을 통해 묶은 다음 대상에 해당하는 회원을 찾고 쿠폰을 넣어준다면 더 편하게 일을 처리할 수 있습니다
join을 왜 사용해야 하는지 알았으면 join의 종류에 대하여 알아봅시다
join에는 letf join, inner join, right join 등 다양하게 있습니다
보통 세가지 중에 left와 inner를 많이 사용한다고 합니다
left join은
이런 느낌입니다 A에 해당하는 B의 것을 가져와 A를 기준으로 합칩니다
예시를 통해 봅시다 user 테이블에는 회원의 정보를 담고 있습니다
user_id, created_at, updated_at, name, email
point_users 테이블에는 회원이 보유한 포인트에 대한 정보를 가지고 있습니다
point_user_id, created_at, update_at, user_id, point
user 테이블은 498개의 정보를 가지고 있으며
point_user 테이블은 271개의 정보를 가지고 있습니다
둘을 left join 시켜보겠습니다
SELETE * FROM users u
LEFT JOIN point_users p
ON u.user_id = p.user_id
join 한 후 출력된 결과의 수는 498개 입니다
하지만 출력된 결과를 보면 몇몇 항목이 비어있는 것을 확인할 수 있습니다
NULL값을 나타냅니다
이유가 뭘까요?
users 테이블을 기준으로 join시켰기 때문입니다 회원 중에는 point를 가지고 있지 않은 회원이 있습니다 그렇기에 point_user의 테이블에는 없는 회원이 있었고 그런회원들의 정보는 null로 표시된 것 입니다
다음으로 inner join에 대하여 알아보겠습니다
left join과 차이가 보입니다!
inner join은 두 테이블 공통된 것을 이용하여 join시킵니다 이 때 A테이블과 B테이블의 모든 컬럼을 가져옵니다
SELETE * FROM users u
INNER JOIN point_users p
ON u.user_id = p.user_id
위에서 사용했던 테이블을 가지고 join 방법만 바꿔 실행해보겠습니다
총 데이터의 수는 271 입니다 null값은 없습니다
오직 공통된 것만을 join하기 때문에 이러한 출력결과를 보여줍니다!(포인트가 없는 회원의 정보는 제외시키고 출력)
inner join과 left join의 차이를 알았다면 이제 join을 이용한 문제를 풀어봅시다
join을 하는 과정을 보겠습니다
SELETE * FROM users u <-여기까지는 기본적인 SELETE문입니다
INNER JOIN point_users p <-JOIN 방식을 고르고 JOIN할 테이블을 정합니다
ON u.user_id = o.user_id <-ON을 적고 별칭을 이용하여 공통된 컬럼을 이용하여 JOIN시켜줍니다
JOIN상태에서도 WHERE과 GROUP BY, ORDER BY 사용이 가능합니다
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
주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 COUNT 한 것입니다
풀어서 보자면
SELETE * FROM orders o에서 시작합니다
INNER JOIN users u <-유저정보와 join 시켜줍니다
ON o.user_id = u.user_id <-공통된 user_id를 이용하여 join 시킵니다
WHERE u.email like '%naver.com' <-users 테이블의 email 컬럼에서 naver.com으로 끝나는 것 만 찾아줍니다
GROUP BY u.name <-users 테이블의 name 컬럼으로 그룹화 시킵니다
(name은 이**, 김** 처럼 성만 표현되어있습니다)
SELETE u.name, count(u.name) as count_name FROM orders o
users 테이블의 name과 그 성에 해당하는 수를 COUNT하여 출력하며 필드명은 count_name으로 합니다
GROUP BY와 ORDER BY는 ,를 이용하여 여러 개 이용할 수 있습니다
웹개발, 앱개발 종합반의 week 별 체크인 수를 세어보기
courses 테이블은 강의에 대한 정보가 저장되어있습니다 chechins 테이블에는 week컬럼을 통해 주를 관리하고 comment컬럼에는 회원이 남긴 한 주를 시작하는 다짐이 likes는 그 다짐에 달린 좋아요 수를 저장합니다
select c1.title, c2.week, count(*) as cnt from checkins c2
inner join courses c1 on c2.course_id = c1.course_id
group by c1.title, c2.week
order by c1.title, c2.week
마찬가지로 풀어서 보겠습니다
SELETE * FROM checkins c2 <-시작은 체크인 테이블을 살펴보는 것으로 시작합니다
INNER JOIN courses c1 <-코스 테이블과 join시킵니다
ON c2.course_id = c1.course_id <-공통된 컬럼 course_id를 통해 join 시킵니다
group by c1.title c2.week<course에 있는 title 컬럼과 checkins에 있는 week 컬럼을 그룹화 합니다
select c1.title, c2.week, count(*) as cnt from checkins c2<-출력할 필드는 courses 의 title, checkins의 week 그리고 각 주마다 강의별 코멘트 수를 count합니다
ORDER BY를 사용하여 정렬해줍니다
ORDER BY c1.title, c2.week <-디폴트는 오름차순
정렬되었습니다!
INNER JOIN은 여러 테이블을 동시에 JOIN시키는 것도 가능합니다
select * 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
이런식으로 curse_id를 통해 JOIN 후에도 user_id를 통해 또 한번 JOIN이 가능합니다.
오늘은 Alias를 이용한 별칭과 join을 이용하는 이유, left join과 inner join의 개념과 활용방법에 대해 알아봤습니다
다음 시간에는 개념만 짚고 넘어간 left join에 대해 알아보겠습니다