SQL연습 8

수랜드·2020년 12월 10일
0
post-thumbnail

여러가지 키워드 사용해보기 3

(ROWNUM,RANK,NVL)

1 ROWNUM

ROWNUM은 순번을 매길때 사용합니다.

선수 테이블에서 골을 가장 많이 넣은 순으로 정렬 한뒤 순위를 매기고 싶습니다.

SELECT name, goals,rownum
FROM players
ORDER BY goals DESC

이렇게 단순히 ROWNUM만 추가 하게되면 순서가 뒤죽박죽 나오게 됩니다.

그래서 서브쿼리로 만들어서 사용하게 되는데

SELECT name,goals,rownum
FROM (SELECT name, goals
      FROM players
      ORDER BY goals DESC)

순위가 조금 이상합니다. 동일한 골의 수가 중복됨에도 순위가 나눠져 버렸기 때문입니다.

그렇다면 중복된 값은 같은 순위로 놓아야 합니다.

2 RANK

이럴때 따로 쓰는게 RANK 함수 입니다.

SELECT name, goals,RANK() OVER (ORDER BY goals DESC ) as ranking
FROM players

이렇게 RANK 함수는 ROWNUM과 다른 방식으로 작성합니다.

순위가 적당하게 잘 나온 것이 보입니다.

3 NVL

NVL 함수는 null인 컬럼의 값을 특정한 값으로 바꿔주는 역할을 합니다.

선수 테이블에 현재 null값이 들어가 있는 셀이 없어서 선수를 추가해 주겠습니다.

INSERT INTO PLAYERS(player_id,name,birth_date,nation,height,weight,goals,assist,club_id)
VALUES(players_seq.nextval,'마커스 래쉬포드','1994-09-08','잉글랜드',181,69,9,null,1);

INSERT INTO PLAYERS(player_id,name,birth_date,nation,height,weight,goals,assist,club_id)
VALUES(players_seq.nextval,'앙토니 마르시알','1994-09-08','프랑스',179,69,7,null,1);

INSERT INTO PLAYERS(player_id,name,birth_date,nation,height,weight,goals,assist,club_id)
VALUES(players_seq.nextval,'사디오 마네','1992-04-10','센네갈',175,69,5,null,3);

세 명의 선수가 추가 되었는데 어시스트가 모두 null로 되어있습니다.

만약 CONCAT함수를 써서 '개'를 붙인다면 이렇게 null값이기 때문에 숫자가 붙지 않습니다.

그렇기 때문에 NVL함수를 사용해서 null일때는 0으로 표시되게 해주겠습니다.

SELECT name,NVL(assist,0)
FROM players

이렇게 사용 하면 null은 0으로 나오게 됩니다.

CONCAT함수와 같이 사용한다면

SELECT name,CONCAT(NVL(assist,0),'개') 어시스트
FROM players

이렇게 안에 넣어주면 되겠습니다.

개 로만 나왔던게 0개로 잘 나오네요.

profile
신입 개발자 입니다...

0개의 댓글