본문 바로가기
DATABASE/SQL

사전캠프 6일차 SQL 4,5 주차 강의 정리

by codechu 2025. 3. 24.

subquery 기능 , 조건이 여러개이고 복잡한 연산이 있을 때 한번 계산 해주고 이 계산을 ()로 묶어주기

그 위로 다시  select, from 문 이용해서 구해주기

 

 

 

문제 ) 50세 이상 고객의 연령에 따라 경로 할인율을 적용하고, 음식타입별로 원래 가격과 할인 적용 가격 합을 구하기

(조회 컬럼:음식타입, 원래가격, 할인 적용 가격, 할인 가격)

(할인률 공식 : 나이 -50 *0.005)

( 고객 정보가 없는 경우도 포함하여 조회 -> left join)

 

1. 서브쿼리안에   where절 만들어 우선 50세 이상 고객이라는 조건으로 1차 분류 그리고 (나이에 -50 해서 *0.005를 한 컬럼) dis_price 도 만들어 주기 

2. 본 쿼리에 가격의 합, 할인 적용가격 (원래 가격 - dis_price),할인가격의 합 넣어주기

 

join - 각 테이블에 놔눠져 있는 정보들을 필요한 부분을 모아서 하는 것

if 가격과 결제수단을 함께 나타내고 싶지만 가격은  주문 테이블 , 결제수단은 결제 테이블에 나누어져 있으면 

 

join을 이용해 하나로 나타내주기

 

left join -  공통 컬럽을 기준으로 하나의 테이블에 값이 없어도 모두 조회됨 ( ~ 가 없는 경우에도 포함하여 조회)
inner join - 공통 컬럼을 기준으로 두 테이블 모두 값이 있을 때에만 조회됨 ( 있는경우에만 조회)

 

 

조인 기본 구조 

 

from 테이블 명 left join 다른 테이블 명 on 1.테이블에 공통 키값 = 2.테이블 공통 키 값
 
데이터에 사용할 수 없는 데이터 값이 들어있을 때 처리 방법

 

1. if문으로 그 값을 제외해주기
if(<컬럼명>이 <>이 아니라면, o, null)
null = 못 쓰는 값을 아예 빼주는 거
 

2. where 컬럼명 is not null

 

조건을 주는 where 절에 컬럼명 is not null 을 붙여줘서 null값은 나오지 않게한느 법

 
3. 대체값으로 넣기
coalesce(b.age, 20)
값이 없을때 20이라는 값으로 대체해서 넣어주는 방법
 
 
데이터의 상식적이지 않은 값이 들어있을 경우
ex) 나이가 2,90 처럼 상식적이지 않은 값이 들어있을 경우 -> 조건 문으로 가장 낮은 나이의 범위, 높은 나이의 범위를 지정해줌
 

 

case when을 사용해서 조건 주기
 
5주차 window 함수에 대해서 
SQL **윈도우 함수(Window Function)**는 쿼리의 결과 집합을 "윈도우"라고 하는 범위로 나누어 각 행에 대해 계산을 수행하는 함수입니다. 윈도우 함수는 기본적으로 집계 함수와 비슷하지만, GROUP BY 없이 개별 행에 대해 계산을 할 수 있다는 점에서 차별화됩니다.
 
-> 일반 집계함수 누적합 sum 을 사용하는 것처럼 윈도우 함수에서도 집계함수 기능을 나타낼 수 있음 다른 점은 집계함수를 사용하면 group by를 써줘야 하지만 윈도우 함수는 그룹바이 안 해줘도 됨

 

 

실습에 사용한 함수 

1.rank와 over 은 세트라고 생각 

rank() over( patition by cuisine type order by )

형태는 비슷함

SUM () OVER() 다른 함수를 써도 괄호, PARTITON BY 무슨 컬럼으로 묶어줄 건지는 똑같음

 

select rank()over (partition by 컬럼명 order by)

from 테이블명

 

피벗 테이블 만드는 

 

 

셀렉트 옆 에이지가 

 

퀴진타입처럽 이렇게 로우 형태로 나옴

행으로 할 컬럼명을 먼저 적어주면 됨

 

 

 

 

컬럼명에 지정 이름에 따라 겹치면 또 값이 다르게 나올 수도 있음 age가 컬럼명이랑  case when문으로 사용 했을 때 이상하게 나온다고 해서 처음부터 같은 이름 있으면 age_group과 같이 그냥 다르게 설정하기

그리고 연령은 10-59세 사이가 조건이 되기 때문에  where절 사용해서 조건으로 묶어줬음

음식타입별, 연령별이니까 그룹 바이는 1,2로 서브쿼리 닫기.

if안에 들어가는 값은 age컬럼명이 아니라 case when 으로 계산해줫던 age_GROUP 을 사용해서 구하는 거임

MAX(IF(age_group=10, cnt_order,0)) "10대"

'DATABASE > SQL' 카테고리의 다른 글

사전캠프3일차 - SQL 3주차  (0) 2025.03.19
3/18일 SQL-2주차 내용 + 사전 과제 1  (0) 2025.03.18
사전캠프 1일차 -SQL 1주차  (0) 2025.03.17