UNION : 2개 이상 테이블에 존재하는 같은 성격의 값을 하나의 쿼리로 추출할 때 사용한다. 새로운 행으로 결합.
- UNION ALL : 중복 허용하고 모든 값을 추출하는 방법
- UNION(=UNION DISTINCT) : 중복되지 않는 값만 추출하는 방법
문제)
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
ONLINE_SALE 테이블은 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
OFFLINE_SALE 테이블은 OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
코드)
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM (
SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
USER_ID,
PRODUCT_ID,
SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE)=3
UNION
SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
NULL AS USER_ID,
PRODUCT_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE)=3
) A
ORDER BY
SALES_DATE ASC,
PRODUCT_ID ASC,
USER_ID ASC;
여기서 자꾸 오류가 났던 부분은 UNION 연산은 서브쿼리의 결과 열의 순서와 데이터 형식이 동일해야 한다는 점이었다. 그래서 첫 번째 서브쿼리와 두 번째 서브쿼리의 열 순서를 일치시켜야 한다.
JOIN : 하나의 공통의 속성으로 두 테이블을 결합할 때 사용한다. 새로운 열로 결합.
- INNER JOIN (=JOIN)
내부 조인. 두 테이블을 조인할 때 두 테이블에 모두 지정한 열의 데이터가 있어야한다. 교집합
문제)
상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.
FIRST_HALF 테이블은 SHIPMENT_ID, FLAVOR, TOTAL_ORDER 는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF 테이블의 기본 키는 FLAVOR입니다.
ICECREAM_INFO 테이블은 FLAVOR, INGREDITENT_TYPE 은 각각 아이스크림 맛, 아이스크림의 성분 타입을 나타냅니다. INGREDIENT_TYPE에는 아이스크림의 주 성분이 설탕이면 sugar_based라고 입력되고, 아이스크림의 주 성분이 과일이면 fruit_based라고 입력됩니다. ICECREAM_INFO의 기본 키는 FLAVOR입니다. ICECREAM_INFO테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.
코드)
SELECT A.FLAVOR
FROM FIRST_HALF A
JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR
WHERE A.TOTAL_ORDER > 3000 AND B.INGREDIENT_TYPE LIKE '%fruit%';
JOIN 절의 ON 조건은 두 테이블 간의 관계를 정의하는데 사용된다. 이 관계는 기본 키(primary key)와 외래 키(foreign key)를 사용하여 정의할 수 있지만, 반드시 그렇게 할 필요는 없다. 그래서 두 테이블 간의 관계가 기본 키와 외래 키로 정의되지 않았더라도, 다른 열을 기준으로 JOIN을 할 수 있다.
- OUTER JOIN
외부 조인. 두 테이블을 조인할 때, 한개의 테이블에만 데이터가 있어도 된다. 합집합
- LEFT OUTER JOIN : 왼쪽 테이블 모든 값 출력
- RIGHT OUTER JOIN : 오른쪽 테이블 모든 값 출력
- FULL OUTER JOIN : 왼쪽 또는 오른쪽 테이블 모든 값 출력
추가) 날짜 포맷 사용방법
USER_INFO 테이블은 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.
USER_INFO 테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.
SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE (DATE_FORMAT(JOINED, '%Y') LIKE '2021')
AND (AGE<= 29 AND AGE>=20)
'Algorithm' 카테고리의 다른 글
[ 알고리즘 ] DFS, BFS 란? (0) | 2024.04.06 |
---|---|
[ Python ] 정렬 (2) - list 예시 (0) | 2024.04.05 |
[ Python ] 정렬 (1) - list 개념 (0) | 2024.04.04 |
[ 알고리즘 ] 스택/큐 이론 (0) | 2024.04.02 |
[ SQL ] SQL 연산자 ( IN, EXISTS ) (0) | 2024.03.25 |