728x90
having 절
- group by 집계 결과에 대한 조건을 거는 것
예시
-- 객실 별로 생존률이 0.7 이상의 객실만 보고싶다면???
select cabin,
avg(survived) as survived_rate
from titanic_raw
group by cabin
having survived_rate >= 0.7
order by survived_rate;
위와 같이 having절은 group by 다음에 온다는 특징이 있다.
limit
- 조회되는 행 갯수를 지정할 수 있다.
예시
select * from titanic_raw limit 2,10; # 행번호, 몇개
-- 행번호 값을 생략 시
select * from titanic_raw limit 5; # 기본 값으로 0이 들어간다.
limit이 사용되는 것은 일반 인터넷에서 영화 게시글이나 쇼핑몰 게시글에서 볼 수 있다.
사용 예시
게시글 조회 방식
-- (페이지 번호 -1) * 페이지 당 게시글 개수
-- if page = 1
-- 페이지당 게시글 개수는 10개일 경우
-- 페이지당 게시글 개수는 행갯수
-- (1-1) * 10 = 0 <= 행번호
-- (2-1) * 10 = 0 <= 행번호
select * from titanic_raw limit 10,10;
SQL 실행순서
From -> Where -> Group by -> Having -> Select -> Order by -> Limit
Join이란?
- 다수의 table 간에 공통된 데이터를 기준으로 조회하는 명령어
- 컬럼을 기준으로 데이터가 매칭될 경우 결합한다.
- 다수의 테이블을 결합하여 조회할 때 사용
- join은 inner join, self join, left(right) join이 있다.
컬럼명
# dept 테이블
deptno - 부서번호 (pk)
dname - 부서이름
loc - 지역
# emp 테이블
empno - 사원번호
ename - 사원이름
job - 직무
mgr - 상급자의 사원번호
hiredate - 입사일
sal - 급여
comm - 커미션
deptno - 부서번호 (fk)
inner join
- inner join은 줄어들거나 늘어날 수 있다. 그러나 left join은 줄어들 수 없고, 늘어날 수 있다.
- 전처리 시 left join을 많이 쓴다.
- 테이블 사이에 on 조건에 맞는 데이터만 join 함.
- 순서가 중요하지 않다.
inner join의 형식
-- join시는 select 절에 컬럼명을 명시하자.
select ename, job, mgr, dname, loc
from emp
inner join dept
on emp.deptno = dept.deptno;
-- table 별칭을 적용해서 적용해서 join하기
select ename, job, mgr, d.dname, loc
from emp e
inner join dept d
on e.deptno = d.deptno;
예시
-- 뉴욕 지역에 근무하는 사원이름과 , 급여 , 지역 등을 조회해보세요.
select e.ename, sal, loc
from emp as e
inner join dept as d
on e.deptno = d.deptno and loc = 'new york';
-- research 부서에 소속된 사원의 이름과 , 입사일, 급여를 조회해보세요.
select e.ename, hiredate, sal
from emp as e
inner join dept as d
on e.deptno = d.deptno and dname = 'research';
-- 직무가 manager인 사원의 이름과, 부서명 , 급여, 커미션을 조회해 보세요.
select e.ename, d.dname, e.sal, e.comm
from emp e
inner join dept d
on e.deptno = d.deptno and job = 'manager';
self join
- 동일 테이블에서 진행되는 조인
예시
-- 각 사원의 관리자 이름을 알고 싶다면?
select e.ename as "사원이름",
m.ename as "상사이름"
from emp e
inner join emp m
on e.mgr = m.empno;
-- 관리자 이름이 King인 사원의 이름과 상사이름을 조회하시오.
select e.ename as "사원이름",
m.ename as "상사이름"
from emp e
inner join emp m
on e.mgr = m.empno and m.ename = "King";
-- allen의 동료이름(같은 부서에서 일하는 동료)을 조회하시오.
select e.deptno, m.ename
from emp e
inner join emp m
on e.ename = 'Allen' and e.deptno = m.deptno and m.ename != "Allen";
left join
- 왼쪽 테이블 기준으로 join(right join은 오른쪽 테이블 join)
- 왼쪽 테이블에 컬럼값과 on 조건에 맞는 행이 없을 경우 Null이 들어간다.
- join 후 행이 늘어날 수도 있으나 줄어들지 않는다.
예시
-- king도 같이 조회하고 싶다면?
select e.ename as '사원명', m.ename as '상사이름' # king이 안사라지고 존재
from emp e
left join emp m
on e.mgr = m.empno;
select * from dept; # 40번이 사라지지 않음!
select * from emp;
select d.deptno, d.dname, e.ename
from dept d
left join emp e
on d.deptno = e.deptno;
-- 모든 부서 정보와 함께 급여가 3000 이상인 직원들의 연봉과 이름을 조회하시오.
select d.*, sal,ename
from dept d
left join emp e
on d.deptno = e.deptno and e.sal >= 3000;
-- 모든 부서 정보와 함께 커미션이 있는 직원들의 커미션과 이름을 조회하시오.
select d.*, e.comm,e.ename
from dept d
left join emp e
on d.deptno = e.deptno and e.comm > 0;
-- 모든 부서의 부서별 연봉에 대한 총합과 평균과 표준편차를 구하고,
-- 모든 부서의 사원 수를 구하시오.
select d.*,
sum(e.sal) as sum_sal,
avg(e.sal) as avg_sal,
std(e.sal) as std_sal,
count(e.empno) as everybody
from dept d
left join emp e
on d.deptno = e.deptno
group by d.deptno;
-- 각 관리자의 부하직원 수와 부하직원들의 평균연봉을 구하시오. # 다시보기!
select m.empno, m.ename,
count(e.empno) as count_empno,
avg(e.sal) as avg_sal
from emp e
inner join emp m # 관리자 테이블이라 생각
on m.empno = e.mgr
group by m.empno;
이번 having절과 join은 반복을하면서 익혀진 것 같다.
아직 완벽하지않지만 꾸준한 복습만이 답인 것 같다.
728x90
'AI 공부 > SQL' 카테고리의 다른 글
SQL (Open API와 HTTP) (0) | 2022.08.18 |
---|---|
SQL (조회하기 실습 및 One-hot Encoding) (0) | 2022.08.12 |
SQL (DDL,DML,DCL) (0) | 2022.08.11 |
SQL (데이터의 이해와 SQL) (0) | 2022.08.11 |
댓글