[SQL] 데이터 분석, 활용 _ 필터링을 통한 서브쿼리

강지영·2023년 2월 22일
0

📚 필터링 서브쿼리의 제약

WHERE 절에 서브쿼리는 단일값 또는 단일 컬럼만 가능하다!

서브쿼리 결과를 단순 비교할 때는 단일값이어야 하지만!

IN | ALL | ANY 등의 필터링 연산 시에는 서브쿼리가 단일 컬럼(Nx1)에 형태를 가져야 한다.

🔫 IN 연산

포함된 것
만약 서브쿼리가 단일 컬럼 A, B, C를 가져왔다면 메인쿼리는 여기에 포함된 것
즉 성적이 A, B, C인 학생만 필터링한다.

🔫 ALL 연산

모두를 만족하는 것
가령 서브쿼리가 단일 컬럼 80, 72, 68을 가져왔다면 이것들을 가지고 비교 연산을 하는데 이들 모두보다 큰 값을 필터링한다.

🔫 ANY 연산

하나라도 만족하는 것
예를 들어 서브쿼리가 단일 컬럼 80, 72, 68일 때, 메인쿼리는 비교 연산을 통해서 적어도 하나만이라도 만족한 값을 필터링한다.


실습

📑 판매량 상위 3개 음료를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오.

-- 판매량 상위 3개 음료를 다음과 같이 조회
SELECT 
	id AS "ID",
	name AS "음료명"
FROM
	beverages
WHERE
	id IN (
			-- 음료 ID별 판매량
		SELECT 
			beverage_id
		FROM
			order_details
		GROUP BY
			beverage_id
		ORDER BY
			SUM(count) DESC
		LIMIT
			3
);

📑 아메리카노와 라떼보다 가격이 싼 음료는 다음과 같다. 주어진 쿼리를 조합하여 이를 조회하시오.

-- 아메리카노와 라떼보다 가격이 싼 음료
SELECT 
	id		AS "ID",
	name	AS "음료명"
FROM
	beverages
WHERE
	price < ALL (		
	-- 아메리카노 라떼 가격
	SELECT
		price
	FROM
		beverages
	WHERE
		name IN ('아메리카노','라떼')
);
	

📑 커피가 아닌 음료들 중, 적어도 한 커피 보다 가격이 비싼 것은 다음과 같다. 주어진 두 쿼리를 조합하여 이를 조회하시오.

-- 커피가 아닌 음료들 중, 적어도 한 커피 보다 가격이 비싼 것
SELECT
	name		AS "음료명",
	price		AS "가격"
FROM
	beverages
WHERE
	btype != 'COFFEE'
	AND
	price > ANY (
		-- 모든 커피의 가격
	SELECT
		price
	FROM 
		beverages
	WHERE
		btype = 'COFFEE'

	)
;

훈련

📑 다음 쿼리 A, B가 동작하지 않는 이유를 설명하시오
A ) WHERE절에서는 WHERE 절에 서브쿼리는 단일값 또는 단일 컬럼이 되어야 하고,
IN | ALL | ANY 등의 필터링 연산 시에는 서브쿼리가 단일 컬럼(Nx1)에 형태를 가져야 하는 데 아래의 쿼리는 그렇지 않다. beverage_id,수정함

-- 메인 쿼리(판매량 상위 3개의 음료 정보)
SELECT
  id     AS "ID",
  name   AS "음료명"
FROM
  beverages
WHERE
  id IN (
    -- 음료 id 별, 판매량
    SELECT
     ~~beverage_id,~~
      SUM(count)
    FROM
      order_details
    GROUP BY
      beverage_id
    ORDER BY           -- 내림차순 정렬(판매량 기준)
      SUM(count) DESC
    LIMIT              -- 개수 제한(상위 3개만)
      3
  )
;

B ) 서브쿼리 결과가 하나 이상의 행을 리턴했다. => [수정한 부분]

-- 메인 쿼리(적어도 한 커피 보다 비싼 음료)
SELECT
  name    AS "음료명",
  price   AS "가격"
FROM
  beverages
WHERE
  btype != 'COFFEE'
    AND
  price >  [ANY](
    -- 모든 커피의 가격
    SELECT
      price
    FROM
      beverages
    WHERE
      btype = 'COFFEE'
  )
;
profile
Hello World!

0개의 댓글