프로그래머스 SQL 문제를 1단계부터 풀면서 몰랐던 부분을 기록하고자 한다.
❓ 중복 제거하기
COUNT(*)
👉 NULL을 포함한 모든 컬럼 수를 센다.
COUNT(ColumnName)
👉 NULL 값은 제외하고 센다. 빈 문자열은 COUNT() 결과에 포함한다.
COUNT( DISTINCT( ColumnName ) )
👉 중복을 제거하고 NULL값도 제외한 값들만 센다.
WHERE 절에 컬럼이름 IS NULL
을 적으면 끝!
mssql 은 ISNULL
oracle 은 NVL
mysql 은 IFNULL
함수명(컬럼(널아니면 출력될 컬럼),널값일경우 대체할 값))
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format
date_format([칼럼 이름], '%Y-%m-%d')
2020-03-01 00:00:00 이 형식의 날짜를 2020-03-01 이렇게 시간 빼고 날짜만 나오게 바꿀 수 있다.
IF(조건문, 참일때 값, 거짓일 때 값)
DATEDIFF(날짜 a, 날짜 b)
이 문제에서 자동차 대여 기간을 구할 때
DATEDIFF(2022-09-26,2022-09-26)의 결과가 0이지만 하루 빌린 것이므로 대여기간은 1이다.
그래서 장기대여와 단기대여를 구분하기 위해 DATEDIFF()한 결과에 1을 더해주고 30일 이상인지 아닌지를 검사했다.
SUBSTRING("문자열", "시작위치", "길이")
: 지정한 위치에서 지정한 문자열 길이만큼 자를 때 사용
LEFT("문자열", "길이")
: 왼쪽에서부터 지정한 문자열의 길이만큼 자를 때 사용
RIGHT("문자열", "길이")
: 오른쪽에서부터 지정한 문자열의 길이만큼 자를 때 사용
참고) SELECT에서 지정한 값을 기준으로 GROUP BY, ORDER BY 한다.
CASE WHEN 조건절 THEN 참일때 값 ELSE 거짓일때 값 END 컬럼명
(CASE WHEN 조건절 THEN 값
WHEN 조건절 THEN 값
WHEN 조건절 THEN 값
ELSE 값
END) AS '컬럼이름'
TRUNCATE(숫자,버릴 자릿수)
SELECT TRUNCATE(3456.1234567 ,1) FROM DUAL;
// 3456.1
SELECT TRUNCATE(3456.1234567 ,-2) FROM DUAL;
// 3400
FROM ANIMAL_INS AS A LEFT JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
id를 기준으로 left join 한 후 오른쪽 테이블의 id가 null 인 컬럼을 찾으면 왼쪽 테이블에만 있고 오른쪽 테이블에는 없는 칼럼이 선택된다.
❓조건에 맞는 사용자 정보 조회하기
CONCAT('문자열1','문자열2','문자열3')
👉'문자열1문자열2문자열3'
CONCAT() 합칠 문자열을 모두 넣어준다.
CONCAT_WS('구분자','문자열1','문자열2','문자열3')
👉'문자열1구분자문자열2구분자문자열3'
구분자에 " " 를 쓰면 문자열들을 띄워쓰기로 구분하여 나타내고
구분자에 ","를 쓰면 문자열을 쉼표로 구분하여 나타냄
❓오프라인/온라인 판매 데이터 통합하기
UNION ALL은 두 테이블을 세로 방향 결합하고 중복을 제거하지 않고 모두 가져온다.
UNION 으로 테이블을 합치려면 컬럼 수가 같아야하는데 오프라인 판매내역에는 유저 아이디가 없다. 오프라인 테이블에 유저아이디라는 이름의 컬럼을 NULL 값으로 채워주려면 NULL AS USER_ID
라고 하면 아주 간단하게 해결되는 거였다!