728x90
반응형

DB 226

[DB][SQL] INNER JOIN 시 ON절과 WHERE

1. 기본 INNER JOIN SELECT *FROM CUSTOMER CJOIN ORDER O ON C.CUST_ID = O.CUST_IDWHERE O.STATUS = 'PAID';ON 절: C.CUST_ID = O.CUST_ID → 고객과 주문을 연결하는 “조인 조건”WHERE 절: O.STATUS = 'PAID' → 주문 중 결제 완료된 것만 필터링👉 읽는 사람이 “아, 고객과 주문을 ID로 연결한 후, 결제된 주문만 가져오는구나”라고 바로 이해할 수 있음.2. 조건을 ON 절에 포함한 경우 SELECT *FROM CUSTOMER CJOIN ORDER O ON C.CUST_ID = O.CUST_ID AND O.STATUS = 'PAID';INNER JOIN이라면 결과는 위와 동일함.다만 **“조..

DB 2025.08.19

[DB][Oracle] RAW 타입

Oracle에서 RAW 타입은 **"가공하지 않은(binary) 데이터"**를 저장하는 자료형입니다.쉽게 말하면 문자가 아니라 순수한 바이트(byte) 값을 저장하는 거예요.📌 RAW 타입 특징문자열이 아님 → 인코딩 안 된 바이트 시퀀스 저장보통 길이는 최대 2000 바이트 (RAW(n) 에서 n ≤ 2000)VARCHAR2 와 달리 문자셋/인코딩 변환 없음출력하면 보통 16진수(hex) 형태로 보입니다📌 사용 예시바이너리 데이터 저장 CREATE TABLE raw_test ( id NUMBER, data RAW(16) -- 16바이트 저장 가능);INSERTINSERT INTO raw_test VALUES (1, HEXTORAW('7F45C210'));SELECT SELECT data..

DB 2025.08.06

[DB][Oracle] DBMS_LOB.SUBSTR

DBMS_LOB.SUBSTR 는 Oracle에서 LOB 타입(CLOB, BLOB) 데이터를 잘라서VARCHAR2 나 RAW 타입으로 변환해주는 함수예요.CLOB 은 그대로는 ORDER BY 나 GROUP BY 에 못 쓰기 때문에, 이 함수로 문자열을 잘라내 변환해야 합니다. 📌 기본 구조 DBMS_LOB.SUBSTR( lob_loc IN CLOB/BLOB, -- 잘라낼 LOB 데이터 amount IN INTEGER, -- 잘라낼 길이 (문자 수 또는 바이트 수) offset IN INTEGER := 1 -- 시작 위치 (1부터 시작)) RETURN VARCHAR2 | RAW;📌 파라미터 설명lob_loc잘라낼 대상 LOB (예: CLOB 컬럼, BLOB 컬럼..

DB 2025.08.05

[DB][Oracle] LISTAGG(DISTINCT ...)

https://imswengineer.tistory.com/1301 [DB][Oracle] LISTAGGLISTAGG는 Oracle DB를 포함한 SQL 데이터베이스에서 여러 행의 값을 하나의 문자열로 집계(Aggregation) 할 때사용하는 함수입니다.주로 그룹화된 데이터를 문자열로 연결할 때 유용합니다.📌 기본 문imswengineer.tistory.com 중복 제거: 기본적으로 중복 제거는 안 됨 → DISTINCT 서브쿼리로 처리해야 함으로 작성하였는데 ✅ 오라클 21c 이상일 경우 LISTAGG(DISTINCT ...)도 가능오라클 21c 이상에서는 다음과 같은 문법이 공식 지원됩니다:LISTAGG(DISTINCT CI.EXHL_CD, ', ') WITHIN GROUP (ORDER BY ..

DB 2025.07.04

[DB][MySQL] ROW_NUMBER()와 WITH (CTE)를 사용할 때 성능 차이

✅ 시나리오 예제: 게시판 페이징데이터 상황게시글 테이블 T_BD에 10만 건의 데이터가 있다고 가정게시글에는 공지사항(상단 고정) 여부, 등록일, 제목, 본문 등의 컬럼이 있음목표: 특정 게시글(BD_CD)이 몇 페이지에 있는지 계산① 인라인 뷰 (서브쿼리) 방식sql복사편집SELECT * FROM ( SELECT BD_CD , BD_TITLE , ROW_NUMBER() OVER (ORDER BY NOTI_YN DESC, INS_DT DESC) AS RN FROM T_BD WHERE USE_YN = TRUE ) R WHERE R.BD_CD = 'BD12345'; 🟢 장점BD_CD 조건이 바깥쪽에서 바로 필터링되므로 불필요한 전체 정렬을 피할..

DB 2025.05.26

[DB][Oracle] 동적으로 정렬이 바뀔 때 행 번호 매기기 (ROWNUM, ROW_NUMBER())

✅ 방법 1: SQL에서 여러 정렬 기준을 동적으로 설정 (CASE WHEN 사용)SELECT ROW_NUMBER() OVER ( ORDER BY CASE WHEN :sort_col = 'emp_id' THEN emp_id END , CASE WHEN :sort_col = 'emp_name' THEN emp_name END , CASE WHEN :sort_col = 'salary' THEN salary END ) AS RN , emp_id , emp_name , salary FROM employees;:sort_col은 바인딩 변수 (예: 'emp_id', 'emp_name', 'salary')정렬 기준을 바꾸면 그에 따라..

DB 2025.05.19

[DB] LISTAGG / STRING_AGG

✅ 1. 기본 개념항목LISTAGG (Oracle)STRING_AGG (PostgreSQL, SQL Server)목적문자열 집계 (여러 행 → 하나의 문자열)동일지원 DBOraclePostgreSQL, SQL Server 등기본 구문LISTAGG(col, ', ') WITHIN GROUP (ORDER BY col)STRING_AGG(col, ', ')정렬WITHIN GROUP (ORDER BY col) 필요ORDER BY col 옵션 제공 (WITHIN GROUP 아님)중복 제거DISTINCT 서브쿼리 필요DISTINCT 바로 사용 가능 (PostgreSQL 13+) ✅ 2. 예제 비교📌 Oracle (LISTAGG)SELECT DEPT_ID , LISTAGG(EMP_NAME, ', ') WIT..

DB 2025.05.16
728x90
반응형