inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[백문이불여일타] 데이터 분석을 위한 고급 SQL

DELETE 리트코드 문제풀이 + 섹션 3 서브쿼리 맛보기

196. Delete Duplicate Emails 좋은 코드 질문

해결된 질문

140

개발너구리

작성한 질문수 4

0

DELETE A1
FROM Person A1
INNER JOIN Person A2 ON A1.email = A2.email
WHERE A1.id > A2.id;
  1. 이너조인 연습

 

DELETE FROM Person --삭제
WHERE id IN (
    SELECT id --외부 서브쿼리
    FROM (
        SELECT id, --내부 서브쿼리
               ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as id_rank
        FROM Person
    ) Number_Practice
    WHERE id_rank > 1 --외부조건 2순위 이상
);
  1. 윈도우함수 Row_number 활용

 

 

WITH CTE_practice AS (
    SELECT id,
           ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as id_rank
    FROM Person
)

DELETE FROM Person
WHERE id IN (SELECT id FROM CTE_practice WHERE id_rank > 1);
  1. CTE 이용

WITH CTE_NAME AS (

내부서브쿼리

)

 

DELECT

WHERE id IN ( 외부 서브 쿼리)

 

3가지를 연습해봤는데,

실무적으로는 어느 것을 더 지향하는지 (좋은코드? 클린코드?)

궁금해서 질문드립니다.

 

sql

답변 1

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
개발너구리님께서 실무적으로 가장 좋은 SQL 중복 삭제 패턴에 대해 질문해 주셨네요.

세 가지 방법 모두 중복된 이메일을 삭제하는 기술적인 관점에서는 효과적인 접근 방법입니다. 그러나, 실무적으로 어떤 방법이 더 적합한지 또는 좋은 코드인지 판단하기 위해서는 다음과 같은 요소들을 고려할 필요가 있습니다:

  1. 가독성: 코드의 가독성은 매우 중요합니다. 나중에 다른 개발자가 코드를 이해하고 유지보수할 때 용이해야 합니다. 이 측면에서는 CTE(Common Table Expression)를 사용하는 방법이 가장 읽기 쉬운 구조를 제공합니다. CTE는 복잡한 쿼리를 단계적으로 볼 수 있게 해주고, 이름을 붙여주어 의미를 명확하게 전달할 수 있습니다.

  2. 성능: 대량의 데이터를 처리하는 경우 성능도 중요한 요소입니다. 일반적으로 내부 서브쿼리보다는 CTE 방식이 SQL 최적화기에 의해 더 최적화된 경로로 실행될 가능성이 높습니다.

  3. 유지보수성: 코드가 변경될 가능성이나 확장성이 필요할 경우 CTE 방법이 유리할 수 있습니다. 내부 로직을 명확하게 분리할 수 있어 로직 수정 시 일부만 변경해도 되는 장점이 있습니다.

종합적으로 볼 때, 가독성과 유지보수성 측면에서 CTE를 사용하는 방법을 지향하는 것이 좋습니다. 다만, 기업의 표준이나 코드 스타일 가이드에 따라 다를 수 있으니, 해당 사항도 참고하셔야 합니다.

생각해 볼 점은 직접 측정해보지 않으면 성능이 예상과 다를 수 있기 때문에, 실제로 데이터베이스 환경에서 성능 테스트를 통해 어떤 방식이 가장 효율적인지 검증하는 것이 바람직합니다.
Spring Data JPA - 참고 문서도 참조하셔서 데이터베이스 작업에 있어 더 많은 최적화와 관련된 정보들을 찾아보실 수 있습니다.

순위 함수 연습 문제 - 스테디셀러 작가 찾기

0

83

1

문제 내용이 잘못된 것 같습니다.

0

57

2

서브쿼리 질문

0

59

2

[수업질문] 서브쿼리 > null데이터 avg사용 주의

0

71

1

서브쿼리는 언제 작성하는건가요?

0

66

1

안녕하세요 질문드립니다.

0

66

2

Top Earners 문제관련 질문

0

95

2

고급반 cheetsheet

0

145

2

a.id = 1과 b.id=1이 없어도 되는 이유

0

125

0

강의 플랫폼

0

197

3

리트코드 177번 function 풀이중 case when 활용을 위한 서브쿼리 구문을 제출 시 검증에 통과되지 않도록 보강된 듯 하네요

0

203

2

ERD 읽는법에 추가 질문 있어요

0

249

1

lead, lag로 풀이할 시 id 값이 존재하지 않는 경우의 오답

0

355

2

사용자정의함수

0

230

1

이 문제 inner join이 이해가 안됩니다.

0

294

1

평균 함수 사용할 때 주의점과 해결법

0

259

1

196. subquery로 풀 때, 궁금한 점

0

381

2

쿼리성능 질문드립니다.

0

311

1

리트코드 highest department salary 문제

0

257

2

The report 문제 order by부분 질문

0

268

2

리트코드 서브쿼리 문제 질문

0

418

1

DEPARTMENT HIGHEST SALARY 서브쿼리 문제 문의

0

233

1

서브쿼리의 활용사례 및 조인관련질문

0

281

1

count(*)과 AS가 사용가능한절 TOP EARNERS문제

0

250

2