개발자 미니민의 개발스터디

[Oracle] 오라클 - 서브쿼리 subquery

by mini_min
[Oracle] 
오라클 - 서브쿼리 subquery

✔️ 서브쿼리

--SELECT, INSERT, UPDATE, DELETE 문에서 사용되는 SELECT 문

--SELECT 문의 SELECT 절, FROM 절, WHERE 절에서 사용 가능

--서브쿼리는 단독으로 실행 가능하다.

--SELECT 절에서는 하나의 컬럼, 하나의 행의 결과를 출력하는 경우만 사용 가능

--WHERE 절에서는 하나의 컬럼만 가능, IN이나 ANY 등에서는 여러행 출력도 되지만

-- > , <, = , <= , >= , != 등의 연산에서는 하나의 행만 가능!!

 

❌ 아래와 같이 코드 짜면 에러발생

SELECT name, sal
	FROM emp
	WHERE sal = (SELECT MAX(sal), MIN(sal) FROM emp);
		--에러 (: 서브쿼리에 컬럼이 두개)
        
SELECT name, sal
	FROM emp
	WHERE sal = (SELECT sal FROM emp WHERE city = '서울');
		--에러 : = 으로 비교하는데 값이 여러개 (하나만 =으로 비교 가능하다.)

 

 

🔒 문제

--- 서울 사람이 아닌 사원 중 서울 평균 급여보다 많이 받는 사람. name, sal, city
    SELECT name, sal, city
        FROM emp
        WHERE city != '서울' AND sal > (SELECT AVG(sal) FROM emp WHERE city= '서울');


-- name, sal, 평균급여(sal) 와 차이
    SELECT name, sal, TRUNC(sal - (SELECT AVG(sal) FROM emp)) 차이
    FROM emp;
    
    
--sal + bonus 가 가장 많은 사원 : name, sal, bonus, sal + bonus
    SELECT name, sal, bonus, sal+bonus
    FROM emp
    WHERE sal+bonus = (SELECT MAX(sal+bonus) FROM emp);

 

 

Q. 부서별 인원수가 가장 많은 부서는?

SELECT dept, COUNT(*) FROM emp GROUP BY dept
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM emp GROUP BY dept);

 

Q. 입사년도별 인원가수 가장 많은 년도 및 인원수

SELECT EXTRACT(YEAR FROM hireDate) 입사년도 , COUNT(*) 인원수
FROM emp
GROUP BY EXTRACT(YEAR FROM hireDate)
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM emp GROUP BY EXTRACT(YEAR FROM hireDate));

 

Q. 생일이 동일한 사람이 2명 이상인 경우 출력

SELECT name, TO_DATE(SUBSTR(rrn,1,6), 'RRMMDD') birth
FROM emp
WHERE SUBSTR(rrn, 3,4) IN (
    SELECT SUBSTR(rrn,3,4)FROM emp GROUP BY SUBSTR(rrn,3,4)
        HAVING COUNT(*) >= 2
)
ORDER BY SUBSTR(rrn,3,4);
💡 생일이 같은 경우, 월/일만 추출해서 같은지 비교해야함.

 

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기