헷갈리는 개념 정리
아직 SQL 구문 중 내가 원활하게 쓸 수 없는 개념들을 정리해보려고 한다.
1. 윈도우 함수
group by의 개념과 비슷하다고 생가하면 된다. 행을 그룹화한 뒤에, 정렬해준다. 그리고 범위를 설정해서 다양한 함수들을 제공한다.
SELECT 윈도우함수(컬럼1) OVER (
[PARTITION BY 컬럼2] -- 그룹화
[ORDER BY 컬럼3 ASC / DESC] --정렬
[ROWS /RANGE BETWEEN A AND B] --계산 범위
) AS 결과
FROM 테이블
[] 대괄호는 생략이 가능하다.
윈도우 함수의 진행 순서
1. 데이터를 파티션으로 나눠준다.
2. 각 그룹별로 데이터를 정렬해준다.
3. 정렬된 데이터 안에서 연산할 범위를 설정해준다.
4. 지정된 범위와 정렬에 따라 윈도우함수 값 계산
(1) 집계 함수의 확장: SUM, AVG
(2) 원본 데이터 유지: 원본 데이터
특징
(1) 기존 집계 함수는 그룹 단위로 함수가 적용되지만, 윈도우 함수는 각 행의 데이터와 함께 집계 결과를 유지함.
> 즉, 각각의 행마다 개별적으로 연산을 할 수 있다.
(2) 원본 데이터와 함께 윈도우 함수의 결과를 동시에 확인 가능
(3) 순위 매기기, 누적합 계산, 특정 행 값 참조, 백분위 계산 등 가능함
윈도우 함수가 실행되면
FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> 윈도우 함수 -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
윈도우 함수는 HAVING과 SELECT 절 사이에 실행되는 것을 잊지말자!!
1.2 순위 함수
RANK : 순위를 매기지만, 동일한 값에 대해 같은 순위를 부여한다. 이후의 순위는 건너뛴다.
만약에
1번과 2번의 ranking score가 같을 경우에는 다음에 나오는 번호가 2가 되는 것이 아니라, 생략 후 바로 3번이 나온다.
DENSE_RANK:
Row number는 말그대로 행번호이다.
2. 코드카타 오답 노트
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
SELECT I.ANIMAL_ID,
I.ANIMAL_TYPE,
I.NAME
FROM ANIMAL_INS AS I
JOIN ANIMAL_OUTS AS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE'%INTACT%'
AND (O.SEX_UPON_OUTCOME LIKE 'SPAYED%' OR O.SEX_UPON_OUTCOME LIKE 'NEUTERED%')
ORDER BY I.ANIMAL_ID
1. 서로 다른 테이블을 연결해주어야 하므로 JOIN 함수를 사용해서 연결해주어야 한다.
두 테이블에 모두 ANIMAL_ID가 있으므로 해당 컬럼으로 연결해주면 된다.
2. 중성화 여부를 확인하기 위해 WHERE절로 조건을 걸어준다.
들어올 당시에는 중성화가 안되었다면 LIKE 함수를 사용하여 중성화가 되지 않았다는 것을 의미한 INTACT가 포함된 컬럼을 찾아주어야 한다. 중성화가 되었을 경우는 SEX_UPON_OUTCOME 컬럼에서 LIKE함수를 걸어 'SPAYED%' 또는 ' NEUTERED%' 가 포함된 문자를 찾아 주면된다.
3. 마지막으로 ORDER BY 로 ANIMAL_ID를 기준으로 오름차순을 해준다.
드디어 한 주가 끝났다. 준비할 때는 힘들었으나....어찌됐든 끝났다!!!!!!
오늘 하루만큼은 해방이다...
나도 더욱 발전해서 돌아오겠다. 다음주에 있을 파이썬까지 개념강의 어느 정도는 들어놔야 편히 따라갈 수 있겠지....