중복된 갯수가 n 개 이상 및 데이터 찾기

1 분 소요

요즘 자주 쓰는 sql문인데 쓸때마다 헷갈려서 버벅인다. 사용하고자 할때 바로바로 떠올라야 하는데 일일이 구글링하기 귀찮아서 정리해보았다.

1. 중복된 갯수가 n 개 이상인

SELECT 필드명, count(*) as 변수명 FROM 테이블명 GROUP BY 필드명 HAVING 변수명 > *n;*

*또는*

SELECT 필드명, count(*) FROM 테이블명 GROUP BY 필드명 HAVING *count(*)* > *n;*

// 중복된 값을 찾고자 하는 필드명을 지정한다.

// 가령 mp3rand 라고 지정하면 GROUP BY mp3rand

img

칼럼에 INDEX 를 걸기 전과 건 후의 속도 차이를 보면 엄청난 차이가 발생한 걸 알 수 있다.

2. 중복된 데이터 추출

SELECT column1, column2, column3, …

FROM tableA

WHERE column1 IN (

SELECT column1

FROM tableA

GROUP BY column1

HAVING COUNT(*) > 1

);

로 하면 중복된 게시물을 보여준다.

select a.uid, a.no, a.eng from data a, (select eng from data group by eng having count() > 1) b where a.eng = b.eng; select uid, no, eng from data where eng IN (select eng from data group by eng having count() > 1) order by eng;

이 두개는 동일한 결과를 화면에 뿌려준다.

하지만 Query 속도는 JOIN 으로 가져온 첫번째 방법이 훨씬 더 빠르다.

동명이인 자료 추출

select m.* from member m, (select userNM from member group by userNM having count(*) > 1) b where m.userNM=b.userNM;

그런데 가져올 기존 테이블명을 손대지 않고 처리를 하려면 별칭으로 이름을 변경해주면 중복이 발생하지 않기 때문에 자료를 조회하는데 문제가 생기지 않는다.

select * from member , (select userNM as userNM1 from member group by userNM having count(*) > 1) b where member.userNM=b.userNM1;

3. 중복된 것 모두 찾기

SELECT 필드명, count(*) FROM 테이블명 GROUP BY 필드명

영문, 한글자까지 문자의 정확한 길이를 알려면 CHAR_LENGTH() 함수를 사용한다.

SELECT eng, CHAR_LENGTH(eng) FROM data WHERE uid =번호;

4. 중복데이터 제거 WHERE절 대신 HAVING절을 이용하여 해결

DELETE FROM TABLE WHERE id IN (

SELECT A.id id FROM ( SELECT id FROM TABLE

​ GROUP BY col2, col3, col4, col5, col6

​ HAVING COUNT(*) > 1) A)

출처: https://link2me.tistory.com/728 [소소한 일상 및 업무TIP 다루기]

태그:

카테고리:

업데이트:

댓글남기기