![window 함수 활용법(feat. group by와 다른점)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuZkg7%2FbtsLlRwRTKJ%2FTjziKkI8ldgzZueRfTimP0%2Fimg.png)
프로그래머스 - 연도별 대장균 크기의 편차 구하기 문제를 풀다가 window 함수의 유용함을 알게 되어서 정리해보려고 한다.내가 푼 원래 풀이SELECT ym.YEAR, (ym.max - ed.SIZE_OF_COLONY) AS YEAR_DEV, ed.IDFROM ECOLI_DATA ed JOIN ( SELECT YEAR(DIFFERENTIATION_DATE) AS YEAR, MAX(SIZE_OF_COLONY) AS max FROM ECOLI_DATA GROUP BY YEAR(DIFFERENTIATION_DATE) ) ym ON YEAR..
![MySQL ONLY_FULL_GROUP_BY 이해하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fef4YlJ%2FbtsLeqFsxf5%2FvSbweBEPq4ZpKMyzfik83k%2Fimg.png)
MySQL에서 GROUP BY를 사용할 때 다음과 같은 오류가 발생할 때가 있다.Error Code:1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'practice.employees.hire_date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by쉽게 말해서 SELECT절에서 사용하는 칼럼이 GROUP BY에 포함되지 않거나, 함수적 종속성을 만족하지 않아 only_full_group_by모드와 호환되지 않는다는 의..
![COUNT 함수와 SUM 함수의 차이점](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHZdsw%2FbtsK2FwTHEY%2F60aC7PboF1fBY9DO1bfSI0%2Fimg.png)
COUNT 함수와 SUM 함수 모두 데이터를 집계할 때 사용한다.그런데 사용하다보면 사용 방법이 헤갈릴 때가 있어서 정리해두려고 한다.COUNT와 SUM의 사용 목적COUNT 함수 : 특정 조건을 만족하는 데이터 행의 개수를 구하는 데 사용한다.SUM 함수 : 특정 칼럼의 값들을 모두 더할 때 사용합니다.실제 사용 예시예제 테이블 생성먼저 학생 정보를 저장할 테이블을 만들자.CREATE TABLE students( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), score INT); 모든 데이터를 조회하는 쿼리SELECT * FROM students;결과COUNT 함수 사용*(아스트릭)으로 COUNTSELECT COUNT(*) FROM stu..
![MySQL에서 날짜 차이 계산하는 방법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7rZ01%2FbtsK1Qlzs9Z%2FbSEWUVs9tbfdTxXsdKYbMK%2Fimg.png)
1. 처음 시도: 뺄셈 연산으로 날짜 차이 계산두 날짜 간의 차이를 계산하려고 아래와 같이 SQL문을 실행하였다.SELECT DATE("2024-11-07") - DATE("2024-11-03");결과는 4로 나왔고, 기대값과 일치했다.하지만 뺄셈 연산은 올바른 결과를 보장하지 않는다.2. 뺄셈 연산으로 기간을 구하는 문제점다음 SQL문을 실행했을 때는 문제가 발생했다.SELECT DATE("2024-11-07") - DATE("2023-11-07");기대값은 366일 (윤년 포함)이지만, 결과는 10000이 나왔다.이유는 MySQL이 DATE 타입의 값을 YYYYMMDD 형식의 숫자로 변환한 뒤 계산하기 때문이다.즉, 20241107-20231107이로 변환되어 10000이 나오는 것이다.3. 날짜 차..
![SQL IN절에서 NULL이 예상대로 동작하지 않는 이유](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLu7Yr%2FbtsK2CsESeP%2FBKViMRdZDjAegSKhxyTgAK%2Fimg.png)
SQL쿼리를 사용할 때 IN절에 NULL 값이 들어가면 안된다.IN절은 WHERE 절의 조건에 맞는 각 행의 칼럼 값이 IN절 안의 값 중 하나와 일치할 때 행을 반환하는 연산자이다.IN절에 NULL이 포함되었을 때다음과 같은 students 테이블을 생성해 데이터를 확인해 보자CREATE TABLE students( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), score INT); 모든 데이터를 조회하는 쿼리SELECT * FROM students;결과 이제 score가 100 또는 NULL인 데이터를 조회하기 위해 다음과 같은 쿼리를 작성했다.SELECT * FROM students WHERE score IN (100, null); ..
![MySQL에서 SELECT 별칭은 GROUP BY, ORDER BY, HAVING 절에서 사용 가능하다](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcUvqK%2FbtsKYx0Ggcm%2FW0Nzs7fZCdW373XJhVIdHk%2Fimg.png)
상황프로그래머스에서 카테고리 별 상품 개수 구하기 문제를 풀다가 의문이 들었다.다음과 같이 쿼리를 작성했는데 통과가 되었다.SELECT LEFT(PRODUCT_CODE, 2) CATEGORY, COUNT(*)FROM PRODUCT GROUP BY CATEGORY ORDER BY 1 ASC; GROUP BY 절에서 CATEGORY라는 별칭을 사용했음에도 문제가 없었다. 왜 그럴까?SQL 실행 순서내가 알는 SQL 실행순서는 아래와 같았다.FROM : 가장 먼저 테이블을 선택하고 JOIN이 있다면 함께 진행WHERE : FROM에서 가져온 데이터 필터링GROUP BY : 데이터를 그룹화하여 집계 가능하게 만듦DISTINCT : DISTINCT가 걸린 칼럼의 중복 행들을 제거SELECT : 조회할 행들이 결정..
![MySQL은 문자열 대소문자 구분을 하지 않는다.](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaBQCH%2FbtsKT1HBjoz%2FINC04L3Ry3KH2q7pLmXJQk%2Fimg.png)
비이진 문자열(CHAR, VARCHAR, TEXT)의 경우 문자열 비교를 할 때 대소문자 비교를 하지 않는다.문자 집합과 정렬은 각각 기본값으로 utf8mb4와 utf8mb4_0900_ai_ci를 기반으로 하기 때문이다.utf8mb4mysql에서 아래 쿼리문을 실행하면 어떤 인코딩 방식으로 실행하는 지 확인할 수 있다.SHOW VARIABLES LIKE 'character_set_server'; 실행 결과 원래 기본적으로 utf-8은 1~4바이트까지 전세계 모든 문자를 표현할 수 있다.하지만 MySQL에서는 utf-8을 사용해도 3바이트까지만 표현이 가능하다.이모지는 4바이트로 저장되어 있기 때문에 MySQL에서 utf-8을 사용할 경우 이모지를 저장할 수 없다.그래서 이모지를 표현하기 위해서는 인코딩 ..