ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다중 행 서브쿼리 : ANY, ALL, EXISTS (+ subquery와 join)
    SQL/sql 문법(mysql, mariaDB) 2024. 5. 9. 14:43

    ▤ 목차

      ✔  subquery VS join

      💻 코드로 보기

      총무부에 근무하는 직원들이 관리하는 고객 출력하기

      join

      SELECT gogek_no, gogek_name, gogek_tel FROM gogek
      INNER JOIN jikwon ON jikwon.jikwon_no = gogek_damsano
      INNER JOIN buser ON buser_num = buser_no
      WHERE buser_name='총무부';

       

      subquery

      SELECT gogek_no, gogek_name, gogek_tel FROM gogek
       WHERE gogek_damsano IN (SELECT jikwon_no FROM jikwon WHERE buser_num = (SELECT buser_no FROM buser WHERE buser_name= '총무부' ));

       

      👏 정리

      서브 쿼리와 조인은 상황에 따라 맞춰 사용할 수 있다.

      서브쿼리가 직관적이라 이해하기 쉽다. 하지만 조인이 훨씬 효과적이다.

       

      서브쿼리를 조인으로 대체할 수 있는 경우

      • 스칼라 서브 쿼리
      • IN 연산자 안에 있는 서브쿼리(서브쿼리가 여러개 값을 반)
      • NOT IN 연산자 안에 있는 서브쿼리
      • EXISTS, NOT EXISTS 연산자 안의 상관관계 서브 쿼리

      ✔ ANY 연산

       NULL인 자료는 제외하고 작업한다.

      ⌨ 형식

      <ANY: 서브쿼리의 반환값 중 최대값 보다 작은 
      >ANY: 서브쿼리의 반환값 중 최대값 보다 큰 
      >= 연산자도 사용 가능

      💻 코드로 보기

      문제) 직급이 대리의 최대값보다 작은 연봉을 받는 직원 출력하라

      SELECT jikwon_no, jikwon_name, jikwon_pay FROM jikwon
      WHERE jikwon_pay <ANY (SELECT jikwon_pay FROM jikwon WHERE jikwon_jik='대리');

      👏 결과 확인

      서브 쿼리를 확인해보면, 대리이면서 최대 연봉값이 나온다.

      SELECT MAX(jikwon_pay) FROM jikwon WHERE jikwon_jik='대리'

       

      ✔ ALL 연산

      ⌨ 형식

      #<ALL: 서브쿼리의 반환값 중 최소값 보다 작은
      >ALL: 서브쿼리의 반환값 중 최소값 보다 큰
      >= 연산자도 사용 가능

      💻 코드로 보기

      문제) 30번 부서의 최대 연봉자보다 연봉을 많이 받는 직원은 ?

      SELECT jikwon_no, jikwon_name, jikwon_pay FROM jikwon
      WHERE jikwon_pay >ALL (SELECT jikwon_pay FROM jikwon WHERE buser_num=30);

      👏 결과 확인

       

       

      ✔ EXISTS : 값의 존재 유무

      값의 존재 유무를 알려준다. 반환값은 true, false이다.

      💻 코드로 보기 :EXISTS

      문제) 직원이 있는 부서 출력해보자.

      SELECT buser_name, buser_tel FROM buser bu
      WHERE EXISTS (SELECT 'imsi'FROM jikwon WHERE buser_num=bu.buser_no);

       

      💻 코드로 보기 : not EXISTS

      SELECT buser_name, buser_tel FROM buser bu
      WHERE not EXISTS (SELECT 'imsi'FROM jikwon WHERE buser_num=bu.buser_no);

       

      😊정리

      다중 행 비교 연산자 중 3가지를 알아봤다.

      시험을 준비하는 것이 아니라면 존재를 알고 잘 사용할 수 있도록 연습하자.

    Designed by Tistory.