데이터분석

12. SQL문

장수우 2023. 12. 5. 17:17
학습주제
  • JOINS
  • UNION
  • WITH
  • Subquery
  • 타임스탬프 함수
  • 타입변환
  • 조건문
  • 그 외 유용한 함수
주요 메모 사항 소개
  • JOIN : 두 개 이상의 테이블을 특정 Key를 기준으로 결합하는 것
  • INNER JOIN : 두개의 테이블에서 일치하는 행만 가져온다. (교집합)
  • LEFT JOIN : 왼쪽 테이블의 모든 행 가져오고 오른쪽에서 일치하는  행만 가지고 온다.
    - 불일치 값은 null로 채워짐
  • RIGHT JOIN : 오른쪽 테이블의 모든 행 가져오고 왼쪽에서 일치하는 행만 가지고 온다.
  • FULL OUTER JOIN : 모든 행 조합(필터링 없음)
    - 모든 행을 더하기 때문에 DB에 과부하가 심하게 걸릴 수 있다. 꼭 필요할때만 사용
  • Alias : 별칭과 같다
  • UNION : SELECT 한 결과문 위 아래로 붙히는 것
    - 중복행 제거
    - 컬럼 개수, 데이터 타입이 일치해야 한다.
  • UNION ALL : UNION 과 같지만 중복행 제거하지않음
  • WITH  (적극 사용 추천)
    - CTE라고 부르며, MySQL 8.0 버전 이상에서만 지원한다.
    - 임시결과 집합을 생성하여 복잡한 쿼리를 쉽게 작성할 수 있도록 돕는다.
    - 복잡한 쿼리에서 하위 쿼리를 사용해 같은 결과를 여러 번 계산해야하는 경우를 줄여준다.
    - 쿼리 가독성을 높여 유지보수를 용이하게 한다.
    - DB Optimizer는 CTE를 단순한 뷰나 서브쿼리보다 더 효율적으로 처리한다.

블록단위로 작성이 가능합니다. ( )로 닫고 ' , ' 이용시 연속적으로 WITH문 사용 가능합니다.

  • Subquery : 다른 내부에 포함되어있는 쿼리
SELECT c.*(
	SELECT name
	FROM managers
   	WHERE managing in ('스포츠', '주방용품')) a
  	INNER JOIN clicks c on a.name = c.user_name
    
    - 이런식으로 이중 SELECT 문을 생각하시면 편합니다.

  • 데이터 타입
    • STRING : 'yyyy-mm-dd', 'yyyy-mm-dd HH:MM:SS'
    • DATE : yyyy-mm-dd (시간입력이 없기에 저장효율은 제일 좋다)
    • DATETIME : YYYY-MM-DD HH:MM:SS (시간의 간격계산에 용이하다)
    • TIMESTAMP : YYYY-MM-DD HH:MM:SS UTC
    • 용량이 클수록 시간단위를 어디까지 지정할지 잘 선택해야 한다.
  • 시간관련 함수
    • NOW() : UTC 기준으로 현재 시간을 가져오는 함수
      - CURRENT_TIMESTAMP()
      - CURTIME() : 현재 시간 반환
      - CURRENT_DATE() = CURDATE() : yyyy-mm-dd 형식으로 반환
    • SYSDATE() : 함수가 호출된 시간을 반환
    • YEAR()  / MONTH() / DAY() / HOUR() / MINUTE() / SECOND() / WEEKDAY() / MONTHNAME() / DAYNAME() ..
  • 날짜 형식화
    • STR_TO_DATE : 문자열 타입을 날짜 타입으로 변경
    • DATE_FORMAT : 지정된 형식으로 날짜를 출력
    • %Y : 연도(2023) /  %y : 연도(23) / %m : 월(12) / %d : 일(20) / %H : 시(05), 24h 형태/ %T : hh:mm:ss / %s : 초
  • 타입변환
    • 데이터 타입 불일치로 인한 연산 / 비교 오류를 피하기 위함
    • 다양한 데이터 소스 산의 호환성을 유지하기 위함
      - CAST()
      - CONVERT
  • 조건문
    • IF(조건, '참일 때 값' , '거짓 일때 값')
    • IFNULL(값, 'null 값일때 바꿀 값')
    • CASE WHEN
      - 조건에 따라 case를 처리하기 위함
SELECT price
	CASE WHEN price > 10000 THEN '고가' -- 10000원 초과 물품은 '고가'
    WHEN (price <= 10000 AND price > 4000) THEN '중가' -- 이후 WHEN으로 조건 추가 가능
    ELSE '저가' -- 나머지 값
    END AS price_class
FROM products_B

 


  • WINDOW 함수
    • RANK() : 동점시 랭크 숫자 건너뛰고 출력한다.
    • DENSE_RANK() : 동점인 랭크가 있을 시 랭크 숫자를 건너뛰지 않고 빽빽하게 채워 출력한다..
    • PERCENT_RANK() : 몇 퍼센트의 다른 값들이 지금 보고있는 값보다 작은지 알려준다.
    • LEAD() : 파티션 내에서 다음으로 오는 값을 찾는다.
      - 값결
    • LAG() : 파티션 내에서 이전에 온 값을 찾는다.
    • 밑에는 참조 문서입니다. 더욱 다양한 코드가 필요하시면 들어가서 찾으시면 됩니다.
    • https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html
 

MySQL :: MySQL 8.0 Reference Manual :: 12.20.1 Window Function Descriptions

12.20.1 Window Function Descriptions This section describes nonaggregate window functions that, for each row from a query, perform a calculation using rows related to that row. Most aggregate functions also can be used as window functions; see Section 12

dev.mysql.com

공부하면서 어려웠던 내용
  • window 함수와 조건문을 섞어서 SQL문을 작성하려니 생각보다 어려웠다. 계속해보면서 손에 익혀야겠다.
반응형

'데이터분석' 카테고리의 다른 글

14. 효율적인 SQL 코드 작성법  (1) 2023.12.07
13. 데이터 타입  (1) 2023.12.06
11. SQL 과 RDB  (1) 2023.12.04
10. 결측치란?  (0) 2023.12.01
9. 캐글 시작  (1) 2023.11.30