SQL 에서 distinct 와 rownumber()over()의 차이 및 용법

머리말
SQL 문 구 를 작성 하여 데이터 베 이 스 를 조작 할 때 불쾌 한 문제 가 발생 할 수 있 습 니 다.예 를 들 어 같은 필드 에 같은 이름 의 기록 을 가지 고 있 습 니 다.우 리 는 하나만 표시 해 야 합 니 다.그러나 실제 데이터 베 이 스 는 같은 이름 의 기록 을 여러 개 포함 하고 있 을 수 있 습 니 다.검색 할 때 여러 개의 기록 을 표시 하 는 것 은 우리 의 취지 에 어 긋 납 니 다!그래서 이런 상황 이 발생 하지 않도록 우 리 는'무 거 운 것'처 리 를 해 야 한다.그렇다면'무 거 운 것'은 무엇 일 까?말하자면 같은 필드 에 같은 내용 을 가 진 기록 을 하나의 기록 만 표시 하 는 것 이다.
그렇다면'무 거 운 것 을 없 애 라'는 기능 을 어떻게 실현 할 것 인가?이에 대해 우 리 는 두 가지 방식 으로 이 기능 을 실현 할 수 있다.
첫 번 째,selection 문 구 를 작성 할 때 distinct 키 워드 를 추가 합 니 다.
두 번 째,selection 문 구 를 작성 할 때 row 를 호출 합 니 다.number()over()함수.
상기 두 가지 방식 모두'무 거 운 것 을 없 애 는'기능 을 실현 할 수 있다.그러면 이들 사이 에는 어떤 차이 점 이 있 습 니까?이어서 저 자 는 상세 한 설명 을 할 것 이다.
2 distinct
SQL 에서 키워드 distinct 는 유일 하 게 다른 값 을 되 돌려 주 는 데 사 용 됩 니 다.문법 형식:

SELECT DISTINCT     FROM    
만약 에 표'CESHIDEMO'가 있 고 두 필드 를 포함 하 며 각각 NAME 와 AGE 를 포함한다 고 가정 하면 구체 적 인 형식 은 다음 과 같다.
CESHIDEMO
이상 의 시 계 를 살 펴 보면 같은 NAME 를 가 진 기록 은 두 가지 가 있 고 같은 AGE 를 가 진 기록 은 세 가지 가 있다 는 것 을 알 수 있다.만약 우리 가 아래 의 이 SQL 문 구 를 실행한다 면,

/**
*    PPPRDER   Schema    ,   CESHIDEMO   PPPRDER  
*/

select name from PPPRDER.CESHIDEMO
다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
name
이 결 과 를 살 펴 보면 상기 네 개의 기록 에 두 개의 NAME 값 이 같은 기록,즉 제2 조 기록 과 제3 조 기록 의 값 이 모두'gavin'이라는 것 을 발견 할 수 있다.그렇다면 같은 NAME 기록 을 하나 만 보 여 주 려 면 어떻게 해 야 할 까?이 럴 때 는 distinct 키 워드 를 사용 해 야 합 니 다!다음은 다음 SQL 문 구 를 실행 합 니 다.

select distinct name from PPPRDER.CESHIDEMO
다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
distinct
이 결 과 를 관찰 하면 분명히 우리 의 요구 가 실현 되 었 다.하지만 distinct 키 워드 를 두 필드 에 동시에 작용 하면 어떤 효과 가 있 을 까?생각 나 는 바 에 야 다음 과 같은 SQL 문 구 를 실행 해 보 자.

select distinct name, age from PPPRDER.CESHIDEMO
얻 은 결 과 는 다음 과 같다.
nameandage
이 결 과 를 살 펴 보 니 어 머,소 용이 없 는 것 같은 데?그녀 는 모든 기록 을 다 보 여 주 었 구나!그 중 NAME 값 이 같은 기록 은 두 개,AGE 값 이 같은 기록 은 세 개 로 전혀 변 하지 않 았 습 니 다!하지만 결 과 는 그래 야 한다.distinct 가 여러 필드 에 작용 할 때 그녀 는 모든 필드 값 이 똑 같은 기록 을'무 거 워'떨 어 뜨 릴 뿐 우리 의'불쌍 한'네 개의 기록 이 이 조건 을 만족 시 키 지 못 하기 때문에 distinct 는 위의 네 개의 기록 이 다르다 고 생각 할 것 이다.말 만 으로 는 증거 가 없다.그 다음 에 우 리 는 표'CESHIDEMO'에 똑 같은 기록 을 추가 하여 검증 하면 된다.기록 을 추가 한 표 는 다음 과 같다.
添加一条记录
다음 SQL 문 구 를 실행 합 니 다.

select distinct name, age from PPPRDER.CESHIDEMO
얻 은 결 과 는 다음 과 같다.
nameandage
이 결 과 를 관찰 하여 우리 위의 결론 을 완벽 하 게 검증 하 였 다.
그 밖 에 특히 주의해 야 할 것 이 있 습 니 다.즉,키워드 distinct 는 SQL 구문 의 모든 필드 의 맨 앞 에 놓 아야 만 역할 을 할 수 있 습 니 다.위 치 를 잘못 놓 으 면 SQL 이 잘못 보고 하지 않 지만 아무런 효과 도 내지 않 습 니 다.
3 row_number() over()
SQL Server 데이터베이스 에서 함수 row 를 제공 합 니 다.number()는 데이터베이스 시트 의 기록 에 레이 블 을 표시 하 는 데 사 용 됩 니 다.사용 할 때 그 다음 에 함수 over()를 따 르 고 함수 over()의 역할 은 표 의 기록 을 그룹 으로 나 누 어 정렬 하 는 것 입 니 다.둘 이 사용 하 는 문법 은 다음 과 같다.

ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)
표 의 기록 을 필드 COLUMN 1 로 나 누 어 필드 COLUMN 2 로 정렬 한 다 는 뜻 이다.
PARTITION BY:그룹 ORDER BY:정렬 표시
이어서 우 리 는 표'CESHIDEMO'의 데이터 로 테스트 를 진행한다.우선,row 를 사용 하지 않 았 음 을 드 립 니 다.number()over()함수 에서 조회 한 결 과 는 다음 과 같 습 니 다.
添加一条记录
그리고 다음 SQL 문 구 를 실행 합 니 다.

select PPPRDER.CESHIDEMO.*, row_number() over(partition by age order by name desc) from PPPRDER.CESHIDEMO
얻 은 결 과 는 다음 과 같다.
函数
위의 결 과 를 통 해 알 수 있 듯 이 원 표를 바탕 으로 숫자 정렬 이 표 시 된 열 이 하나 더 생 겼 다.그러면 반대로 우리 가 실행 하 는 SQL 문 구 를 분석 한 결과 필드 AGE 의 값 에 따라 그룹 을 나 누 었 고 필드 NAME 의 값 에 따라 정렬 되 었 습 니 다!그래서 함수 의 기능 이 검증 되 었 다.
다음은 row 를 어떻게 사용 하 는 지 연구 하 겠 습 니 다.number()over()함수 가'무게 제거'기능 을 실현 합 니 다.위의 결 과 를 살 펴 보면 NAME 로 그룹 을 나 누 어 AGE 로 순 위 를 매 긴 다음 에 각 그룹의 첫 번 째 기록 을 취하 면'무 거 운 것 을 없 애 는'기능 을 실현 할 수 있 음 을 알 수 있 습 니 다!그렇다면 다음 SQL 문 구 를 실행 해 보 세 요.

/*
*    rn           
*/

select * from 
(select PPPRDER.CESHIDEMO.*, row_number() over(partition by name order by age desc) rn from PPPRDER.CESHIDEMO)
where rn = 1
실행 후 얻 은 결 과 는 다음 과 같다.
rn
이상 의 결 과 를 관찰 한 결과,우 리 는 아이고,데이터 가 무 거 워 지 는 기능 이 부주의 로 우리 에 의 해 실현 되 었 구나!안 타 깝 게 도 우리 가 세심 하면 불쾌 한 것 을 발견 할 수 있다.그것 은 바로 상기 SQL 문 구 를 실행 하여'무 게 를 제거 하 자'는 것 이다.NAME 값 이'gavin'이 고 AGE 값 이'18'이라는 기록 이 걸 러 졌 지만 현실 생활 회 에 서 는 같은 이름 의 다른 연령 대의 일이 너무 정상 적 이다.
총화
이상 의 내용 을 읽 고 실천 함으로써 우 리 는 이미 알 고 있 습 니 다.키워드 distinct 를 사용 하 든 함수 row 를 사용 하 든.number()over()는 모두 데이터 의'무 거 운 제거'기능 을 실현 할 수 있다.그러나 사용 을 실현 하 는 과정 에서 우 리 는 이들 의 용법 특징 과 차이 점 에 특히 주의해 야 한다.
키워드 distinct 를 사용 할 때 우 리 는 하나의 필드 와 여러 필드 에 작용 할 때 차이 가 있다 는 것 을 알 아야 한다.하나의 필드 에 작용 할 때'무 거 운 것'은 표 의 모든 필드 값 이 중복 되 는 데이터 이다.여러 필드 에 작용 할 때'무 게 를 제거 하 라'는 표 의 모든 필드(즉,distinct 의 구체 적 인 역할 을 하 는 여러 필드)값 은 같은 데이터 입 니 다.
함수 row 사용 중number()over()는 먼저 그룹 을 나 누 어 정렬 한 다음 에 각 그룹의 첫 번 째 기록 을 꺼 내 서'무 거 운 것 을 제거 합 니 다'(이 블 로그 에서 이와 같 습 니 다).물론 여기 서 우 리 는 서로 다른 제한 조건 을 통 해'무 거 운 것 을 없 앨 수 있다'.구체 적 으로 어떻게 실현 하 는 지 는 모두 가 스스로 머리 를 써 서 생각해 야 한다!
마지막 으로 이 박문 에서 작 가 는 키워드 distinct 와 함수 row 를 상세 하 게 서술 하 였 다.number()over()는 데이터'무 거 운 것'에 대한 인식 을 하고 이상 의 내용 이 여러분 에 게 도움 이 되 기 를 바 랍 니 다!
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기