[SQL] 서브쿼리 개념 실습 복습

yookyungmin·2023년 10월 17일
0

조인보다 서브쿼리가 좀 익숙하지 않아서 다시 공부해서 포스팅 해보려고 합니다

서브쿼리

  • 서브쿼리란 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미한다.
  • Group by 절을 제외하고는 모든 절에서 사용 가능
  • 서브쿼리는 반드시 괄호안에 사용해야 한다.

서브쿼리 실행 순서

  • 서브쿼리 실행 -> 메인(부모) 쿼리 실행

서브쿼리(=자식쿼리, 내부쿼리) - 메인쿼리 컬럼 사용 불가
메인쿼리(=부모쿼리, 외부쿼리) - 서브쿼리 컬럼 사용불가

서브쿼리 장점

  • 서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해준다.
  • 서브쿼리는 복잡한 JOIN이나 UNION 과 같은 동작을 수행할 수 있는 또 다른 방법을 제공
  • 서브쿼리는 복잡한 JOIN이나 UNION보다 좀더 읽기 편하다

서브쿼리 위치에 따른 명칭

스칼라 서브쿼리(Scalar Subquery)

  • Select 문에 서브쿼리 작성
  • 딴 테이블에서 어떠한 값을 가져올때 쓰인다
  • 하나의 레코드만 리턴이 가능하며 두개 이상 레코드는 리턴할 수 없다.
  • 일치하는 데이터가 없더라도 NULL값을 리턴할 수 있다. 이는 원래 그룹함수의 특징 중에 하나인데 스칼라 서브쿼리 또한 이 특징을 가진다.
  • SELECT 절의 서브쿼리는 결과가 반드시 하나의 값이어야 함

Q. 부서코드가 D9 인 사원의 ID/이름/부서명을 출력 하라는 쿼리를 급조해서 작성해 보았다.

SELECT [컬럼], (SELECT [컬럼] FROM [테이블] WHERE 조건)
FROM [테이블]
WHERE 조건;

  • 스칼라 서브쿼리
select e.emp_id, e.emp_name, (select dept_title from department d where d.dept_id = e.dept_code) DTITLE 
FROM employee e where e.dept_code = 'D9';
  • JOIN 문
select e.emp_id, e.emp_name, d.dept_title  from employee e inner join department d
on e.dept_code = d.dept_id where e.dept_code = 'D9';


동일한 데이터가 나오는데 역시 조인이 더 익숙하다..

인라인 뷰 서브쿼리

  • FROM문에 나타나는 서브쿼리
  • FROM 절에 사용 되면 AS 별칭을 무조건 지정해줘야 한다.
  • FROM 절에 서브쿼리를 사용하면 특정 조건식을 갖는 SELECT 문을 테이블처럼 사용할 수 있습니다. 이를 통해 SELECT 문을 효율적이고 간결하게 작성할 수 있습니다.

SELECT [컬럼]
FROM (SELECT [컬럼] FROM [테이블] WHERE [조건]) AS [별명]
WHERE 조건;

Q. 사원테이블과 부서테이블에서 '부서별' 부서명, 월급 총합, 평균, 부서별 인원수를 출력하세요.

  • 인라인뷰 쿼리
SELECT E.DEPT_CODE, D.DEPT_TITLE, 합계, 평균, 인원수 
FROM (SELECT DEPT_CODE,SUM(SALARY) 합계, AVG(SALARY) 평균, COUNT(*) 인원수 FROM EMPLOYEE GROUP BY DEPT_CODE) E, department d
where E.DEPT_CODE = D.DEPT_ID
ORDER BY E.DEPT_CODE;
  • JOIN 쿼리
SELECT E.DEPT_CODE, D.DEPT_TITLE, SUM(E.SALARY) AS 합계, AVG(E.SALARY) AS 평균, COUNT(*) AS 인원수
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D ON E.DEPT_CODE = D.DEPT_ID
GROUP BY E.DEPT_CODE, D.DEPT_TITLE
ORDER BY E.DEPT_CODE;

중첩 서브쿼리

  • WHERE 문에 사용하는 서브쿼리

SELECT [컬럼]
FROM [테이블]
WHERE [컬럼][연산자](SELECT [컬럼] FROM [테이블] WHERE 조건);

Q. 이름이 심봉선인 사람의 급여보다 높은 사람들을 구하세요

SELECT * FROM EMPLOYEE
WHERE SALARY > (
SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME IN ('심봉선'));

SELECT * FROM EMPLOYEE
WHERE SALARY > (
SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME = '심봉선');

Q. DEPT_CODE가 D9인 사람들을 구하시오

SELECT * FROM EMPLOYEE
WHERE SALARY  IN(
SELECT SALARY FROM EMPLOYEE WHERE DEPT_CODE IN ('D9'));

SELECT * FROM EMPLOYEE
WHERE SALARY  = ANY(
SELECT SALARY FROM EMPLOYEE WHERE DEPT_CODE IN ('D9'));

IN 가 ANY는 동일한 의미이다.

추가로 INSERT 문 DELET문 UPDATE문에도 사용이 가능하다
간략하게 정리를 하면서 효율성이 떨어지는거 같지만서도 여러가지 상황이 있으니 좀더 문제를 풀면서 학습을 해야될거 같습니다.

참고
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC

https://dev-kwon.tistory.com/14

0개의 댓글