DataBase/SQL

[SQL] DML - SELECT {JOIN}

노트북 산 김에 공부 2023. 4. 13. 21:55

[SQL] DML - 데이터 조작 을 학습하고 와주시기 바랍니다.


우선 다음 코드를 작성해 주시기 바랍니다.

create table product (
pcode varchar2(10) primary key,
name varchar2(20),
cost number(10));

create table shop (
scode varchar2(10) primary key,
sname varchar2(20));

create table salelist (
saleno number(10) primary key,
pcode varchar2(10) not null, 
saledate date,
scode varchar2(10) not null,
amount number(10));

insert into product values('AA01','아메리카노',3000);
insert into product values('AA02','에스프레소',3500);
insert into product values('AA03','카페라떼',4000);
insert into product values('AA04','카라멜마끼',4500);
insert into product values('AA05','카푸치노',5000);
insert into product values('AA06','초코롤케익',6000);
insert into product values('AA07','녹차롤케익',6500);
insert into product values('AA08','망고쥬스',7000);
insert into product values('AA09','핫초코',2500);

insert into shop values('S001','강남점');
insert into shop values('S002','강서점');
insert into shop values('S003','강동점');
insert into shop values('S004','강북점');
insert into shop values('S005','동대문점');
insert into shop values('S006','인천점');

insert into salelist values(100001, 'AA01', '20180902', 'S001', 50);
insert into salelist values(100002, 'AA03', '20180902', 'S002', 40);
insert into salelist values(100003, 'AA04', '20180902', 'S002', 20);
insert into salelist values(100004, 'AA04', '20180902', 'S001', 30);
insert into salelist values(100005, 'AA05', '20180902', 'S004', 40);
insert into salelist values(100006, 'AA03', '20180902', 'S004', 30);
insert into salelist values(100007, 'AA01', '20180902', 'S003', 40);
insert into salelist values(100008, 'AA04', '20180902', 'S004', 10);
insert into salelist values(100009, 'AA01', '20180902', 'S003', 20);
insert into salelist values(100010, 'AA05', '20180902', 'S003', 30);
insert into salelist values(100011, 'AA01', '20180902', 'S001', 40);
insert into salelist values(100012, 'AA03', '20180902', 'S002', 50);
insert into salelist values(100013, 'AA04', '20180902', 'S002', 50);
insert into salelist values(100014, 'AA05', '20180902', 'S004', 20);
insert into salelist values(100015, 'AA01', '20180902', 'S003', 30);

앞으로 이 3개의 테이블로 SELECT 고급을 알려드릴 겁니다.

간단히 테이블 컬럼 설명을 해드리겠습니다.

product = 제품 테이블 shop = 매점 테이블 salelist = 판매 테이블
pcode = 제품 번호 scode = 매점 번호 saleno = 판매 번호
name = 제품 이름 sname = 매점 이름 pcode = 제품 번호
cost = 제품 가격 scode = 매장 번호
saledate = 판매일
amout = 판매 개수

대충 카페과 같이 어떤한 특정 제품(product) 들이 있는데 이것이 언제, 어디에서(shop),  몇개(salelist)가 팔렸는지에 대한 데이터가 있습니다. 하지만 이러한 데이터는 위와 같이 3개의 테이블이 분포되어있습니다.

그럼 어떻게 3개의 테이블을 묶어서 동시에 검색할 수 있을까요?


JOIN

join은 두 개 이상의 테이블에서 관련된 컬럼을 기준으로 데이터를 결합하는 방법입니다

select * 
from 
product A, # "product를 A라고 부르겠다"
shop B,
salelist C
where A.pcode = c.pcode and b.scode = c.scode;

위 표를 다시 보면 pcode와 scode는 제품 테이블(A)과 매점 테이블(B)은 각각 하나가 있지만,

판매 테이블(C)에는 pcode와 scode가 모두 있기 때문에

where을 사용해 (A, C) 과 (B, C) 와 같은 식으로 묶어주었기 때문에 join의 기능이 제현된겁니다.

 

이러한 join이 가능한 이유는

pcode와 scode는 primary key 의 속성을 띄고 있기 때문입니다.

primary key는 관계형 데이터베이스에서 각 행(row)을 유일하게 식별할 수 있는 열(column) 또는 열의 집합입니다.

이러한 속성을 가진 column은 기본키라는 제약조건이 걸리는데.

 

pcode와 scode 컬럼은 제품(product), 매점(shop) 테이블에서는 기본키 이지만,

판매(salelist) 테이블 에서는 외래키가 됩니다.


제품별 총 매출액을 구해보겠습니다.

select
A.pcode,
A.name,
to_char(sum(A.cost * C.amount), '999,999') as cost
from
product A,
shop B,
salelist C
where A.pcode = c.pcode and b.scode = c.scode;
group by A.pcode, A.name;

to_char( )를 사용해 출력 값이 000,000 형태가 되도록 합니다. 그리고 안에 sum( )을 사용해서 (가격 X 판매개수) 를 구하면 제품별 총판매액이 나옵니다.


음... 딱히 쓸게 너무 없네... 그냥 [SQL] DML - 데이터 조작 에 쑤셔 넣을걸... 

join에 대해 자세히 알고 싶으신 분은 https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/ 로 가시기 바랍니다. 이 글은 많이 안보셨음 좋겠네요 ㅎ