sqldb join
create database sqldb;
use sqldb;
create table usertbl(
userID char(8) NOT NULL PRIMARY KEY, -- id컬럼 :PK
name varchar(10) NOT NULL, -- 이름
birthYear int not null, -- 출생년도
addr char(2) not null, -- 지역(경기, 서울)
mobile1 char(3), -- 휴대폰 앞자리
mobile2 char(8), -- 휴대폰 뒤에..
height smallint, -- 키
mDate DATE -- 회원 가입일..
);
create table buytbl (
num int auto_increment not null primary key, -- 순번
userID char(8) not null, -- 아이디 FK : 밑에 어디와 연결하는지 세팅..
prodName char(6) not null, -- 상풍명
groupName char(4), -- 분류
price int not null, -- 가격
amount smallint not null, --
foreign key( userID ) references usertbl(userID)
);
INSERT INTO usertbl VALUES('LSG', '이승기', 1987, '서울', '011', '1111111', 182, '2008-8-8');
INSERT INTO usertbl VALUES('KBS', '김범수', 1979, '경남', '011', '2222222', 173, '2012-4-4');
INSERT INTO usertbl VALUES('KKH', '김경호', 1971, '전남', '019', '3333333', 177, '2007-7-7');
INSERT INTO usertbl VALUES('JYP', '조용필', 1950, '경기', '011', '4444444', 166, '2009-4-4');
INSERT INTO usertbl VALUES('SSK', '성시경', 1979, '서울', NULL , NULL , 186, '2013-12-12');
INSERT INTO usertbl VALUES('LJB', '임재범', 1963, '서울', '016', '6666666', 182, '2009-9-9');
INSERT INTO usertbl VALUES('YJS', '윤종신', 1969, '경남', NULL , NULL , 170, '2005-5-5');
INSERT INTO usertbl VALUES('EJW', '은지원', 1972, '경북', '011', '8888888', 174, '2014-3-3');
INSERT INTO usertbl VALUES('JKW', '조관우', 1965, '경기', '018', '9999999', 172, '2010-10-10');
INSERT INTO usertbl VALUES('BBK', '바비킴', 1973, '서울', '010', '0000000', 176, '2013-5-5');
INSERT INTO buytbl VALUES(NULL, 'KBS', '운동화', NULL , 30, 2);
INSERT INTO buytbl VALUES(NULL, 'KBS', '노트북', '전자', 1000, 1);
INSERT INTO buytbl VALUES(NULL, 'JYP', '모니터', '전자', 200, 1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '모니터', '전자', 200, 5);
INSERT INTO buytbl VALUES(NULL, 'KBS', '청바지', '의류', 50, 3);
INSERT INTO buytbl VALUES(NULL, 'BBK', '메모리', '전자', 80, 10);
INSERT INTO buytbl VALUES(NULL, 'SSK', '책' , '서적', 15, 5);
INSERT INTO buytbl VALUES(NULL, 'EJW', '책' , '서적', 15, 2);
INSERT INTO buytbl VALUES(NULL, 'EJW', '청바지', '의류', 50, 1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL , 30, 2);
INSERT INTO buytbl VALUES(NULL, 'EJW', '책' , '서적', 15, 1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL , 30, 2);
use sqldb;
show tables;
select * from usertbl;
select * from buytbl;
- 참고) 각기 테이블을 따로 보는 것이 아니라
이번에는 고객의 정보와 구매 이력을 같이 보자 - Q) 구매 정보가 있는 고객들의 정보만 보자 + 볼 항목 : 전체
=> 구매 이력도 & 회원 정보 : inner
select * from usertbl inner join buytbl;
# 연결이 애매하게 된다 (on 기준으로 연결)
select * from usertbl U inner join buytbl B on U.userID=B.userID;
# 기준으로 해야하지만 정확하게 연결이 됨
- Q) 구매한 고객들의 정보만 보겠다 (구매하지 않은 고객은 제외)
볼 항목 : 고객의 아이디, 고객이름, 구매한 상품, 연락처 full, 주소
select * from usertbl U inner join buytbl B on U.userID=B.userID;
select U.userID,U.name, B.prodName, concat(U.mobile1,U.mobile2), U.addr
from usertbl U inner join buytbl B on U.userID=B.userID;
select U.userID,U.name, B.prodName, concat(U.mobile1,U.mobile2) as `핸드폰`,
U.addr from usertbl U inner join buytbl B on U.userID=B.userID;
select U.userID,U.name, B.prodName, concat(U.mobile1,U.mobile2) as `핸드폰`,
U.addr from usertbl U inner join buytbl B on U.userID=B.userID order by B.num asc;
select U.userID,U.name, B.prodName, concat(U.mobile1,U.mobile2) as `핸드폰`,
U.addr from usertbl U inner join buytbl B on U.userID=B.userID order by B.num desc; -- 최근에 구매한 것 중심
- Q) 조건을 설정하고 싶다
userID가 JYP인 사람이 구매한 물품과 그 고객에 대한 기본 정보만 보자
볼 항목 : userID, 이름, 상품명, 전체 핸드폰
=> key : where vs having
select U.userID,U.name, B.prodName, concat(U.mobile1,U.mobile2) as `핸드폰`
from usertbl U inner join buytbl B on U.userID=B.userID
where U.userID="JYP"; -- select 쿼리 순서 & 왜 where인지
- select * from usertbl where userID="JYP";
- 위 쿼리에서 from에서 있는 덩어리만 커진 것
- Q) 쇼핑몰에서 1번이라도 구매한 고객들에게 감사 문자를 보내겠다
어느 고객들에게 보낼지 고객들을 선정해야 한다
볼 항목 : 고객id, 이름, 연락처
select U.userID as `고객id`,U.name as `이름`, concat(U.mobile1,U.mobile2) as `연락처`
from usertbl U inner join buytbl B on U.userID=B.userID
where B.amount>=1;
# 중복이 나타남
- 중복을 처리하고 싶을 때 : distinct
select distinct U.userID as `고객id`,U.name as `이름`, concat(U.mobile1,U.mobile2) as `연락처`
from usertbl U inner join buytbl B on U.userID=B.userID;
- 참고)
select * from usertbl U
left join buytbl B on U.userID=B.userID;
- 고객들의 정보를 두고, 구매이력이 있거나 없거나 다 가져온다
여기서 구매이력이 없는 쪽을 필터링한다
구매쪽 테이블의 urserID 값이 없는 친구들을 걸러내면 된다
select * from usertbl U
left join buytbl B on U.userID=B.userID
where B.userID is not null;
select U.userID, U.name from usertbl U
left join buytbl B on U.userID=B.userID
where B.userID is not null;
select distinct U.userID, U.name from usertbl U
left join buytbl B on U.userID=B.userID
where B.userID is not null;
# 코테나 회사에서 면접 문제로 풀때 - 순차적으로 하나씩 진행하면서 접근
# 직접 방법도 생각날 수도 있지만 순차적으로 이야기하려 한다
- Q) 우리 사이트에 회원가입을 했는데 전혀 구매이력이 없는 고객들
유령회원들한테 첫 구매하시면 할인해 드립니다. 쿠폰 발송
볼 항목: 아이디,이름,연락처 - 생각) 앞의 문제처럼 inner join? => 불가능!
앞의 문제와 다르게 한 번에 가는 숏컷 쿼리는 없다 => 필터링!
select * from usertbl U left join buytbl B on U.userID=B.userID; -- 뼈대
select U.userID as `아이디`,U.name as `이름`, concat(U.mobile1,U.mobile2) as `연락처`
from usertbl U left join buytbl B on U.userID=B.userID
where B.userID is null;
- 관계성을 생각해보면 연결이 없는 친구들만 원하는 것이므로 데어터가 1개씩만 존재할 수 밖에 없음
물론 distinct를 해도 된다
위에와 다르게 여기서는 distinct를 사용하지 않았다 - 필요한 정보들을 join을 사용해서 일단 테이블로 만들자
앞에서 한대로 가공할지 그대로 보여줄지 선택
여러개의 table join
USE sqldb; # 다른 DB도 무관
CREATE TABLE stdtbl
( stdName VARCHAR(10) NOT NULL PRIMARY KEY,
addr CHAR(4) NOT NULL
);
CREATE TABLE clubtbl
( clubName VARCHAR(10) NOT NULL PRIMARY KEY,
roomNo CHAR(4) NOT NULL
);
CREATE TABLE stdclubtbl
( num int AUTO_INCREMENT NOT NULL PRIMARY KEY,
stdName VARCHAR(10) NOT NULL,
clubName VARCHAR(10) NOT NULL,
FOREIGN KEY(stdName) REFERENCES stdtbl(stdName),
FOREIGN KEY(clubName) REFERENCES clubtbl(clubName)
);
INSERT INTO stdtbl VALUES ('김범수','경남'), ('성시경','서울'), ('조용필','경기'), ('은지원','경북'),('바비킴','서울');
INSERT INTO clubtbl VALUES ('수영','101호'), ('바둑','102호'), ('축구','103호'), ('봉사','104호');
INSERT INTO stdclubtbl VALUES (NULL, '김범수','바둑'), (NULL,'김범수','축구'), (NULL,'조용필','축구'), (NULL,'은지원','축구'), (NULL,'은지원','봉사'), (NULL,'바비킴','봉사');
show tables;
- 추가된 3개 : stdtbl, clubtbl,stdclubtbl
select * from stdtbl; -- 개인 신상 정보
select * from clubtbl; -- 클럽 정보
select * from stdclubtbl; -- 개인이 신청한 클럽 정보
- 필요한 정보들이 3개의 테이블에 흩어져 있다
그냥 2개씩 하면서 이어 붙이기 (덩어리 중심)
- Q) 3개의 테이블을 활용을 해서, 학생이름,학생사는 지역, 가입한 동아리, 동아리방호수 출력
단, 동아리를 신청한 친구들에 대해서만 알림
select * from stdtbl; -- 연결 고리 : stdclubtbl
select * from stdtbl S
inner join stdclubtbl SC
on S.stdName=SC.stdName;
select * from stdtbl S
inner join stdclubtbl SC
on S.stdName=SC.stdName
inner join clubtbl C
on SC.clubName=C.clubName;
select S.stdName,S.addr,SC.clubName, C.roomNo
from stdtbl S
inner join stdclubtbl SC
on S.stdName=SC.stdName
inner join clubtbl C
on SC.clubName=C.clubName;
- Q) 모든 학생들에 대해서 가입한 동아리가 있다면 가입한 동아리이름/방번호를 같이 출력해주세요
가입하지 않은 학생이 있다면 그 학생의 기본 정보는 그래도 같이 출력
볼 항목 : 학생이름,학생지역,클럽명,방번호
select * from stdtbl;
select * from stdtbl S
left join stdclubtbl SC
on S.stdName = SC.stdName;
select * from stdtbl S
left join stdclubtbl SC
on S.stdName = SC.stdName
left join clybtbl C
on SC.clubName = C.clubName;
select S.stdName, S.addr, SC.clubName, C.roomNo from stdtbl S
left join stdclubtbl SC
on S.stdName = SC.stdName
left join clybtbl C
on SC.clubName = C.clubName;
- => 기본적인 join에 대해서 체크
+이것들을 바탕으로 조금 다양한 것들을 해보자
case when
- 조금 다른 스타일의 쿼리: case when ~
있는 정보를 가공을 해서 처리
여러 집계 함수도 같이 사용할 수 있다
use sqldb;
show tables;
# usertbl, buytbl
- Q) buytbl에서 누적 구매 금액 (price*amount) 기준
1500 이상 : 최우수 고객
1000~1500 미만 : 우수 고객
1~1000 미만 : 일반 고객
없음 : 유령 고객
=> 더 많은 경우들을 나눠가면서 뭔가를 하고 싶다
select * from buytbl;
select userID, price, amount from buytbl;
# 고객단위별로 묶어가면서 재형성(여러 구매 이력이 있는 고객: 누적합)
select userID, sum(price*amount) from buytbl; -- 에러 발생!
select sum(price*amount) from buytbl; -- 누적 매출액
select userID, sum(price*amount)
from buytbl
group by userID; -- 아이디와 누적금액 연동
# 누적금액을 기준으로 많이 산 고객을 앞에 보자
select userID, sum(price*amount) as `TotalPrice`
from buytbl
group by userID
order by `TotalPrice` desc;
# 고객의 이름을 같이 보자
select B.userID, sum(B.price*B.amount) as `TotalPrice`
from buytbl B left join usertbl U
on B.userID = U.userID
group by B.userID
order by `TotalPrice` desc; -- 소속 명시
# 구매 이력이 있는 부분으로 돌아갈 수 있으니
select B.userID, sum(B.price*B.amount) as `TotalPrice`
from buytbl B right join usertbl U
on B.userID = U.userID
group by B.userID
order by `TotalPrice` desc;
- 잠깐만!
select * from usertbl U left join buytbl B
on U.userID = B.userID;
# => 구매 이력이 없는 LJB,JKW,KKH,LSG,YJS
select U.userID, sum(B.price*B.amount) as `TotalPrice`
from buytbl B right join usertbl U
on B.userID = U.userID
group by U.userID
order by `TotalPrice` desc;
- 명시적으로 어느 소속의 필드로 할지에 따라 결과가 달라짐
실제로 진짜 그런지 더블체크해야 한다
sql에서 이런 정도에서는 에러를 안던진다
- 고객들의 실제 등급을 보자
지금 위에 처리한 값을 기준으로 값을 변경
1920 --> VVIP, 1210 --> VIP,
200,95,75 etc --> Basic
null --> Ghost
=> case when : case by case 값을 처리
select U.userID, U.name, sum(B.price*B.amount) as `TotalPrice`,
case when (sum(B.price*B.amount) >= 1500) then "VVIP"
when (sum(B.price*B.amount) >= 1000) then "VIP"
when (sum(B.price*B.amount) >= 1) then "Basci"
else "Ghost"
end as `CustomerClass` -- 새로운 필드명 (case when구문은 select에 포함된다)
from buytbl B right join usertbl U
on B.userID = U.userID
group by U.userID
order by `TotalPrice` desc;
- 다른 관점으로 진행 => 눈에 보이는 대로 진행
select U.userID, sum(B.price*B.amount) as `TotalPrice`
from buytbl B right join usertbl U
on B.userID = U.userID
group by U.userID
order by `TotalPrice` desc;
- 앞에 했던 쿼리 case when에서
select U.userID, U.name, sum(B.price*B.amount) as `TotalPrice`,
case when (`TotalPrice` >= 1500) then "VVIP" -- 에러 발생
when (`TotalPrice` >= 1000) then "VIP"
when (`TotalPrice` >= 1) then "Basci"
else "Ghost"
end as `CustomerClass`
from buytbl B right join usertbl U
on B.userID = U.userID
group by U.userID
order by `TotalPrice` desc;
- 앞에서 select하는 과정에서 그냥 눈에 보이는 컬럼 중에서
실존하지 않는 것을 기준으로 하면 에러가 발생함
from에 있는 실존하는 필드들로 표현을 싹 해야 가능함
select U.userID, sum(B.price*B.amount) as `TotalPrice`
from buytbl B right join usertbl U
on B.userID = U.userID
group by U.userID
order by `TotalPrice` desc;
-- 위 부분을 하나의 from문으로 넣는다 (쿼리문 포장)
select *, case when (TotalPrice>=1500) then "VVIP"
when (TotalPrice>=1000) then "VIP"
when (TotalPrice>=1) then "Basic"
else "Ghost"
end as `CustomerClass` from
(select U.userID, sum(B.price*B.amount) as `TotalPrice`
from buytbl B right join usertbl U
on B.userID = U.userID
group by U.userID
order by `TotalPrice` desc)A; -- A(별칭)꼭 필요함!!!
-- 쿼리를 덩어리로 인지해야 한다
정리
- 기존의 값을 바탕으로 새로운 값을 형성할 때 : case when ~ end ~
- 순차적으로 해결하는 과정에서 새롭게 만든 값을 바탕으로 다시 select에 뭔가 할 때 필드명이 에러가 발생할 수 있다
=> sol1) 처리한 처리 수석/과정을 그대로 작성 : sum(B.price*B.amount)
from에서 바로 가져올 수 있는 값들
=> sol2) 그냥 실존적인 테이블이라고 포장
select ~ from (중첩 중첩...)A ~;
mysql은 from 자리에 포장할 때 무조건 별칭 테이블 붙여야 한다
중요! 위의 쿼리들은 꼭 숙지하자 (나중에 중급 쿼리에서 어려울 수 있다)
자주사용하는 쿼리 정리
use sqldb;
select * from buytbl;
# 구매 이력이 있고 고객 정보도 같이 보자 - inner join
select * from buytbl B inner join usertbl U
on B.userID=U.userID;
select U.userID, U.name, U.addr, B.prodName
from buytbl B inner join usertbl U
on B.userID=U.userID;
# userID에 distinct를 걸면
select distinct U.userID, U.name, U.addr, B.prodName
from buytbl B inner join usertbl U
on B.userID=U.userID;
# + userID별로 1건만 보자
select U.userID, U.name, U.addr, B.prodName
from buytbl B inner join usertbl U
on B.userID=U.userID
group by U.userID;
- 주의) 유니크한 값들, 중복되는거 제거 : distinct -> 옆에 항목까지 처리 / group by
- 자주 사용되는 패턴 : 그룹별로 몇 건인가 카운팅
카운팅 : count(*) -> count(1), count(PK), count(특정컬럼:null허용인지 확인)
select * from buytbl group by userID;
select userID,count(1) from buytbl group by userID;
select userID,count(num) from buytbl group by userID;
# 주의사항 : null이 있는 컬럼으로 세팅 하면 빠지고 카운팅
- Q) 구매이력 테이블에서 groupName이 전자인 경우에 한해서 사용자 id별로 구매한 횟수를 찾아보세요
select * from buytbl;
select * from buytbl where groupName="전자";
select userID, count(num) from buytbl where groupName="전자"
group by userID;
- Q) 위의 문제의 결과에서 구매 횟수가 2회 이상인 고객들의 userID만 찾아주세요
=> 우리회사 전자제품 2회 이상 구매한 고객은 누구인지
select userID, count(num) as `구매건수`
from buytbl where groupName="전자"
group by userID;
select userID, count(num) as `구매건수`
from buytbl where groupName="전자"
group by userID
where '구매건수'>=2; -- 에러 발생
select userID, count(num) as `구매건수`
from buytbl where groupName="전자"
group by userID
having '구매건수'>=2; -- 처리한 후 결과를 바탕으로 필터링
select userID, count(num) as `구매건수`
from buytbl where groupName="전자"
group by userID
where count(num)>=2; -- 에러 발생
# select -> from -> where -> (group by) ~ having ~
- 참고) 앞에서 했던 해결 방식 도입 : 자기 참조 / 포장
select userID, count(num) as `구매건수`
from buytbl where groupName="전자"
group by userID;
select * from (select userID, count(num) as `구매건수`
from buytbl where groupName="전자"
group by userID)A where `구매건수`>=2;
# 필터링을 할 때 언제 where을 사용하고 having을 사용할지 스스로 판단해야 한다
where에서 조건들
- Q) 사용자 정보 테이블에서 지역이 서울이 아닌 지역만 보자
select * from usertbl;
select * from usertbl where addr !="서울";
select * from usertbl where addr <>"서울"; -- "서울"빼고 나머지
# != 다르다 <> 연산자로도 사용 가능함
- Q) 태어난 년도 1970년부터 1980년도 사이의 고객들은 누구?
시작점/끝점에 대한 포함여부는 필요에 따라서 조정
select * from usertbl where birthYear Between 1970 and 1980;
- Q) 사용자의 id에서 K를 사용하는 고객들은 누구? (%,_)
select * from usertbl where userID like "%k%";
# 실제 mysql의 세팅/버전에 따라서 대소문자 혼용 & 구별
# 대문자/ 소문자 체크하면서 해보자
case when ~ end
- 1. 기본 기능 : 기존의 값을 내가 원하는 대로 변경
ex) 누적금액에 따른 고객 등급 부여 : VVIP,VIP,Basic
Q) 상황 : 태어난 해를 기준으로 구별을 묶어서 보자
50년대, 60년대, 70년대, 80년대, 90년대
볼 항목: 아이디, 이름, 세대(만든 컬럼: BirthYear기반)
select userID,name,birthYear from usertbl;
select userID,name,
case when birthYear between 1950 and 1959 then "50년대"
when birthYear between 1960 and 1969 then "60년대"
when birthYear between 1970 and 1979 then "70년대"
when birthYear between 1980 and 1989 then "80년대"
when birthYear between 1990 and 1999 then "90년대"
else "기타세대"
end as `세대`
from usertbl;
- Q) 위의 결과들을 세대별로 고객들이 몇 명인지 체크
=> 카운팅의 기준 : 새로운 기준(세데) & 카운팅
select
case when birthYear between 1950 and 1959 then "50년대"
when birthYear between 1960 and 1969 then "60년대"
when birthYear between 1970 and 1979 then "70년대"
when birthYear between 1980 and 1989 then "80년대"
when birthYear between 1990 and 1999 then "90년대"
else "기타세대"
end as `세대`, count(1) as `명수`
from usertbl
group by `세대`;
# => 기존 userID별로 카운팅도 있지만 case when을 이용해서 원하는 기준별로 카운팅
- Q) 위의 결과에서 고객이 3명 이상인 나이대를 중심으로 이벤트를 진행하겠다 => 어느 세대가 해당되나?
select
case when birthYear between 1950 and 1959 then "50년대"
when birthYear between 1960 and 1969 then "60년대"
when birthYear between 1970 and 1979 then "70년대"
when birthYear between 1980 and 1989 then "80년대"
when birthYear between 1990 and 1999 then "90년대"
else "기타세대"
end as `세대`, count(1) as `명수`
from usertbl
group by `세대`
having `명수`>3;
- 위의 내용들을 from (~)A 포장해서 할 수도 있음
- Q) 지역에 대한 정보 addr에 값을 재구성해보자
"서울", "경기" : 수도권, 경북/경남 : 경상도, 그외 : 기타지역
select addr from usertbl;
select addr, case when addr in("서울", "경기") then "수도권"
when addr in ("경북","경남") then "경상도"
else "기타권역"
end as `권역별`
from usertbl;
- Q) 지역에 대한 정보를 바탕으로 수도권 : 서울, 경기 / 비수도권 : 그 외 지역
=> 2가지 새로운 기준을 바탕으로 고객들의 분포(지역별로 몇 명인지)
select addr from usertbl;
select addr, count(1) from usertbl group by addr;
select case when addr in ("서울", "경기") then "수도권"
else "비수도권"
end as `권역별`,
count(1)
from usertbl
group by `권역별`;
- Q) 지역 정보 중에서 addr이 서울인 고객인 경우는 몇 명?
select * from usertbl;
select * from usertbl where addr="서울";
select count(1) from usertbl where addr="서울";
# => 조건을 활용해서 카운팅을 하는 구조 - case when
select case when addr="서울" then 1 else 0 end as `서울여부`
from usertbl;
select sum(case when addr="서울" then 1 else 0 end) as `서울카운팅`
from usertbl;
# 특정한 조건에 맞는 데이터들의 카운팅/ 비율 : case when~
# 내가 관심있는 조건은 1로 바꾸고, 아니면 0으로 바꿔서 sum 카운팅
- group by 조건 where/ having
select case when addr in ("서울", "경기") then "수도권"
else "비수도권"
end as `권역별`,
count(1) as `명수`
from usertbl
group by 1; -- 내가 select 뒤에 나열한 순서에 대한 자연수값 기준
서브 쿼리에 대한 종류
- 1. 조건식에 들어갈 때: 키에 대한 값을 쿼리문으로 요청할 때
=> 김경호인 고객의 키보다 큰 사람들의 이름과 키를 출력하세요
select name, height from usertbl where height>= (select height from usertbl where name = "김경호");
=> (select~) 별칭 사용x - 2. from 자리에 들어갈 때는 무조건 별칭을 사용해야 한다 (mysql 기준)
select ~ from (select ~)A;
select ~ from (select ~from) ; 에러 발생
=> 지역이 서울인 사람들의 아이디만 보자
select userID from usertbl where addr="서울";
select userID from
(select userID from usertbl where addr="서울")A;
- 내일은 rank
- + 실제 데이터셋을 바탕으로 문제를 주고 쿼리문으로 결과를 추출하세요
- 막날 2024년12월31일
- 오후에 sql 퀴즈
'ASAC 빅데이터 분석가 7기 > ASAC 일일 기록' 카테고리의 다른 글
ASAC 빅데이터 분석가 과정 20일차 (25.01.02) (1) | 2025.01.02 |
---|---|
ASAC 빅데이터 분석가 과정 19일차 (24.12.31) (0) | 2024.12.31 |
ASAC 빅데이터 분석가 과정 18일차 -1 (24.12.30) (2) | 2024.12.30 |
ASAC 빅데이터 분석가 과정 17일차 (24.12.27) (1) | 2024.12.27 |
ASAC 빅데이터 분석가 과정 16일차 - 2 (24.12.26) (0) | 2024.12.26 |