SQL 2

최인영·2023년 1월 17일
0
-- 영어단어/품사 테이블
-- 영어단어/한국어 테이블

create table 영어품사(
    단어 varchar2(50),
    품사 varchar2(50),
    constraint pk_영어품사 primary key(단어)
);
desc 영어품사;

create table 영어사전(
    단어 varchar2(50),
    의미 varchar2(50),
    constraint pk_영어사전 primary key(단어)
);
desc 영어사전;

insert into 영어품사(단어, 품사) values('boy', '명사');
insert into 영어품사(단어, 품사) values('girl', '명사');
insert into 영어품사(단어, 품사) values('get', '동사');
insert into 영어품사(단어, 품사) values('have', '동사');
insert into 영어품사(단어, 품사) values('in', '전치사');
commit;
select * from 영어품사;

insert into 영어사전(단어, 의미) values('boy', '소년');
insert into 영어사전(단어, 의미) values('girl', '소녀');
insert into 영어사전(단어, 의미) values('get', '얻다');
insert into 영어사전(단어, 의미) values('earth', '지구');
insert into 영어사전(단어, 의미) values('on', '위에');
insert into 영어사전(단어, 의미) values('eat', '먹다');
commit;
select * from 영어사전;

select * from 영어품사
where 단어 = 'get';

select * from 영어사전
where 단어 = 'get';

select a.단어, a.품사, b.의미
from 영어품사 a inner join 영어사전 b
on a.단어 = b.단어
where a.단어 = 'get';

inner join

left outer join

right outer join

full outer join

-- 다수의 테이블 합쳐서 select쿼리
-- 1) 조인쿼리 : 가로() 결합 
-- inner join, outer join, cross join
-- 2) 집합쿼리 : 세로() 결합
-- union, minus, intersect
-- 3) 서브쿼리 : 쿼리안 자식쿼리
-- 인라인뷰, 스칼라뷰, 서브쿼리

select * from 영어품사;
select * from 영어사전;

select a.단어, a.품사, b.의미
from 영어품사 a inner join 영어사전 b
on a.단어 = b.단어;

select a.단어, a.품사, b.의미
from 영어품사 a left outer join 영어사전 b -- left join 약식가능
on a.단어 = b.단어;

select b.단어, a.품사, b.의미
from 영어품사 a right outer join 영어사전 b 
on a.단어 = b.단어;

select a.단어, a.품사, b.단어, b.의미
from 영어품사 a full outer join 영어사전 b 
on a.단어 = b.단어;

-- cross
select a.단어, a.품사, b.단어, b.의미
from 영어품사 a cross join 영어사전 b;


select * from emp;
select * from dept;
-- inner join
select e.*, d.*
from emp e inner join dept d
on e.deptno = d.deptno; -- 40번 부서에 소속된 직원이 없으니 40번부서에 정보도 누락

-- right outer join
select e.*, d.*
from emp e right outer join dept d
on e.deptno = d.deptno;

-- 부서에 소속되지 않은 사원까지 조회하기 위해서는 left outer join을 사용
insert into emp values(7777, '홍길동', 'CLERK', 7839, sysdate, 4000, null, null, '남');
commit;
-- left outer join
select e.*, d.*
from emp e left outer join dept d
on e.deptno = d.deptno;

cross join

-- cross
select a.단어, a.품사, b.단어, b.의미
from 영어품사 a cross join 영어사전 b;

오라클 문법

-- 오라클 조인문
-- ANSI(표준) inner join
select e.*, d.*
from emp e inner join dept d
on e.deptno = d.deptno;

-- 오라클 inner join
select e.*, d.*
from emp e, dept d
where e.deptno = d.deptno;
-- ANSI(표준) left join
select e.*, d.*
from emp e left join dept d
on e.deptno = d.deptno;

-- 오라클 left join
select e.*, d.*
from emp e, dept d
where e.deptno = d.deptno(+);
-- 오라클 right join
select e.*, d.*
from emp e, dept d
where e.deptno(+) = d.deptno;
-- 오라클 cross join
select e.*, d.*
from emp e, dept d

equi vs non equi

self join

3개이상의 inner join

대륙 > 국가 > 지역 > 상세주소

-- inner join 
-- 1) equi join = : 문자값, 숫자값
-- 2) non equi join !=, >, <,..... : 대부분 숫자값

create table 참가자(이름 varchar(50),등수 number(10));
create table 상금(등수 number(10),금액 number(10));
insert into 참가자 values('루피', 1);
insert into 참가자 values('조로', 2);
insert into 참가자 values('나미', 3);
insert into 상금 values(1, 1000);
insert into 상금 values(2, 500);
insert into 상금 values(3, 100);
commit;

select * 
from 참가자 inner join 상금
on 참가자.등수 = 상금.등수;

-- 1등은 2,3등의 상금도 받는다. 2등은 3등의 상금도 받는다...
select 참가자.이름 이름,  참가자.등수 등수, 상금.금액 금액
from 참가자 inner join 상금
on 참가자.등수 <= 상금.등수;
-- 고객이 원하는 리포트 형태로...
select 이름, sum(금액)
from (select 참가자.이름 이름,  참가자.등수 등수, 상금.금액 금액
    from 참가자 inner join 상금
    on 참가자.등수 <= 상금.등수) t
group by 이름
order by sum(금액) desc; -- 인라인뷰


-- self join(같은 테이블)
select * from emp; -- 사원의 정보도 emp, 관리자 정보도 emp

select e1.ename 사원이름, e1.mgr, e2.empno, e2.ename 관리자이름
from emp e1 inner join emp e2
on e1.mgr = e2.empno;

-- 3개이상의 테이블의 대한 inner join
create table 대륙(
    대륙번호 number(10),
    대륙이름 varchar2(50)
);
create table 나라(
    나라번호 number(10),
    나라이름 varchar2(50),
    대륙번호 number(10)
);
create table 도시(
    도시번호 number(10),
    도시이름 varchar2(50),
    나라번호 number(10)
);
insert into 대륙 values(1, '아시아');
insert into 나라 values(1, '대한민국', 1);
insert into 도시 values(1, '서울', 1);
commit;

select * from 도시;

select *
from 도시 inner join 나라
on 도시.나라번호 = 나라.나라번호;

select *
from 도시 inner join 나라
on 도시.나라번호 = 나라.나라번호
                            inner join 대륙
                            on 나라.대륙번호 = 대륙.대륙번호;
profile
부감하는 공간.

0개의 댓글