12.06(금) 본캠프 10일차 기록

Laña·2024년 12월 6일
0
post-thumbnail

<팀 프로젝트 발표회>

오늘 드디어... 이번주 팀과제의 발표회가 지나갔다!!
매니저님들의 귀여운(?) 실수로 우리조가 제일 첫번째 발표였지만 6번째로 밀려나게 되었다ㅠㅠ
너무너무 아쉬웠지만 그래두 발표에 참석을 하였는데..
첫발표부터 완벽에 가까운 발표를 해버렸다
우리만 너무 기본에 충실해서 간단하게 한 것은 아닌지 걱정했지만, 다른 사람은 이상하지 않고 깔끔하게 잘 했다고 얘기해줘서 너무 고마웠다🥺
팀원 모두 공통 세부주제를 가지고 알아볼 코드의 주제를 잡아서 각자 코드를 작성해서 추후에 공유 및 취합하는 방향으로 진행하였다
코드를 열심히 짜보았지만 팀원들의 뒤를 따라가는 것도 버거워서 자원해서 PPT의 기본 템플릿을 만들었다
몇몇은 코드 정리를 할 때, 나는 일단 해결하지 못한 코드 완성에 의의를 두었다
또한, 이번주 개인과제를 진행하면서 알게 된 ROUND( )함수를 통해 백분율을 구하는 공식을 정확히 이해하여 풀지못한 쿼리를 완성할 수 있었다.

📢 정확한 내용은 WIL 게시물을 참고!!

<오늘 배운 것 요약>

SQL 4회차 - 복습

JOIN

JOIN 이란?

두 테이블 이상을 연결하여 원하는 데이터를 추출하기 위해 SQL에서 활용!
≑ 엑셀의 VLOOKUP 함수

JOIN의 종류 및 간단한 예시⭐
실무활용 갑‼️
  • 두 테이블에서 공통된 데이터만 조회 - (INNER) JOIN

    defalt 값으로 생략 가능
    결합 기준이 명확한 데이터를 조회할 때!
    예) 주문 테이블과 고객 테이블의 교집합 (customer_id로 연결)
SELECT * 
FROM orders o INNER JOIN customers c ON o.customer_id=c.customer_id ;
	--- INNER 생략 가능 JOIN의 default 값이 INNER이기 때문!
  • 왼쪽 테이블의 모든 데이터를 조회 - LEFT JOIN

    예) 고객 테이블과 주문 테이블 중 주문을 안한 고객을 알고 싶을 때 (customer_id로 연결)
SELECT *
FROM customer c LEFT JOIN orders o ON c.customer_id=o.customer_id
WHERE o.customer_id IS NULL ; 
-- 왼쪽에 있는 테이블을 다 가져옴으로 주문 테이블에는 없는고객의 정보를 알 수 있음!

기타 종류
  • 오른쪽 테이블의 모든 데이터를 조회 - RIGHT JOIN

    LEFT JOIN의 정반대!!
    예) 고객 테이블과 주문 테이블 중 고객 테이블에 없는 주문
SELECT *
FROM customer c RIGHT JOIN orders o ON c.customer_id=o.customer_id
WHERE c.customer_id IS NULL ; 
-- 오른쪽에 있는 테이블 전체를 가져옴 -> 고객 테이블에 없는 주문을 알 수 있음!
  • 모든 가능한 조합 조회 (리그 매치 같은 너낌..?) - CROSS JOIN

    '예시는 너무 어려우니 넘어가도록 하자.....'

  • 동일 테이블 내 데이터 비교, 그룹화 - SELF JOIN
    (예시 이해는 했는데, 쿼리 짜는건 모르겠당)
    예) 같은 연령대, 다른 성별에 속한 고객 간 매칭결과를 조회하세요 (중복제거)

SELECT c1.연령대, 
       c1.고객ID AS 고객1_ID, 
       c1.이름 AS 고객1_이름, 
       c1.성별 AS 고객1_성별, 
       c2.고객ID AS 고객2_ID, 
       c2.이름 AS 고객2_이름, 
       c2.성별 AS 고객2_성별
FROM customers c1
INNER JOIN customers c2
ON c1.연령대 = c2.연령대
AND c1.성별 != c2.성별
AND c1.고객ID < c2.고객ID; #중복제거!!
  • 두 테이블 모든 데이터 조회(중복없이) - FULL OUTTER JOIN

    -> MySQL에서는 UNION 함수 이용

    실무에서는 왼쪽을 기준으로 데이터를 가져오기 때문에 RIGHT JOIN을 잘 활용하지 않음
    CROSS JOIN, SLEF JOIN은 실무 활용도 낮음
    FULL OUTTER JOIN은 MYSQL에서만 기능을 제공하지 않음!!


UNION, UNION ALL

UNION

SELECT문의 결과를 수직으로 결합 + 중복 제거 => 성능 떨어질 수 있음
SELECT문의 열 수데이터 형식동일!!
예) 여자인 고객의 아이디와 결제한 고객의 아이디

SELECT customer_id
FROM customers
WHERE gender='female'
UNION -- 두 결과를 수직으로 합치면서 중복제거!
SELECT customer_id
FROM payments ;
UNION ALL

UNION과 비슷하지만 중복도 포함!
예) 여자인 고객의 아이디와 결제한 고객의 아이디

SELECT customer_id
FROM customers
WHERE gender='female'
UNION -- 두 결과를 수직으로 합치기! (중복포함)
SELECT customer_id
FROM payments ;
FULL OUTTER JOIN - UNION으로 구현하기

= LEFT JOIN + UNION + RIGHT JOIN
예) 고객 테이블과 주문 테이블의 모든 데이터 조회 (중복 제거)

SELECT *
FROM customer c LEFT JOIN orders o ON c.customer_id=o.customer_id
WHERE o.customer_id IS NULL ; -- LEFT JOIN 이용한 주문을 안한 고객ID
UNION
SELECT *
FROM customer c RIGHT JOIN orders o ON c.customer_id=o.customer_id
WHERE c.customer_id IS NULL ; -- RIGHT JOIN 이용한 고객 테이블에 없는 주문

SUBQUERY

특징
1. SELECT, FROM, WHERE, HAVING, JOIN 등 다양하게 올 수 있음
2. 외부 QUERY와의 관계 - 비/상관
3. 외부 QUERY보다 먼저 실행 , 결과 -> 외부 QUERY


반환 타입에 따른 분류 (자세한 예시는 강의자료나 다른 자료 참고!)
  • 스칼라(=숫자,문자)
    주로 SELECT,WHERE,HAVING 에서 사용
  • 다중 행(=행)
    1개컬럼 - 여러개의 행 => 배열(리스트)
    주로 IN,ANY,ALL 등의 연산자 사용
  • 다중 열(=테이블)
    여러 열 - 여러 행 => 가상 테이블처럼 동작

위치에 따른 분류
  • SELECT
    서브쿼리 -> 단일값만!! => 외부쿼리의 새로운 파생변수 (=새로운 변수 생성)
  • FROM = 인라인 뷰
    데이터 집합 -> 가상 테이블화
    => 외부 쿼리에서 활용
  • WHERE
  1. 비교연산자
    부등호(>,<,=,!=,>=,<=) 활용
  2. 논리연산자 (서브쿼리 결과가..)
    • ANY : 하나라도 만족하면 참
    • ALL : 모두 만족해야 참
    • IN : 하나와 일치하면 참
    • EXISTS : 한 행이라도 존재하면 참

의존성에 따른 분류 (자세한 내용은 6일째 기록 참고)
  • 상관
    서브쿼리와 외부쿼리가 번갈아 가면서 결과값이 조회되는 것
    = 파이썬: 반복문과 비슷
  • 비상관
    독립적인 쿼리이며, 외부쿼리와 1번만 실행된다.
    내부 쿼리결과 -> 외부 쿼리에서 사용
  • 상관 VS 비상관
profile
SQL, Python, Code Kata

0개의 댓글