SQL 구문을 작성할 때 가장 중요한 부분이 서브쿼리를 활용하는 것 같다.
조건문에도 추가적인 부분으로 사용할 수 있고, 일부만을 긁어오기 위해서 쓰기도 하고 서브쿼리의 활용은 어마하다.
서브쿼리를 통해 복잡한 것도 실행할 수 있게 해주기 때문에 꼭! 알아야할 부분이다.
오늘은 이 서브쿼리에 대해 자세하게 알아보는 것을 중점으로 포스팅 해보려 한다.
서브 쿼리 종류
서브쿼리의 종류는 크게 두개로 나뉜다.
결과가 단일 스칼라 값을 반환하는 스칼라 서브쿼리와 서브쿼리의 결과가 한개 이상의 행이나 열을 반환하는 테이블 서브쿼리가 있다.
스칼라 서브쿼리는 주로 SELECT 문의 열 리스트에서 사용한다.
테이블 서브쿼리는 필터링 조건을 만족하는 ROW를 선택하기 위해 WHERE 절에서도 사용하고,
다른 테이블과 조인하거나 중첩된 쿼리를 생성할 때를 위해 FROM 절에서도 사용한다.
예제
먼저 스칼라 서브쿼리를 어떻게 사용하는지 살펴보자
SELECT employee_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
이런 형식으로 하나의 값을 반환하기 때문에 부등호와 함께 사용해 조건을 만족시킨다.
테이블 서브쿼리는 어떻게 사용되는지 살펴보자
SELECT department_name
FROM departments
WHERE department_id IN (SELECT department_id FROM employees WHERE salary > 50000);
테이블 서브쿼리는 여러행을 반환하기 때문에 IN, JOIN 등과 같은 연산자들을 함께 사용하고,
다른 테이블과 관련된 데이터를 필터링하거나 결합할 수 있다.
이렇게 SQL 서브 쿼리를 사용한다면 데이터 베이스에서 더 복잡한 데이터를 검색하고 조작할 수 있고,
데이터 베이스의 데이터를 더 효율적으로 활용하는 것이 가능해진다!
추가 꿀팁) 실전 예시로 알아보는 두 종류의 차이점!
한 회사에서 직원들의 월급을 데이터 베이스에 입력해둔 상태라고 가정하자
이 때, 스칼라 서브쿼리를 사용해서 구하는 예시를 들면 평균 급여를 산정해서 평균보다 높은 급여를 받는 직원을 선택할 때 사용할 수 있다.
코드 형식으로 간단하게 작성해봤다.
SELECT employee_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
테이블 서브쿼리를 사용하는 예시로는, 부서 컬럼을 선택해서 급여가 일정 금액보다 높은 직원의 부서명을 표현하도록 하는 방법이 있다.
코드 형식으로 이해를 돕자면,
SELECT department_name
FROM departments
WHERE department_id IN (SELECT department_id FROM employees WHERE salary > 50000);
이런식으로 부등호로 이루어진 방법이 아닌 IN을 사용한 코드이다.
서브쿼리 특징
1. 서브쿼리는 메인쿼리와 독립적으로 실행해 결과에 의존하지 않는 비상관 서브쿼리와 메인쿼리의 결과에 의존하며 하나씩 실행하는 상관 서브쿼리가 있다.
2. 서브쿼리는 무제한으로 중첩이 가능하다.
3. 예외 상황을 처리해 NULL이나 다른 기본값을 반환하는 방법을 사용한다.
4. 서브쿼리는 사용후 이름을 부여할 수 있는데, 가독성이 좋은 이름을 사용하는 것을 권장한다.
5. 성능을 최적화하려면 인덱스를 적절하게 활용하며, JOIN 연산을 사용하는 것이 좋다.
이정도만 알아도 서브쿼리를 사용하는 것에 있어서 큰 도움이 될 것이다!
'SQL' 카테고리의 다른 글
[MYSQL] 개인적으로 헷갈린 부분들 정리집 (0) | 2023.10.12 |
---|---|
[MYSQL] 임시 테이블 생성하기 (1) | 2023.10.11 |
[MYSQL] 평점으로 상품 분류하기 - 실전 예제 (1) | 2023.10.06 |
[MYSQL] DATEDIFF를 사용한 Churn Rate 구하기 (1) | 2023.10.06 |
[MYSQL] 테이블 생성부터 삭제까지 알아보자 (0) | 2023.10.05 |