[광주직업학교] 스마트인재개발원에서 배운 데이터베이스 - 복습3-1

ㅇ 본 수업은 "스마트인재개발원"에서 진행되었습니다.

https://www.smhrd.or.kr/


#스마트인재개발원 #국비지원코딩교육 #데이터베이스 #실습문제 #23번~26번 #조인조건 #그룹함수 #카운트 #서브쿼리




<목차>
ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(1)
ㅇ 실습문제 23
ㅇ 실습문제 24
ㅇ 실습문제 25
ㅇ 실습문제 26




ㅇ 실습문제 23

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
  • 결과

  • 각 조건 파악

    • 매니저 없는 사람 제외 -> 일반조건
    • 최소 급여 5000미만 제외 -> 그룹조건
    • 급여 기준 역순으로 조회
  • 매니저의 사원 부분 예시를 들어 확인 : 103번에게 관리받는 사원

    • 최소 급여는 4200
    • 즉, 이 경우는 제외
  • where절에 salary가 5000보다 크다 쓴 사람 있어

    • 먼저 웨어절에서 급여 5000 미만인 애들 다 제외시켜 버리는 sql문이 되어, 결괏값이 달라질 수 있음
    • 두 번째 최소 급여가 5000을 넘기는 애들은 살아남아! (5000미만인 사람을 먼저 제외했으므로)
  • 오더바이에 샐러리 내림차순 쓴 사람 있어 - 나 ㅋㅋㅋ

    • select 리스트절에 명시가 된 애들을 정렬하는 거야
    • 이미 min(salary)로 값 변형시키니까 salary라는 컬럼은 나오지 않아.
    • 즉 order by 절에는 salary 쓸 수 없어.

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(2)




ㅇ 실습문제 24

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 
  • 결과
  • 각 조건 파악
    • 각 부서별 사원 총 수 -> 카운트
    • 각 부서별 평균 급여 -> 에버리지샐러리
    • 부서명은 d테이블, 사원수나 평균급여는 e테이블 -> 조인
  • 항상 조인조건 까먹지 말 것!
    • WHERE d.department_id=e.department_id
    • 안 쓰면 카테시간 곱으로 만들어져
  • 질문 : 조인 쓰고 나서 그룹함수 사용할 때 어떤 테이블 사용할 건지 생각할 필요 없나??
    • 답변 : employee랑 salary는 e테이블에만 있으니까 지금은 괜찮아
      만약 양쪽 테이블에 다 있다면 꼭 명시해줘야겠지?!!
  • 만드는 순서 다시 한번 정리하면
    1 셀렉트 리스트 : 부서이름, 부서위치, 사원의 총 수-카운트임플로이, 평균급어-에버리지샐러리
    2 프럼절 : 앞의 2개는 디파트먼트테이블 , 뒤의 2개는 임플로이테이블이 필요해  => 조인
    조인을 쓰니까 조인조건이 필요해
    3 웨어절 : 이큐조인
    4 셀렉트리스트절에 그룹함수가 사용되었으니까 그룹화 시켜줘야지
    그룹화가 사용되지 않은 모든 컬럼들은 그룹화 해주기
  • 프럼절에서 알리아스 썼으면 다른 곳에 다 사용할 수 있어

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(3)




ㅇ 이제부터는 서브쿼리 문제

ㅇ 서브쿼리 때 고려해야 할 점

  • 1 내가 뭘 모르는지
  • 2 누가 받는지
  • 3 어떤 연산자를 사용할지



ㅇ 실습문제 25

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

오답 : '다른' 모든 사원들이니까 질로키를 제외하는 조건절 필요

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

정답

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

정답 수정

SELECT employee_id, hire_date
FROM employees
WHERE department_id IN ( SELECT department_id
			FROM employees
			WHERE last_name = 'Zlotkey' )
AND last_name not in 'Zlotkey'
  • 질로키가 여러 명일 수 있으니 단항연산자인 = 가 아니라 IN을 써줘야 해
    (여기서는 우연히 1명이라서, 오류가 나지 않았어)

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(4)



ㅇ 실습문제 26

SELECT employee_id, last_name
FROM employees
WHERE salary > ( SELECT AVG(salary)
				FROM employees )
  • 각 조건 파악
    • 출력하고 싶은 것 : 사번, 이름 => 메인쿼리 셀렉트 절
    • 모르는 것 : 평균 급여 => 서브쿼리
    • 비교 : 급여 > 평균 급여
  • ALL 쓰신 분들 있어 - 그룹바이절이 없으니까 필요 없어~

ㅇ 본 문제는 [광주직업학교] "스마트인재개발원"에서 제공되었습니다.(5)



좋은 웹페이지 즐겨찾기