본문 바로가기

Language/SQL

SQL Cheat Sheet

##문자열을 합칠때 CONCAT사용!
CONCAT('/home/grep/src/', B.BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH
concat(CITY, ' ', STREET_ADDRESS1) #공백을 넣고 싶다면 이렇게!


##변수가 조건을 만족할때만
WHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD )


## "STATUS"의 원소들을 재 분류해 변수명을 "STATUS"로 출력
CASE
WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
WHEN STATUS = 'DONE' THEN '거래완료'
END AS STATUS


## 날짜/시간 표현 함수
DATE_FORMAT(변수명, "조건") # %Y/y - %M/m - %D/d
YEAR, MONTH, DAY, HOUR (변수명) #원하는 정보만 출력


## 날짜 차이
DATEDIFF(날짜1, 날짜2)+1 #총 기간


##where조건을 다른 테이블과 비교할 때
#equal LIMIT 1 값이 일치하는지 확인
WHERE M.MEMBER_ID = (
    SELECT MEMBER_ID
    FROM REST_REVIEW R
    GROUP BY MEMBER_ID
    ORDER BY COUNT(*) DESC LIMIT 1
)

#or 주어진 보기 안에 있는지 확인
where USER_ID in (
    SELECT WRITER_ID
    from USED_GOODS_BOARD
    group by WRITER_ID
    having count(*)>=3)


##join되는 테이블을 제한할 때
select H.FLAVOR
from FIRST_HALF H
join (select Flavor, sum(total_order) as total_order
     from july
     group by flavor) J #조건에 만족하는 july값과 join
on H.flavor = J.flavor


##출력되는 결과를 조정할 때
#unique
DISTINCT 변수명

#limit
LIMIT 원하는 개수

#자리수 조정
TRUNCATE(변수,-4) #뒤의 네자리수는 버림


##조건지정
#보기중에 있는지 확인
where(and) A.CAR_TYPE in/not in ('세단','suv')

#범위안에 있는지
between A and B

#일치 하는지
IS NULL/ IS NOT NULL
= / !=


##NULL다루기
IFNULL(변수명,"NULL이면 출력될 값")


##빈 가상의 테이블 만들기
WITH RECURSIVE blank AS ( #빈 가상의 테이블 만들기
    SELECT 0 AS HOUR #select 0 as hour-> 0이 데이터인 hour변수 생성
    UNION ALL #데이터 0~23으로 늘리기
    SELECT HOUR + 1 #hour(0이 시작)+1
      FROM blank 
     WHERE HOUR < 23 #hour이 22가 될때 까지
)


##두 테이블을 하나로 만들기 *JOIN은 두 테이블 결합, UNION은 두 테이블 통합 
#UNION: 중복 제거, UNION ALL: 중복 포함

SELECT DATE_FORMAT(A.SALES_DATE,'%Y-%m-%d') AS SALES_DATE, 
A.PRODUCT_ID, A.USER_ID, A.SALES_AMOUNT
FROM ONLINE_SALE A
WHERE SALES_DATE LIKE "2022-03%"

UNION ALL

SELECT DATE_FORMAT(B.SALES_DATE,'%Y-%m-%d') AS SALES_DATE, 
B.PRODUCT_ID, NULL AS USER_ID, B.SALES_AMOUNT
FROM OFFLINE_SALE B
WHERE SALES_DATE LIKE "2022-03%"


##평균
AVG(변수명)


##문자열의 길이 구하기
LENGTH('안녕') # = 6 Byte단위 
CHAR_LENGTH('안녕') # = 2 문자 개수


##평균 구할때 최대 최소를 빼고 싶다면..그냥 직접 구해라 평균!!
SELECT COMPANY,
       CASE
           WHEN COUNT(*) >= 3 THEN
               (SUM(SALARY) - MAX(SALARY) - MIN(SALARY)) / (COUNT(*) - 2)
           ELSE
               AVG(SALARY)
       END AS average_salary
FROM your_table
GROUP BY COMPANY;


##시간차이(원하는대로)
TIMESTAMPDIFF(MINUTE, START, END) 
'''
SECOND : 초 / MINUTE : 분 / HOUR : 시
DAY : 일 / WEEK : 주 / MONTH : 월 / QUARTER : 분기 / YEAR : 연
'''

##반올림, 올림, 내림 함수
ROUND(TIMESTAMPDIFF(MINUTE, A.DATETIME, B.DATETIME)/60) #반올림
CEIL(TIMESTAMPDIFF(MINUTE, A.DATETIME, B.DATETIME)/60) #올림
FLOOR(TIMESTAMPDIFF(MINUTE, A.DATETIME, B.DATETIME)/60) #내림

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

Case 문을 통해 조건에 맞는 경우 추출하기  (0) 2023.04.20
배운게 나오긴 하는구나!  (0) 2023.04.14
Round  (0) 2023.03.30
안 쓰면 까먹는다.  (0) 2023.03.29
MySQL 에서는 ISNULL 대신 IFNULL  (0) 2023.03.24