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가지를 알아봤다.
시험을 준비하는 것이 아니라면 존재를 알고 잘 사용할 수 있도록 연습하자.