NOW OR NEVER

[DataBase] 데이터조작어(DML) - Sub Query 본문

Back-End/Database

[DataBase] 데이터조작어(DML) - Sub Query

LAURA 2022. 4. 22. 18:52
반응형

Sub Query

  • 부속질의, 하위질의, 중첩질의, 내부질의 라고도 한다.
  • sql 문장 안에 포함되는 또 다른 sql문을 말한다.
  • ex)
    • select bookname from book where price = (select max(price) from book);
    • select ename from emp where dno in (select dno from dept where dloc = '서교동');
    • =, in 등 다양한 연산자 활용 가능
  • main query : 주 질의, 외부질의
  • 똑같은 문제를 조인 혹은 서브쿼리로 표현할 수 있다,
    • 자료의 수가 적을 때는 별 차이 없지만 레코드 수가 많을 때는 성능의 차이가 있다.
    • 자료의 수가 많을 때는 조인 보다는 서브쿼리를 권장한다. 서브쿼리가 조인보다 더 성능적인 면에서는 효율성이 높기 때문이다.
    • 어떠한 경우에는 반드시 서브쿼리를 써야만 문제해결을 할 수 있고 반드시 조인과 서브쿼리 중 무엇을 사용해야 한다라는 것은 없다. 하지만 데이터 양이 많을 때는 검색속도 측면에서 서브쿼리가 조인보다 성능이 좋다.

종류

  • scalar subquery 스칼라 부속 질의
    • select 절에 칼럼이름 오는 곳에 사용되는 부속 질의
    • 단일 행이 오도록 표현해야 함
    • 원친적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용 가능, 일반 적으로 select문과 update set 절에 사용
    • update문에 사용된 스칼라 서브쿼리
      • update 테이블명 set 컬럼명 =(서브쿼리)
    • 주 질의와 부속 질의와의 관계는 상관, 비상관 모두 가능
    • scalar_expression(비교연산자)[all,
  • inline view 인라인 뷰
    • from절에 사용되는 부속쿼리(즉 서브쿼리가 from절에 오는 경우를 뜻함)
    • 필요한 곳에서 가상의 테이블을 만들어 사용하는 것
    • 가상 테이블인 뷰 형태로 제공 되어 부속질의로 사용 불가능
  • 중첩쿼리
    • 인라인 절에 사용되는 부속쿼리
    • where 절에 사용
    • 서브쿼리의 건수가 1건일때 조건식에 =연산자 사용가능
    • 서브쿼리의 건수가 여러 건 일 때는 = 연산자 사용 불가, in 사용해야 함

상관 서브 쿼리

  • select 컬럼1, 컬럼2, ... from 테이블1 where 연산자 (select 컬럼 3 from 테이블2 where 테이블 1.컬럼1 = 테이블2.컬럼4);
  • 서브쿼리의 조건식에 메인쿼리의 테이블과 조건식이 필요한 경우를 말한다.
  • 메인 쿼리와 서브 쿼리에 사용되는 테이블들의 컬럼을 조건식에 서로 관련을 맺고 있을 때 사용
  • 메인쿼리와 상관이 있는 서브쿼리(서브쿼리가 메인쿼리와 상관이 있다), 즉 메인쿼리에 의미가 있는 서브쿼리
  • 메인쿼리와의 조건 식을 표현하는 것을 말한다.
  • 서브쿼리에 조건식이 메인쿼리와 조건식이 있어서 join이라고 생각할 수 있는데 이 경우 조인이라 하지 않고 상관서브쿼리라 한다.
  • ex) select b1.bookname from book b1 where b1.price > (select avg(b2.price) from book b2 where b1.publisher = b2.publisher);

집합연산자

  • 메인쿼리 where 연산자 서브쿼리
  • minus
    • 차집합
    • 해당 서브쿼리가 제외된 메인쿼리 출력
    • select name from customer minus select name from customer where custid in (select custid from orders); : 모든 고객 - 주문한 고객
  • exists
    • select 컬럼1, 컬럼2 from 테이블 1 where exists (select 컬럼 3 from 테이블2 where 테이블 1.컬럼1 = 테이블2.컬럼4);
    • 서브쿼리에 레코드가 한 건이라도 존재한다면 메인쿼리 실행, 존재하지 않으면 메인쿼리 실행하지 않는다.
    • 그래서 서브쿼리는 반드시 상관서브쿼리가 되어야 한다.(메인쿼리와 서브쿼리간에 조건식이 필요하다)

다중행 연산자

  • 서브쿼리가 where 절에 사용 될 때 서브쿼리의 건 수가 여러 건일 때 사용하는 연산자
  • in : 서브쿼리의 건수가
  • all, any(some) : 서브쿼리의 건수가 여러 건일 때 비교 연산자(>, <, >=, <= 등)를 표현할 때 같이 사용
    • 서브쿼리의 건수가 여러 건이면 단일 행 연산자인 비교연산자를 바로 사용할 수 없어서 all, any(some)과 같이 사용
    • all : 메인쿼리가 비교연산자를 통해 모든 서브쿼리의 결과에 대한 것을 모두 만족해야 할 때 사용
      • 메인쿼리 where 컬럼 > all(서브쿼리)를 max함수를 사용하여 단일 행 연산자로도 표현할 수 있다.

Tips

  • distinct는 컬럼에도 줄 수 있다.
Comments