금일 MySQL 관련 학습을 진행하고자 한다.
물론 그간 DB 스터디도 진행하며 SQL문제도 풀어보고 학습도 했지만, 부트캠프를 진행하며 SQL을 필수적으로 다룰 줄 알아야 함을 깨달았고 remind하는 기분으로 짧게라도 진행해보려 한다.
특히 전체적인 문법구조는 아직 안까먹고 알고 있으므로 구체적인 Function들에 대해 알아보고자 한다.
🎈 COUNT DISTINCT NULL 처리
- SELECT COUNT(DISTINCT 컬럼명) FROM 테이블명
위 쿼리를 통해, 테이블로부터 한 컬럼 내 중복을 제거한 ROW 수를 알 수 있다.
기본적으로 일반 COUNT(컬럼명)만 사용하면 NULL값이 제거된 ROW수가 반환되고, COUNT(*)만 사용하면 NULL도 포함한 ROW수를 반환하게 된다. (빈 문자열 역시 동일 처리를 하기에 빈 문자열은 NULL로 변경 필요)DISTINCT와 함께 사용한다면 WHERE절에 컬럼명 IS NOT NULL 조건을 반드시 걸어주어야만 NULL값과 중복이 모두 제거된 ROW수만 나온다.
만일 COUNT없이 DISTINCT만 사용한다면 NULL을 포함하여 중복을 제거하기에 출력되는 결과에 NULL 결측치가 포함된다.
-> 이를 해결하고 싶다면 IFNULL(컬럼명, 보간하고자 하는 값)으로 결측치를 채워주거나 WHERE절로 IS NOT NULL 처리를 해주어야 한다.
+) 추가적으로 COUNT와 같은 집계함수를 사용한다면 GROUP BY를 사용하는 것이 의미가 있고, GROUP BY로 지정한 컬럼 외에 다른 컬럼을 SELECT(조회)하는 경우 에러가 발생하기도 한다.🎈 JOIN 정리
- SELECT * FROM TABLE_A LEFT JOIN B ON A.ID = B.ID
JOIN문을 사용한 쿼리가 위와 같이 주어진다면, 결과는 다음과 같다.
-> A테이블은 그대로고, B테이블의 경우 A테이블과 ID가 일치하는 조건에만 A테이블에 합쳐진다.
반대로 RIGHT JOIN인 경우 B테이블에 합쳐진다고 보면 된다.🎈 LIMIT 정리
ORDER BY 이후 제일 마지막에 작성
LIMIT 1 : 상위 1개만 반환
LIMIT 2,6 : 상위 2번째 ~ 6번째까지만 반환🎈 MIN, MAX
MIN(DATETIME) : 제일 늦은 날짜 출력
MAX(DATETIME) : 제일 최근 날짜 출력🎈 CASE
Mysql에서 Boolean type으로 컬럼을 지정하면 1비트의 공간을 할당해 tinyint(1)로 저장된다.
데이터는 TINYINT 형에 맞게 TRUE면 1, FALSE는 0으로 처리된다.
해당 값을 TRUE, FALSE로 출력하고 싶다면, Schema를 변경하거나 아래 방법만 존재한다.IF(boolean 타입인 컬럼, 'TRUE', 'FALSE') AS 컬럼명
SQL에서 IF 문법으로 원래는 조건문을 걸어주어야 하지만, 타입 자체가 boolean인 컬럼은 별도의 조건이 필요가 없다.이외에도 DB 스키마를 구성하려면 여러 데이터 타입을 알아야하고, 이를 올바르게 사용할 줄 알아야 한다.
- 정수 타입 : TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
- 실수 타입 : FLOAT, DECIMAL(고정 소수점), DOUBLE(부동 소수점)
- 문자열 타입 : VARCHAR(가변길이), CHAR(고정길이)
- BLOB : 문자 셋이나 콜레이션 없는 바이너리 데이터만 저장 (TINY, SMALL, MEDIUM, BIG)
- TEXT : 텍스트 형식만 저장 (TINY, SMALL, MEDIUM, BIG)
추가로 날짜 시간은 상세하게 적어보려 한다.
- DATE : 0000-00-00 ~ 9999-12-31
- DATETIME : 0000-00-00 00:00:00 ~ 9999-12-31 23:59:59
- TIMESTAMP : 1970-01-01 00:00:00 이후로 지난 초
- TIME : -838:59:59 ~ 838:59:59
- YEAR : 1901 ~ 2155