23.05.01 데이터베이스

천용·2023년 5월 1일
0

데이터베이스

목록 보기
17/22

<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만 쓰면 검색이 되지 않는다.

profile
성장하는 개발자가 되자

0개의 댓글