SQL 12

GROUP BY 후 조건 개수 세기: SUM() vs COUNT() 어떤 걸 써야 할까?

[프로그래머스 관련문제] : 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr □ 문제요약 위 문제의 조건을 정리하자면 아래와 같다.2022-10-16이 start_date와 end_date 사이에 있으면 → '대여중'해당 날짜에 대여 기록이 없으면 → '대여 가능'차량별로 하나라도 대여중이면 '대여중', 전부 대여 가능이면 '대여 가능'car_id로 정렬여기에서 집중 해야 할 부분은 차량별 하나라도 대여중이면 '대여중'이라고 표시하는 것이다.이 글에서는 왜 COUNT(AVAILABILITY = '대여중') 이라는 직관적인 로직을 사용하지 않고 SUM 함수..

SQL 2025.07.03

[MYSQL] SQL의 논리적 실행 순서 예외(GROUP BY, HAVING)

□ 일반적으로 SQL에서 논리적 실행 순서는 아래와 같다.FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT□ 다만, 최적화와 구현상 처리를 위해 예외를 둔 경우가 있음. B.3.4.4 Problems with Column AliasesAn alias can be used in a query select list to give a column a different name. You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column: ※ 예외가 있다고 하더라도 여전히 where 절에서는 select의 alias가 계산되지 않기때문에 위 예외가 적용되지 않는다....Standard SQL..

SQL 2025.07.01

[MYSQL] 날짜를 계산하는 주요 함수

□ DATEDIFF(date1, date2) - 두 날짜 간의 '日' 차이 - 식 : date1 - date2 - 리턴값 : 정수 'DAY'SELECT DATEDIFF('2025-07-01', '2025-06-28') -- 3 □ TIMESTAMPDIFF(unit, datetime1, datetime2) - 두 날짜 간의 unit 차이 - unit 종류 : SECOND, MINUTE, HOUR, DAY, MONTH, YEAR - 리턴값 : 정수SELECT TIMESTAMPDIFF(DAY, '2025-01-01', '2025-01-10'); -- 9 □ DATE_ADD(date, INTEVAL n unit) - 특정 unit 만큼 날을 더함SELECT DATE_ADD('2025-07-01', ..

SQL 2025.07.01

Group by시 그룹화 대상이 아닌 컬럼 가지고 오기

관련 SQL 프로그래머스 문제 : 물고기 종류 별 대어 찾기문제점 fish_type 컬럼으로 Group by 시 fish_type 컬럼 외에는 집계함수 외에는 사용하지 못함 -> ID컬럼으로 인하여 this is incompatible with sql_mode=only_full_group_by 오류 발생 § 해당 오류 쿼리 예시 select ID, FISH_NAME, MAX(LENGTH) from fish_info f join fish_name_info fn on f.fish_type = fn.fish_type group by f.fish_type원인 : only_full_group_by 설정이 ON되어있기 때문 □ only_full_group_by를 ON을 설정하는 이유 : 그룹화되지 않은 컬럼..

SQL 2025.05.15

CTE 사용법과 재귀함수

□ 비교 일반 CTE재귀 CTE개념일시적으로 결과 집합을 변수처럼 저장해서 쿼리 전체에서 재사용 가능자기 자신을 참조하며 반복적으로 실행 → 계층형 데이터를 쉽게 설계할 수 있게 함. (오라클에 start with silbling ~ 의 쓰임새와 동일)형식WITH CTE_NAME AS ( 서브쿼리) WITH RECURSIVE CTE_NAME AS ( 기본 쿼리 UNION ALL 재귀 쿼리)※ UNION ALL을 통해 루트에서 시작해 자식 → 손자 ... 순으로 전개CTE를 여러번 사용해야 하는 경우 (1) 일반 CTE 여러개 사용WITH cte1 AS (...), -- 첫 번째 CTE cte2 AS (...), -- 두 번째 CTE cte3 AS (...) -- 세 번째 CTE..

SQL 2025.05.12

프로그래머스 SQL - 상위 퍼센트 대로 나누기 / percent_rank()

프로그래머스 - 대장균의 크기에 따라 분류하기 2번 문제  -정답-select ID , (case when p   필요한 지식  percent_rank() : 상대적 백분위 수를 나타낸다. 값이 낮을 수록 값이 크다."상위 ~ 퍼센트" 값을 구할때 매우 유용할듯기본구성 Percent_rank() over(partition by 컬럼1 order by 컬럼2 ASC/DESC) 이때 partition by 는 생략 가능 ,  select 고객번호, 마일리지 , percent_rank() over(partition by 지역 order by 마일리지 DESC)*100 백분위from 고객order by 백분위 Asc;

SQL 2025.03.27

[DB]NULL값 허용과 관계테이블

n대 n의 관계에서는 '관계테이블'이 필수, 1대 n의 관계에선 n(자식)쪽에 FK를 두면 된다 (단, n(자식)쪽이 먼저 데이터가 생성된다면 FK쪽에 null값이 들어올 수도 있다. -> 널값을 회피하기 위해  '관계테이블' 활용해도 됨  => 같은 활용으로 1대1관계에서도 관계테이블을 사용하는 경우가 있음) [예시]Orders(자식테이블 多) -부모테이블의 데이터가 먼저 발생해야 자식테이블에 있는 FK값이 null 값이 안됨. 단, 논리적으로 자식테이블이 부모테이블보다 먼저 발생되므로ORDERS 테이블의 FK 칼럼의 속성값이 null값이 올 수 밖에 없다.  이럴 경우 관계 테이블을 만들어서 null값을 회피해도 되지만, 데이터가 많지 않아, 낭비되는 메모리의 비율이 크지 않다면, 널값을 허용함으로..

SQL 2024.11.20

[Oracle] 비율함수

Ratio_to_report() over() : 해당 값이 전체 값의 몇 프로를 차지하는지? ( 0 Percent_rank() over() : 랭킹 / 전체 건수 : 꼴지='1', 랭킹이 높을 수록 0에 가까움 ( 0 Cume_dist() over() : 현재 행까지 누적 건수 / 전체 건수 ( 0 Ntile() over() : 주어진 수만큼 행들을 n등분 / 같은 값이더라도 등수를 내림 / 2그룹으로 나누었을때 똑같은 행수로 나누어 떨어지지 않으면 1그룹에 할당한다

SQL 2024.10.25