[STUDY] 240202 | DB | 서브쿼리(SubQuery)

Nimgnos·2024년 2월 11일
0

👾 STUDY

목록 보기
26/40
post-thumbnail

💻 서브쿼리(SubQuery)

  • 하나의 쿼리 안에 또 다른 쿼리가 존재
  • 두 개 이상의 테이블에서 데이터를 조회할 때 사용하는 쿼리문
    • 다른 테이블의 값을 기준으로 한 테이블에서 데이터를 검색할 수 있도록 다른 쿼리 내부에 중첩된 쿼리
    • 즉, 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미
  • 서브쿼리를 포함하고 있는 쿼리는 외부쿼리(outer query)
  • 서브쿼리는 내부쿼리(inner query)

📌 예제를 통한 서브쿼리 이해

  • 예제1

    • 김사랑 사원과 같은 부서에 근무하는 사원들의 사번, 이름, 부서번호 조회(*사번, 이름은 EMP 테이블, 부서번호는 DEPT 테이블에 존재함)

➡️ 서브쿼리 미사용 풀이

1. '김사랑' 사원의 부서를 먼저 찾기 > '김사랑' 사원의 부서번호(DEPTNO): 20

SELECT * FROM emp;
SELECT DEPTNO
FROM emp
WHERE ENAME = '김사랑';


2. 20번 부서에 근무하는 사원들의 사번, 이름, 부서번호 조회

SELECT EMPNO, ENAME, DEPTNO
FROM emp
WHERE DEPTNO = 20;


➡️ 서브쿼리 사용 풀이

SELECT EMPNO, ENAME, DEPTNO
FROM emp
WHERE DEPTNO = (SELECT DEPTNO
					FROM emp
					WHERE ENAME = '김사랑');

위 예제 SELECT 실행을 위해 2개의 쿼리 작성이 필요했으나, "서브쿼리"를 사용하면 1개의 쿼리로 조회 가능!

  • *( )내의 쿼리부터 해석함.

  • 예제2

    • '한예슬' 사원과 동일한 급여를 받는 사원들의 이름, 직급, 급여 조회
SELECT ENAME, JOB, SAL
FROM emp
WHERE SAL = (SELECT SAL
				FROM emp
				WHERE ENAME = '한예슬');
SELECT * FROM dept;	

  • 예제3

    • 모든 사원들의 사번, 이름, 부서번호, 부서명 조회
    • 사번, 이름, 부서번호(FROM EMP), 부서명(FROM DEPT)
SELECT EMPNO 
		, ENAME 
		, DEPTNO
		, (SELECT DNAME FROM dept WHERE DEPTNO = emp.DEPTNO) DNAME
FROM emp;

  • 서브쿼리에는 항상 별칭을 사용해서 구분
  • 서브쿼리는 SELECT에도 사용할 수 있음

  • 예제4

    • 모든 사원들의 급여 평균보다 더 높은 급여를 받는 사원들의 모든 정보를 조회
SELECT *
FROM emp
WHERE SAL > (SELECT AVG(SAL) FROM emp);
-- 오답 > AVG(SAL)은 SELECT 내에 존재해야 함
SELECT *
FROM emp
WHERE SAL > AVG(SAL);


📌 쿼리 함수 사용

  • 데이터를 조회할 때 집계 함수는 여러 개의 row를 집계하여 하나의 결과를 나타낼 때 사용함.
  • 기본적인 집계 함수로는 AVG(평균값), MIN(최솟값), MAX(최댓값), SUM(합), COUNT(갯수) 등이 있다.
  • 예제
    • EMP 테이블의 급여 합계, 사번 수, 급여 최댓값, 급여 최솟값, 급여 평균 조회
SELECT SUM(SAL), COUNT(EMPNO), MAX(SAL), MIN(SAL), AVG(SAL)
FROM emp;

  • 예제5

    • 근무지가 인천인 부서에 속한 사원들의 급여를 현재 급여에서 100 인상
    • 사원 급여가 달라지므로 UPDATE문 사용
    • 사원 급여(FROM EMP) / 근무지 (FORM DEPT)
    • WHERE 조건 -> 부서번호 = 부서번호 조회(지역 '인천')
UPDATE emp
SET SAL = SAL + 100
WHERE DEPTNO = (SELECT DEPTNO FROM dept WHERE LOC = '인천');

  • 예제6

    • 장바구니 저장된 상품들의 상품명, 상품가격, 장바구니 소유자 ID, 소유자명 조회
    • 상품명, 상품가격(FROM SHOP_ITEM) / 장바구니 소유자 ID, 소유자명(FROM SOP_CART)
SELECT ITEM_CODE
	, (SELECT ITEM_NAME FROM shop_item WHERE ITEM_CODE = shop_cart.ITEM_CODE) AS ITEM_NAME
	, (SELECT ITEM_PRICE FROM shop_item WHERE ITEM_CODE = shop_cart.ITEM_CODE) AS ITEM_PRICE
	, MEMBER_ID
	, (SELECT MEMBER_NAME FROM shop_member WHERE MEMBER_ID = shop_cart.MEMBER_ID) AS MEMBER_NAME
FROM shop_cart;
profile
먹고 기도하고 코딩하라

0개의 댓글