<58번> 평균 월급보다 많은 급여를 받고 이름에 '우'이 포함된 사원과 같은 부서에서 근무하는
사원의 사원 번호, 이름, 급여를 표시하시오.
SELECT EMPNO 사원번호, ENAME 이름, SAL 급여
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP)
AND DEPTNO = ANY(SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%우%');
이 결과 SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%우%'
이 부분이 부서번호가 20,50 두 개가 반환되어 출력되지 않는다. 이 때 ANY와 ALL등 한가지를 써서 조건을 충족 시켜주어야한다.
ANY 여러가지 조건들 중에 충족하는 값 EX) 파트 20이거나 50이다. > 조건에 충족
ALL 여러가지 조건들을 모두 충족하는 값 EX)파트 20 50 둘 다 일수는 없다.
SELECT EMPNO 사원번호, ENAME 이름, SAL 급여
FROM EMP
WHERE SAL > ALL (SELECT AVG(SAL) FROM EMP)
AND DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%우%');
이렇게 바꾼다면 ALL을 사용할 수 있다.
ANY는 IN과 비슷한 느낌인거같다.
오답요인 DEPTNO IN SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%우%');처럼 해야하는데
DEPTNO =(X) IN SELECT DEPTNO FROM EMP WHERE ENAME LIKE '%우%');
NVL(A,B)
SELECT buyer_name 거래처, NVL(buyer_charger, '없다') 담당자
FROM buyer;
A컬럼에 널값이 있는경우 B로 치환하라
SELECT JOB, AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = (
SELECT MIN(AVG_SAL)
FROM (
SELECT AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY JOB
)
);
EMP 테이블에서 업무별 평균 급여를 구한 뒤, 이 중 최솟값을 가지는 업무를 출력하는 쿼리문은 다음과 같습니다.
SELECT JOB, AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = (
SELECT MIN(AVG_SAL)
FROM (
SELECT AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY JOB
)
);
위 쿼리문에서, EMP 테이블에서 업무별 평균 급여를 먼저 구한 뒤, 이 중 최솟값을 가지는 업무를 찾기 위해 서브쿼리를 사용하였습니다. 서브쿼리에서는 EMP 테이블에서 업무별 평균 급여를 구한 후, MIN 함수를 사용하여 이 중 최솟값을 구합니다. 이 값을 HAVING 구문에서 비교하여 최솟값을 가지는 업무를 출력합니다.
JOIN을 사용할때 ON을 사용하지 않고 WHERE만 쓰면 검색이 되지 않는다.