[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);
💡 생일이 같은 경우, 월/일만 추출해서 같은지 비교해야함.
'SQL쿼리' 카테고리의 다른 글
[Oracle] 오라클 - 분석 함수 (RANK/ DENSE_RANK/ROW_NUMBER) (0) | 2022.08.09 |
---|---|
[Oracle] 오라클 - ROLLUP/CUBE/GROUPING + GROUP_ID (0) | 2022.08.09 |
[Oracle] 오라클 - NULL 관련 함수(NVL) (0) | 2022.08.09 |
[Oracle] 오라클 - 변환 함수 (TO_CHAR/SYSTIMESTAMP) (0) | 2022.08.09 |
[Oracle] 오라클 - EXTRACT/MONTHS_BETWEEN/NEXT_DAY (0) | 2022.08.09 |
블로그의 정보
개발자 미니민의 개발로그
mini_min