SQL

[MySQL] #15 서브 쿼리 실습을 해보자~

째아 2023. 1. 17. 15:39

-- ### SubQuery ###
-- 1.  ‘SMITH'의 직무와 같은 사람의 이름, 부서명, 급여, 직무를  출력하라.

SELECT e.ename, d.dname, e.sal, e.job
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND job = (
SELECT job
                FROM emp
                WHERE ename = 'SMITH'
                );




-- 2.  ‘JONES’가 속해있는 부서의 모든 사람의 사원번호, 이름, 입사일, 급여를 출력하라.

SELECT empno, ename, hiredate, sal
FROM emp
WHERE deptno = (
SELECT deptno
                FROM emp
                WHERE ename = 'JONES'
                );


                
-- 3.  전체 사원의 평균급여보다 급여가 많은 사원의 사원번호, 이름,부서번호, 입사일,급여를 출력하라.

SELECT empno, ename, deptno, hiredate, sal
FROM emp
WHERE sal > (
 SELECT avg(sal)
             FROM emp
             );



-- 4. 10번 부서와 같은 일을 하는 사원의 사원번호, 이름, 급여를 검색..급여가 많은 순으로 출력하라.

SELECT empno, ename, sal
FROM emp
WHERE job IN (
SELECT job
            FROM emp
            WHERE deptno = 10
            )
ORDER BY sal DESC;




-- 5.  10번 부서 중에서 30번 부서에는 없는 업무를 하는 사원의 사원번호, 이름, 부서번호,업무, 입사일을 출력하라.

SELECT empno, ename, deptno, job, hiredate
FROM emp
WHERE deptno = 10
AND job NOT IN (
SELECT job
            FROM emp
            WHERE deptno = 30
            );





-- 6.  ‘KING’이나 ‘JAMES'의 급여와 같은 사원의 사원번호, 이름,급여를 출력하라.

SELECT empno, ename, sal
FROM emp
WHERE sal IN (
SELECT sal
                FROM emp
                WHERE ename IN ('KING', 'JAMES')
                );




-- 7.  급여가 30번 부서의 최고 급여보다 높은 사원의 사원번호,이름, 급여를 출력하라.

SELECT empno, ename, sal
FROM emp
WHERE sal > (
 SELECT max(sal)
             FROM emp
             WHERE deptno = 30
             );



-- 8. SCOTT의 급여보다 더많은 급여를 받는 사원을 검색
-- 2가지 방법을 사용 1) 서브쿼리  2) 테이블 알리야스를 사용

-- 1)
SELECT *
FROM emp
WHERE sal > (
SELECT sal
            FROM emp
            WHERE ename = 'SCOTT'
            );
-- 2)
SELECT e.*
FROM emp e, (
SELECT sal
            FROM emp
            WHERE ename = 'SCOTT'
            ) s
WHERE e.sal > s.sal;



-- 9. 부서별 최소급여 중에서 20번 부서의 최소급여보다 더 큰 최소급여를 검색

SELECT deptno, min(sal)
FROM emp
GROUP BY deptno
HAVING min(sal) > (
SELECT min(sal)
            FROM emp
            WHERE deptno = 20
            );



-- 10. 급여가 10번부서에 속한 적어도 어느 한 명의 사원의 급여보다 더 많은 급여를 받는 사원을 검색. 
-- 이때 10번 부서에 속한 사원은 제외 
-- 정렬은 사원번호순으로 한다. 

SELECT *
FROM emp
WHERE sal > ANY (
SELECT sal
            FROM emp
            WHERE deptno = 10
            )
AND deptno != 10
ORDER BY empno;



-- 11. 30번 소속 사원들 중에서 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원의 이름과 급여를 검색 
-- 2가지 방법 사용

SELECT ename, sal
FROM emp
WHERE sal > (
SELECT max(sal)
            FROM emp
            WHERE deptno = 30
            );
SELECT ename, sal
FROM emp
WHERE sal > ALL (
SELECT sal
            FROM emp
            WHERE deptno = 30
            );




-- 12. 부하직원을 거느린 사원을 검색 . 상사이름과 상사의 사원번호가 검색되도록(얄리야스 상사이름, 상사사원번호)

SELECT e1.ename 사원, e2.ename 상사이름, e2.empno 상사사원번호
FROM emp e1, emp e2
WHERE e1.empno IN (
SELECT mgr
                FROM emp
)
AND e1.mgr = e2.empno;


-- KING 까지 나오게 하려면..
SELECT ename, mgr 상사사원번호, (SELECT ename FROM emp WHERE empno = 상사사원번호) tkdtkdlfma
FROM emp
WHERE empno IN (
SELECT ifnull(mgr, 0)
                FROM emp
                );