DB/Oracle - SQL

DB/Oracle - SQL

Oracle SQL | 집계 함수와 GROUP BY 사용 규칙 – 비집계 컬럼과 집계 함수 구분

SQL을 학습하거나 사용하는 과정에서 많은 사용자가 GROUP BY에 포함되지 않은 컬럼이나 표현식은 SELECT 절에서 사용할 수 없다고 오해하는 경우가 있다. 그러나 예외가 존재한다.바로 집계 함수는 GROUP BY에 포함되지 않아도 SELECT 절에서 자유롭게 사용할 수 있다는 점이다.핵심 개념비집계 컬럼: GROUP BY에 반드시 포함되어야 하며, 그룹의 기준을 결정한다.집계 함수: SUM, COUNT, AVG, MAX, MIN 등은 그룹화된 레코드에 대해 계산을 수행하므로 GROUP BY에 포함될 필요가 없다.즉, SELECT 절에 나타나는 컬럼 중 집계 함수가 아닌 컬럼은 반드시 GROUP BY에 있어야 하지만, 집계 함수는 제외된다.예시SELECT BOK.AUTHOR_ID, AUT.AUT..

DB/Oracle - SQL

Oracle SQL | 그룹별 조건 필터링 – GROUP BY + IN 서브쿼리 패턴

이 쿼리 패턴은 다음과 같은 논리 구조를 따른다.GROUP BY: 집계 키를 기준으로 그룹화HAVING: 그룹별로 조건을 적용IN 서브쿼리: 조건을 만족한 키값만 메인 쿼리에서 필터링즉, 서브쿼리에서 조건을 만족한 키 목록을 추출하고, 그 키를 기반으로 원본 테이블에서 해당 행들을 다시 조회하는 방식이다.예시SELECT ID, NAME, HOST_IDFROM PLACESWHERE HOST_ID IN ( SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(*) > 1)ORDER BY ID ASC;쿼리 해석서브쿼리: PLACES 테이블에서 HOST_ID 기준으로 그룹화한 뒤, COUNT(*) > 1 조건을 만족하는 HOST_ID만 추출한다.IN 절: ..

DB/Oracle - SQL

Oracle SQL | 그룹별 최대값을 가진 전체 행 추출 – GROUP BY + IN 서브쿼리 패턴

SQL에서 특정 컬럼을 기준으로 그룹화한 뒤, 각 그룹에서 최대값을 가진 행 전체를 조회해야 하는 상황이 많다. 예를 들어, 부서별 최고 연봉자, 상품군별 최대 판매량 상품, 지역별 최다 방문 지점 등을 추출하는 경우가 이에 해당한다.이 문서에서는 GROUP BY와 집계 함수(MAX)를 사용한 뒤, 해당 값을 가지는 전체 행을 추출하는 실무적 쿼리 패턴을 설명한다.핵심 개념: GROUP BY는 값만 추출하며, 행 전체는 반환하지 않는다가장 먼저 떠올릴 수 있는 접근은 다음과 같다SELECT 그룹컬럼, MAX(대상컬럼)FROM 테이블명GROUP BY 그룹컬럼;위 쿼리는 그룹별로 최대값만 반환한다. 그러나 실무에서는 이 최대값을 가지는 원본 행의 나머지 정보(예: ID, 이름 등)를 함께 조회해야 하는 경우..

DB/Oracle - SQL

Oracle SQL | 날짜 차이 계산과 ROWNUM 처리

Oracle SQL에서 날짜 간의 차이를 계산하고, 그 결과를 기준으로 상위 N건만 추출해야 할 경우가 자주 발생한다.이때 사용하는 기본 연산은 날짜 - 날짜, 그리고 상위 제한은 ROWNUM이다.그러나 두 기능은 실행 순서나 동작 방식에서 주의할 점이 많다.1. 날짜 차이 계산Oracle에서는 다음과 같이 DATE 타입 간의 차이를 직접 계산할 수 있다.SELECT 종료일자 - 시작일자 AS 기간FROM 테이블명;특징결과는 일 수(DAY) 단위의 NUMBER로 반환됨TO_DATE 또는 TIMESTAMP가 포함되어도 암시적으로 변환 처리됨TRUNC, ROUND, FLOOR 등의 함수와 함께 자주 사용됨2. 정렬 후 상위 N건 추출 – 기본 구조단순히 상위 N건을 가져오기 위해 다음과 같이 작성하면 의도한..

DB/Oracle - SQL

Oracle SQL | NOT EXISTS와 ROW_NUMBER 조합으로 미존재 조건 + 상위 N건 처리

Oracle SQL에서 특정 조건에 해당하지 않는 데이터, 즉 다른 테이블에 존재하지 않는 데이터를 필터링해야 할 때 가장 안정적인 방식은 NOT EXISTS이다.여기에 정렬된 상위 N건을 추출하려면 ROW_NUMBER() 윈도우 함수를 조합하는 것이 명확하고 정확한 접근이다.이 글에서는 존재하지 않는 조합을 필터링하고, 그 중에서 정렬 기준으로 상위 N건만 추출하는 구조를 정리한다.1. 예제 상황 가정한 테이블에 기준 데이터 존재다른 테이블에는 그 중 일부 데이터만 존재 (부분 조인 관계)특정 컬럼을 기준으로 정렬 후 상위 N건 추출2. NOT EXISTS + ROW_NUMBER() 조합SELECT NAME, DATETIMEFROM ( SELECT INS.*, ROW_NUMBER..

DB/Oracle - SQL

Oracle SQL | IN 절에서 와일드카드(% 문자열 %)를 사용할 수 없는 이유와 LIKE 대체 방식

SQL에서 문자열 검색 조건을 설정할 때 LIKE '%문자%'는 가장 기본적인 패턴 검색 방식이다.그러나 일부 사용자는 이를 IN ('%문자1%', '%문자2%')와 같은 형태로 쓰는 경우가 많으며,이런 방식은 Oracle SQL에서는 의도대로 작동하지 않는다.1. 잘못된 방식 – IN ('%문자%')SELECT CAR_TYPE, COUNT(*) AS "CARS"FROM CAR_RENTAL_COMPANY_CARWHERE OPTIONS IN ('%통풍시트%', '%열선시트%', '%가죽시트%')GROUP BY CAR_TYPE;결과0건 또는 전혀 다른 결과 출력의도한 패턴 매칭이 전혀 동작하지 않음2. 원인 분석 – IN 절의 동작 방식IN (A, B, C)는 내부적으로 다음과 같이 해석된다:col = A ..

DB/Oracle - SQL

Oracle SQL | TO_CHAR 시간 포맷(HH, HH12, HH24)과 출력값 처리

1. 시간 포맷 옵션 정리Oracle의 TO_CHAR(date_column, '시간 포맷')에서 사용 가능한 시간 포맷은 아래와 같다:포맷 설명 예시 (오전 9시 기준)'HH'12시간제 (0포함)09'HH12'12시간제 + AM/PM09'HH24'24시간제 (00 ~ 23)09, 15, 21 등대부분 통계 집계 시에는 'HH24' 포맷을 사용한다.2. 출력: "09" → "9"로 표기기본적으로 TO_CHAR(..., 'HH24')는 "09"와 같이 문자열로 반환된다.이를 "9"처럼 숫자 형태로 출력하려면 문자열 가공이 필요하다.3. 방법 1 – DECODE로 부분 대응SELECT DECODE(TO_CHAR(DATETIME, 'HH24'), '09', '9', TO_CHAR(DATETIME, 'HH24..

DB/Oracle - SQL

Oracle SQL | DECODE vs CASE WHEN – 문자열 패턴 비교 시 주의할 점

Oracle SQL에서 조건 분기를 구현할 때 자주 사용되는 구문은 DECODE와 CASE WHEN이다.두 문법은 유사해 보이지만 지원하는 비교 방식과 적용 가능한 조건에서 명확한 차이가 있으며, 특히 %문자% 패턴을 사용하는 LIKE 조건이 포함된 경우에는 결과에 큰 차이를 만든다.1. 문자열 패턴 비교에서 DECODE는 작동하지 않는다SELECT ANIMAL_ID, NAME, DECODE(SEX_UPON_INTAKE, '%Neutered%', 'O', '%Spayed%', 'O', 'X') AS 중성화여부FROM ANIMAL_INSORDER BY ANIMAL_ID;결과모든 결과가 'X'로 출력됨%Neutered%, %S..

AidenYoun
'DB/Oracle - SQL' 카테고리의 글 목록