교재 : Do it SQL 입문 (이지스퍼블리싱, 강성욱)
5.1 문자열 함수
1) 문자열과 문자열 연결하기
- +
SELECT symbol + ' : ' + company_name FROM nasdaq_company
- CONCAT 함수
SELECT CONCAT('I', 'LOVE', 'SQL')
2) 문자열과 숫자 또는 날짜 연결하기
- CAST, CONVERT 함수로 문자열 자료형으로 변경 후 + 로 연결하기
- CAST 함수
CAST(expression AS datatype(length))
- CONVERT 함수
CONVERT (data_type [(length)], expression [, style])
- 함수 사용 시 문자열의 길이를 지정할 수 있으며, 지정한 값이 실제 변경할 문자열의 길이보다 짧으면 문자열이 잘린다.
- 숫자형을 문자열로 변환하되 문자열 크기를 작게 지정하면 산술 오버플로 오류가 발생한다.
3) NULL과 문자열 연결하기
- 문자열과 연결하려는 값이 NULL이면 결과는 NULL로 반환된다. 따라서 NULL을 문자형이나 숫자형으로 변경해줘야 한다.
- ISNULL
ISNULL (check_expression, replace_value)
- COALESCE : 첫 번째 인자로 전달한 값이 NULL이면 쉼표로 구분해 입력한 N개의 인자를 순차 대입한다.
COASLESCE(첫 번째 인자, 두 번째 인자,... N 번째 인자)
4) 문자열을 소문자나 대문자로 변경하기
- UPPER, LOWER
SELECT UPPER('do IT sql!')
5) 문자열 공백 제거하기
- LTRIM : 문자열의 왼쪽 공백 제거
- RTRIM : 문자열의 오른쪽 공백 제거
- TRIM : 문자열 양쪽의 공백, 마침표 제거
SELECT TRIM('.,! ' FROM ' # DO IT sql .' )
6) 문자열 길이 반환하기 : LEN
SELECT LEN('DO IT SQL')
7) 특정 문자열까지 문자열 길이 반환하기
- 예시 : 느낌표가 있는 문자까지의 길이 반환
- 지정한 문자가 탐색 대상 문자열에 없으면 0을 반환한다.
SELECT CHARINDEX('!', 'do it!! sql') -- 결과는 6
8) 지정한 길이만큼 문자열 반환하기
- LEFT : 문자열 왼쪽에서 시작해 정의한 위치까지 문자열을 반환한다.
- RIGHT : 문자열 오른쪽에서 시작해 정의한 위치까지 문자열을 반환한다.
- 문자열 위치 시작값은 1이다.
SELECT LEFT('DO IT SQL', 2), RIGHT('DO IT SQL', 2)
9) 지정한 범위까지의 문자열 반환하기
- 2번째 인자에는 시작 범위를, 3번째 위치에는 반환할 문자 개수가 들어간다.
SUBSTRING(expression, start, length)
10) 특정 문자를 다른 문자로 변경하기
- 2번째 인자에는 변경하려는 문자열을, 3번째 인자에는 변경 문자열이 들어간다.
REPLACE (string_expression, string_pattern, string_replacement)
11) 문자 반복하기
- REPLICATE : 반복할 문자와 반복 횟수를 인자로 한다.
REPLICATE (string_expression, integer_expression)
- SPACE : 공백 문자 반복하기
SPACE(10)
12) 문자열 역순으로 표시하기
REVERSE('DO IT SQL')
13) 지정한 범위의 문자열을 삭제하고 새 문자열 끼워넣기
SELECT STUFF ( 'Do it! XX SQL Server', 8, 2, N'마이크로소프트')
-- 결과 : Do it! 마이크로소프트 SQL Server
-- 8번째 자리부터 2개의 문자를 제거하고 그 자리에 문자열 삽입
14) 숫자를 문자열로 변환하기
- 2번째 인자로 전달하는 변환 길잇값이 변경할 문자열 길이보다 짧은 경우 오른쪽 맞춤으로 정렬한다.
- 3번째 인자로 전달하는 소수 부분 길이에 맞게 반올림해 표현한다.
SELECT STR(123.45, 6, 1)
5.2 날짜 함수
1) 서버의 현재 날짜, 시간 반환하기
- GETDATE() : 소수점 3자리까지 시간 표현
- SYSDATETIME() : 소수점 7자리까지 시간 표현
- 실행할 때마다 다른 값을 반환하는 비결정적 함수에 속한다.
2) 서버의 현재 UTC 날짜, 시간 반환하기
- GETUTCDATE() : 소수점 3자리까지 시간 표현
- SYSUTCDATETIME() : 소수점 7자리까지 시간 표현
3) 날짜 더하기
- 날짜 형식, 숫자, 더하거나 뺄 대상 날짜 순으로 인자로 한다.
DATEADD (datatype, year, date)
4) 날짜 차이 구하기
- 날짜 형식, 시작 날짜, 종료 날짜를 받는다.
DATEDIFF (datapart, startdate, enddate)
5) 지정된 날짜 일부 반환하기
- DATEPART : 숫자로 반환 (ex. 월요일이면 1 반환)
- DATENAME : 실젯값으로 반환
DATEPART (datepart, date)
DATENAME (datepart, date)
6) 날짜에서 일, 월, 연도 반환하기
- DAY(날짜), MONTH(날짜), YEAR(날짜)
7) 날짜 자료형 또는 형태 반환하기
- CONVERT
ex) yyyy-mm-dd hh:mm:ss.sss 형태를 yy/mm/dd 형태로 바꾸기
SELECT symbol, last_crawel_date,
CONVERT(nvarchar(10), year(last_crawel_date)) + '/' +
CONVERT(nvarchar(10), month(last_crawel_date)) + '/' +
CONVERT(nvarchar(10), day(last_crawel_date))
FROM nasadaq_company
-- 스타일 매개변수 사용
SELECT CONVERT(nvarchar(10), year(last_crawel_date), 111)
5.3 집계 함수
1) 조건에 맞는 데이터 개수 세기
- COUNT(열 이름) : INT 범위 반환
- COUNT_BIG(열 이름) : BIGINT 범위 반환 (약 21억 초과 시 사용)
- 특정 열만 지정해서 사용 시 NULL값은 제외한다.
- DISTINCT 문을 조합하면 고윳값의 데이터 개수를 얻을 수 있다.
2) 데이터 합 구하기
- SUM(열 이름)
- 모든 행의 값을 합하지만 DISTINCT 문을 조합해 중복값을 무시하고 고윳값에만 SUM함수를 적용할 수 있다.
SELECT SUM(close_price) FROM nasadaq_company
SELECT SUM(DISTINCT close_price) FROM nasadaq_company
- 함수의 반환값이 반환 자료형을 초과하면 오류가 발생한다.
3) 데이터 평균 구하기
- AVG(열 이름)
- NULL 값은 무시하고, DISTINCT 문을 사용하면 중복값을 제외하고 고윳값에만 AVG 함수를 적용할 수 있다.
4) 최댓값, 최솟값 구하기
- MAX(열 이름), MIN(열 이름)
- NULL 값을 무시하고, 데이터베이스 속성에 정의된 데이터 정렬 순서에 따라 다르게 출력된다.
5) 부분합, 총합 구하기
- GROUPBY문을 ROLLUP 함수와 CUBE 함수에 조합한다.
- ROLLUP : GROUP BY ROLLUP(...)에 입력한 열 기준으로 오른쪽에서 왼쪽으로 열을 이동하며 부분합과 총합을 구한다.
- CUBE : GROUP BY 문과 조합해 사용하며 모든 열 조합의 집계 그룹을 만든다.
6) 모든 값의 표준편차 구하기
- STDEV(열 이름) : 모든 값의 편차를 구한다.
- STDEVP(열 이름) : 모집단의 표준편차를 구한다.
5.4 수학 함수
1) 절댓값 구하기
- abs(값)
- 인수로 식을 입력할 수 있다.
2) 양수, 음수 여부 판단하기
- SIGN(값)
- 양수일 시 1, 음수일 시 -1, 0이면 0을 반환한다.
- 기본적으로 인자로 입력한 자료형을 반환하지만, smallint, tinyint와 같은 자료형은 근사치 자료형인 int와 같은 방식으로 반환한다.
3) 천장값, 바닥값 구하기
- CEILING(값) : 지정한 숫자보다 크거나 같은 최소 정수를 반환한다.
- FLOOR(값) : 지정한 숫자보다 작거나 같은 최대 정수를 반환한다.
4) 반올림 구하기
ROUND (numeric_expression, length [, function])
- numeric_expression : bit 자료형을 제외한 정확한 수치나 근사자료형 범위의 값을 사용한다.
- length : numeric_expression을 반올림해 표현한 자릿수
- tinyint, smallint, int 자료형을 허용한다.
- length에는 양수나 음수를 지원할 수 있다.
- 양수이면 소수부부터 반올림하고, 음수면 정수부부터 반올림한다.
- 음수를 전달할 경우, 정수부 길이보다 절댓값이 큰 값을 전달하면 0을 반환한다.
- 정수부의 길이와 절댓값이 같은 음수를 전달하면 산술 오버플로가 발생한다.
- [, function] : 수행할 연산의 종류
- tinyint, smallint, int형 값을 사용하며 생략 시 기본값 0을 적용한다.
- 기본값 0은 반올림 결괏값을 자르지 않으며 0 이외의 값을 입력하면 해당 값만큼 반오림 결괏값을 자른다.
5) 로그 구하기
LOG (float_expression [, base])
- float_expression : LOG 함수가 계산한 표현식으로, float 형으로 변환될 수 있는 표현식을 사용해야 한다.
- [, base] : 밑 기본값은 e이다.
6) e의 n제곱값 구하기 : EXP 함수
EXP (float_expression)
7) 제곱하기
- POWER : 거듭제곱을 구한다.
- float형 표현식과 거듭제곱할 값을 인자로 받는다.
- y는 bit형을 제외한 정확한 수치 또는 근사 자료형의 값이다.
- 입력 자료형과 반환 자료형이 다르다.
- SQUARE : 제곱값을 구한다.
POWER (float_expression, y)
SQUARE (float_expression)
8) 제곱근 구하기
SQRT (float_expression)
9) 난수 구하기
RAND ([seed])
- 0~1 범위의 메타적 의사 난수 float형 값을 반환한다.
- [seed] 인수
- 자료형은 smallint, tinyint, int형이다.
- 지정하지 않으면 데이터베이스 엔진이 임의적으로 초깃값을 설정한다.
- 난수 종류를 결정하는 값이다.
10) 삼각함수
COS (float_expression)
SIN (float_expression)
ATAN (float_expression)
5.5 순위 함수
- 결과에 순위를 부여하는 함수이다.
1) 유일값으로 순위 부여하기
- 모든 행에 유일값으로 순위를 부여한다.
ROW_NUMBER ( )
OVER ([PARTITION BY 열, ..., [n]] order by 열)
2) 같은 순위 개수 고려해 순위 부여하기
- RANK 함수는 같은 순위일 때 같은 값을 부여한다는 점에서 ROW_NUMBER 함수와 다르다.
RANK ( ) OVER ([partition_by_clause] order_by_clause)
3) 같은 순위 개수 무시하고 순위 부여하기
- ex) 1위가 3개이면 그 다음은 2위가 된다.
DENSE_RANK( ) OVER ([partition_by_clause] order_by_clause)
4) 그룹화해 순위 부여하기
- 인자로 지정한 값만큼 데이터 행을 그룹화해 그룹별 순위를 부여한다.
- 각 그룹은 1부터 순위가 매겨지며 순위는 각 행의 순위가 아닌 행이 속한 그룹의 순위이다.
NTILE (integer_expression) OVER ([partition_by_clause] order_by_clause)
5.6 분석 함수
1) 앞 또는 뒤의 행 참조하기
- LAG, LEAD
LAG[LEAD] (scalar_expression [, offset], [default]) OVER ([partiition_by_caluse] order_by_caluse)
- LAG 함수는 현재 행에서 바로 앞의 행에 접근한다.
- LEAD 함수는 현재 행에서 바로 뒤의 행에 접근한다.
- offset는 이전/이후 몇 번째 행의 데이터를 참조할지 결졍할 값이다. 기본값은 1이다.
2) 누적 분포 계산하기
- 그룹에서 지정한 값의 상대 위치를 계산한다.
CUME_DIST( ) OVER ([partition_by_clause] order_by_clause)
3) 상대 순위 계산하기
RERCENT_RANK( ) OVER ([partition_by_clause] order_by_clause)
4) 중앙값 계산하기
PERCENT_CONT [PERCENT_DISC] (numeric_literal)
WITHIN GROUP (ORDER BY order_by_expression [ASC | DESC])
OVER ([<partition_by_clause>])
5) 정렬된 첫 번째/마지막 행의 값 구하기
- FIRST_VALUE([열])
- LAST_VALUE([열])
'독학 > [책 + 인강] SQL' 카테고리의 다른 글
[얄코 MySQL] 섹션 2 SELECT 더 깊이 파보기 (0) | 2024.04.05 |
---|---|
[얄코 MySQL] 섹션 1 SELECT 기초 - 원하는 정보 가져오기 (2) | 2024.03.25 |
[SQL Server] Do it SQL 입문 4장 테이블을 서로 조합하는 조인 알아보기 (0) | 2024.02.04 |
[SQL Server] Do it SQL 입문 3장 SQL 시작하기 (2) | 2024.01.29 |
[SQL Server] Do it SQL 입문 1장~2장 (2) | 2024.01.14 |