(Kh정보교육센터, 36일차) DQL2 – Group by / Credit / Rollup / Cube / JOIN (Inner Join , Outer Join )

그룹화 기준

– 테이블의 모든 행을 특정 열이 동일한 행으로 그룹화

– group by 절이 없으면 테이블의 모든 행을 하나의 그룹으로 취급

– 그룹화 기준 select 절에는 특정 열만 사용할 수 있습니다.

. 비열을 사용하면 오류가 발생합니다.

– 그룹화 또한 0을 그룹으로 취급합니다.

하다.

– 가상컬럼으로 그룹화도 가능합니다.

– 그룹화할 때 열 순서는 중요하지 않습니다.

– Group By에서 여러 열을 그룹화할 때 고유 처리와 마찬가지로 값이 같은 행을 두 개의 열로 그룹화합니다.

ex) 부서별 급여 합계

select
        dept_code,
        sum(salary) sum_sal,
        trunc(avg(salary)) avg_sal
from
        employee
group by
        dept_code --group_by에서는 null도 그룹으로 처리함
order by
        sum(salary) desc;

ex) 근무 연도별 직원 수 쿼리(테이블 별칭이 아님)

select
        extract(year from hire_date) hire_year,
        count(*) cnt
from
        employee e
group by
        extract(year from hire_date)
order by
        hire_year; 

Extract(~)와 같은 가상 컬럼도 조회가 가능한 것을 확인할 수 있습니다.

ex) 부서별, 직위별 직원 수 조회

-> 두 열 사이에 동일한 값을 가진 행을 그룹화합니다.

B. 뚜렷한

select
        dept_code,
        job_code,
        count(*) cnt
from
        employee
group by
        dept_code,job_code;

가지다

-조건문, 그룹화 결과 행에 대한 결과 집합을 포함할지 여부처리할 구문

ex) 인턴 제외, 부서별 평균 급여가 300만원 이상인 부서만 검색(부서코드, 평균 급여)

select
        dept_code,
        trunc(avg(salary)) avg_sal
from
        employee
where   
        dept_code is not null
group by
        dept_code
having
        avg(salary)>=3000000;

예) 두 명 이상의 직원을 관리하는 관리자의 관리자 수 및 직원 수를 쿼리합니다.

방법 1

select
        manager_id,
        count(*) cnt
from
     employee
where
        manager_id is not null
 group by
        manager_id
having
        count(*) >=2 ;

방법 2

 select
        manager_id,
        count(*) cnt
 from
     employee
 group by
        manager_id
having
        count(*) >=2 and manager_id is not null;

방법 3

 select
        manager_id,
        count(*) cnt
 from
     employee
 group by
        manager_id
having
     count(manager_id)>=2; --count자체가 null을 세지 않음

답은 전부다


로 나온다

where 대신 have에 조건을 작성할 수 있습니다.

롤업 | 주사위

– 그룹별로 계산된 결과의 소계를 반환하는 함수

– group by 절에서만 사용

롤업 : 지정된 열에 대한 단방향 소계

주사위 : 지정된 열에 대한 양방향 소계

select
       dept_code,
        count(*)
from
        employee
group by
        rollup(dept_code)
order by
        dept_code;

7행의 0은 dept_code가 없는 두 명의 인턴입니다.

8행의 0은 롤업으로 계산한 24명의 합입니다.

구분하는 한 가지 방법은 그룹화를 사용하는 것입니다.

그룹화(값)

실제 데이터 (0) , 집계 프로세스 중에 생성된 데이터 (하나) 분리

select
        decode(grouping(dept_code),0,nvl(dept_code,'인턴'),1,'전체') dept_code,
        count(*)
from
        employee
group by
        rollup(dept_code)
order by
        dept_code;

연결하다

– 둘 이상 테이블 레코드를 조인하여 가상 테이블 관계 생성문법을 하기 위해

– 참조 열이 있는 두 테이블의 레코드 조인

관계를 맺다

1. 결합하다 2. 결합하다 두 가지 가능성이 있습니다.

왜 가입)

직원 “송종기”의 부서명을 조회하는 방법입니다.

select dept_code from employee where emp_name="송종기";--D9
select dept_title from department where dept_id ='D9'; --총무부

다음을 두 번 거쳐야 하기 때문에 번거롭고 코드가 길다.

조인은 그것을 한 번에 해결합니다.

select d.dept_title
from
        (employee e join department d
                on e.dept_code = d.dept_id)
-- dept_code와 dept_id가 같은 행끼리 연결해서 붙인 것임.
where
        e.emp_name="송종기";

JOIN 분류

1. 동등한 조인 : 조인 참조절(on) = 동치 비교로 조인(이용률 95%)

2. 비동등 조인 : 조인 표준절에서(on) = 동등 비교를 사용하지 않는 조인(이용률 5%)

예) !
=, between and , in, 같은 연산자는 null

JOIN 방식의 분류

1. ANSI 표준 문법 : 합류하다, 큐

2. Oracle 관련 문법 : ,(쉼표), where 절 사용

EQUI-JOIN 분류

1. 내부 연결: 교차

2. 외부 조인: 유니온

왼쪽 외부 연결

오른쪽 외부 조인

전체 외부 조인

3. 교차 연결

4. 참여하기

5. 복수가입 복수가입


내부 연결

– 내부 가입. 두 테이블의 교차점을 지정합니다.

– 각 테이블에서 참조 열이 null이고 상대 테이블에 일치하는 행이 없는 행 제외.

– inner 키워드는 생략 가능합니다.

(내부) 조인으로 생성

직원 | 부서 테이블의 내부 조인.

직원.dept_code = 부서.dept_id

내부 조인

직원 테이블에서 dept_code가 null인 경우 2번 라인 제외BE.

부서 테이블의 employee.dept_code에서 사용되지 않음 라인 D3, D4, D7 제외

* 직원 중에서 선택;


부서에서 *로 전화하십시오.


select 
    e.emp_name,
    d.dept_title
from
    employee e inner join department d
        on e.dept_code = d.dept_id;

내부 조인 결과(22행 출력)


외부 조인

외부 연결

왼쪽/오른쪽 테이블을 기준으로 조인합니다.

기본 테이블에 누락된 행이 없습니다.

outer 키워드는 생략할 수 있습니다.

왼쪽(외부) 조인 | 오른쪽(외부) 조인

예) 왼쪽 외부 조인

직원 테이블을 기반으로 하는 모든 행을 포함합니다.

24행 = 22행(내부 조인) + 2행(내부 null 값)

select
    emp_name,
    dept_title
from
    employee e left outer join department d
        on e.dept_code = d.dept_id;

내적 연결 결과를 비교해 보면 하동운과 이오리가 추가된 것을 알 수 있다.

ex) 오른쪽 외부 조인

부서 테이블을 기반으로 하는 모든 행을 포함합니다.

행 25 = 행 22( 내부 조인 ) + 행 3(직원이 없는 D3, D4, D7 부서)

select
    d.dept_title,
    e.emp_name
from
    employee e right outer join department d
        on e.dept_code = d.dept_id;

마케팅 섹션, 국내 판매 섹션, 해외 판매 섹션이 null 값인데도 출력되는지 확인할 수 있습니다.

예) 완전 외부 조인

왼쪽과 오른쪽이 모두 표준이므로 왼쪽과 오른쪽 테이블에서 제외되는 행은 없습니다.

27행 = 22행(내부 조인) + 2행(인턴) + 3행(직원이 없는 부서 D3,D4,D7)

select
    e.emp_name,
    d.dept_title
from
    employee e full outer join department d
        on e.dept_code = d.dept_id;

27행이 인쇄되는 것을 볼 수 있습니다.

이렇게 내부 조인과 외부 조인에 대해 알아보았습니다.

당신은 PK와 FK를 언급했지만 나는 그것을 짧게 유지하고 아래에 요약합니다.

.!