Challange

패스트캠퍼스 환급챌린지 18일차 미션 (2월 18일) : 데이터 분석 Master Class 강의 후기

@0-0 2024. 2. 18. 21:22
반응형

 

오늘은 3번째로 설문지를 제출하는 날!

18일차 빠밤

 

 

오늘은 SQL을 활용한 데이터의 생성과 조회 마지막 시간이었다.

JOIN과 서브쿼리에 이어 UNION, ROLL UP, 윈도우 함수를 배울 수 있었다.

 

UNION의 경우 개념이나 사용하는 방법은 쉬웠다.

하지만 MySQL에서 INTERSECT와 MINUS를 사용하지 못하는 것은 몰랐는데

MySQL에서 EXISTS 구문을 통해 사용하는 방법을 배울 수 있어 좋았다.

특히 이렇게 예제를 하나하나 알아가면서 명령어들을 다양하게 사용할 수 있는 방법을 배워갈 수 있었다.

 

ROLL UP의 경우 처음 배워본 개념이었지만 어렵지 않은 개념이었다.

특히 ROLL UP을 사용할 경우 합계와 소계를 바로 계산해줘

데이터 집계를 일일이 할 필요없이 사용할 수 있어 유용한 명령어인 것 같다.

그리고 GROUP BY를 할 때 컬럼의 순서 중요⭐

 

마지막으로 윈도우 함수는 SQL에 대해 이것저것 서칭해보다가 이름만 들었던 개념이었다.

나도 처음에 윈도우 함수라는 이름을 들었을 때 OS에 관련된 건가라는 생각이 들었었는데

강사님도 그런 생각이 들었다고 한다. 나만 그런게 아니었군ㅋㅋ

윈도우 함수는 처음에 뭐지,,? 이런 생각이 들었던 개념이었다.

그래서 이해를 위해 강의를 여러 번 반복해서 들었고 예제 테이블이 마땅치 않아

기존 나눠주었던 자료에서 예제를 수정하여 실습을 진행했는데

예제를 직접해보며 이해할 수 있었다.

특히 윈도우 함수는 간결한 SQL로 많은 데이터를 도출할 수 있어 개념을 잘 숙지해서 잘 활용하고 싶다🤗

 

 

 

 

 


 

Part 2. SQL _ 데이터 생성과 조회 2

 

 

 

 

 

05. 집합 연산자

: 데이터를 세로로 연산해줌 

+ 가로 연산: JOIN

// 실습 데이터: 자료 Part 6의 world_tour.sql

 

1. UNION ALL

: 중복 데이터 제거 X인 합집합

 

select * from world_tour1
union all
select * from world_tour2;

* 주의: select하는 컬럼의 개수가 같아야 함

 

- 개수가 동일하다면 컬럼의 순서는 상관없음

-- 동일한 결과 출력 --

select cast, name from world_tour1
union all
select name, cast from world_tour2;

 

- alias를 붙이고 싶다면 제일 위에 위치한 컬럼에만 붙이면 됨

 

 

 

2. UNION

: 중복된 데이터 제거(DISTINCT)하는 합집합

 

 

 

+ intersect, minus

: MySQL의 경우 intersect(교집합), minus(차집합)을 지원하지 않기 때문에 exists를 이용해야 함

/* intersect */
select * from world_tour a
 where exists (select 1 from world_tour2 b where a.cast = b.cast);
 
/* minus */
select * from world_tour a
 where not exists (select 1 from world_tour2 b where a.cast = b.cast);

 

 

 

06. WITH ROLLUP

: 데이터를 집계한 후 소계나 합계를 구할 때 사용

 

// 실습 데이터: 자료 Part 4의 animal.sql

 

1. 합계

select animal, count(*) from animal_info group by animal with rollup;

 

2. 합계, 소계

select animal, type, count(*) from animal_info group by animal, type with rollup;

 

 

* 주의: ROLL UP을 사용할 때에는 GROUO BY절의 컬럼의 순서에 영향을 받으므로 이를 고려해서 작성해야 함

select animal, type, count(*) from animal_info group by type, animal with rollup;

 

 

3. CASE WHEN

select case when animal is null then 'total' else animal end as animal,
		case when type is null then 'total' else type end as type,
		count(*)
 from animal_info
 group by animal, type with rollup;

* CASE WHEN 구문의 마지막 'END AS 컬럼' CASE WHEN 구문 사용으로 생긴 새로운 열의 이름을 지정하는 것

 

 

 

07. 윈도우 함수

: 테이블의 특정 부분을 대상으로 데이터를 계산해주는 함수

 

// 실습 테이블: 자료 Part 6의 idol.sql

 

 

1. 그룹별 멤버 수

 

- 윈도우 함수

select group_name,
		count(*) over(partition by group_name) as member_cnt
 from idol_member;

 

   · count(*) 다음 over절 

   · partition by: 파티션이 될 컬럼

 

- GROUP BY

select group_name, count(*) from idol_member group by group_name;

 

 

2. 순위 매기기

 

// 실습 테이블: 자료 Part 4의 book_list.sql 을 수정하여 사용

genre 컬럼을 추가하고 price 컬럼의 데이터를 수정하였기 때문에 기존의 테이블을 삭제 후 진행함

/* 기존 테이블 삭제 */
drop table book_list;

/* 테이블 생성 */
CREATE TABLE book_list (
    book_no     varchar(13),
    book_nm     varchar(30),
    writer      varchar(20),
    publisher   varchar(30),
    reg_date    date,
    price       int,
    genre	varchar(10)
);

INSERT INTO book_list VALUES ('9791168473690','세이노의 가르침','세이노','데이원','20230302',7200, '자기계발'); 
INSERT INTO book_list VALUES ('9791158741952','상처받지 않는 관계의 비밀','최리나','미디어숲','20230730',17500, '자기계발'); 
INSERT INTO book_list VALUES ('9788901272580','역행자','자청','웅진지식하우스','20230529',19500, '자기계발'); 
INSERT INTO book_list VALUES ('9788932923413','꿀벌의 예언1','베르나르 베르베르','열린책들','20230621',16800, 'SF'); 
INSERT INTO book_list VALUES ('9791191891287','메리골드 마음 세탁소','윤정은','북로망스','20230306',15000, '판타지'); 
INSERT INTO book_list VALUES ('9791191669466','나는 죽을 때까지 지적이고 싶다','양원근','정민미디어','20230615',16800, '에세이'); 
INSERT INTO book_list VALUES ('9791158741952','심플 라이프','제시카 로즈 윌리엄스','밀리언서재','20230615',17500, '자기계발'); 
INSERT INTO book_list VALUES ('9791190299770','모든 삶은 흐른다','로랑스 드빌레르','피카(FIKA)','20230403',16800, '에세이'); 
INSERT INTO book_list VALUES ('9791192389073','유연함의 힘','수잔 애쉬포드','상상스퀘어','20230510',19800, '자기계발'); 
INSERT INTO book_list VALUES ('9791167740984','도둑맞은 집중력','요한 하리','어크로스','20230428',18800, '인문');

 

 

- 순위를 매기는 함수

row_number: 모두 다른 순위, 동일 데이터의 경우 random으로 순위 지정

   ex) 1, 2, 3, 4, 5, 6, ...

rank: 동일 데이터는 같은 순위, 다음 데이터는 동일 데이터만큼 뛰어넘은 후 순위 지정

   ex) 1, 2, 2, 2, 5, 5, 7, ...

dense rank: 동일 데이터는 같은 순위, 다음 데이터는 차례대로 순위 지정

   ex) 1, 2, 2, 2, 3, 4, 4, 5, ...

 

 

- 윈도우 함수

select book_no, book_nm, price, genre,
	row_number() over(partition by genre order by price desc) as row_no,
	rank() over(partition by genre order by price desc) as rank_no,
	dense_rank() over(partition by genre order by price desc) as dense_rank_no
 from book_list
order by genre, row_no;

 

 

 

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

 

 

 

:: https://bit.ly/48sS29N

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

반응형