5월 25일 화요일 (11일차) - ANY, ALL ㅇ

@_@·2021년 5월 25일
0

Database

목록 보기
21/28

<목차>
(다중 행 서브쿼리)
ㅇ ANY
ㅇ ALL
ㅇ 다중 행 서브 쿼리에서의 NULL 값




(다중 행 서브쿼리)

  • 서브쿼리 결과가 여러 개 나오는 것
  • IN, ANY, ALL
  • 실험) 이 명령문은 무엇이 잘못되었을까요?
SELECT employee_id, last_name
FROM employees
WHERE salary = (SELECT MIN(salary)
		FROM employees
        GROUP BY department_id

서브쿼리의 결과가 다수의 값이 나오니까 '=' 연산자 사용하면 안 돼 => IN 사용


ㅇ ANY, ALL 연산자

  • 단일연산자는 1개의 값밖에 비교할 수 없어 => ANY, ALL
    • IN : 30, 40
    • <ALL : 전부보다 작은 값들
      : 서브쿼리 결과 중 최솟값(30)보다 작은 값을 찾아 => 10, 20
    • >ALL : 전부보다 큰 값들
      : 서브쿼리 결과 중 최댓값(40)보다 큰 값을 찾아 =>50, 60
    • <ANY : 젤 큰 값보다 작은 값들
      : 서브쿼리 결과 중 최댓값(40)보다 작은 값을 찾아 => 10, 20, 30
    • >ANY : 젤 작은 것보다 큰 값들
      : 서브쿼리 결과 중 최솟값(30)보다 큰 값을 찾아라 => 40, 50, 60
  • ANY, ALL 설명 잘 되어 있는 블로그
  • ALL은 서브쿼리 결과들을 포함하지 않고, ANY는 포함할 수 있어

ㅇ 실습) 4가지 모두로 실습해보기
: IT_PROG라는 업무를 하는 사원들의 급여보다 급여가 ㅇㅇ한 사원을 구하여라.

  • 답이 맞는지 체크하기 위해 서브쿼리만 실행하여 IT_PROG 급여 확인
SALARY
9000
6000
4800
4800
4200

IT_PROG 최소급여보다 작은 사람들

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL ( SELECT salary
		FROM employees
		WHERE job_id = 'IT_PROG' )
  • 실수한 부분) IT PROG라고 언더바 안 썼더니 107개 다 나와
    (아마 서브쿼리가 NULL이 나와서 WHERE절이 의미 없어졌나 봐) Q.왜 노로우셀렉티드가 아니라?
    다중 행 서브쿼리에서는 널이 있어도 되나 봐 ---여기는 나중에 실험 다시 해서 수정하자

IT_PROG 최대급여보다 큰 사람들

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary > ALL ( SELECT salary
		FROM employees
		WHERE job_id = 'IT_PROG' )

IT_PROG 최대급여보다 작은 사람들

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY ( SELECT salary
		FROM employees
		WHERE job_id = 'IT PROG' )
  • ANY 안 쓰고 그룹함수 MAX 사용해도 되지만 ANY가 더 성능 좋아
  • MAX는 그룹함수라서 계산 수행하는 작업 늘어나

IT_PROG 최소급여보다 큰 사람들

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary > ANY ( SELECT salary
		FROM employees
		WHERE job_id = 'IT PROG' )

ㅇ 다중 행 서브쿼리에서 NULL은?

ㅇ 실험) (논란 있을 문제이긴 해;;)

SELECT e.last_name
FROM employees e
WHERE e.employee_id NOT IN (SELECT m.manager_id
				FROM employees m)

no rows selected

  • 서브쿼리에서 106개의 매니저 아이디와 1개의 NULL값이 나와 (King 혼자 매니저 없으니까)
  • NOT IN 썼으니까 여기 안에 없는 값을 찾아라
    즉, NULL을 찾아라 = King 찾아라 라는 의도였지만
  • 서브쿼리가 값을 넘겨줄 때 NULL값을 찾는 경우는 존재할 수 없다. ★
  • 그냥 IS NULL 사용


profile
STEP BY STEP

0개의 댓글