본문 바로가기
AI 공부/SQL

SQL (having 절과 Join)

by AI Sonny 2022. 8. 16.
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

댓글