일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- conda base 활성화
- conda 기초 설정
- 티스토리챌린지
- conda 가상환경 설정 오류
- 3000 port kill
- 려려
- conda base 기본 설정
- 오블완
- window netstat time wait 제거
- 실행중인 포트 죽이기
- time wait port kill
- Today
- Total
모도리는 공부중
20.11.09. 오전 - 데이터베이스 연습문제 & 서브쿼리 본문
20.11.09. 오전 - 데이터베이스 연습문제 & 서브쿼리
공부하는 모도리 2020. 11. 9. 14:1020. 동일한 직업을 가진 사원들의 총 수를 출력하시오.
- 잡아이디를 그룹화를 먼저 시키고, 그 잡아이디 그룹에 대해 몇명이냐 물어보는 카운트함수를 사용하면 되지 않을까요?
21. 매니저로 근무하는 사원들의 총 수를 출력하시오.
22. 사내의 최대 급여 및 최소 급여의 차이를 출력하시오.
select max(salary) - min(salary)
from employees ;
23. 매니저의 사번 및 그 매니저 밑 사원을 중 최소 급여를 받는 사원의 급여를 출력하시오.
- 매니저가 없는 사람들은 제외한다.
- 최소 급여가 5000 미만인 경우는 제외한다.
- 급여 기준 역순으로 조회한다.
방금전에 관리자의 수가 18명인걸 봤죠? 그 18명을 관리자로 둔 사원들..
select manager_id, employee_id, salary, min(salary)
from employees
where manager_id is not null
and salary >= 5000
group by manager_id
order by salary desc
/
having by를 써야했구나.
order by절을 그냥 salary로 써버린 사람이 많았다. 이 절은 셀렉절에 출력된 것을 정렬해주는 것이므로 그냥 쓰면 안됩니다.
having절은 그룹을 제한하는 조건절, where절을 행을 제한하는 조건절.
select manager_id, min(salary)
from employees
where manager_id is not null
and salary >=5000
group by manager_id
order by 1
/
둘의 결과값이 다르게 나온다. 첫번째 것이 교수님이 풀어준것, 두번째는 어느 학생이 해본 것.
having절을 데이터 전체를 가지고 비교를 한다..라..
24. 부서명, 부서위치id, 각 부서별 사원 총 수, 각 부서 별 평균 급여를 출력하되, 부서위치를 오름차순으로 출력하시오.
그룹바이절 이해를 못하는 분들이 꼬 많아요.
일단 나는 이렇게 풀었다.
where절은 가장 먼저 실행, 행이 오면 안됨
having by절은 그룹 실행시 실행되지 않은 절
Abel이라는 사원이 받는 급여보다 더 많은 급여를 받는 사원의 이름과 급여를 출력하시오.
우리는 이 Abel이라는 사원이 얼마를 받는지 모르기 때문에 이렇게 찾아야했다.
Abel을 먼저 찾아서 급여를 보고
이렇게 도출했다.
하지만 이걸 이렇게 쓴다면?
자, 오늘 우리는 서브쿼리를 배워볼겁니다.
vol1, p263, 267
서브쿼리를 쓰게 되면 먼저 서브쿼리를 도출하고 그 다음 메인쿼리가 그 결과값을 받아들여서 실행한다.
그래서 우린 방금 서브쿼리를 사용해서 결과값을 도출해본거죠.
이걸 그럼 어디서 쓰냐구요?
생각보다 많은 곳에서 쓰이네...? (들으면서 쓰는걸 놓침)
having절에서 쓴다?
항상 where절과 서브쿼리는 구분해서 하나의 값으로 인식해주기 위해 괄호로 묶어준다.
항상 where절과 having절을 연산자 오른쪽에 위치해 있고 값의 자리를 대신한다.
order by절에도 쓸 수 있으며 서브쿼리 안에 서브쿼리를 또 쓸 수 있다. 현업에서는 최소 2번 이상의 깊이있는 서브쿼리를 꽤 자주 사용한다.
oorder by절은 출력이 되는 값이지만 서브쿼리절은 출력되는 값이 아니다. 값의 역할을 대신하는 변수역할.
굳이 출력도 되지 않는 녀석을 일부러 order by절로 정렬해서 사용할 이유가 없다. 사용을 해도 되긴 하지만 쓸 이유가 없다는 거지.
그럼 from절은요? 여기서 서브쿼리는 엄청난 역할을 수행합니다.
hwhere와 having은 출력이 되지 않고 값의 역할을 대신하지만, from절에서는 적극적으로 사용된다. 이 정도로만 기억해둡시다.
p268
서브쿼리의 결과가 하나냐 여러개냐에 따라 사용할 연산자가 달라져야 한다.
서브쿼리는 where와 having에서 쓸 때 항상 괄호로 둘러져있고 값이 하나냐 두개 이상이냐에 따라 '='과 같은 단일 연산자나 'in'과 같은 복수 연산자를 사용할지 정해야한다.
p269
단일 행 : 결과를 하나만 돌려주는 것. =, >, < 같은 연산자.
다중 행 : 복수개의 결과값을 돌려주는 것. in 같은 연산자.
p270
여기에서 사용 가능한 연산자를 알려주네요?
자, 여기에 있는 예제를 한 번 해봅시다.
(우리는 서브쿼리의 값이 어떻게 나오는지도 궁금하니 sql창을 하나 더 띄워놓고 서브쿼리꺼만 따로 또 봐봅시다.)
p271
여기 것도 해봅시다.
수요일에 숙제 드릴게요. 가상의 4명 팀을 짜드릴거고, 2~4시간 정도 소요됩니다.
시간은 하루밖에 안 드릴겁니다.
아까 말씀 드렸듯이 조인 문장을 대신할 수도 있습니다.
IT라는 부서에 근무하는 사원의 이름과 부서번호를 출력하시오.
제일 나쁜놈, 조인. 그다음 나쁜놈, 정렬. 그럼 최악으로 나쁜놈? 조인에서 정렬 쓰는놈.ㅋㅋㅋㅋ
하지만 정말 필요하다면 써주시는 것도 좋습니다..
p272
우리가 서브쿼리를 쓰는 아주 합당한 이유가 이 예제입니다.
셀프조인은 대부분 서브쿼리로 해결이 가능합니다.
p273
having절에 서브쿼리
근데 여기에 맹점이 숨어있었다. 우리는 부서별로 보려는건데, 값이 없는 null이 하나의 부서로 엮여서 결과가 나온것이다. 그럼 어떻게 할것인가? where절을 추가해서 이것을 삭제해주면 된다.
그럼 p273의 예제를 풀어봅시다.
p274, 275
복수 값이 나올 서브쿼리인데 단일 연산자를 사용.
서브쿼리 자체가 no rows selected가 발생되면서 메인쿼리에 null 값을 넘겨줬기 때문에 발생하는 현상.
p276
이건 어려우니까 우리 메모를 해봅시다.
sg = (30, 40) | |
10 | in (30, 40) => 30, 40 >any (최소값 30보다 큰 값) => 40, 50, 60 <any (최대값 40보다 작은 값) => 10, 20, 30 >all (전부. 최대값 40보다 큰 값) => 50, 60 <all (전부. 최대값 30보다 작은 값) => 10, 20 |
20 | |
30 | |
40 | |
50 | |
60 |
any는 반대의 개념이기 때문에 외우는 방법밖에 없습니다.
p277
연산자를 4개 다 넣어서 한 번 해봅시다.
첫 번째, <any
두 번째, >any
세 번째, >all
네 번째, <all
p279
null이 들어가 있는 값을 돌려주는 서브쿼리들은 안해주는 것이 좋습니다.
연습문제 풀어봅시다.
내가 뭘 찾아야하고, 이걸 어디에 넘겨줘야하는지를 잘 생각해봐야합니다.
25. Zlotkey와 동일한 부서에 근무하는 모든 사원들의 사번 및 고용날짜를 출력하시오.
나는 서브쿼리를 보고 했지만, 보통 그걸 다 하는게 아니잖아?
그 사원이 여러개의 부서에 똑같은 이름으로 있을 수 있잖아. 그럼 어떻게 할건데?
=를 쓸 게 아니라 in을 써줘야겠지..
그리고 Zlotkey와 동일한 부서에 근무하는 사람을 찾고 싶은거니까 Zlotkey는 제외겠지?
결과를 보자!
26. 회사 전체 평균 급여보다 더 급여를 많이 받는 사원들의 사번 및 이름을 출력하시오.
27. 이름에 u가 포함되는 사원들과 동일 부서에 근무하는 사원들의 사번 및 이름을 출력하시오.
배아파서 그런가.. 자꾸 제대로 신경을 안 쓰네 그래..
아하 like을 쓰는거구나...
'K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12 > SQL' 카테고리의 다른 글
20.11.11. 오전 - 데이터베이스 (0) | 2020.11.11 |
---|---|
20.11.10. 오후 - 데이터베이스 연습문제, DDL, DCL (0) | 2020.11.10 |
20.11.06. 오전 - 데이터베이스 join, having, group by, 그룹함수 (0) | 2020.11.06 |
20.11.05. 오전 - 데이터베이스 where절 활용 및 연습문제 (0) | 2020.11.05 |
20.11.03 오전 - 데이터베이스 (0) | 2020.11.03 |