[mysql] 서브쿼리

이영주·2021년 3월 31일
0

MySQL

목록 보기
11/11

서브쿼리란 무엇일까?

sql 문 안에 부품처럼 들어가는 select 문이다.
서브(sub)라는 단어는 하위의 또는 일부분의 라는 뜻을 가지고 쿼리는 데이터베이스에 보내는 요청을 뜻한다.
종합하면 서브쿼리는 전체 sql 문에서 일부를 이루는 또 다른 sql 문인 것이다.
서브쿼리를 쓸 때는 꼭 괄호로 감싸주어야 한다.

select 절에 있는 서브쿼리

*select 절에 있는 서브쿼리는 컬럼의 최댓값, 평균값처럼 특정 컬럼의 특징을 찾아주는 서브쿼리를 자주 쓴다

SELECT
	id,
    name,
    price,
    (SELECT MAX(price) FROM item)
FROM copang_main_item;

where절에 있는 서브쿼리

(1)

SELECT id, name, price
FROM item
WHERE price = (SELECT MAX(price) FROM item);

(2)
서브쿼리가 또 다른 형식의 결과를 리턴하는 경우

SELECt * FROM item
WHERE id IN
(
SELECT item_id
FROM review
GROUP BY item_id HAVING COUNT(*) >= 3
);

▶ IN 이 있으면 그 뒤에 있는 값들 중에서 하나라도 같은 게 있으면 조건을 만족한다.

▶ ANY 는 조건에 만족하는 값들 중 단 하나의 값보다도 크다면 True를 리턴한다.

▶ ALL은 모든 경우에 대해서 해당 조건이 성립해야 True를 리턴한다.

From 절에 있는 서브쿼리

From 절에 오는 서브쿼리는 table 형태이고 이렇게 탄생한 테이블을 derived 테이블이라고 한다.
그리고 꼭 alias 를 붙여주어야 한다.

SELECT AVG(review_count)
FROM
(SELECT
	SUBSTRING(adress, 1, 2) AS region,
    COUNT(*) AS review_count
FROM review AS r LEFT OUTER JOIN member AS m
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING region IN NOT NULL
	AND region != '안드') AS review_count_summary;

비상관 서브쿼리, 상관 서브쿼리

▶ 비상관 서브쿼리
그 자체만으로도 실행이 가능한 쿼리로 서브쿼리로 사용된 쿼리를 따로 빼서 별도로 실행해도 결과가 잘 나온다. 이것은 이 서브쿼리가 그것을 둘러싼 outer query와 별개로 독립적으로 실행되기 때문에 그런것이다. 이렇게 outer query와 상관 관계가 없는 서브쿼리를 비상관 서브쿼리라고 한다.

▶ 상관 서브쿼리
상관 서브쿼리란 outer query와 상관 관계가 있는 쿼리를 말한다.

서브쿼리가 필요로 하는 item 테이블이 서브쿼리의 FROM 절에 있는게 아니라 outer query에 있기 때문에 독립적으로 실행이 안된다.

  1. item 테이블의 첫번째 row에서 review 테이블의 item_id 컬럼에 있는지 조회한다.
  2. EXISTS 하면 WHERE 절은 True가 되고 item 테이블의 row는 최종 조회 결과 바구니에 담긴다.
  3. 이제 한줄 씩 row를 내려가면서 위의 과정이 반복된다. 이것과 정 반대로 NOT EXISTS를 사용해 만약 존재하지 않는다면의 조건으로 바꿀 수도 있다.
  4. EXISTS와 IN 의 연산 결과는 같으나 차이가 있다면 EXISTS는 한 row씩 조회한다는 점이고 IN의 경우에는 모든 행을 다 보기 때문에 실행 결과가 EXISTS가 더 빠를 수 있다는 점이다.

0개의 댓글