[SQL]원하는 데이터 만들기

Shy·2024년 1월 4일

MySQL

목록 보기
5/7

데이터 줄 세우기

"10번 이상 구매한 VIP고객 리스트 뽑아주세요."
"매출 5천만원 이상의 상품 리스트 뽑아주세요."

위와 같이 데이터를 가져올 때, 다음과 같이 순서를 정해 원하는 데이터를 가져오는 방법을 알아본다.

"10번 이상 구매한 VIP고객, 구매 금액 순으로 리스트 뽑아주세요."
"매출 5천만원 이상의 상품, 판매량 순으로 리스트 뽑아주세요."

ORDER BY: 가져온 데이터를 정렬해주는 키워드

ORDER BY

  • ORDER BY [컬럼 이름] 형식으로 사용한다.
  • 입력한 [컬럼 이름]의 값을 기준으로 모든 row를 정렬한다.
  • 기본 정렬 규칙은 오름차순이다.
    • ORDER BY [컬럼 이름] = ORDER BY [컬럼 이름] ASC
  • 내림차순 정렬을 원할 경우에는 마지막에 DESC 키워드를 추가한다.
    • ORDER BY [컬럼 이름] DESC
  • 여러 컬럼으로 정렬도 가능하며, 키워드 뒤에 [컬럼 이름]을 복수 개 입력하면 된다.
    • 위치한 순서 대로 정렬이 됩니다.
    • (예시) ORDER BY [컬럼 1], [컬럼 2]
      • [컬럼1]기준으로 정렬->[컬럼1]값이 동일한 로우 간에[컬럼2]기준으로 정렬
  • 컬럼 번호로도 정렬이 가능하다.
    • 이 때, 컬럼 번호는 SELECT 절의 컬럼 이름의 순서를 의미한다.

ORDER BY 문법

  1. 오름차순 정렬
SELECT [컬럼 이름] 
FROM [테이블 이름] 
WHERE 조건식
ORDER BY [컬럼 이름] ASC; //ASC는 생략 가능
  1. 내림차순 정렬
SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE 조건식
ORDER BY [컬럼 이름] DESC;

데이터 순위 만들기

아래와 같이 순서를 정해 원하는 데이터를 가져와보자.

"10번 이상 구매한 VIP고객 중 7번째 고객 뽑아주세요"
"매출 5천만원 이상의 상품 중 판매량 하위 10번째 상품 뽑아주세요"

RANK

데이터를 정렬해 순위를 만들어주는 함수

RANK 특징

  • RANK() OVER (ORDER BY [컬럼 이름]) 형식으로 사용한다.
  • 항상 ORDER BY와 함께 사용한다.
  • SELECT절에 사용하며, 정렬된 순서에 순위를 붙인 새로운 컬럼을 보여준다.
    • 테이블의 실제 데이터에는 영향을 미치지 않는다.

RANK 문법

// 오름차 순위 만들기
SELECT [컬럼 이름], ..., RANK() OVER (ORDER BY [컬럼 이름]) 
FROM [테이블 이름]
WHERE 조건식;

// 내림차 순위 만들기
SELECT [컬럼 이름], ..., RANK() OVER (ORDER BY [컬럼 이름] DESC)
FROM [테이블 이름] 
WHERE 조건식;

DENSE_RANK 사용 예제

ROW_NUMBER 사용 예제

데이터 순위를 만드는 함수 비교

SELECT name, attack,
	RANK() OVER (ORDER BY attack DESC) AS rank_rank,
	DENSE_RANK() OVER (ORDER BY attack DESC) AS rank_dense_rank, 
    ROW_NUMBER() OVER (ORDER BY attack DESC) AS rank_row_number
FROM mypokemon;

문자형 데이터 정복하기

MySQL 내의 다양한 타입의 데이터는 '함수'를 사용하여 변형할 수 있다.

함수의 예시로는 LENGTH가 있다.

함수 특징

  • 함수 이름(함수를 적용할 값 또는 컬럼 이름) 형식으로 사용한다.
  • 결과 값을 새로운 컬럼으로 반환한다.

자주 사용하는 문자형 데이터 함수

함수활용 예시설명
LOCATELOCATE("A", "ABC")"ABC"에서 "A"는 몇 번째에 위치해 있는지 검색해 위치 반환
SUBSTRINGSUBSTRING("ABC", 2)"ABC"에서 2번째 문자부터 반환
RIGHTRIGHT("ABC", 1)"ABC"에서 오른쪽에서 1번째 문자까지 반환
LEFTLEFT("ABC", 1)"ABC"에서 왼쪽에서 1번째 문자까지 반환
UPPERUPPER("abc")"abc"를 대문자로 바꿔 반환
LOWERLOWER("ABC")"ABC"를 소문자로 바꿔 반환
LENGTHLENGTH("ABC")"ABC"의 글자 수를 반환
CONCATCONCAT("ABC", "DEF")"ABC"문자열과 "CDF"문자열을 합쳐 반환
REPLACEREPLACE("ABC", "A", "Z")"ABC"의 "A"를 "Z"로 바꿔 반환

LOCATE 함수

함수활용 예시설명
LOCATELOCATE("A", "ABC")"ABC"에서 "A"는 몇 번째에 위치해 있는지 검색해 위치 반환
  • 문자가 여러 개라면 가장 먼저 찾은 문자의 위치를 가져온다.
  • 만약 찾는 문자가 없다면 0을 가져온다.

  • lyric은 column의 이름이다.

SUBSTRING 함수

함수활용 예시설명
SUBSTRINGSUBSTRING("ABC", 2)"ABC"에서 2번째 문자부터 반환
  • 만약 입력한 숫자가 문자열의 길이보다 크다면 아무것도 가져오지 않는다.

RIGHT, LEFT 함수

함수활용 예시설명
RIGHTRIGHT("ABC", 1)"ABC"에서 오른쪽에서 1번째 문자까지 반환
LEFTLEFT("ABC", 1)"ABC"에서 왼쪽에서 1번째 문자까지 반환

UPPER, LOWER 함수

함수활용 예시설명
UPPERUPPER("abc")"abc"를 대문자로 바꿔 반환
LOWERLOWER("ABC")"ABC"를 소문자로 바꿔 반환

LENGTH 함수

함수활용 예시설명
LENGTHLENGTH("ABC")"ABC"의 글자 수를 반환

CONCAT 함수

함수활용 예시설명
CONCATCONCAT("ABC", "DEF")"ABC"문자열과 "CDF"문자열을 합쳐 반환

REPLACE 함수

함수활용 예시설명
REPLACEREPLACE("ABC", "A", "Z")"ABC"의 "A"를 "Z"로 바꿔 반환

숫자형 데이터 정복하기

함수활용설명
ABSABS(숫자)숫자의 절댓값 반환
CEILINGCEILING(숫자)숫자를 정수로 올림해서 반환
FLOORFLOOR(숫자)숫자를 정수로 내림해서 반환
ROUNDROUND(숫자, 자릿수)숫자를 소수점 자랏수까지 반올림해서 반환
TRUNCATETRUNCATE(숫자, 자릿수)숫자를 소수점 자릿수까지 버림해서 반환
POWERPOWER(숫자A, 숫자B)숫자A의 숫자B 제곱 반환
MODMOD(숫자A, 숫자B)숫자A를 숫자B로 나눈 나머지 반환

ABS 함수

함수활용설명
ABSABS(숫자)숫자의 절댓값 반환

CEILING, FLOOR 함수

함수활용설명
CEILINGCEILING(숫자)숫자를 정수로 올림해서 반환
FLOORFLOOR(숫자)숫자를 정수로 내림해서 반환

함수활용설명
ROUNDROUND(숫자, 자릿수)숫자를 소수점 자랏수까지 반올림해서 반환
TRUNCATETRUNCATE(숫자, 자릿수)숫자를 소수점 자릿수까지 버림해서 반환

POWER 함수

함수활용설명
POWERPOWER(숫자A, 숫자B)숫자A의 숫자B 제곱 반환

함수활용설명
MODMOD(숫자A, 숫자B)숫자A를 숫자B로 나눈 나머지 반환

날짜형 데이터 정복하기

함수활용설명
NOWNOW()현재 날짜와 시간 반환
CURRENT_DATECURRENT_DATE()현재 날짜 반환
CURRENT_DATECURRENT_DATE()현재 시간 반환
YEARYEAR(날짜)날짜의 연도 반환
MONTHMONTH(날짜)날짜의 원 반환
MONTHNAMEMONTHNAME(날짜)날짜의 월을 영어로 반환
DAYNAMEDAYNAME(날짜)날짜의 요일을 영어로 반환
DAYOFMONTHDAYOFMONTH(날짜)날짜의 일 반환
DATOFWEEKDAYOFWEEK(날짜)날짜의 요일을 숫자로 반환
WEEKWEEK(날짜)날짜가 해당 연도에 몇 번째 주인지 반환
HOURHOUR(시간)시간의 시 반환
MINUTEMINUTE(시간)시간의 분 반환
SECONDSECOND(시간)시간의 초 반환
DATE_FORMATDATEFORMATE(날짜/시간, 형식)날짜/시간의 형식을 형식으로 바꿔 반환
DATEDIFFDATEDIFF(날짜1, 날짜2)날짜1과 날짜2의 차이 반환 (날짜1 - 날짜2)
TIMEDIFFTIMEDIFF(시간1, 시간2)시간1과 시간2의 차이 반환 (시간1 - 시간2)

NOW, CURRENT_DATE, CURRENT_TIME 함수

함수활용설명
NOWNOW()현재 날짜와 시간 반환
CURRENT_DATECURRENT_DATE()현재 날짜 반환
CURRENT_DATECURRENT_DATE()현재 시간 반환

YEAR, MONTH, MONTHNAME 함수

함수활용설명
YEARYEAR(날짜)날짜의 연도 반환
MONTHMONTH(날짜)날짜의 원 반환
MONTHNAMEMONTHNAME(날짜)날짜의 월을 영어로 반환

DAYNAME, DAYOFMONTH, DAYOFWEEK, WEEK 함수

함수활용설명
DAYNAMEDAYNAME(날짜)날짜의 요일을 영어로 반환
DAYOFMONTHDAYOFMONTH(날짜)날짜의 일 반환
DATOFWEEKDAYOFWEEK(날짜)날짜의 요일을 숫자로 반환
WEEKWEEK(날짜)날짜가 해당 연도에 몇 번째 주인지 반환

HOUR, MINUTE, SECOND 함수

함수활용설명
HOURHOUR(시간)시간의 시 반환
MINUTEMINUTE(시간)시간의 분 반환
SECONDSECOND(시간)시간의 초 반환

DATE_FORMAT 함수

함수활용설명
DATE_FORMATDATEFORMATE(날짜/시간, 형식)날짜/시간의 형식을 형식으로 바꿔 반환

표현설명
%a요일을 영문 약어로 표현(Sun, Sat)
%b월을 영어 약어로 표현(Jan, Dec)
%c월을 숫자로 표현(0.. 12)
%D일을 숫자와 영문으로 표현 (0th, 1sr, 2nd, 3rd)
%d일을 항상 숫자 두 글자로 표현(00, 31)
%e일을 표현 (0.. 31)
%f마이크로 초를 표현 (000000..999999)
%H시를 24시간으로 표현 (00.. 23)
%h시를 12시간으로 항상 숫자 두 글자로 표현 (01..12)
%I시를 12시간으로 표현 (1..12)
%i분을 표현(00..59)
%j1년 중 몇 번 째 날인지 표현 (001..366)
%k시를 24시간으로 표현 (0..23)
%l시를 12시간으로 표현 (1..12)
%M월을 영문으로 표현 (January, December)
%m월을 표현 (00.. 12)
%pAM 또는 PM을 표현
%r시간을 AM 또는 PM과 함께 표현 (hh:mm:ss AM or PM)
%S초를 표현 (00..59)
%s초를 표현 (00..59)
%T시간을 24시간으로 표현(hh:mm:ss)
%U1년 중 몇 번째 주인지를 표현(한 주가 일요일 부터 시작. 00..53)
%u1년 중 몇 번째 주인지를 표현(한 주가 일요일 부터 시작. 00..53)
%V1년 중 몇 번째 주인지를 표현(한 주가 일요일 부터 시작. 00..53)
%v1년 중 몇 번째 주인지를 표현(한 주가 일요일 부터 시작. 00..53)
%W요일을 영문으로 표현 (Sunday..Saturday)
%w요일을 숫자로 표현 (0=Sunday.. 6=Saturday)
%X주가 속한 연도를 네 글자로 표현 (한 주가 일요일부터 시작)
%x주가 속한 연도를 네 글자로 표현 (한 주가 월요일부터 시작)
%Y연도를 네 글자로 표현 (0000...9999)
%y연도를 두 글자로 표현 (00, 99)
%%글자 '%'

DATEDIFF, TIMEDIFF 함수

함수활용설명
DATEDIFFDATEDIFF(날짜1, 날짜2)날짜1과 날짜2의 차이 반환 (날짜1 - 날짜2)
TIMEDIFFTIMEDIFF(시간1, 시간2)시간1과 시간2의 차이 반환 (시간1 - 시간2)

profile
신입사원...

0개의 댓글