5월 24일 월요일 (10일차) - 실습 문제

@_@·2021년 5월 24일

Database

목록 보기
21/39

<목차>
ㅇ 실습문제 18번~



ㅇ 17번
: 자신의 매니저보다 먼저 고용된 사원들의 이름 및 고용일 출력
( 수업시간에 안하고 혼자 풀었는데, ppt파일 보니 대강 맞는 듯)
아이디어)

  • 내 고용일 < 내 매니저 고용일
  • 조인 : 임플로이 테이블에 있는 매니저 아이디 = (e로 만든) 매니저테이블의 임플로이 아이디
SELECT e.last_name, e.hire_date
FROM employees e, employees m
WHERE  e.manager_id = m.employee_id
AND e.hire_date  < m.hire_date

ㅇ 18번
: 회사 전체의 최대 급여, 최소 급여, 급여 총 합 및 평균 급여 출력

SELECT MAX(salary), MIN(salary), SUM(salary), AVG(salary)
FROM employees

ㅇ 19번
: 각 직업별 최대 급여, 최소 급여, 총 합 및 평균 급여를 출력
단, 최대 급여는 MAX, 최소 급여는 MIN, 급여 총합은 SUM, 평균 급여는 AVG로 출력, 직업 기준 오름차순 정렬

  • 알리아스로 MAX MIN SUM AVG 쓰라는 말 이었어.
    문장을 곡해하지 말고 제대로 읽자
SELECT job_id, MAX(salary) MAX, MIN(salary) MIN, SUM(salary) SUM, AVG(salary) AVG
FROM employees
GROUP BY job_id
ORDER BY job_id

ㅇ 20번
: 동일한 직업을 가진 사원들의 총 수

SELECT job_id, COUNT(employee_id)
FROM employees
GROUP BY job_id
  • a라는 직업을 몇명의 사원이 가지고 있는지. 사원들의 행의 수를 구하는 거니까
    • 직업이 그룹의 기준이 되고
    • 수를 세기 위해 카운트를 사용할거야
  • 이부분 수업녹화 없어서 수업 녹음 들어야 해
    우선 내가 이해한 대로 정리하고
    주말에 수업 복습으로 들으면서 수정하자.
    1시간 40분쯤
  • 카운트 *, 카운트 잡 아이디를 쓰면 내가 그룹화한 것의 개수를 출력
    결국 디스팅트와 같은 역할하게 되지 않을까?
    직업의 개수 출력돼
  • 컬럼 헤딩을 보고 어떤 값이냐를 유추
    결과는 사원의 수가 떨어졌지만, 직업 수로 해석할 수도 있어 --??? 무슨말이야???
  • 사원 네임은 중복이 일어날 수 있니 패스, 즉 프라이머리키인 임플로이를 써줘

ㅇ 21번
: 매니저로 근무하는 사원들의 총 수 출력

SELECT COUNT(DISTINCT manager_id)
FROM employees

아이디어 : 매니저 아이디에 있는 수만 세어서

  • 셀렉트 매니저아이디, 카운트(임플로이아이디)
    프롬 임플로이
    그룹바이 매니저아이디

-> 매니저 아이디를 기준으로 그룹화가 발생
100번 사원에게 관리를 받는 사원이 14명이다

여기 설명 다시 듣기

작성2
카운트(매니저)
널 값을 무시해서 106이 나와

작성3
작성2에다가 관리자 번호 중복되는걸로

(쌤이 나 잘한다고 칭찬해주셨는데,, 이것도 녹화는 안 됐네ㅋㅋ)
20번 21번 연속으로 풀어서 말씀해 주신 듯
너는 어디서 이걸 했니? 잘한다잉

ㅇ 22번
: 사내의 최대 급여 및 최소 급여의 차이를 출력

SELECT MAX(salary)-MIN(salary)
FROM employees
  • 그룹함수도 컬럼과 상수, 컬럼과 컬럼에 대한 산술연산 가능

ㅇ 23번
: 매니저의 사번 및 그 매니저 밑의 사원들 중 최소 급여 받는 사원의 급여를 출력

  • 매니저 없는 사람 제외 -> 일반조건
  • 최소급여 5000미만 제외 -> 그룹조건
  • 급여 기준 역순으로 조회
SELECT manager_id, MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>=5000
ORDER BY MIN(salary) DESC

cf. 내가 고민했던 부분 매니저아이디이스낫널인 웨어절 필요한가? 매니저 아이디를 그룹바이 할꺼고, 그 매니저 아이디들의 그룹 안에서 샐러리 비교할건데 이 과정에서 널이 이루어지는 것 아닌가??

매니저 밑의 사원
임플로이테이블에서 매니저

셀렉트  매니저아이디, min사원의 급여
프롬
웨어 매니저아이디 없어
그룹바이 매니저아이디
해빙바이 민급여<5000
오더바이 desc

매니저 밑의 사원은 해석을 잘 했어 - 그 매니저 번호를 두고 있는 사원
임플로이아이디/매니저아이디 봐보자
103번에게 관리받는 사원 104 ~ 107번
그 중 최저 급여인 4200을 찾으세요

웨어절에 샐러리가 5000보다 크다 쓴 사람 있어
먼저 웨어절에서 급여 5000미만인 애들 다 제외시켜버린거야.
결과값이 틀려질 수 있어.

오더바이에 샐러리 내림차순 쓴 사람 있어 - 나 ㅋㅋㅋ
셀랙트 리스트에 명시가 된 애들을 정렬하는 거야

이미 민 셀러리로 값 변형시키니가
샐러리라는 컬럼은 나오지 않아.
즉 오더바이절에는 샐러리 쓸 수 없어.

에러난 코드보기
103번 사원 관리 받는 거 - 스크린샷

이렇게 모아서 최저 급여가 5000미만인 사람을 제외하겠다.

ㅇ 24번
부서명, 부서위치아이디, 각 부서 별 사원 총 수, 각 부서 별 평균 급여를 출려하되
부서위치를 오름차순 출력

부서명
부서위치아이디
각 부서별 사원 총 수 - 카운트
각 부서별 평균 급여 - 에버리지샐러리
부서테이블 - 사원테이블 연걸

이러면 카테시안 곱이 생겨

SELECT d.department_name, d.location_id, COUNT(employee_id), AVG(salary)
FROM departments d, employees e
GROUP BY department_name, location_id
ORDER BY location_id
  • 조인조건을 넣어줘야지
SELECT d.department_name, d.location_id, COUNT(employee_id), AVG(salary)
FROM departments d, employees e
WHERE d.department_id=e.department_id
GROUP BY department_name, location_id
ORDER BY location_id 

결과는 똑같이 나와.
질문: 조인 쓰고 나서 그룹함수 사용할 때 어떤 테이블 사용할건지 생각할 필요 없나??
아 어차피 임플로이랑 샐러리는 e테이블에만 있으니까
만약 양쪽 테이블에 다 있는 애들은 꼭 명시해줘야겠지?!!

SELECT d.department_name, d.location_id, COUNT(e.employee_id), AVG(e.salary)
FROM departments d, employees e
WHERE d.department_id=e.department_id
GROUP BY d.department_name, d.location_id
ORDER BY d.location_id

순서
1 셀렉트 리스트 : 부서이름, 부서위치, 사원의 총 수-카운트임플로이, 평균급어-에버리지샐러리
2 프럼절 : 앞의 2개는 디파트먼트테이블과 , 뒤의 2개는 임플로이테이블이 필요해  => 조인
조인을 쓰니까 조인조건이 필요해
3 웨어절 : 이큐조인
4 셀렉트리스트절에 그룹함수가 사용되었으니까 그룹화 시켜줘야지
그룹화가 사용되지 않은 모든 컬럼들은 그룹화 해주기
그룹바이절 : 디.디아읻.

SELECT d.department_name, d.location_id, COUNT(e.employee_id), AVG(e.salary)
FROM departments d, employees e
WHERE d.department_id=e.department_id
GROUP BY department_name, location_id
ORDER BY location_id

프럼절에서 알리아스 썼으면 다른 곳에 다 사용할 수 있어


내일은 이걸 토대로
셀렉트 명령문 마지막 시간 . 셀렉트의 꽃 중의 꽃

내일은 셀렉트 문장 마무리만 하려고해. 새로운 거
새로운 진도 안나가고
서브쿼리 실습까지 진행하면

남은 1시간은 체크해온거 질문 받을거야

profile
STEP BY STEP

0개의 댓글