ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • subquery _ 상관쿼리( correlated subquery )
    SQL/sql 문법(mysql, mariaDB) 2024. 5. 8. 18:21

    ▤ 목차

      지난번 subquery에대해 정리를 했다.

      서브쿼리란 쿼리 안에 다른 쿼리가 들어간 것을 의미한다.

      밖의 쿼리는 outer 쿼리, 메인쿼리라고 하며 안쪽 쿼리는 inner 쿼리, 서브쿼리라고 한다.

       

      지금까지는 메인 쿼리가 실행되다가 서브쿼리의 반환값을 가져와 쿼리가 진행되었다.

      ✔ 상관(연관) 관계가 있는 서브쿼리( correlated subquery )

      내부 쿼리가 외부쿼리에서 얻은 정보에 의해 실행되는 쿼리가 있다.

      이와 같이 상관관계가 있는 서브쿼리가 있다.

      상관쿼리는 서브쿼리 단독으로 실행할 수 없다.

      상관관계가 있는 서브쿼리 또한 SELECT, WHERE, FROM문에 사용된다.

       

      ⌨ 실행되는 순서

      메인 쿼리가 먼저 실행이 된다.

      이후 서브 쿼리쪽으로 들어간다.

      이때, 메인쿼리는 서브쿼리로 한 행씩 넘어간다.

      한 행을 처리할 때마다 서브쿼리로 주고 값을 처리한다.

      그 결과를 다시 메인 쿼리로 전달한다.

      >내부적으로 성능이 저하가 된다.(데이터 양이 많으면 상당히 느려진다. )

       

      일반적으로 메인 쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용된다.

      💻 코드로 보기 (select 절 위치)

      SELECT jikwon_name, jikwon_pay, buser_no,
      	(SELECT buser_name FROM buser b WHERE b.buser_no = j.jikwon_num )
      FROM jikwon j;

       

      내부쿼리에서 메인 쿼리의 값을 가져와 비교했다.

       

      💻 코드로 보기 (where절 위치)

      SELECT jikwon_name, jikwon_pay, buser_no
      FROM jikwon j
      WHERE jikwon_pay > (SELECT AVG(jikwon_pay) FROM jikwon a 
      	WHERE j.jikwon_num = a.jikwon_num)

       

      💻 코드로 보기 (UPDATE)

      UPDATE jikwon j
      SET jikwon_pay = (SELECT sum(jikwon_pay) FROM buser b
      WHERE b.buser_no = j.buser_num);

       

      한 쿼리씩 update 한다. 데이터 양이 많은 것은 merge로 수행하는 것이 성능적으로 좋다.

       

    Designed by Tistory.