- 집합 연산 UNION
JOIN이 양 옆으로 데이터 테이블을 붙인다 생각하면, UNION은 위아래로 이어 붙이는 것
테이블 간에 중복되는 데이터가 있다면 하나로 합쳐서, 그니까 1개만 나타냄 (중복 제외, DISTINCT같은 개념)
이게 디폴트값임
- UNION ALL
테이블 간에 중복되는 데이터가 있더라도 아래에다 그대로 붙여줌. 중복값 포함(합집합같은 개념)
Products 테이블에서 price가 5 이하 또는 200 이상인 데이터를 출력해라
>> where문에 or 써서도 출력할 수 있지만 동일 테이블 내에서도 union 사용 가능
SELECT *
FROM products
WHERE price <= 5
UNION
SELECT *
FROM Products
WHERE price >= 200
- FULL OUTER JOIN (MySQL에서 지원 안하지만 JOIN으로 구현할 수 있음)
LEFT, RIGHT JOIN 같이 쓰고 UNION으로 묶어주는 경우
Customers 테이블을 왼쪽에 두고 left join을 했는데,
만약 '비회원 주문'이라는게 있어서 고객 정보가 없어도 주문 정보가 존재할 수 있다면,
Cusotmers로 left join만 해서는 Orders 정보를 끌고 올 수 없다.
이런 정보까지 다 출력하고 싶을 때, left, right join을 똑같이 작성해주고 UNION으로 위아래를 붙여준다.
SELECT *
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
UNION
SELECT *
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
OUTER JOIN은 여기로 >> https://jaayy.tistory.com/114
- 해커랭크 예제 풀이 1 (난이도 상)
https://www.hackerrank.com/challenges/symmetric-pairs/problem?isFullScreen=true
You are given a table, Functions, containing two columns: X and Y.
Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1.
Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1.
Sample Input
Sample Output
20 20
20 21
22 23
문제 이해
X1 = Y2
X2 = Y1 이고 X<=Y니까 (20,20) 출력
X3 = Y6
X6 = Y3 이고 X3 < Y6인데 X6 < Y3은 아니라서 (20,21)만 출력
풀이 접근
1. x = y인 경우, 그게 한 쌍 더 있어야 함 (2개)
2. x ≠ y인 경우, f1으로 지정한 테이블에서는 x를, f2로 지정한 테이블에서는 y를 키로 잡고 inner join하면 (8 18) (18 8) 이런 식으로 나옴
3. 2번의 경우 중 x<y를 where문으로 뽑아내기
4. 1번+2번을 합치기, union
5. 마지막에 X값을 기준으로 오름차순
select x, y, count(*)
from functions
where x=y
group by x, y
having count(*) = 2
>> 이걸로 x=y인 데이터 출력, 그거의 개수도 세 봄
>> (13,13)만 2쌍 >> 최종 출력결과에 이것만 나와야 하는거임
>> having 필터링으로 2쌍으로 존재하는 페어만 출력 13, 13, 2
select f1.x, f1.y
from functions as f1
inner join functions as f2 on f1.x = f2.y and f1.y = f2.x
where f1.x < f1.y
order by x
>> self join(inner join), 같은 테이블끼리 조인하는 것이므로 별칭 지정해줘야 함
>> f1.x = f2.y and f1.y = f2.x → X1=y2, X2=Y1의 조건문을 써준 것
>> where문에는 x<y인 경우만 출력하도록 조건 써줌
>> 우리가 출력할건 8, 18 처럼 x가 작은 경우니까 select에 f1.x, f1.y만
>> 마지막으로 x를 기준으로 오름차순(union한 후 전체적으로 정렬 적용할 때는 뒷 쿼리의 마지막 줄에 써주기)
풀이1 최종코드: inner join, groupby, having, union 사용
SELECT X, Y
FROM Functions
WHERE X = Y
GROUP BY X, Y
HAVING COUNT(*) = 2
UNION
SELECT f1.x, f1.y
FROM Functions as f1
INNER JOIN Functions as f2 ON f1.x=f2.y AND f1.y=f2.x
WHERE f1.x < f1.y
ORDER BY X
풀이2: (서브쿼리+if문), groupby, having으로도 해결 가능 >> 나중에 내용 보충
'SQL' 카테고리의 다른 글
프로그래머스 SQL - 조건에 부합하는 중고거래 상태 조회하기(Lv.2) (1) | 2024.10.11 |
---|---|
프로그래머스 SQL - 상품 별 오프라인 매출 구하기(Lv.2) (0) | 2024.10.11 |
OUTER JOIN(LEFT, RIGHT)/ALIASES (+ 리트코드 예제) (2) | 2024.10.10 |
INNER JOIN (+ 해커랭크 예제) (1) | 2024.10.10 |
프로그래머스 SQL - 평균 일일 대여 요금 구하기/재구매가 일어난 상품과 회원 리스트 구하기 (3) | 2024.10.09 |