그냥 읽으면서 배운점을 일단 써놓고 나중에 정리하려고 한다.
하지만 다른 DBMS에서는 안되지만 mysql에서는 없어도 오류가 발생하지 않았는데 8.0 버전으로 업데이트를 하며 ONLY_FULL_GROUP_BY라는 것이 기본으로 활성화가 되어있어 Group by 절이 사용된 쿼리의 SELECT 절에는 Group by절에 명시된 컬럼과 집계 함수만 사용할 수 있다. SELECT절에 집계 함수가 사용되는 경우 GROUP BY절에 명시되지 않은 컬럼도 집계함수의 인자로 사용할 수 있다.
MySQL은 정해진 형태의 날짜 포맷으로 표기하면 MySQL서버가 자동으로 DATE나 DATETIME으로 변환하기 때문에 그냥 문자열로 '2023-12-27' 이렇게 해도 사용 가능하다.
BOOL, BOOLEAN 타입이 있지만 결국 TINYINT타입에 대한 동의어다. FALSE는 0이고 TRUE는 오직 1만이다.
<=> 연산자는 = 연산자와 같으며 NULL 값에 대한 비교까지 수행한다. 한쪽만 NULL이면 FALSE 반환, 둘다 NULL이면 TRUE 반환
일반적으로 쿼리에선 <> 을 같지 않다는 연산자로 많이 사용한다. !=도 가능하지만 통일해서 <>로 사용하는 것을 추천한다.
&&와 ||이 사용가능하지만 AND와 OR를 사용하자, 순서는 AND가 우선순위 높다
LIKE연산자는 와일드카드(%, _ ) 가 검색어의 뒤에 있다면 인덱스 레인지 스캔이 가능하지만 앞쪽에 있다면 사용할 수 없다. ex) christ%면 가능, %rist는 x, 이유는 인덱스의 left-most 특성 때문
between 대신 IN을 활용해서 인덱스 효과를 더욱 잘 활용하자
where num in (select num from table where num between 3 and 5) 이런식
지정 문자
%Y : 4자리 연도
%m : 2자리 숫자 표시의 월 (01 ~ 12)
%d : 2자리 숫자 표시의 일 (01 ~ 31)
%H : 2자리 숫자 표시의 시 (00 ~ 23)
%i : 2자리 숫자 표시의 분 (00 ~ 59)
%s : 2자리 숫자 표시의 초 (00 ~ 59)
전
create table t(
a_id BIGINT not null auto_increment,
a_url VARCHAR(1000) not null,
primary key (a_id),
index ix_accessurl (a_url)
) ENGINE=INNODB;후
create table t(
a_id BIGINT not null auto_increment,
a_url VARCHAR(1000) not null,
primary key (a_id),
index ix_accessurl ((MD5(a_url)))
// 만약 index ix_accessurl (UNHEX(MD5(a_url))) 이렇게 하면 저장 공간 더 줄일 수 있음
);