TIL #9. SQL 날짜, 시간, 랜덤 추출

2024. 11. 28. 21:39·SQL

 

SQL 공부

[MySQL] 날짜 형식 변경 : DATE_FORMAT

SELECT DATE_FORMAT ('2024-11-28 09:45', '%Y년 %m월 %d일')  >>  2024년 11월 28일

SELECT 
    DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM table

참고)

 

[MySQL] DATE_FORMAT: 날짜/시간 표기 방식 지정하기

본 포스팅에서는 MySQL 내 date_format 구문을 활용하여 날짜 혹은 시간 표기 방식을 지정하는 방법을 알아봅니다. 목차 1. date_format 표기법 2. 날짜만 출력하기 2.1. 'yyyy-mm-dd' 형태로 출력하기 2.2. 'yy-mm

heytech.tistory.com

 

시간 더하기 : DATE_ADD

DATE_ADD(기준 날짜, INTERVAL 뺄 수치)

-- 현재 시간에 1초 더하기
SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND);

-- 현재 시간에 1분 빼기
SELECT DATE_ADD(NOW(), INTERVAL -1 MINUTE);

-- 1시간, 1일, 1달, 1년도 동일하게 HOUR, DAY, MONTH, YEAR 넣으면 됨

 

시간 빼기 : DATE_SUB

DATE_SUB(기준 날짜, INTERVAL 뺄 수치)

-- 현재 시간에 1시간 빼기
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);

-- 현재 시간에 1시간 더하기
SELECT DATE_SUB(NOW(), INTERVAL -1 HOUR);

 

시간 차이 구하기 : DATEDIFF, TIMESTAMPDIFF

DATEDIFF(날짜1, 날짜2);

SELECT DATEDIFF('2024-12-31','2024-01-01') +1
-- 결과 : 365
-- 1년이 총 몇일인지 구하려면 저렇게 1 더해야 함
-- 오늘-어제로 하면 날짜 차이는 하루나니까 1로 나오는데, 총 며칠인지 구하려면 +1하는 논리

 

TIMESTAMPDIFF(단위, 날짜1, 날짜2);

SELECT *, 
       TIMESTAMPDIFF(YEAR, hire_date, SYSDATE) AS 근무기간
FROM doctors;

*단위

SECOND : 초
MINUTE : 분
HOUR : 시
DAY : 일
WEEK : 주
MONTH : 월
QUARTER : 분기
YEAR : 연

참고)

 

[MySQL] 날짜 차이 가져오기 (DATEDIFF, TIMESTAMPDIFF 함수)

▶MySQL 날짜 차이 가져오기 (DATEDIFF, TIMESTAMPDIFF 함수) ▶설명 MySQL에서 두 날짜간의 차이를 가져올 때 사용하는 함수가 두 가지가 있습니다. 단순히 일 차이를 가져올 때 사용하는 것이 DATEDIFF 함수

extbrain.tistory.com

 

 

집계함수

함수
설명
COUNT
데이터의 행 수를 반환
COUNT(DISTINCT 컬럼)
고유한 값을 갖는 데이터의 행 수 반환

 

예제 코드

-- 데이터의 행 수 세기
SELECT COUNT(*) AS row_count
FROM employees;

-- NULL 포함여부에 따른  COUNT 차이
SELECT COUNT(*) AS total_rows, -- NULL 포함
       COUNT(salary) AS non_null_salaries -- NULL 제외
FROM employees;

-- 부서별 고유한 직원 수 계산
SELECT department, COUNT(DISTINCT employee_id) AS unique_employees
FROM employees
GROUP BY department;

-- 특정 열의 값 합산
SELECT SUM(salary) AS total_salary
FROM employees;

-- 열 값의 평균 구하기
SELECT AVG(salary) AS average_salary
FROM employees;

-- 열 값 중 최대값과 최소값 찾기
SELECT MAX(age) AS max_age,
       MIN(age) AS min_age
FROM employees;

-- 날짜 데이터를 활용한 MIN/MAX
SELECT MIN(hire_date) AS earliest_hire,
       MAX(hire_date) AS latest_hire
FROM employees;

-- 여러 집계함수 동시 사용
SELECT COUNT(*) AS row_count,
       AVG(salary) AS average_salary,
       MAX(age) AS max_age,
       MIN(age) AS min_age,
       SUM(salary) AS total_salary
FROM employees;

 

MySQL은 특이하게 HAVING에서 alias쓸 수 있음

원래 SELECT 전 단계 애들은 alias를 못 쓰는건데 특이하게 HAVING에서 사용 가능함

DBMS 종류 HAVING에서 별칭 사용
MySQL 가능
Oracle 불가능
PostgreSQL 가능
SQL Server 불가능

 

WHERE와 HAVING 차이점 요약

  • WHERE
    • 그룹화 이전에 데이터를 필터링
    • 개별 행을 기준으로 조건을 적용
  • HAVING
    • 그룹화 이후에 데이터를 필터링, 즉 그룹화된 결과를 기준으로 조건을 적용
  • 차이 요약
    • 데이터 → WHERE (개별 행 필터링) → GROUP BY (그룹화) → HAVING (그룹화된 결과 필터링)

 

RAND() 함수로 데이터 샘플링

RAND 함수는 0 이상 1 미만의 난수(예: 0.456)를 생성합니다. ORDER BY와 함께 사용하면 각 행마다 랜덤한 값을 생성한 후 이를 기준으로 정렬합니다. 이후 LIMIT으로 원하는 갯수만큼 샘플링하는 효과를 얻을 수 있습니다~!

단, 메모리 부하 올 수 있으니 10만 행 이하의 데이터셋에서 사용 권장!

-- 랜덤하게 5개의 행 샘플링
SELECT * 
FROM employees 
ORDER BY RAND() 
LIMIT 5;

-- 나이가 30 이상인 직원 중 랜덤하게 3명 추출
SELECT * 
FROM employees 
WHERE age >= 30 
ORDER BY RAND() 
LIMIT 3;

 

예시)

 

SQL 코드 작성 순서

select from join on where groupby having orderby limit


SQL 코드 실행 순서

from on join where groupby having select orderby limit

 

 

오답노트

문제. doctors 테이블에서 각 의사의 근무 기간을 계산하는 쿼리를 작성해주세요

id
name
major
hire_date
1
르탄이
피부과
2018-05-10
2
배캠이
성형외과
2019-06-15
3
구구이
안과
2020-07-20
-- 오답
SELECT *, 
(SYSDATE - hire_date) AS 근무기간
FROM doctors
-- 


-- 정답

ㅇㅇㅇ

 

데이터 분석 관련 아티클 읽기

오늘 아래 아티클을 읽고 팀원들과 의견을 나누었다

 

비개발자를 위한 엑셀로 이해하는 SQL: ④ GROUP BY와 HAVING | 요즘IT

지금까지 비개발자, 비데이터 직군인 일반 사무직으로써 자주 사용하는 엑셀을 통해 온라인 서비스의 데이터베이스 중 하나인 RDB와 이를 활용해 데이터를 조회/추출하기 위한 SQL의 문법 중 기

yozm.wishket.com

 

더보기
  • 요약 : 데이터를 유형 별로 묶어 특징을 살필 때 엑셀에서는 여러 단계의 처리를 통해서만 알 수 있었는데 SQL에서는 GROUP BY와 HAVING을 통해 쉽게 처리할 수 있다.

 

  • 주요 포인트
  1. GROUP BY
    • 1번째 : 어떤 기준으로 그룹핑할지
    • GROUP BY 1,2와 같이 열의 순서를 이용하는 건 비추. 쿼리가 길어지면 알아보기 어려움.
    • 2번쨰 : 그룹핑해서 보고 싶은 값이 뭔지(총계, 평균, 최솟값 등)
    • 그룹핑한 후에는 그룹대로 묶여서 개별 데이터를 나열할 수 없음
  2. HAVING
    • GROUP BY를 통해 그룹핑한 후 조건을 걸어야 할 때 필요한 구문
    • WHERE과 동일하게 논리 연산자(같다, 같지 않다), 비교(초과, 미만, 이상, 이하), 범위 또는 목록, 문자열 등을 조건으로 가질 수 있고 콤마를 통해 여러 조건을 달 수 있다.

 

  • 핵심 개념
    • WHERE는 그룹핑하기 전에 조건문 걸 때 쓰는 거고, HAVING은 그룹핑한 후에 조건문 걸 때 쓰는 구문
    • 쿼리를 작성하는 순서 SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
    • 쿼리가 실행되는 순서 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

 

  • 용어 정리
    • 집계 함수 : SUM, AVG, MAX, MIN 집계 함수는 GROUP BY와 함께 사용되는 것이 일반적. 데이터 전체를 대상으로 총합을 구하는 등 사용할 수도 있지만 그 때는 임의로 데이터 전체를 하나의 그룹으로 묶었다는 개념으로 적용되는 것
    • 집계 함수 : AVG, MAX, MIN, SUM 등
      • 일반적으로 집계 함수는 group by와 함께 사용되는 경우가 많습니다.
      • 더불어 집계 함수가 group by 와 사용되지 않고, 테이블 전체에 적용할 수도 있습니다.
      • 하지만 이 경우에는 테이블 전체를 묵시적으로 group by 대상으로 생각하고 집계 함수를 적용하므로 Select 절에는 집계 함수 외에는 다른 컬럼이 올 수가 없습니다.

 

  • 개인 인사이트

GROUP BY를 하면 WHERE을 못 쓰고 HAVING만 쓸 수 있다고 착각하고 있었는데, WHERE와 HAVING 둘 다 사용 가능한 것을 알게 되었다. 쿼리 실행 순서를 기억하면서 앞으로 코드 작성해야겠다. 개념 이해가 더 잘 되어서 앞으로 더 잘 활용할 수 있을 듯.

GROUP BY 공부하는 김에 문제 풀면서 계속 헷갈리던 집계 함수 부분도 찾아봄. 어떤 때는 GROUP BY 안 쓰면 에러나고 어떤 때는 에러가 안 났는데 그 이유가 테이블 전체를 그룹핑했다고 가정하고 코드가 작동한 거였다는 사실을 알게 됨. GROUP BY를 따로 안 쓰고 테이블 전체를 대상으로 집계를 할거면 SELECT절에 다른 일반 컬럼 없이 집계 함수만 써야 하고, 그런 경우가 아닐 경우에는 GROUP BY를 명시해야겠다.

 

'SQL' 카테고리의 다른 글
  • SQL 공부 | 피봇테이블 만들기, 윈도우함수, RAND
  • SQL 공부 | JOIN 함수
  • TIL #8. 개미는 뚠뚠🐜 오늘도 뚠뚠🐜 SQL 공부하네
  • TIL #7. SQL 기초 공부
초담
초담
4년차 마케터입니다
  • 초담
    그로스마케터의 기록
    초담
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (117)
      • Data Analytics Project (3)
      • SQL (55)
      • Python (43)
      • GA4 (0)
      • Tableau (8)
      • 아티클 스터디 (7)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
초담
TIL #9. SQL 날짜, 시간, 랜덤 추출
상단으로

티스토리툴바