MySQL로 진행합니다
서브쿼리란
SELECT문 안에 SELECT문을 사용하는 것
서브 쿼리는 괄호로 묶어준다
1. SELECT 절에 사용(스칼라 서브 쿼리)
2. FROM 절에 사용(인라인 뷰)
3. WHERE 절에 사용(일반 서브 쿼리)
SELECT절에 서브쿼리( = 스칼라 서브쿼리)
단일 값을 리턴한다.
product 테이블에서
product_name(상품 이름), star(별점)를 추출하고
서브쿼리로 avg_star(상품들의 평균 별점)을 추출한다
SELECT
id,
star,
(SELECT AVG(star) FROM product) AS avg_star
FROM product;
FROM절에서 서브쿼리( = 인라인 뷰)
테이블이 리턴되는 서브쿼리를 사용할 때 이 테이블을 FROM절에서 사용할 수 있다
서브쿼리로 만들어진 테이블을 derived table이라고 하고, 쿼리 안에서만 유효한 테이블이다
derived table에는 꼭 별칭을 붙여줘야 한다(AS 별칭)
SELECT *
FROM (서브 쿼리) AS 별칭;
https://loghada.tistory.com/18
WHERE절에서 서브쿼리
메인쿼리
서브 쿼리 밖에 있는 SELECT문
서브 쿼리
WHERE 절에 있는 SELECT문
1. 단일 값을 리턴하는 서브 쿼리 = 단일 행 서브 쿼리
2. 하나의 컬럼을 리턴하는 서브 쿼리 = 다중 행 서브 쿼리
3. 여러 컬럼을 리턴하는 서브 쿼리 = 다중 컬럼 서브 쿼리
WHERE절에서 집계 함수는 사용이 불가하다!!
그렇기 때문에 집계 함수를 적용하고 싶다면 서브 쿼리를 사용해야 한다!
단일 행 서브 쿼리
하나의 row를 리턴하는 서브쿼리를 WHERE절에 쓸 때
비교 연산자(=, <, >, <=, >=, <>) 사용
SELECT *
FROM product
WHERE price > (SELECT AVG(price) FROM product);
다중 행 서브 쿼리
여러 row를 리턴하는 서브쿼리를 WHERE절에 쓸 때
1. IN
서브쿼리 안에 있으면
WHERE 컬럼 IN (서브쿼리)
2. ANY
서브쿼리 안에 하나라도 만족하면
#하나라도 서브쿼리 결과보다 크면 조건 만족
WHERE 컬럼 > ANY (서브쿼리)
3. ALL
서브쿼리 안에 모든 것을 만족하면
#서브쿼리 결과보다 모두 작으면 조건 만족
WHERE 컬럼 < ALL (서브쿼리)
4. EXISTS
서브쿼리가 참인 게 하나라도 존재하면 WHERE절 조건이 참
WHERE EXISTS (서브쿼리)
WHERE NOT EXISTS (서브쿼리) #서브쿼리가 참인 게 존재하지 않으면 WHERE절 조건이 참
전체 테이블
서브쿼리
20000 이하인 것만 조회
-> 10000, 7500
SELECT price FROM product WHERE price < 20000;
<IN>
10000, 7500 중에 있으면 조건 만족
SELECT *
FROM product
WHERE price IN (SELECT price FROM product WHERE price < 20000);
<ANY>
10000 보다 작거나, 7500 보다 작으면 조건 만족(둘 중 하나만 만족)
SELECT *
FROM product
WHERE price < ANY (SELECT price FROM product WHERE price < 20000);
<ALL>
10000보다 크고, 7500보다 크면 조건 만족(모두 만족)
SELECT *
FROM product
WHERE price > ALL (SELECT price FROM product WHERE price < 20000);
<EXISTS>
서브쿼리에 row가 존재하면 조건 만족
SELECT *
FROM product
WHERE EXISTS (SELECT price FROM product WHERE price < 20000);
+연관 서브쿼리: 서브쿼리가 메인쿼리의 컬럼을 가지고 있을 때
https://data-make.tistory.com/25
서브쿼리가 중첩되면 코드가 길어지고 가독성이 떨어진다
-> 뷰로 저장하고 사용
계속 쓰는 결과 테이블이 있다
-> 뷰로 저장하고 사용
뷰 만들기
CREATE VIEW [뷰 이름] AS
[테이블을 만들 쿼리];
뷰의 장점
가상 테이블로, 컴퓨터에서 물리적인 용량을 차지하지 않는다
sql문을 계속 만들 필요 없이 재활용하여 편리하다
직무 별 테이블 구조를 만들어 제공할 수 있고, 기존의 테이블은 건드리지 않아도 된다
민감한 부분은 제외하는 뷰를 만들어 데이터 보안이 가능하다