SQL/sql 문법(mysql, mariaDB)

다중 행 서브쿼리 : ANY, ALL, EXISTS (+ subquery와 join)

읽히는 블로그 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가지를 알아봤다.

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