SQL,Database

집계 함수, 범주별 연산(GROUP BY), 정렬(ORDER BY), 정보수정

seungmin576 2024. 11. 22. 14:55

숫자 연산 예시

select food_preparation_time,
       delivery_time,
       food_preparation_time + delivery_time as total_time
from food_orders

 

이런식으로 컬럼명 + 컬럼명 해도 SUM 함수처럼 나오긴 함.

 

 

  • SUM, AVG
select sum(food_preparation_time) total_food_preparation_time,
       avg(delivery_time) avg_delivery_time
from food_orders

SUM(컬럼명)은 컬럼 데이터의 총합을 알려달라는 뜻.

 

SUM함수 안에 컬럼명을 적고 뒤에 원하는 별명을 설정한 모습

이렇게 하면 FOOD_PREPARATION_TIME 컬럼의 총합이 TOTAL_FOOD_PREPARATION_TIME 이란 별명으로

결과 값이 나온다.

 

AVG(컬럼명)은 컬럼 데이터의 평균을 알려달라는 뜻.

 

AVG 함수도 마찬가지로 안에 컬럼명 적고 뒤에 원하는 별명을 설정한 모습.

DELIVERY_TIME 컬럼의 평균값이 AVG_DELIVERY_TIME이란 별명으로 결과 값이 나온다.

위 함수 결과 값.

 

 

 

  • COUNT
select count(1) count_of_orders,
       count(distinct customer_id) count_of_customers
from food_orders

COUNT()는 어떠한 테이블 안 컬럼의 조회되는 데이터의 갯수를 알려주는 함수이다.

 

COUNT(1)은 COUNT(*)과 같은 의미이며 COUNT_OF_ORDERS 컬럼의 데이터 갯수를 전부 알려달라는 뜻이다.

COUNT(DISTINCT CUSTOMER_ID)는 CUSTOMER_ID 컬럼의 데이터 중에

중복된 값을 제외한 갯수를 알려달라는 의미이다.

즉 5명이 10개 주문하면 그냥 COUNT시 10이 나와 몇명이 주문한지 모르겠지만

DISTINCT 사용시 5명이 나온다 라는 느낌이다.

 

결과 값 이미지

 

 

 

  • MIN, MAX
select min(price) min_price,
       max(price) max_price
from food_orders

MIN(컬럼명)은 어떤 컬럼의 최소값을 구해 달라는 것이며

MIN(PRICE)는 가격 컬럼의 최솟값을 구해 달라는 것이다.

 

MAX(PRICE)는 반대로 최댓값이다.

 

 

GROUP BY

select cuisine_type,
       sum(price) sum_of_price
from food_orders
group by cuisine_type

GROUP BY는 같은 값을 가진 컬럼을 하나로 묶어 준다.

FORM절 뒤에 오며 WHERE절이 존재할시 WHERE절 뒤에 써야한다.

GROUP BY 1, 2 이런식으로 해도 된다.

(위 코드 같은 경우에는 CUISINE_TYPE이 1, SUM(PRICE) AS SUM_OF_PRICE가 2이다.)

 

CUISIN_TYPE 컬럼에는 어떤 나라의 음식을 하는지 적혀 있으며

SUM(PRICE)는 음식의 총합 가격을 구하는 SQL문이다.

근데 뒤에 GROUP BY CUISINE_TYPE이 있으니 한식, 중식, 일식 등등 별로 나뉘게 되고 나뉜 각 컬럼을 Korean, Japanese 같이 하나의 그룹으로 묶어 주며 각 각 나뉜 곳들에서 음식의 총합 가격을 구하게 된다.

한식을 하는 가게들의 음식 총합 가격.

일식을 하는 가게들의 음식 총합 가격. 이런 느낌인 것 같다.

한식 일식 멕시칸 등에 따른 가격 총합

 

 

 

ORDER BY

오름차순 또는 내림차순으로 어떠한 컬럼을 정렬해 보여달라는 함수이다.

FROM절 뒤에 오며 GROUP BY 절이 존재한다면 그 뒤에 써야한다.

 

기본적으로는 오름차순 정렬이며 두개 이상의 컬럼을 정렬해 달라할 수 있다.

그럴 경우에는 먼저 앞에 쓴 컬럼을 정렬하고 그 다음 쓴 컬럼을 정렬하여 보여준다.

내림차순 정렬을 원할시 ORDER BY 컬럼명 DESC라고 쓰면 된다.

SELECT 
	*
FROM customers
ORDER BY gender, name

이럴 경우엔 GENDER 컬럼의 첫 글자를 오름차순으로 정렬한 뒤 NAME 컬럼의 첫 글자를 오름차순으로 정렬하여 모든 컬럼 데이터를 조회하게 된다.

 

 

정보 수정

  • REPLACE

어떤 컬럼 데이터의 글자를 지정하여 원하는 글자로 변경하는 함수

REPLACE(컬럼명, '지정할 글자', '바꿀글자')

select restaurant_name "원래 상점명",
       replace(restaurant_name, 'Blue', 'Pink') "바뀐 상점명"
from food_orders
where restaurant_name like '%Blue Ribbon%'

푸드 오더스 테이블의 RESTAURANT_NAME 컬럼을 "원래 상점명"이라는 별명으로

RESTAURANT_NAME 컬럼 데이터의 'BLUE'라는 글자는 'PINK'로 치환하여 "바뀐 상점명"이라는 별명으로 보여달라.

조건은 RESTAURANT_NAME 컬럼 데이터에 BLUE RIBBON이라는 글자가 포함된 것이다.

BLUE RIBBON이 포함된 RESTAURANT_NAME 컬럼 데이터들이 글자 BLUE가 PINK로 변환되어 '바뀐 상점명'이라는 별명 컬럼에 보여준다.

 

 

  • SUBSTRING

어떤 컬럼의 글자를 추출하여 보여주는 함수인데 SUBSTR이라 써도 된다.

SUBSTRING(추출할 컬럼, 시작부분, 시작한 부분부터 추출할 글자 수)

만약 끝부분을 정할 수 없다면 끝부분은 생략하면 된다.

select addr "원래 주소",
       substr(addr, 1, 2) "시도"
from food_orders
where addr like '%서울특별시%'

푸드 오더스 테이블의 ADDR 컬럼을 '원래 주소'라는 별명으로

ADDR컬럼의 첫번째 글자부터 두번째 글자까지 추출하는데 '시도'라는 별명으로 보여달라.

조건은 ADDR 컬럼의 서울특별시라는 글자가 포함된 데이터이다.

ADDR 컬럼의 '서울특별시'라는 글자가 포함된 데이터들이 첫번째 글자부터 두번째 글자인 서울이 추출되어 '시도'라는 별명 컬럼에 나온다

  • CONCAT

어떤 컬럼 안의 데이터들을 이어 붙이고 싶을 때 사용하는 함수

CONCAT('붙이고 싶은 문자열', '붙이고 싶은 컬럼')

select restaurant_name "원래 이름",   
       addr "원래 주소",
       concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
from food_orders
where addr like '%서울%'

푸드 오더스 테이블의 RESTAURANT_NAME 컬럼의 데이터를 '원래 이름'이라는 별명을 붙여 보여주고

ADDR은 '원래 주소'라는 별명을 붙여 보여주고

'[' 라는 문자 그 뒤에

ADDR의 첫번째 글자부터 두번째 글자까지 붙인 뒤,

']' 라는 문자를 뒤에 붙인다.

마지막으로 RESTAURANT_NAME 컬럼 데이터를 뒤에 붙이고 '바뀐 이름'이라는 별명으로 데이터를 보여줘이다.

조건은 ADDR 컬럼 데이터에 '서울'이라는 글자 포함이다.

바뀐 이름이란 별명이 붙은 컬럼의 데이터를 보면 CONCAT('[', SUBSTR(ADDR, 1, 2), ']', RESTAURANT_NAME)가 잘 적용되어 '[서울]' RESTAURANT_NAME 컬럼 데이터가 나왔다.

'SQL,Database' 카테고리의 다른 글

mysql에서 사용할 수 없는 값이 있을 때 / Pivot Table처럼 만들기  (0) 2024.11.28
Database,FIrestore  (0) 2024.11.27
subquery, JOIN  (0) 2024.11.26
IF, CASE  (1) 2024.11.25
별명 붙이기, WHERE, 논리연산자  (2) 2024.11.21