인공지능/R

R - sqldf

해피밀세트 2020. 4. 17. 16:44
반응형

 

 

 sqldf

  • SQL 이용해서 데이터를 처리

 

sqldf 라이브러리 설치 및 임포트

install.packages("sqldf")

library(sqldf)

 

sqldf 사용 예

# emp 테이블에서 사원번호 출력

sqldf("select employee_id from emp")

# 부서번호가 20인 사원들의 사원번호 출력

sqldf("select employee_id
        from emp
        where department_id=20")

# 부서번호들의 중복을 제거하고 출력

sqldf("select distinct department_id
         from emp")

# 부서번호가 30인 사원들의 모든 정보 출력. 급여를 내림차순으로 정렬

sqldf("select *
        from emp
        where department_id=30
        order by salary desc")

# 모든 사원의 수, 급여의 합, 급여의 평균, 급여의 분산, 급여의 표본, 급여의 최대값, 급여의 최소값 출력

sqldf("select count(employee_id),sum(salary),avg(salary),
      variance(salary),stdev(salary),max(salary),min(salary)
      from emp")

# 부서번호 별로 묶었을때 부서번호와 부서별 급여합 출력

sqldf("select department_id, sum(salary)

        from emp

        group by department_id")

# 부서번호 별로 묶었을때 급여합이 10000보다 큰 부서의 부서번호와 급여합 출력

sqldf("select department_id, sum(salary)

        from emp

        group by department_id

        having sum(salary) > 10000")

# 모든 사원들의 성, 대문자 성, 소문자 성, 성의 앞 2문자, 성의 길이 출력

sqldf("select last_name, upper(last_name)up,
        lower(last_name) low, substr(last_name,1,2) sub,
        length(last_name) len

        from emp")

# 모든 사원들의 성, 성의 앞 2문자, 성의 오른쪽 1문자, 성의 왼쪽 2문자 출력

sqldf("select last_name, substr(last_name,1,2) sub,

        rightstr(last_name,2) r, leftstr(last_name,2) l

        from emp")

# 모든 사원의 급여/3 , 소수점 2자리 뒤에서 반올림(급여/3),
소수점에서 반올림(급여/3) 한 값을 출력

sqldf("select salary/3,round(salary/3,-2) r2,round(salary/3,0) r

      from emp")

# 모든 사원의 급여/3 , 소수점 2자리 뒤에서 반올림(급여/3),
소수점에서 반올림(급여/3), 올림(급여/3), 내림(급여/3) 한 값을 출력

sqldf("select salary/3,round(salary/3,-2) r2,
        round(salary/3,0) r, ceil(salary/3) ce,floor(salary/3) fl

        from emp")

# 부서번호가 null인 사원의 모든 정보 출력

sqldf("select *
        from emp
        where department_id is null")

# 부서번호가 null이 아닌 사원의 모든 정보 출력

sqldf("select *
        from emp
        where department_id is not null")

# 부서번호가 10 혹은 20인 사원의 성을 출력

sqldf("select last_name
        from emp
        where department_id in (10,20)")

# 급여가 10000과 20000 사이인 사원의 성을 출력 

sqldf("select last_name
        from emp
        where salary between 10000 and 20000")

# 성이 'K'로 시작하는 사원의 성을 출력

sqldf("select last_name
        from emp
        where last_name like 'K%'")

# 성의 두번째 글자가 'i'로 시작하는 사원의 성을 출력

sqldf("select last_name
        from emp
        where last_name like '_i%'")

# emp과 dept를 조인하고 emp 테이블에 있는 성과 dept 테이블에 있는 부서 이름을 출력

sqldf("select e.last_name, d.department_name

        from emp e, dept d

        where e.department_id = d.department_id")

# 위의 내용을 ANSI 표준 방법으로 만듬

sqldf("select e.last_name, d.department_name

        from emp e join dept d

        on e.department_id = d.department_id")

# 위의 내용에 using절 사용
# using절을 사용할땐 어떤 테이블인지 명시하면 안된다.

sqldf("select e.last_name, d.department_name

      from emp e join dept d

      using(department_id)")

# left outer join 사용

sqldf("select e.last_name, d.department_name

      from emp e left outer join dept d

      on e.department_id = d.department_id")

# right, full outer join 없음
# left outer join 두번을 union하기(합집합)

sqldf("select e.last_name, d.department_name

      from emp e left outer join dept d

      on e.department_id = d.department_id

      union

      select e.last_name, d.department_name

      from dept d left outer join emp e

      on e.department_id = d.department_id")

# 누락된 정보까지 전부 보기

sqldf("select e.last_name, d.department_name

      from emp e left outer join dept d

      on e.department_id = d.department_id

      union all

      select e.last_name, d.department_name

      from dept d left outer join emp e

      on e.department_id = d.department_id")

# 교집합

sqldf("select e.last_name, d.department_name

      from emp e left outer join dept d

      on e.department_id = d.department_id

      intersect

      select e.last_name, d.department_name

      from dept d left outer join emp e

      on e.department_id = d.department_id")

# 차집합

sqldf("select e.last_name, d.department_name

      from emp e left outer join dept d

      on e.department_id = d.department_id

      except

      select e.last_name, d.department_name

      from dept d left outer join emp e

      on e.department_id = d.department_id")

# 사원번호가 150인 사원보다 급여가 많은 사원의 성과 급여 출력

sqldf("select last_name, salary

      from emp

      where salary > (select salary

                      from emp

                      where employee_id=150)")

# 관리자 사원에 대해서 찾기

x<- sqldf("select *

      from emp

      where employee_id in (select manager_id from emp)")

 

x<- sqldf("select *

      from emp e

      where exists (select 'x'

                    from emp

                    where manager_id = e.employee_id)")

head(x)

# 관리자가 아닌 사원

x <- sqldf("select *

      from emp

      where employee_id not in (select manager_id

                                from emp

                                where manager_id is not null)")

 

x <- sqldf("select *

      from emp e

      where not exists (select 'x'

                        from emp

                        where manager_id = e.employee_id)")

 

head(x)

반응형

'인공지능 > R' 카테고리의 다른 글

R - grep과 정규표현식  (0) 2020.04.17
R - melt / dcast  (0) 2020.04.17
R - dplyr 라이브러리 ② summarise , group_by  (0) 2020.04.17
R - dplyr 라이브러리 ① filter, select, arrange, %>%, mutate  (0) 2020.04.16
R - subset / ddply  (0) 2020.04.16