MS SQL

[MS SQL]2.수치와 문자열,DATETIME,CASE,집계 함수

myjeongjun 2025. 1. 31. 20:13

MS SQL에서 사칙연산 + 모듈러 연산 모두 다른 프로그래밍 언어와 동일하게 사용이 가능하다.

 

가령 데이터에서 한국나이 계산을 위해 아래와 같이 작성하고 출력하는게 가능하다.

SELECT 2024 - birthYear AS koreanAge
FROM players
WHERE deathYear IS NULL AND birthYear IS NOT NULL AND (2024 - birthYear)  <= 80 
ORDER BY koreanAge

WHERE 조건중에 (2024 - birthYear) 대신에 koreanAge로 As처리했으니 저부분도 똑같이 할 수 있을거 같지만 이전 글에서 작성했듯이 작성순서는 영어 문장 어순을 따르지만 실행 순서는 논리적 절차를 따르므로

FROM -> WHERE -> SELECT -> ORDER BY로 진행될때 WHERE에서 정의 되지않은 koreanAge를 사용할수 없다.

 

 이외에도 문자열같은경우에도 + 연산이 가능하고 C++을 해봤으면 알법한 substring같은 문자열 부분추출 같은거도 가능하다.

SELECT 3.0 / 2
--명시적으로 실수로 표기

SELECT 'Hello' + 'World'

SELECT SUBSTRING('20240131',1,4)

 

DATETIME

BaseballData에서 데뷔 날짜와 마지막 경기 날짜를 보면 데이터 형식이 문자열로 되어있는걸 볼 수있다.

단순 문자열일 경우 날짜 비교까지는 가능할지 몰라도 "두 시간의 차이" 또는 "oo분 이후의 시간"같은걸 얻기위해선 덧셈연산을 해야하는데 문자열이어서 곤란한 부분이있다.

 

그래서 dataType중에 datetime형식이란걸 지원한다.

이렇게 문자열을 캐스팅해서 DATETIME형식으로 바꿔준다.

SELECT CAST('20240131' AS DATETIME)

지금 문자열을 연도-월-일로 썻는데 한가지 의문점으로 "다른 국가에서는 일 - 월 - 년도로 표기해서 문자열을 일-월-년으로 주는 경우에는 알아서 인식을하나?" 라는점이다. MS sql은 그것을 고려해 그냥 

  YYYYMMDD
  YYYYMMDD hh:mm:ss.nnn

와 같이 2가지 형식으로 작성한 경우에만 DATETIME으로 인식하게 했놓았다.

 

현재 시간을 추출하는 함수 2가지로

  SELECT GETDATE()
  SELECT CURRENT_TIMESTAMP

가 있는데 GETDATE는 TSQL에서만 사용되는 함수이고 CURRENT_TIMESTAMP는 표준 SQL에서도 통용되는 함수이다.

그렇지만 두 함수는 머신시간에 의존하기 때문에 여러 국가에서 서비스하는 게임에 적용하기에는 부적합하다.(시간대가 다르므로)

그래서 표준 시간을 사용하는데 GMT기준 시간을 알려주는 GETUTCDATE()함수를 사용하는게 좋다.

SELECT GETUTCDATE();

 

이제 특정 시간을 더한 시간을 얻는 방법은 DATEADD라는 함수가 있다.

SELECT DATEADD(YEAR,1,'20200426')

SELECT DATEADD(DAY,1,'20200426')

SELECT DATEADD(SECOND,1,'20200426')

 

두 시간사이의 차이를 구하기위해서 DATEDIFF라는 함수도 지원한다.

SELECT DATEDIFF(SECOND, '20200426','20200503')

 

CASE

switch 혹은 if - else 구문같이 활용 할 수있는 CASE문법이 SQL에 존재한다.

아래의 코드는 birthMonth를 이용해서 birthSeason이라는 속성의 값을 결정하기 위한 코드이다.

SELECT *,
	CASE birthMonth
		WHEN 1 THEN N'겨울'
		WHEN 2 THEN N'겨울'
		WHEN 3 THEN N'봄'
		WHEN 4 THEN N'봄'
		WHEN 5 THEN N'봄'
		WHEN 6 THEN N'여름'
		WHEN 7 THEN N'여름'
		WHEN 8 THEN N'여름'
		WHEN 9 THEN N'가을'
		WHEN 10 THEN N'가을'
		WHEN 11 THEN N'가을'
		WHEN 12 THEN N'겨울'
		ELSE N'몰라요'
	END AS birthSeson
FROM players

 

SELECT *,
	CASE 
		WHEN birthMonth <= 2  OR birthMonth = 12 THEN N'겨울'
		WHEN birthMonth <= 5  THEN N'봄'
		WHEN birthMonth <= 8  THEN N'여름'
		WHEN birthMonth <= 11  THEN N'가을'
		ELSE N'몰라요'
	END AS birthSeson
FROM players

 

집계 함수

1.COUNT :개수

2.SUM : value합

3.AVG : 평군

4.MIN : 최소

5.MAX : 최대

직관적이어서 사용법을 자세히 설명하지 않아도 될듯하다.

 

기본적으로 집계함수는 NULL값이 있으면 무시한다.

 

DISTINCT키워드를 붙이면중복을 제외하고 birthcity속성의 값을 가져온다.

SELECT DISTINCT birthCity
FROM players