[TIL] 서브쿼리

meek·2023년 3월 15일
0

/*elice*/

목록 보기
5/21
post-thumbnail

1. 서브쿼리

💡 서브쿼리

하나의 쿼리 안에 포함된 또 하나의 쿼리이며, 메인 쿼리가 서브쿼리를 포함하는 종속적인 관계이다. 서브쿼리를 통해 필터링, 정렬, 집계 등을 위해 사용할 수 있다.

  • 복잡한 논리로 데이터를 추출하고 싶을 때, 여러 테이블을 연결하면 데이터가 꼬일 수도 있다. 그럴 때 서브쿼리를 사용하면 직관적으로 데이터를 사용하기 좋다.

  • 예시) 연봉 A를 받고 있는 여자가 어떤 책을 읽는지 궁금한데 이걸 매년 읽는지 올해만 읽는지 궁금한 경우

🐢 서브쿼리의 특징

  • 알려지지 않은 기준을 이용한 검색에 유용
    -> '알려지지 않은 기준'의 예시 : 연봉이 상위 5%인 여자
  • 메인 쿼리가 실행되기 이전에 한 번만 실행
    -> select문이 실행될 때 서브쿼리 -> 메인쿼리 순으로 실행된다.
  • 한 문장에서 여러 번 사용 가능
    SELECT *
    FROM orders
    WHERE customer_id IN
    (SELECT customer_id
    FROM customers
    WHERE country = 'USA');
    -- 괄호의 전체가 서브쿼리

❗ 주의사항

  1. 서브쿼리는 괄호와 함께 사용되어야 한다.
  2. 서브쿼리 안에서 ORDER BY 절은 사용할 수 없다.
  3. 서브쿼리는 연산자의 오른쪽에 사용되어야 한다.
    👉 메인쿼리 <(연산자) 서브쿼리
  4. 서브쿼리는 오로지 SELECT문으로만 작성 할 수 있다.

2. 반환에 따른 분류

💡 단일 행 서브쿼리

결과가 한 행만 나오는 서브쿼리이다. 서브쿼리가 결과를 1개의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.

      SELECT *
      FROM products
      WHERE price > 
      (SELECT AVG(price) FROM products);
      -- 괄호의 전체가 서브쿼리
  • 사원번호는 기본적으로 1개만 있으므로 한 개의 행만 반환한다
    👉 단일 행

💡 다중 행 서브쿼리

결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를 2개 이상 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.

	SELECT *
    FROM employee
    WHERE 급여 IN
    (SELECT max(급여) FROM employee GROUP BY 부서번호);
    // 괄호의 전체가 서브쿼리

🐢 다중 행 연산자

기호
IN하나라도 만족하면 반환
ANY하나라도 만족하면 반환, 비교 연산 가능
ALL모두 만족하면 반환, 비교 연산 가능

3. 위치에 따른 분류

🐢 스칼라 서브쿼리

  • SELECT절에서 사용하는 서브쿼리
  • 스칼라 서브쿼리는 오로지 한 행만 반환해 마치 JOIN을 사용한 것과 같은 결과를 나타냄
  • 데이터가 많을 경우 join보다 스칼라를 사용했을 때 조금 더 데이터가 빨리 추출되는 경우도 있다.
    👉 계산 속도 향상을 위해 사용
	SELECT students.name, (
      SELECT math
      FROM middle_test as m
      WHERE m.student_id = students.student_id
   ) AS middle_avg
   FROM students;

1. 서브쿼리

💡 서브쿼리

하나의 쿼리 안에 포함된 또 하나의 쿼리이며, 메인 쿼리가 서브쿼리를 포함하는 종속적인 관계이다. 서브쿼리를 통해 필터링, 정렬, 집계 등을 위해 사용할 수 있다.

  • 복잡한 논리로 데이터를 추출하고 싶을 때, 여러 테이블을 연결하면 데이터가 꼬일 수도 있다. 그럴 때 서브쿼리를 사용하면 직관적으로 데이터를 사용하기 좋다.

  • 예시) 연봉 A를 받고 있는 여자가 어떤 책을 읽는지 궁금한데 이걸 매년 읽는지 올해만 읽는지 궁금한 경우

🐢 서브쿼리의 특징

  • 알려지지 않은 기준을 이용한 검색에 유용
    -> '알려지지 않은 기준'의 예시 : 연봉이 상위 5%인 여자
  • 메인 쿼리가 실행되기 이전에 한 번만 실행
    -> select문이 실행될 때 서브쿼리 -> 메인쿼리 순으로 실행된다.
  • 한 문장에서 여러 번 사용 가능
    SELECT *
    FROM orders
    WHERE customer_id IN
    (SELECT customer_id
    FROM customers
    WHERE country = 'USA');
    -- 괄호의 전체가 서브쿼리

❗ 주의사항

  1. 서브쿼리는 괄호와 함께 사용되어야 한다.
  2. 서브쿼리 안에서 ORDER BY 절은 사용할 수 없다.
  3. 서브쿼리는 연산자의 오른쪽에 사용되어야 한다.
    👉 메인쿼리 <(연산자) 서브쿼리
  4. 서브쿼리는 오로지 SELECT문으로만 작성 할 수 있다.

2. 반환에 따른 분류

💡 단일 행 서브쿼리

결과가 한 행만 나오는 서브쿼리이다. 서브쿼리가 결과를 1개의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.

      SELECT *
      FROM products
      WHERE price > 
      (SELECT AVG(price) FROM products);
      -- 괄호의 전체가 서브쿼리
  • 사원번호는 기본적으로 1개만 있으므로 한 개의 행만 반환한다
    👉 단일 행

💡 다중 행 서브쿼리

결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를 2개 이상 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리이다.

	SELECT *
    FROM employee
    WHERE 급여 IN
    (SELECT max(급여) FROM employee GROUP BY 부서번호);
    // 괄호의 전체가 서브쿼리

🐢 다중 행 연산자

기호
IN하나라도 만족하면 반환
ANY하나라도 만족하면 반환, 비교 연산 가능
ALL모두 만족하면 반환, 비교 연산 가능

3. 위치에 따른 분류

🐢 스칼라 서브쿼리

  • SELECT절에서 사용하는 서브쿼리
  • 스칼라 서브쿼리는 오로지 한 행만 반환해 마치 JOIN을 사용한 것과 같은 결과를 나타냄
  • 데이터가 많을 경우 join보다 스칼라를 사용했을 때 조금 더 데이터가 빨리 추출되는 경우도 있다.
    👉 계산 속도 향상을 위해 사용
	SELECT students.name, (
      SELECT math
      FROM middle_test as m
      WHERE m.student_id = students.student_id
   ) AS middle_avg
   FROM students;
profile
hello, world!

0개의 댓글