카테고리 없음

[SQL] 서브쿼리

왕초보코딩러 2024. 2. 4. 21:30
728x90

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

 

[Oracle] Inline View 인라인뷰란

인라인뷰 소개 서브쿼리가 FROM 절에서 안에서 사용되는 경우, 해당 서브쿼리를 '인라인뷰'라고 한다. FROM 절에서 사용된 서브쿼리의 결과가 하나의 테이블에 대한 뷰(View)처럼 사용된다. SELECT * FR

loghada.tistory.com

 

 


WHERE절에서 서브쿼리

 

메인쿼리

서브 쿼리 밖에 있는 SELECT문

 

서브 쿼리

WHERE 절에 있는 SELECT문

1. 단일 값을 리턴하는 서브 쿼리 = 단일 행 서브 쿼리

2. 하나의 컬럼을 리턴하는 서브 쿼리 = 다중 행 서브 쿼리

3. 여러 컬럼을 리턴하는 서브 쿼리 = 다중 컬럼 서브 쿼리

 

https://seoyuun22.tistory.com/entry/SQL-%EC%84%9C%EB%B8%8C-%EC%BF%BC%EB%A6%AC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EB%8B%A8%EC%9D%BC-%ED%96%89-%EB%8B%A4%EC%A4%91-%ED%96%89-NOT-IN-EXISTS-NOT-EXISTS-1

 

[SQL] 서브 쿼리 사용하기 1 - 단일 행, 다중 행

1. 단일행 서브쿼리 특정 쿼리에서 검색한 값을 다른 쿼리에서 받아 검색하려면 서브 쿼리를 사용해야 한다. EX ) JONES 보다 더 많은 월급을 받는 사원들의 이름과 월급을 출력하라 JONES 보다 더 많

seoyuun22.tistory.com

 

 

WHERE절에서 집계 함수는 사용이 불가하다!!

그렇기 때문에 집계 함수를 적용하고 싶다면 서브 쿼리를 사용해야 한다!

https://velog.io/@tolerance/TIL-WHERE-%EC%A0%88%EA%B3%BC-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98-%EA%B7%B8%EB%9F%B0-%EA%B1%B0-%EC%97%86%EC%9D%8C

 

[TIL] WHERE 절과 집계함수? 그런 거 없음

엣지 퀘스천으로 인생을 살아가는 새럼.. 오늘도 이런 것에 딴지를 걸었다.

velog.io

 

 

단일 행 서브 쿼리

하나의 row를 리턴하는 서브쿼리를 WHERE절에 쓸 때

비교 연산자(=, <, >, <=, >=, <>) 사용

SELECT *
FROM product
WHERE price > (SELECT AVG(price) FROM product);

전체 테이블 결과 / where절에 서브 쿼리를 넣은 결과

 

 

다중 행 서브 쿼리

여러 row를 리턴하는 서브쿼리를 WHERE절에 쓸 때

 

1. IN

서브쿼리 안에 있으면

WHERE 컬럼 IN (서브쿼리)

 

2. ANY

서브쿼리 안에 하나라도 만족하면

#하나라도 서브쿼리 결과보다 크면 조건 만족
WHERE 컬럼 > ANY (서브쿼리)

 

3. ALL

서브쿼리 안에 모든 것을 만족하면

#서브쿼리 결과보다 모두 작으면 조건 만족
WHERE 컬럼 < ALL (서브쿼리)

 

4. EXISTS

서브쿼리가 참인 게 하나라도 존재하면 WHERE절 조건이 참 

WHERE EXISTS (서브쿼리)
WHERE NOT EXISTS (서브쿼리)	#서브쿼리가 참인 게 존재하지 않으면 WHERE절 조건이 참

 

https://carami.tistory.com/18

 

IN, ANY, ALL 설명

1. IN - 조건절에서 사용하며 다수의 비교값과 비교하여 비교값 중 하나라도 같은 값이 있다면 true 이다. - SELECT * FROM emp WHERE sal IN(950, 3000, 1250);- 'sal = 950 OR sal = 3000 OR sal = 1250' - 950, 3000, 1250 과 동

carami.tistory.com

 


 

전체 테이블

 

서브쿼리

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

 

[SQL] 서브쿼리의 모든 것 - Sub Query, Inline View, Scalar, Multi Column

쿼리 안에 또 다른 쿼리 - Sub Query SELECT col1, (SELECT ...) -- 스칼라 서브쿼리(Scalar Sub Query): 하나의 컬럼처럼 사용 (표현 용도) FROM (SELECT ...) -- 인라인 뷰(Inline View): 하나의 테이블처럼 사용 (테이블

data-make.tistory.com

 

 


서브쿼리가 중첩되면 코드가 길어지고 가독성이 떨어진다

-> 뷰로 저장하고 사용

 

계속 쓰는 결과 테이블이 있다

-> 뷰로 저장하고 사용

 

뷰 만들기

CREATE VIEW [뷰 이름] AS 
[테이블을 만들 쿼리];

 

뷰의 장점

가상 테이블로, 컴퓨터에서 물리적인 용량을 차지하지 않는다

sql문을 계속 만들 필요 없이 재활용하여 편리하다

직무 별 테이블 구조를 만들어 제공할 수 있고, 기존의 테이블은 건드리지 않아도 된다

민감한 부분은 제외하는 뷰를 만들어 데이터 보안이 가능하다