SQL에서 테이블의 중복과 NULL 개수?

문해피와 제육볶음·2023년 6월 18일
0

데이터베이스

목록 보기
3/13

🦥 고민들

최근 프로젝트를 하면서 배치를 돌리면서 하루에 한번이나 두번을 가져오게되는데
웹페이지에 같은 이미지를 계속 주는거는 어떻게 해결할까? 라는 생각을 많이 하였습니다.
즉, "개봉예정작을 가져오지만 다음날에도 가져오는 데이터에도 같은 개봉예정작이 있는데 어떻게 중복을 처리해야 할까?" 라는 생각을 많이 하였습니다.

🦤 느려지면 어쩐담

이러한 중복 데이터의 처리를 나중에 데이터가 아주많을때 운영DB에서 하게된다면 느려지거나 비효율적이라고 생각하여, 레이크나 웨어하우스에서 데이터를 받아올때 어떻게 처리해야할까라는 생각도 같이 하게되었습니다.

🦆 들어온거중에서 NULL값의 개수는 어떻게 알지?

count()를 통해서 열의 개수나 다른것을 알수는 있지만 null만의 개수는 어떻게 새는지 고민했습니다.


🐇 나름 해결책

테이블을 지우고 다시만들기 (Redshift를 사용할경우)

Redshift를 사용하게 되면 postgreSQL을 기반으로하며 기본키에 대한 중복을 쿼리없이 처리할수 없기 때문에 데이터를 받아오면서 데이터를 테이블에 insert into 를 하기전에 테이블을 삭제하고 다시만들면 어떨까 라는 생각을 하였습니다.

1 DROP TABLE IF EXISTS [테이블 명];
2 CREATE TABLE [테이블 명] (
3 [컬럼명] [데이터 타입],
4 [컬럼명] [데이터 타입],
....
)

위의 쿼리를 거치게
첫번째 줄에서 테이블명이 같은것이 있다면 삭제를 하고 없다면 넘어가게 됩니다.
이렇게 한다면 메일 같은 데이터를 들어와도 원래의 데이터를 지우고 다시테이블을 만들어서 넣게되기때문에 중복이 없게 되겠다라는 나름 해법을 찾았습니다.

NULL은 개수를 알아보자

  • 방법 1
    아직 sql이 부족해서인지 다른거의 개수는 새지만 어떻게 해야할지 고민이 많았습니다.
    하지만 count()-count()가 가능하다는것을 알고 고민이 싹 없어졌습니다.
SELECT COUNT(1)-COUNT([컬럼명])
FROM [테이블명]
  • COUNT(1)은 모든 열의 개수를 알려준다.
  • COUNT([ 컬럼명 ])은 NULL의 개수만 빼고 알려준다.

이렇게 하게 된다면 모든 열의 개수에서 NULL을뺀 개수의 차를 통해서 NULL의 개수를 알수 있었습니다

  • 방법 2

CASE WHEN을 사용하였습니다.

SELECT SUM( CASE
	WHEN [컬럼 명] IS NULL THEN 1
    ELSE 0
    END
    ) AS null_cnt
FROM [테이블 명]

CASE WHEN 을 통해서 NULL이면 1이고 아니면 0을 하면서 SUM()에서 합치면서 개수를 알수 있었습니다.


🫣 잘못된 생각으로 시행착오

테이블의 컬럼을 기본기로 하여 적재해보자 (MySQL사용하면서)

딱봐도 아주 잘못되고 어리석었다고 생각합니다.
조금만 생각해보면 되는데 허허 안했죠??

만약 데이터가 영화 개봉 예정작이라면 movie_name을 primary key로 하면서 넣으면 중복이 안된다는 생각을 했습니다.
하지만 중복이 안된다는것은 테이블에서 알아서 처리해주면서 조건문처럼 다음 데이터에는 영향이 안가는줄 알았지만 오류발생을 시키면서 데이터의 적재가 정지된다는것을 알았습니다.

그러면서 영화 이름을 말고 다른컬럼으로 식별을 해보려 했지만 해법을 찾지 못했습니다.

왜 NULL은 연산이 안돼??

처음 NULL을 연산하려 100-NULL등을 해보았지만 자꾸 안되서 마음이 아팠지만
근본적인 NULL의 성격을 알지못하고 접근했던 것이었습니다.
기초가 탄탄해야 한다 무조건입니다.

0개의 댓글