티스토리 뷰
-- Product 테이블에서 price가 5이하 또는 200 이상인 상품들만 출력
SELECT *
FROM products
WHERE price<=5 OR price>=200;
-- Product 테이블에서 price가 5이하 또는 200 이상인 상품들만 출력
SELECT *
FROM products
WHERE price<=5
UNION
SELECT *
FROM products
WHERE price>=200
두 코드는 모두 같은 결과값을 가진다.
UNION 은 중복값을 제외하고 두 테이블을 결합한다.
UNION ALL 은 중복값을 포함해 두 테이블을 결합한다.
* 테이블간의 차는 EXCEPT, MINUS 를 활용할 수 있으나 오라클에서만 되고 MySQL 은 지원하지 않는다
-- 고객정보O 주문정보X
SELECT *
FROM customers
LEFT JOIN orders ON customers.customerid = orders.customerid
UNION
-- 고객정보X 주문정보O (비회원주문)
SELECT *
FROM customers
RIGHT JOIN orders ON customers.customerid = orders.customerid
MySQL 에서 지원하지 않는 FULL OUTER JOIN 을 사용하기 위해선 LEFT JOIN 과 RIGHT JOIN 테이블을 UNION 한다
연습문제
https://www.hackerrank.com/challenges/symmetric-pairs/problem?h_r=internal-search&isFullScreen=true
Symmetric Pairs | HackerRank
Write a query to output all symmetric pairs in ascending order by the value of X.
www.hackerrank.com
연습문제 해설 : 테이블 내부에 특정 규칙을 충족하는 행을 찾아라
- 규칙 : x1=y2, x2=y1 이를 충족하는 행을 찾아라 (예) 20 21 21 20 -> 좌우반전된 모양
* 규칙에 만족하는 행이 인접해야 한다는 조건은 없다
- 규칙에 만족하면서 x1 <= y1 데이터만 출력한다
-- X = Y
SELECT X, Y
FROM functions
WHERE X=Y
GROUP BY X, Y
HAVING COUNT(*) = 2
UNION
-- X < Y
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 -- UNION 사용시 마지막 쿼리에서 정렬 가능
어려운 점
1. 문제 해석을 잘못했다. 규칙을 만족하는 행이 꼭 인접해야 한다고 생각했으나, 그런 조건은 없었다.
2. 모든 조건을 만족하는 행을 한번에 출력하려고 했다 -> UNION 을 활용한다
3. GROUP BY 에 대한 이해도 부족 -> COUNT(*)
4. SELF JOIN 에 대한 이해도 부족 -> 조건 부여
* 접근 방법
1. x1 = y1 즉 모든 데이터가 동일한 결과를 찾는다 (예) 20 20 20 20
1-1. GROUP BY 와 HAVING, COUNT 를 사용한다
2. 좌우반전된 데이터를 찾는다 (예) 20 21 21 20
2-1. 단, x1 < y1 조건 만족해야 한다
3. 두 테이블을 더한다
3-1. x ASC 로 정렬해 출력한다
* 이 문제는 여러번 다시 풀어볼 것!
'SQL' 카테고리의 다른 글
[SQL] 기초 공부 3일차 (0) | 2022.01.06 |
---|---|
[SQL] 기초 공부 2일차 (0) | 2022.01.04 |
[SQL] 기초 공부 1일차 (0) | 2021.12.24 |