수직결합구조
두 개 이상도 결합 가능
# 컬럼 순서가 같고, 그 형식이 같아야 함
select 컬럼1, 컬럼2, 컬럼3..
from 테이블명1
union (all) #수직결합 명시
select 컬럼1, 컬럼2, 컬럼3..
from 테이블명2
구분 | UNION | UNION ALL |
---|---|---|
공통점 | 두 테이블을 수직결합 | 두 테이블을 수직결합 |
차이점 | 중복된 행을 하나로 표기(중복제거하고 표기) | UNION ALL 은 모두 표현(중복을 제거하지 않고 표기) |
수평결합구조
두 개 이상도 결합 가능
이름이 달라도 됨✅
# JOIN 기본 구문
# 공통컬럼이 1개인 경우
select 컬럼1, 컬럼2.
from 테이블 a
join
select 컬럼1, 컬럼2..
from 테이블 b
on a.공통컬럼=b.공통컬럼
---------------------------------------------------------------------------
# JOIN 기본 구문
# 공통컬럼이 2개 이상인 경우
select 컬럼1, 컬럼2..
from 테이블 as a
join
select 컬럼1, 컬럼2..
from 테이블 as b
on a.공통컬럼=b.공통컬럼 and a.공통컬럼2=b.공통컬럼2
1️⃣ 공통컬럼 찾기
테이블A: 나는 이름컬럼과 나이컬럼이 있어.
테이블B: 나는 성별컬럼과 결제금액컬럼이 있어.
➡️ JOIN 불가 공통컬럼 없음
테이블A: 나는 이름컬럼과 나이컬럼이 있어.
테이블B: 나는 이름컬럼과 나이컬럼과 국가컬럼이 있어.
➡️ 공통컬럼 이름, 나이
조건 1개 : 이름이 같은 경우를 확인하고 싶은 경우
조건 2개 : 이름과 나이가 같은 경우를 확인하고 싶은 경우
2️⃣ 공통컬럼 관계찾기(PK와 FK찾기)
3️⃣ 적절한 조인 방식 찾기
두 테이블에서 일치하는 값을 가진 행 출력(교집합)
# INNER JOIN 작성법(기초편)
select 컬럼1, 컬럼2...
from 테이블명1 a
inner join 테이블명2
on a.공통컬럼=b.공통컬럼
복잡한 예✅
구조적으로 작성하기
문제가 있을 때 안쪽에서부터 바깥쪽으로 검증(정합성 체크)
COUNT와 같이 많이 사용하게 됨
기준이 되는 테이블은, 조인 조건을 만족해도/만족하지 못해도 모두 출력
# LEFT JOIN 작성법(기초편)
select 컬럼1, 컬럼2...
from 테이블1 as 테이블명1
left join basic.theglory2 as 테이블명2
on a.공통컬럼=b.공통컬럼
복잡한 예✅
구조적으로 작성하기
문제가 있을 때 안쪽에서부터 바깥쪽으로 검증(정합성 체크)
현업에서 잘 사용하지 않음
기준을 LEFT랑 반대로 둔다고 이해하면 될듯
합집합
현업에서 잘 사용하지 않음
모든 데이터를 보고싶을때 사용 MYSQL 지원❌
FULL OUTER JOIN = LEFT JOIN + RIGHT JOIN
UNION ALL과 동일하다고 생각하면 됨
필요에 따라 UNION과 JOIN 함께 사용 가능
문제 1 - JOIN 활용
- 조건1) 알맞은 join 방식을 사용하여 users 테이블을 기준으로, payment 테이블을 조인해주세요.
- 조건2) case when 구문을 사용하여 결제를 한 유저와 결제를 하지 않은 게임계정을 구분해주시고, 컬럼이름을 gb로 지정해주세요.
- 조건3) gb를 기준으로 게임계정수를 추출해주세요. 컬럼 이름은 usercnt로 지정해주시고, 결과값은 아래와 같아야 합니다.
- 힌트) 기준이 되는 테이블의 데이터는 그대로 두어야겠죠?
SELECT CASE WHEN p.pay_type IS NOT NULL THEN '결제함'
ELSE '결제안함'
END AS gb,
COUNT(DISTINCT u.game_account_id) AS usercnt
FROM users u
LEFT JOIN payment p
ON u.game_account_id = p.game_account_id
GROUP BY gb;
문제 2 - JOIN 응용1
- 조건1) users 테이블에서 서버번호가 2 이상인 데이터와 payment 테이블에서 결제방식이 CARD 모두를 만족하는 경우를 알맞은 방식으로 join 해 주세요.
- 조건2) 조인한 결과를 바탕으로 users 테이블의 game_account_id 를 기준으로 game_actor_id수를 중복값없이 세고 컬럼 이름을 actor_cnt로 지정해주세요. 또한 pay_amount 값을 더해주시고, 컬럼 이름을 sumamount로 지정해주세요.
- 조건3) having 을 사용하지 않고, 인라인 뷰 subquery 사용으로 actor_cnt수가 2 이상인 경우만 추출해주세요. 그리고 sumamount를 기준으로 내림차순 정렬해주세요.
SELECT game_account_id,
actor_cnt,
sumamount
FROM
(
SELECT u.game_account_id,
COUNT(DISTINCT u.game_actor_id) AS actor_cnt,
SUM(p.pay_amount) AS sumamount
FROM users u
LEFT JOIN payment p
ON u.game_account_id = p.game_account_id
WHERE u.serverno >= 2 AND p.pay_type = 'CARD'
GROUP BY u.game_account_id
)sub
WHERE actor_cnt >= 2
ORDER BY sumamount DESC;
문제3 - JOIN 응용2
- 조건1) user 테이블에서 game_account_id, first_login_date, serverno 를 추출한 결과와
- 조건2) payment 테이블에서 game_account_id 별 가장 마지막 결제일자를 찾고 그 컬럼이름을 date2로 지정해주세요. 그 다음 inner join 을 진행해주세요. 다만, 첫 접속일자보다 마지막 결제일자가 큰 경우만 추출해주세요.
- 조건3) 조인 결과를 바탕으로 마지막 결제일자-첫 접속일자 를 구해주세요. 그리고 컬럼이름을 diffdate로 설정해주세요. 두 날짜의 형식은 같아야 합니다.
- 조건4) 인라인 뷰 subquery 를 이용하여 서버별 평균 diffdate를 구해주시고, 컬럼이름을avgdiffdate로 설정해주세요. 해당컬럼은 정수 형태로 출력되어야 합니다.
- 조건5) 조건절에 diffdate 값이 10일 이상인 경우를 필터링해주세요. 그리고 서버번호를 기준으로 내림차순 정렬해주세요.
- 힌트) 소수점을 반올림해주는 round 함수를 활용해주세요!
SELECT serverno, round(avg(diffdate))
FROM
(
SELECT u.game_account_id,
u.first_login_date,
u.serverno,
DATEDIFF(p.date2, u.first_login_date) AS diffdate
FROM users u
INNER JOIN
(
SELECT p.game_account_id,
MAX(p.approved_at) AS date2
FROM payment p
GROUP BY p.game_account_id
)p
ON u.game_account_id = p.game_account_id
WHERE p.date2 > u.first_login_date)sub
WHERE diffdate >= 10
GROUP BY serverno
ORDER BY serverno DESC
SQL - NULL 처리하기
SQL - 경기도에 위치한 식품창고 목록 출력하기
SQL - 강원도에 위치한 생산공장 목록 출력하기
SQL - DATETIME에서 DATE로 형 변환
코드카타 15-18✅
숙제제출✅
발표대본초본✅
1-1강✅
오늘은 그래도 개인시간이 조금 생겨서 SQL 숙제를 미리 해뒀다
3/4까지긴 한데 개인강의도 추가로 지급됐고, 다음 주에는 파이썬 개인과제라 정신이 없을 것을 미리 대비🥲
조원분들이랑도 그렇지만 타 조원분들이랑도 스몰톡하는 시간이 늘었다 다른 조 상황은 어떤지 많이 물어봤었는데 다들 비슷비슷한 것 같아서 위안이 되기도 했다 그리고 얘기하면서 물어보고 배우고 하는 게 많아서 참 좋다😗💞💞
기초분석은 상당히 .. 힘든 과제였다 처음부터 분석 방향이나 쿼리를 잘 짜야겠다는 생각이 많이 들었음 내가 짜둔 쿼리가 쓰이지 않거나 뭔가 무의미한 결과가 도출돼서 그래프 폐기하게 되는 게 너무 슬펐음🥴
그리고 내가 원하는 것에 비해 내 쿼리 실력이 따라주지 않는다는 것을 절실히 느끼게 되었음 ㅎ 그래서 아직 제대로 배우지 못한 WITH 절이 너무너무 궁금하고요
숙제 하면서도 느꼈지만 이미 정해진 답에서 쿼리를 짜는 건 쉬운 것 같은데, 정답이 없는 데이터 속에서 무언가를 찾아내는 건 어려워서 연습이 많이 필요할 것 같다고 생각했다
데이터 리터러시 강의가 이 시기에 지급된 건 정말 레전드 타이밍
제게 정말 필요한 거에요 예예.. 상대적으로 SQLD 준비할 시간이 없어서 조금만 더 고민해보고 취소할듯🤣 치킨 사먹었다 치겠습니다