본문 바로가기
데이터 [Data]/SQL

SQL 서브쿼리 실습 코드

by 냉철하마 2021. 5. 14.

참고도서: 모두의 SQL(길벗) 7장 http://www.yes24.com/Product/Goods/64434562?OzSrank=1

 

모두의 SQL

난생처음 SQL로 데이터를 분석하고 가공해야 한다면? 초보자와 비전공자를 위한 가장 쉬운 SQL 입문서인터넷이 발전하고 페이스북과 같은 소셜 미디어가 활성화되면서 데이터로 모든 것을 말하

www.yes24.com

 

 

 

---- 모두의 SQL 7장: 서브쿼리 - SELECT 문 안에 있는 SELECT 문 ----
--- 1) 단일 행 서브쿼리
SELECT FIRST_NAME FROM EMPLOYEES
WHERE SALARY = (SELECT MIN(SALARY) FROM EMPLOYEES);

-- 예제 7-1. 'De Haan'과 salary가 동일한 직원
SELECT * 
FROM EMPLOYEES A
WHERE A.SALARY = (
                  SELECT SALARY FROM EMPLOYEES
                  WHERE LAST_NAME = 'De Haan'
                  );      -- '=': 단일 행 연산자

-- 'Taylor'와 salary가 동일한 직원은?
SELECT SALARY FROM EMPLOYEES WHERE LAST_NAME = 'Taylor'; -- 서브쿼리
SELECT * 
FROM EMPLOYEES A
WHERE A.SALARY = (
                  SELECT SALARY FROM EMPLOYEES
                  WHERE LAST_NAME = 'Taylor'
                  );
-- 서브쿼리가 다중 행일 경우 단일 행 연산자를 사용할 수 없음
-- 즉, A.SALARY = 8600이면서 3200일수는 없음
-- '=any' 등 연산자를 추가해줄 경우 해결 가능

--- 2) 다중 행 서브쿼리
-- 예제 7-2. department_id별로 가장 낮은 salary 조회, 해당 직원은 누구인가?
SELECT MIN(SALARY) 최저급여 FROM EMPLOYEES GROUP BY DEPARTMENT_ID; -- 서브쿼리
SELECT * 
FROM EMPLOYEES A
WHERE A.SALARY IN (
                  SELECT MIN(SALARY) 최저급여 FROM EMPLOYEES
                  GROUP BY DEPARTMENT_ID
                  )
ORDER BY A.SALARY DESC;      -- 'IN': 다중 행 연산자

-- '=ANY': 다중 행 연산자로, ANY와 ALL은 반드시 비교 연산자(>/=/<)를 앞에 같이 써야 함
SELECT * 
FROM EMPLOYEES A
WHERE A.SALARY =any (
                  SELECT MIN(SALARY) 최저급여 FROM EMPLOYEES
                  GROUP BY DEPARTMENT_ID
                  )
ORDER BY A.SALARY DESC;


--- 3) 다중 열 서브쿼리: WHERE 조건식에서 비교되는 열이 여러 개일 때 사용
-- 예제 7-3. job_id별로 가장 낮은 salary 조회, 해당 직원은 누구인가?
SELECT JOB_ID, MIN(SALARY) 그룹별급여 FROM EMPLOYEES GROUP BY JOB_ID; -- 서브쿼리
SELECT * FROM EMPLOYEES A
WHERE (A.JOB_ID, A.SALARY) IN (
                               SELECT JOB_ID, MIN(SALARY) 그룹별급여
                               FROM EMPLOYEES
                               GROUP BY JOB_ID
                               )
ORDER BY A.SALARY DESC;

--- 4) FROM절 서브쿼리: 인라인 뷰
SELECT * 
FROM EMPLOYEES A, 
    (SELECT TO_CHAR(HIRE_DATE, 'YYYY'), SUM(SALARY)
     FROM EMPLOYEES 
     GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')) B;

-- 예제 7-4. 직원 중 department_name이 IT인 직원의 정보를 인라인 뷰를 이용해 출력
SELECT * FROM EMPLOYEES A, 
            ( SELECT DEPARTMENT_ID
              FROM DEPARTMENTS
              WHERE DEPARTMENT_NAME = 'IT') B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID;

'데이터 [Data] > SQL' 카테고리의 다른 글

강의내용 정리: Data Modeling 기본  (0) 2021.06.30
SQL DML 실습 코드  (0) 2021.05.14
SQL 조인 실습 코드  (0) 2021.05.14
SQL 함수 실습 코드  (0) 2021.05.13
SQL SELECT문 실습 코드  (0) 2021.05.13

댓글