본문 바로가기

CS/Database

[ SQL ] 실행순서, 문자열, DATETIME, CASE, DISTINCT, 집계함수

-- ASC 오름차순 디폴트
-- OFFSET을 이용하여 100~200 행
SELECT * 
FROM players
WHERE birthYear IS NOT NULL
ORDER BY birthYear ASC, birthMonth ASC, birthDay ASC
OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;

 

- 실행되는 순서

FROM 책상에서
WHERE 빨간색 펜들을
SELECT 가져오고
ORDER BY 크기 순서로 정렬해라

 

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

실행 순서로 인해 WHERE에서 (2021 - birthYear )부분을 koreanAge로 사용할 수 없음

but, ORDER BY에서는 가능!

 

 1. FROM                        책상에서
 2. WHERE                     공을
 3. GROUP BY               색상별로 분류해서
 4. HAVING                     분류한 다음 빨간색 공들만  
 5. SELECT                     갖고와서
 6. ORDER BY                크키 순으로 나열해라

문자열 관련

'' 은 1바이트로 읽고 N'' 으로 해줘야 2바이트로 읽음. 그렇기에 한글을 써넣으려면 N을 붙여줘야함!

SELECT '안녕';
SELECT N'안녕';

SELECT 'Hello' + 'World!';

SELECT SUBSTRING('20240312!', 1, 4); -- 1부터 시작

SELECT TRIM('         hi  !    '); -- LTRIM, RTRIM 다 있음

DATETIME 관련

DATE 연/월/일
TIME 시/분/초
DATETIME 연/월/일/시/분/초
USE [BaseballData];

INSERT INTO [dbo].[dateTimeTest]
           ([time])
     VALUES
           -- (CAST('20240312 03:02:1.123' AS datetime)) 
           ('20100312 03:02:1.123') -- 자동형변환됨
;

-- DATETIME 타입
-- YYYYMMDD
-- YYYYMMDD hh:mm:ss.nnn
-- YYYY-MM-DDThh:mm
SELECT CAST('20240312' AS datetime);
SELECT CAST('20240312 03:02:1.123' AS datetime);	

-- pc 시스템 기준 현재 시간
SELECT CURRENT_TIMESTAMP;

-- GMT 표준시 ( Greenwich mean time ) 
SELECT GETUTCDATE();

-- 자동형변환
SELECT * 
FROM dateTimeTest
WHERE time >= '20200101';
-- WHERE time >= CAST('20200101' AS datetime);



-- DATETIME 덧셈,뺄셈
SELECT DATEADD(YEAR, 1, '20240312');
SELECT DATEADD(MONTH, 3, '20240312');
SELECT DATEADD(DAY, 5, '20240312');
SELECT DATEADD(SECOND, 40, '20240312');
SELECT DATEADD(SECOND, -40, '20240312');

-- DATETIME 차이
SELECT DATEDIFF(SECOND, '20240101', CURRENT_TIMESTAMP);

-- DATETIME 특정 부분 추출
SELECT DATEPART(DAY, '20240312');
SELECT DAY('20240312');

CASE

WHEN에 해당되지않고 ELSE가 없으면 NULL

NULL 체크를 하려면 IS NULL 사용

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 BirthSeason
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 BirthSeason
FROM players;

DISTINCT

중복 없애기

SELECT DISTINCT birthCity
FROM players;

SELECT COUNT(DISTINCT birthCity)
FROM players;

 

 


집계함수 ( 5가지 )

집계함수는 집합이 NULL이면 무시한다

 

COUNT ( 유일하게 * 사용 가능 )

 

SELECT COUNT(*)
FROM players;

SELECT COUNT(birthYear)
FROM players;

SUM 합계

AVG 

-- 평균 weight
-- 단, weight가 NULL이면 weight=0으로 하여 계산하기
SELECT AVG(CASE WHEN weight IS NULL THEN 0 ELSE weight END)
FROM players;

MIN 최소값

MAX 최대값