DBMS (MySQL)/DBMS (Oracle)

[DB] 서브쿼리

(งᐛ)ว 2023. 10. 17. 23:27
728x90

** MySQL 서브쿼리 참고

 

[DBMS] order by, limit, distinct, group by, 서브쿼리, 다중조건문

[order by] select * from 테이블명 order by 컬럼명 desc/asc; select문 사용 시 테이블에 입력된 순서대로 출력되는 것이 기본 내림차순(desc), 오름차순(asc) 정렬 필요할 때 사용 기본사용 select * from city order b

studywithjw.tistory.com

 

서브쿼리

SQL문에 또다른 SQL문을 삽입해 검색에 이용

 

서브쿼리 사용가능 위치 

- WHERE, HAVING  절 

- SELECT, DELETE문의 FROM 절

- UPDATE문의 SET 절 

- INSERT문의 INTO

 

 

--사원테이블에서 이름이 'Michael'이고 직종이 'MK_MAN'인 사원의 급여보다 많이받는 사원들의 사번, 이름, 직종, 급여 순으로 출력

 

--1단계) Michael이 받는 급여?

SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME = 'Michael' AND JOB_ID = 'MK_MAN'; --13000

 

--2단계) 13000보다 급여를 많이받는 사원들 조회

SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY FROM EMPLOYEES WHERE SALARY >13000;

 

--3단계) 1)과 2)를 한 구문으로 합치기

SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY FROM EMPLOYEES

WHERE SALARY > (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME = 'Michael' AND JOB_ID = 'MK_MAN');

 

 

--회사의 평균급여 이상 받는 사람들의 이름과 급여를 조회

SELECT FIRST_NAME, SALARY FROM EMPLOYEES

WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEES);

 

 

--사번이 111인 사원과 직종이 같고 사번이 159인 사원의 급여보다 많이 받는 사원들의 정보를 사번, 이름, 직종, 급여 순으로 출력

SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY FROM EMPLOYEES

WHERE JOB_ID = (SELECT JOB_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 111) --FI_ACCOUNT

AND

SALARY > (SELECT SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = 159); --8000

 

 

--직종, 평균급여를 출력하되 평균급여가 Bruce사원의 급여보다 큰 경우만 조회

SELECT JOB_ID, AVG(SALARY) FROM EMPLOYEES

GROUP BY JOB_ID HAVING AVG(SALARY) > (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME = 'Bruce');

 

 

--사원테이블에서 성에 'Bat'이라는 단어를 포함하는 사원과 같은 부서에서 근무하는 사원의 부서번호, 이름을 출력

SELECT DEPARTMENT_ID, FIRST_NAME FROM EMPLOYEES

WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE LAST_NAME LIKE '%Bat%');

 

 

--사원테이블에서 성이 'Kochhar'인 사람의 급여보다 많이 받는 사원들의 사번, 성, 직종, 급여 출력

SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY FROM EMPLOYEES

WHERE SALARY > (SELECT SALARY FROM EMPLOYEES WHERE LAST_NAME LIKE 'Kochhar');

 

 

--사원테이블에서 급여가 가장 적은 사람의 사번, 이름, 급여를 출력

SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM EMPLOYEES

WHERE SALARY = (SELECT MIN(SALARY) FROM EMPLOYEES);

 


 

SET절에서의 서브쿼리

--사원번호가 100번인 사람의 이름을 150번 사원의 이름으로 바꾸기

UPDATE EMPLOYEES SET FIRST_NAME = (SELECT FIRST_NAME FROM EMPLOYEES WHERE EMPLOYEE_ID = 150)

WHERE EMPLOYEE_ID = 100;

변경전
변경후

 

 

SELECT문 자체에서의 서브쿼리 (SCARLAR)

--사원테이블에서 전체평균급여와 부서별 평균급여 구하기

SELECT DEPARTMENT_ID, AVG(SALARY) AS "부서별 평균급여", (SELECT AVG(SALARY) FROM EMPLOYEES) AS "전체평균"

FROM EMPLOYEES GROUP BY DEPARTMENT_ID; 

 

 

FROM절에서의 서브쿼리 (INLINE VIEW)

--사원테이블에서 부서번호가 80인 사원들 중 직종이 'SA_MAN'인 사원들의 정보 조회하기

SELECT * FROM (SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 80) WHERE JOB_ID = 'SA_MAN'; 

 

 

서브쿼리의 위치에 따른 이름 참고 

흔히 WHERE절에서의 서브쿼리 : SUB QUERY _ 하나의 변수처럼 사용되는 쿼리문
FROM절에서의 서브쿼리 : INLINE VIEW _ 쿼리문으로 출력되는 결과를 테이블처럼 사용
SELECT절에서의 서브쿼리 : SCALAR _ 하나의 컬럼처럼 사용되는 쿼리문

 

 

 

 

 

728x90