240627

Gi Woon Lee·2024년 6월 27일
1

TIL

목록 보기
5/78
post-thumbnail

DISTINCT 는 ()를 사용하지 않는다!

distinct 다음에는 () 가 아니라 바로 칼럼이름이 온다.

DISTINCT(NAME) ❌
DISTINCT NAME ⭕

LIKE 함수는 ' = ' 을 사용하지 않는다!

  • LIKE 함수는 WHERE 절 조건이나, SELECT 문에 들어가는 CASE WHEN 조건에서 자주 사용된다.

- LIKE 함수 작성할 때 '=' 을 사용하지 않는다.

SELECT ANIMAL_ID,
       NAME,
       CASE WHEN SEX_UPON_INTAKE LIKE "%Spayed%" THEN "O"
            WHEN SEX_UPON_INTAKE LIKE "%Neutered%" THEN "O"
            ELSE "X" END 중성화
FROM ANIMAL_INS
#동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 
#중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
# Spayed: 중성화된(암컷)
# Neutered: 중성화된(수컷)
# Intact: 손대지 않은

SUBSTR()

substr(조회 할 칼럼, 시작 위치, 글자 수)


SELECT CATEGORY,
       COUNT(PRODUCT_CODE) PRODUCTS
FROM 
(SELECT SUBSTR(PRODUCT_CODE,1,2) CATEGORY,
       PRODUCT_CODE,
       PRICE
FROM PRODUCT) A
GROUP BY CATEGORY

🔥DATE DATA🔥

날짜 데이터에 대해

설명함수
날짜에 간격을 더하기DATE_ADD(date, INTERVAL value unit)
날짜에서 간격을 빼기DATE_SUB(date, INTERVAL value unit)
두 날짜 사이의 일 수 계산DATEDIFF(date1, date2)
두 날짜 시간 값 사이의 차이를 특정 단위로 계산TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
날짜 값을 지정된 형식으로 변환DATE_FORMAT(date, format)
날짜 또는 날짜 시간 값에서 연도, 월, 일 추출YEAR(date), MONTH(date), DAY(date)
날짜 시간 값에서 시, 분, 초 추출HOUR(datetime), MINUTE(datetime), SECOND(datetime)

💡1. DATE_ADD()

특정 날짜에 주어진 간격을 더합니다.

함수: DATE_ADD(date, INTERVAL value unit)
------
예시: SELECT DATE_ADD('2024-06-28', INTERVAL 10 DAY) AS new_date;
------
결과: 2024-07-08

💡2. DATE_SUB()

특정 날짜에서 주어진 간격을 뺍니다.

함수: DATE_SUB(date, INTERVAL value unit)
------
예시: SELECT DATE_SUB('2024-06-28', INTERVAL 10 DAY) AS new_date;
------
결과: 2024-06-18

💡3. DATEDIFF()

두 날짜 사이의 일(day) 수를 계산합니다.

함수: DATEDIFF(date1, date2)
------
예시: SELECT DATEDIFF('2024-06-28', '2024-06-18') AS days_diff;
------
결과: 10

💡4. TIMESTAMPDIFF()

TIMESTAMPDIFF

KODEKATA_35

두 날짜 또는 날짜 시간 값 사이의 차이를 특정 단위로 계산합니다.

함수: TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
------
예시: SELECT TIMESTAMPDIFF(MINUTE, '2024-06-28 12:00:00', '2024-06-28 14:30:00') AS minutes_diff;
------
결과: 150

💡6. DATE_FORMAT()

날짜 값을 지정된 형식으로 변환합니다.

함수: DATE_FORMAT(date, format)
------
예시: SELECT DATE_FORMAT('2024-06-28', '%Y-%m-%d') AS formatted_date;
------
결과: 2024-06-28

6-1. 날짜 형식 지정자

형식 지정자설명
%aAbbreviated weekday name.
%YYear, in 4-digits.
%MFull name of the month.
%mMonths (from 01-12).
%dDay of the month, numeric (00 .. 31).
%eDay of the month (from 1-31).
%HHour (from 00-23).
%k시간(hour) (0부터 23까지).
%l시간(hour) (1부터 12까지).
%iMinutes (from 00-59).
%sSeconds (from 00-59).

💡7. YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()

각각 날짜 또는 날짜 시간 값에서 연도, 월, 일, 시, 분, 초를 추출합니다.

예시:

예시: SELECT YEAR('2024-06-28'), MONTH('2024-06-28'), DAY('2024-06-28');
---
결과: 2024, 6, 28

💡8. DATE() 함수

My SQL

SELECT DATE("The date is 2017-06-15");
  • 결과 (시간 정보를 제외하고 날짜date만 조회)
DATE("2017-06-15 09:34:21")
2017-06-15

💡날짜 데이터 끼리 계산! TIMESTAMPDIFF()함수

TIMESTAMPDIFF

  • TIMESTAMPDIFF(단위,datetime_expr1,datetime_expr2)
  • 단위: month, year, minute 등등 차이를 알고싶은 시간의 단위
  • datetime_expr1,2: DATE DATA 혹은 대상 칼럼

KODEKATA_35

EX)

mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
        -> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
        -> -1
mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
        -> 128885

테이블 칼럼 정보 "NULLABLE"

  • nullable = FALSE: NULL 값 허용 안 함.
  • nullable = TRUE: NULL 값 허용.

    위 사진에서 TLNO의 Nullable 값이 "TRUE" 이므로 TLNO 칼럼에는 NULL값이 존재할 수 있다.

CODEKATA

22-조건에 맞는 회원수 구하기

USER_INFO 테이블에서 2021년에 가입한 회원 중 
#나이가 20세 이상 29세 이하인 회원이 몇 명인지 구하라.

SELECT COUNT(USER_ID)
FROM USER_INFO
WHERE DATE_FORMAT(CAST(JOINED AS DATE), '%Y') = 2021 AND 
      AGE >= 20 AND
      AGE <= 29
      

23-중성화 여부 파악하기

#동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 
#중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
# Spayed: 중성화된(암컷)
# Neutered: 중성화된(수컷)
# Intact: 손대지 않은


/*
SELECT ANIMAL_ID,
       NAME,
       CASE WHEN SEX_UPON_INTAKE = LIKE "Spayed" THEN "O"
            WHEN SEX_UPON_INTAKE = LIKE "Neutered" THEN "O"
            ELSE "X" END 중성화
FROM ANIMAL_INS
LIKE 함수는 그냥 바로 적어라. = LIKE 하면 안돼~ 
*/ 
SELECT ANIMAL_ID,
       NAME,
       CASE WHEN SEX_UPON_INTAKE LIKE "%Spayed%" THEN "O"
            WHEN SEX_UPON_INTAKE LIKE "%Neutered%" THEN "O"
            ELSE "X" END 중성화
FROM ANIMAL_INS

26-입양 시각 구하기

SELECT HOUR(DATETIME) HOUR,
       COUNT(ANIMAL_ID) COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR
ORDER BY HOUR

34-카테고리 별 도서 판매량 집계하기

조인, 그룹핑 참고하기 좋음

문제링크

SELECT B.CATEGORY,
       SUM(SALES) TOTAL_SALES
FROM BOOK_SALES S INNER JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
WHERE DATE_FORMAT(S.SALES_DATE, '%Y-%m') = '2022-01'
GROUP BY B.CATEGORY
ORDER BY CATEGORY

35-오랜 기간 보호한 동물(2)

KODEKATA_35

SELECT ANIMAL_ID,
       NAME
FROM
(
SELECT GO.ANIMAL_ID,
       GO.NAME,
       TIMESTAMPDIFF(DAY, COME.DATETIME, GO.DATETIME) DURATION # 2. TIMESTAMPDIFF()함수로 기간 차이 구하기
FROM ANIMAL_OUTS GO LEFT JOIN ANIMAL_INS COME 
ON GO.ANIMAL_ID = COME.ANIMAL_ID # 1. 조인
ORDER BY DURATION DESC
) A # 까먹지 마라
LIMIT 2

0개의 댓글