2023.03.09 DB

DB MySQL 버전

26. 날짜 기능

26.1 현재 시간을 가져오는 함수

1. 현재 시간의 년, 월, 일
날짜()
현재 날짜()

2. 현재 시간 시 분 초
curtime()
현재 시간()

3. 현재 시간의 년, 월, 일, 시간
지금();
sysdate();
현재 타임스탬프()

Oracle에서는 ()가 필요하지 않지만 MySQL에서는 매개변수가 없더라도 함수를 포함해야 합니다.
SYSDATE, SYSTIMESTAMP, CURRENT_DATE, CURRENT_TIMESTAMP 선택

26.2 형식 변경

date_format(날짜,형식)
형식 정의에 따라 날짜 또는 시간을 반환합니다.
이것은 매우 일반적으로 사용되는 기능입니다.
형식에 사용되는 문자는 다음과 같습니다.

26.2.1년

%Y : 4자리 연도
%y : 2자리 연도

26.2.2월

%M: 월 이름(1월~12월)
%m : 월(01~12)
%c : 월(1~12)
%비
짧은 월 이름(jan..dez)

26.2.3일

%d : 일(01 31)
%e : 일( 1
31)
%W: 요일(월요일~일요일)
%a : 짧은 요일 이름(월~일)
%D: 영문 접미사(1st, 2nd, 3rd)가 붙은 태그

26.2.4 도시

%H : 12시간 형식의 시간(01..12)
%l : 12시간 형식(1~12)
%h : 24시간 형식의 시간(00~23)
%k : 24시간 형식의 시간(0 ~ 23)

26.2.4분

%i : 분(00-59)

26.2.5초

%s : 초(00..59)

26.2.6시 분 2라운드

%r : 시 분 초 (hh:mm:ss (ap)m)
%t : 시 분 초 24시간 형식(hh:mm:ss)

26.2.7 기타

%p : 오전 또는 오후 문자
%w: 요일 수(0=일요일..6=토요일)
%U: 연중 주(0..52). 일요일은 시작일입니다.
%u : 올해의 주 번호(0..52). 월요일은 시작일입니다.

26.3 날짜 추출 기능

년, 월, 일, 시, 분, 초, MICROSCOND
함수(표준 날짜)를 사용하면 연, 월, 일을 각각 추출할 수 있습니다.

등록 회원에서 성수기(2, 3, 11, 12) 이외의 기간에 가입한 회원을 찾습니다.
(2,3,11,12)에서 월(REGDATE)인 구성원에서 * 선택;

26.4 날짜 누적 기능

adddate(기준 연도 월 일, 간격 값 유형)
날짜()
date_add()
date_sub()
기준시점의 유형과 값으로 계산

가입한 지 6개월 미만인 회원
SELECT * FROM MEMBER WHERE ADDDATE(SYSDATE(), 간격 -6개월) < REGDATE;

26.5 날짜 차이 구하는 함수

DATEDIFF(날짜1, 날짜2); date1 – date2 날짜 차이(일)
TIMEDIFF(시간1, 시간2); 1시 – 2시 시차

TIMESTAMPDIFF(유형, 날짜1, 날짜2);
date1에서 date2까지의 유형 차이
유형은 다음과 같습니다.
년: 년 월: 월
분기: 분기 주: 주
DAY: 일 HOUR: 시
SECOND: 초 MINUTE: 분

가입한 지 6개월 미만인 회원
TIMESTAMPDIFF(월, REGDATE, SYSDATE()) < 6인 구성원에서 * 선택;

26.6 최종 날짜

SELECT LAST_DAY(‘2020-02-04’);
울티모

데이터가 너무 많아서 필요하면 하나씩 찾아볼 수밖에 없다.

27. 포맷 변환 기능

FORMAT(컬럼 및 데이터, 표시할 소수점 이하 자릿수)
숫자 데이터를 세 자리마다 쉼표(,)를 사용하여 “#, ###, ###.##” 형식으로 변환합니다.
반환되는 데이터의 형식은 숫자 유형이 아닌 문자열 유형입니다.

숫자 -> 날짜 문자열 등의 함수
CAST(숫자 AS형)
CONVERT(숫자, 유형)
보기 선택(날짜로 20211014); 2021-10-14
캐스트 선택(20211014 AS CHAR); ‘20211014’

필요할 때마다 찾아보자. 오라클과 너무 다릅니다!!!

28. DECODE 함수 대 if 함수

DECODE는 Oracle 기능입니다.
DECODE 조건에 따른 값 선택(기본값, 비교값, 초기값, 비교값, 초기값)
삼항 연산자처럼 느껴집니다.

mysql은 비슷한 if 함수를 가지고 있습니다.
IF(조건, ‘조건이 일치하면 VALUE’, ‘조건이 일치하지 않으면 VALUE’)
Oracle은 참조 값으로 =만 설정할 수 있지만 MySQL은 모든 비교 연산자를 설정할 수 있습니다.
즉, IF(기준값 <= 10, A, B)도 이와 같다.

29. SELECT 절이 있는 ORDER BY

집계 함수는 select 절과 함께 사용해야 합니다.
SELECT 문의 구절
SELECT, FROM, WHERE, GROUP BY, HAVE, ORDER BY
이 순서를 잘 기억해야 합니다. 순서를 지켜야 합니다. 순서가 바뀌면 안됩니다.

FROM 데이터에서 작동하는 구조 테이블.
테이블의 구조를 볼 수 있습니다.
테이블이거나 공백의 산술 연결일 수 있습니다.
그리드 데이터 집계

필터링할 위치

GROUP BY(COUNT, AVG) 집계 함수

HAVING 집계로 필터링
집계된 결과 필터링
카운트 포함(ID)>=2

29.1 주문별 주문

ORDER BY 열(ASC/DESC)
ASC 오름차순 DESC 내림차순

역순으로 ID별로 정렬
ID ASC로 회원 주문에서 *를 선택하십시오.
ID DESC로 회원 주문에서 * 선택;

멤버 중 박씨 성을 가진 멤버를 찾아 나이 오름차순 정렬
SELECT * FROM MEMBER WHERE NAME = ‘Bak%’ 연령별 주문 ASC;

2차 정렬의 경우 , 로 구분합니다.
HIT DESC, REGDATE DESC로 알림 순서에서 * 선택;

30. 집계 함수 및 그룹 기준

집계 함수 COUNT, SUM, AVG, MAX, MIN

COUNT: 카운트를 센다.
COUNT NULL 값은 계산되지 않습니다.
레코드 수를 알고 싶다면 어떻게 해야 할까요?
1. NULL을 포함하지 않는 값으로 계산
2.숫자

전자가 더 빠르기 때문에 선호됩니다.

SUM:합계 AVG:평균 MAX:최대 MIN:최소
그러나 계산할 때 사람들은 일반적으로 혼자 계산하지 않고 그룹으로 계산합니다.
소그룹으로 나누고 작성자별로 게시물 수를 세나요?
SELECT memberId, COUNT(ID) COUNT(ID)는 memberId에 의해 공지 그룹에서 계산됩니다.

-> 그리드의 ID와 집계 번호를 반환합니다.
하지만 중간에 TITLE 같은 것을 넣어도 될까요?
집계된 단위는 하나의 단위로 표시되므로 집계에 포함되지 않은 항목은 포함되지 않아야 합니다.

오류가 발생했습니다!
집계된 값을 기준으로 내림차순으로 해보자

SELECT memberId, COUNT(ID) COUNT(ID) COUNT FROM NOTICE GROUP BY memberId ORDER BY COUNT DESC;
쓰기 순서는 SELECT FROM WHERE GROUP BY HAVING ORDER BY입니다.
그러나 실행 순서는 다음과 같습니다.
SELECT가 먼저 작성되지만 FROM이 먼저 실행됩니다.
FROM 절 -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
따라서 FROM 절에 지정된 모든 별칭을 사용할 수 있습니다.

SELECT 절에 지정된 별칭은 ORDER BY만 가능합니다.

31. HAVING 절

회원별 게시물 수를 찾아보지만 게시물이 2개 이하인 목록만 표시됩니다.
SELECT memberId, COUNT(ID) FROM NOTICE WHERE COUNT(ID) < 2 GROUP BY memberId;

-> 이러지 마세요. 집계 함수는 GROUP BY가 집계하므로 WHERE 절에서 사용할 수 없습니다.

SELECT memberId, COUNT(ID) FROM NOTICE GROUP BY memberId HAVING COUNT <=2 ;

33개의 하위 쿼리
(오라클 기반 예시)
순서를 바꿔야 하는 경우가 있습니다.

이 경우 하위 쿼리가 사용됩니다.
1과 10 사이의 ROWNUM이 있는 구성원에서 * 선택
-> 마지막 등록 순으로 정렬된 결과의 상위 10개 이름을 원하면 어떻게 합니까?

SELECT * FROM MEMBER /ORDER BY REGDATE DESC /WHERE ROWNUM BETWEEN 1 AND 10 -> 주문 오류
하위 쿼리를 사용하는 방법에는 여러 가지가 있습니다.
FROM 절에 테이블이 있을 필요는 없습니다.
래스터 데이터가 있으면 오셔도 됩니다.

먼저 정렬된 래스터 데이터를 생성하고 그 안에 WHERE 절을 넣겠습니다.
혼자 확인 REGDATE로 정렬 후 -> 조회수가 0인 하위 쿼리

SELECT * FROM (SELECT * FROM NOTICE REGDATE DESC 주문) A WHERE HIT = 0;
여기에서 하위 쿼리에 별칭이 전달되지 않으면 오류가 발생합니다(오류: 1248).

MySql FROM 절의 모든 테이블에는 이름이 있어야 한다고 명시되어 있습니다. from 절에서 하위 쿼리를 사용하는 경우 이름을 지정해야 합니다.

2023.03.09
Oracle과 MySQL은 동일하지만 많은 차이점이 있습니다.
하위 쿼리는 자주 사용되므로 사용 방법을 이해해야 합니다.
Oracle과 달리 MySQL은 from 절의 모든 테이블에 대한 별칭이 필요합니다. 나중에 사용할 때 혼란스러울 수 있으므로 이 부분을 기억하십시오.

함수가 있는 만큼 경우도 많지만 SQL 문을 작성하면서 필요한 내용을 하나씩 찾아보는 것이 맞을 것 같습니다.