5월 25일 화요일 (11일차) - 서브쿼리 실습

@_@·2021년 5월 25일

Database

목록 보기
24/39

<목차>
ㅇ 서브쿼리 실습





ㅇ 섭쿼리 문제 풀때

1내가뭘몰라
2누가받아
3어떤연산자

ㅇ25번
: Zlotkey와 동일한 부서에 근무하는 다른 모든 사원들의 사번 및 고용번호 날짜 출력

오답

SELECT employee_id, hire_date
FROM employees
WHERE department_id = ( SELECT department_id
		FROM employees
		WHERE last_name = 'Zlotkey' )

처음에 employee_name 이라고 적음 ㅋㅋㅋ

정답

SELECT employee_id, hire_date
FROM employees
WHERE department_id IN ( SELECT department_id
		FROM employees
		WHERE last_name = 'Zlotkey' )
AND last_name != 'Zlotkey'

1다른 사원들 이니까 질러키를 빼줘야 해
2질로키가 여러명일 수 있으니 단항연산자인 =가 아니라 IN을 써줘야 해
(여기서는 우연히 1명이라서, 오류가 나지 않았어)

ㅇ26번
: 회사 전체 평균 급여보다 더 급여를 많이 받는 사원들의 사번 및 이름 출력

SELECT employee_id, last_name
FROM employees
WHERE salary > ( SELECT AVG(salary)
		FROM employees )

출력하고 싶은 것 : 사번, 이름 => 메인쿼리 셀렉트 절
모르는 것 : 평균 급여 => 서브쿼리
비교 : 급여 > 평균 급여

ALL 쓰신 분들 있어 - 그룹바이절이 없으니까 필요 없어~


<3교시>

ㅇ 27번
: 이름에 U가 포함되는 사원들과 동일 부서에 근무하는 사원들의 사번 및 이름을 출력

SELECT employee_id, last_name
FROM employees
WHERE department_id IN ( SELECT department_id
		FROM employees
		WHERE last_name LIKE '%U%'
		OR last_name LIKE '%u%' )

안 좋은 습관 : 에러 메세지 그냥 넘기는 것
에러 메세지에 답이 있어!! (자바 디버깅 할 때 처럼)
공통적인 에러메세지가 싱글로우 어쩌고~ 서브쿼리에 더 많은 행이 떨어진다 ㅋㅋ

SELECT employee_id, last_name
FROM employees
WHERE department_id IN ( SELECT department_id
		FROM employees
		WHERE last_name LIKE '%u%' )

이렇게 찾으셨네. 소문자만 찾아서?!

90프로 이상은 동일하다고 생각해도 돼...-주어를 못 들었음

ㅇ 28번
: 시애틀에 근무하는 사람들 중 커미션을 받지 않는 모든 사람들의 이름, 부서명, 지역아이디 출력

시애틀 도시 이름 - city라는 컬럼에 존재. Locations라는 테이블에 있어
seattle

이쪽 다시 보자
이테이블의 디아이디는 디테이브르이 디아이디
디테이블의 로케아이디는 로케테이블의 로케이이디

로케이션아이디의 시티--- 놓쳣

시에틀의 로케이션 아이디 - 여기에 해당하는 디파트먼트까지 연달아서 찾고 싶어

지금은 어려워
1차 프로젝트 때 내가 디비를 직접 만들면 더 이해해. 걱정하지마

-풀이
1 보고싶은 것 셀렉트절에 사원이름 디파트먼트네임 로케이션 아이디
2 라스트네임은 임플로이, 디파트먼트네임과 로케이션 아이디 는 디파트먼트테이블
로케이션스테이블 찾아와도 돼 - 이러면 코드 더 쉽게 이해될 수 있긴 해

조인으로 풀면

SELECT last_name, department_name, location_id
FROM employees e, department d, location l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND l.city='Seattle'
AND e.commission_pct IS NULL

우리는 서브쿼리 배웠으니까 섭쿼리 써보자
굳이 로케이션까지 가진 말자

SELECT last_name, department_name, location_id
FROM employees e, department d, location l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND l.city='Seattle'
AND e.commission_pct IS NULL

시애틀 도시 번호 알고 싶은 거야.
애틀의 로케이션아이디를 이용해서 디파트먼트 테이블에서
SELECT location_id
FROM locations
WHERE city='Seattle'

SELECT last_name, department_name, location_id
FROM employees e, department d
WHERE e.department_id=d.department_id
AND d.location_id=(SELECT location_id
FROM locations
WHERE city='Seattle')
AND e.commission_pct IS NULL

서브쿼리에 있는 시에틀은 매인쿼리의 테이블에서 가져온 것이 아니니까
조인 접두어 쓸 필요 없어

ㅇ29번
: 이름이 데이비스davies인 사람보다 후에 고용된 사원들의 이름 및 고용일자를 출력
고용일자를 역순으로 출력

SELECT last_name, hire_date
FROM employees
WHERE hire_date >ALL (SELECT hire_date
FROM employees
WHERE last_name = 'Davies' )
ORDER BY hire_date DESC
/

웨어절 쓸 때 지켜야 할 조건
2가지 중에 한가지 위배...
하나는 문자와 날짜는 작은 따옴표 붙여라
테이블의 데이터의 포맷을 그대로 따라가라

근데 작은 따옴표를 안 붙여야 실행 돼 ㅠㅠㅠㅠ

1현재 찾아야 할 값 : 사원의 이름 입사일 => 매인쿼리 셀렉트
2모르는 것 : 데이비스 입사일
3 사원들의 입사일과 비교

그냥> 이거쓰면 단항연산자야 ㅋㅋ

all 써야 해

이름에서 = 안쓰고 like 써도는 되는데, 굳이 이미 풀 네임을 아는데 데이비스 들어가 있는지 다 검색할 필요 없지

추가) 셀프조인으로도 가능 풀었어야 해 - 숙제... 엄청 어려울 걸?!ㅋㅋㅋ
데이비스의 하이어데이트

ㅇ30번
: 킹을 매니저로 두고 있는 모든 사원들의 이름 및 급여 출력

SELECT last_name, salary
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE last_name = 'King' )
/

처음에 = 쓴게 킹이 1명이라고 생각했어;;ㅋㅋㅋ

ㅇ수업설명
101번 사원의 이름은 코차. 코차를 관리하는 관리자가 100번
이 100번의 이름은 킹이야

킹을 관리자로 두고 있는 사원을 찾아라니까.
관리자번호는 킹의 사원번호야

즉, 직역 : 킹의 사원 번호를 매니저 아이디로 두고 있는 애들을 찾아라

사실은
매니저아이디 이스 널 쓰는 게 더 빠른거

킹 관리자인지 모른다면 - 데이터를 모르고 있다면

컬럼 이름은 달랐어. 데이터 타입만 같으면 해결 가능함을 보여줘
(매니저 아이디 in (셀렉트 임플로이 아이디 )

ㅇ 31번
: 회사 전체 평균급여보다 더 많이 받는 사원들 중 이름에 u가 있는 사원들이 부서에서 근무하는 사원들의 사번, 이름 ,급여를 출력하시오.ㅋㅋㅋㅋ

SELECT employee_id, last_name, salaryZZ
FROM employees
WHERE department_id IN (SELECT department_id
FROM employees
WHERE salary > AVG(salary)
AND last_name LIKE '%u%' )

서브쿼리 여러개
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id IN (SELECT department_id
FROM employees
WHERE employee_id IN (SELECT employee_id
FROM employees
GROUP BY employee_id
HAVING salary>AVG(salary))
AND last_name LIKE '%u%')
/
1 회사평균보다 많은 사원 -> 2그 수언들 주이읆에 u -> 3 그사원ㄷ들이 근무하는 부서 -> 그 부서에 근무하는 부서의 사원들으 무엇무엇 찾기

조건 ㅊ자앗어
last_name LIKE '%u%'
AND salary > (SELECT AVG(salary)
FROM employees)
얘까 근무하는 부서 보고싶어 -
셀렉트 에 부서아이디
프롬 임플로이
ㅇ여기까지가 부서 찾기
SELECT department_id
FROM employees
WHERE last_name LIKE '%u%'
AND salary > (SELECT AVG(salary)
FROM employees)

코드 해석할 때 안쪽의 서브쿼리를 먼저 읽는다고 생각해
서브쿼리는 값의 역할을 하는거니까
그 값을 근거로 웨어절이 실행되는 거니까.

디스팅트를쓰면 성느이 떨어져
멀티플 컬럼... 그룹화 작업이 발생해서
테이블의 원래 데이터 값이 아니라 변경시키는 거니까
(뭔가 변경되는 작업들이 성능이 떨어뜨린다)

처음 작성

SELECT employee_id, last_name, salary
FROM employees
WHERE department_id IN (SELECT department_id
FROM employees
WHERE last_name LIKE '%u%'
AND salary> (SELECT AVG(salary)
FROM employees)

평균 급여를 급 사원들 중에서 급여가 평균 급여가 많은 사원만 출력된거야
우리는 ~다 찾고 싶어.
평균급여보다 낮은 급여를 받는 사원도 존재하니까.

이 문제에서는 그룹바이 절을 사용 안해 - 나도 같은 실수했었어. avg잇으니까 그룹바이 써야되는 줄 알고

이제 셀렉트 모든 문장 살펴봤어...

약 17분 남았어
궁금한 것 질문하기

ㅇ질문1
is null에서 is 라는 연산자는 따로 없어. 이스널은 한 몸이야
=, > 이런 연산자들은 값을 비교하는 방식이
아스킬 코드를 가지고 비교하는 거야

ㅇ24번 질문
셀렉트 절에 그룹함수 사용할 수 있어
셀렉트 절에 그룹함수 사용되지 않은 컬럼 같이 있다면
그룹함수가 사용되지 않은 모든 컬럼들을 그룹바이절에 명시하는거야!!

그런데, 결과를 보면
사실 로케이션 아이디는 있으나 마나한 컬럼이긴 해
부서이름별로 사원수와 평균 급여 출력하라는 말이야
각각의 부서들이 로케이션 아이디를 고유하게 가지고 있어

만약 로케이션이 아니라 잡 아이디면 결과 완전히 달라져
부서 안에서 직업별로 2번 그룹화
--놓침..

그룹바이절에 멀티플 컬럼이 나열되면
기본적으로 셀렉트 절에 같이

그룹이라는 게 얘가 어떤 그룹을 가지고 있냐에 따라 달라져
만약 첫번째 그룹이 1개씩이라면 하나씩 나올거야

디파아이디, 임플아이디, sum(샐러리)
임플로이 아이디 넣으면?!
결국 각 사원별로 샐러리 나올 듯

profile
STEP BY STEP

0개의 댓글