중복된 갯수가 n 개 이상 및 데이터 찾기
요즘 자주 쓰는 sql문인데 쓸때마다 헷갈려서 버벅인다. 사용하고자 할때 바로바로 떠올라야 하는데 일일이 구글링하기 귀찮아서 정리해보았다.
1. 중복된 갯수가 n 개 이상인
SELECT 필드명, count(*) as 변수명 FROM 테이블명 GROUP BY 필드명 HAVING 변수명 > *n;*
*또는*
SELECT 필드명, count(*) FROM 테이블명 GROUP BY 필드명 HAVING *count(*)* > *n;*
// 중복된 값을 찾고자 하는 필드명을 지정한다.
// 가령 mp3rand 라고 지정하면 GROUP BY mp3rand
칼럼에 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 다루기]
댓글남기기