SQL 35

서브쿼리

서브쿼리를 사용해야 하는 경우 정리 (Oracle SQL)SQL에서 단순 조회는 어렵지 않지만, 특정 조건이나 정렬 기준을 우선 적용한 후 일부 행만 추출하거나 계산된 값을 조건으로 사용할 경우, 단순 쿼리로는 원하는 결과를 얻기 어렵습니다. 이럴 때는 서브쿼리(Subquery)를 적절히 사용해야 합니다. 정렬된 결과에서 상위 N개만 조회하고 싶을 때예시 요구사항"최신 등록순으로 정렬된 결과에서 상위 10명을 조회하시오." ❌ 잘못된 쿼리 (순서 오류 발생)SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 1 AND 10ORDER BY REGDATE DESC;ROWNUM은 정렬 전에 부여되기 때문에, 최신 순으로 정렬된 결과가 아님.ORDER BY는 WHERE 절 이후에 실행되어..

SQL 2025.07.16

ROW_NUMBER(), RANK()

ROWNUM: 조회 순서 기준 번호 부여SELECT ROWNUM, ID, TITLE, WRITER_ID, REGDATE, HIT FROM NOTICE ORDER BY HIT;ROWNUM은 실제 데이터를 가져오는 순서대로 번호를 매깁니다.ORDER BY보다 먼저 실행되기 때문에, ORDER BY HIT로 정렬해도 ROWNUM은 정렬되기 전 순서로 매겨집니다.따라서 원하는 정렬 기준에 따라 순위를 매기고 싶을 때는 적절하지 않습니다.문제점 예시: HIT 기준으로 정렬하고 싶지만, ROWNUM은 정렬 전 순서를 따름 ROW_NUMBER(): 정렬 기준대로 일렬 번호 부여SELECT ROW_NUMBER() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, H..

SQL 2025.07.16

GROUPBY, HAVING

SQL에서는 데이터를 집계하거나 그룹 단위로 조건을 필터링할 때 GROUP BY와 HAVING 절을 사용합니다. 하지만 WHERE과의 차이, 실행 순서 등은 처음 접하면 헷갈리기 쉽습니다. SQL 실행 순서 먼저 이해하자우리가 자주 쓰는 SELECT문의 형식은 다음과 같지만,SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …실제로 SQL이 실행되는 순서는 다음과 같습니다:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BYWHERE은 GROUP BY보다 먼저 실행되고,HAVING은 GROUP BY 다음에 실행된다는 점이 핵심입니다. GROUP BY란?GROUP BY는 특정 컬럼을 기준으로 같은 값을 가지는 행들끼리 묶..

SQL 2025.07.16

SELECT구절과 ODERBY

SELECT문의 전체 구조와 실행 순서SQL에서 SELECT 문은 다음과 같은 순서로 작성되고 실행됩니다:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY⚠️ 이 순서는 바뀌면 문법 오류가 발생하므로 절대적인 순서입니다. 이유는 각 절이 앞 절의 결과를 바탕으로 작동하기 때문입니다. 각 절의 역할은 아래와 같습니다: FROM데이터를 가져올 테이블을 지정합니다.WHERE테이블에서 가져온 행들 중에서 조건에 맞는 행만 선택합니다.GROUP BY행들을 특정 열의 값에 따라 그룹핑합니다.HAVING그룹핑된 결과에 대해 조건을 다시 필터링합니다. (WHERE처럼 동작하지만 그룹 기준)SELECT어떤 열을 출력할지 선택합니다. 이 시점에서 집계함수를 적용할 수 있습니다..

SQL 2025.07.16

NULL 관련 함수

NVL(NULL값, 대체값)NULL이면 대체값을 반환하고, 그렇지 않으면 원래 값 반환 SELECT NVL(AGE, 0) FROM MEMBERS;AGE 컬럼 값이 NULL이면 0으로 대신 출력 NVL2(입력값, NOT NULL일 때, NULL일 때)입력값이 NULL이 아니면 두 번째 값, NULL이면 세 번째 값을 반환 SELECT NVL2(AGE, 100/AGE, 0) FROM MEMBERS;AGE가 NULL이 아니면 100/AGE 수행AGE가 NULL이면 0 반환 NULLIF(값1, 값2)두 값이 같으면 NULL, 다르면 첫 번째 값 반환 SELECT NULLIF(AGE, 19) FROM MEMBERS;AGE가 19이면 NULL 반환AGE가 19가 아니면 AGE 값을 그대로 반환주로 조건 비교 후 N..

SQL 2025.07.16

형식 변환 함수

변환 함수의 구조와 흐름개요Oracle에서 데이터형 변환은 매우 중요합니다. 각 데이터 타입(숫자, 문자열, 날짜)을 서로 변환하기 위해 아래 함수를 사용합니다:주요 함수 관계변환 방향사용 함수숫자 → 문자열TO_CHAR(number)날짜 → 문자열TO_CHAR(date)문자열 → 숫자TO_NUMBER(string)문자열 → 날짜TO_DATE(string)문자열 → 타임스탬프TO_TIMESTAMP(string)즉, 변환은 모두 문자열(String) 중심으로 이루어집니다. TO_CHAR(number) 숫자 → 문자열 변환예시SELECT TO_CHAR(12345678, '$99,999,999,999.99') FROM DUAL;숫자를 통화 형식 문자열로 바꿉니다.포맷은 숫자의 자릿수보다 더 넉넉하게 지정해야..

SQL 2025.07.16

날짜 함수

현재 시간과 세션 시간 포맷 관련 함수현재 시간 얻기SELECT SYSDATE, CURRENT_DATE, SYSTIMESTAMP, CURRENT_TIMESTAMP FROM DUAL;SYSDATE: 서버의 현재 날짜/시간CURRENT_DATE: 사용자의 세션 시간대 기준 현재 날짜SYSTIMESTAMP: 날짜 + 시간 + 소수초 + 타임존 포함CURRENT_TIMESTAMP: 세션 기준의 타임존 포함 시간※ CURRENT_DATE는 "접속자의 시간대" 기준으로 다르게 보일 수 있습니다. 세션의 시간대, 포맷 변경ALTER SESSION SET TIME_ZONE = '-1:0';ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';TIME_ZONE: 세션..

SQL 2025.07.16

숫자 함수

절대값, 부호, 반올림 함수ABS(n) — 절대값을 반환주어진 숫자 n의 절대값(음수를 양수로) 반환합니다. SELECT ABS(35), ABS(-35) FROM DUAL; -- 결과: 35, 35 SIGN(n) — 부호 반환숫자의 부호를 알려주는 함수입니다:양수이면 1음수이면 -10이면 0 SELECT SIGN(35), SIGN(-35), SIGN(0) FROM DUAL; -- 결과: 1, -1, 0 ROUND(n, i) — 반올림n의 소수점 i번째 자리까지 반올림합니다.i 생략 시 정수로 반올림합니다.예시 1 (정수로 반올림):SELECT ROUND(34.456789), ROUND(34.56789) FROM DUAL; -- 결과: 34, 35예시 2 (소수점 자리 지정):SELECT ROUND(12...

SQL 2025.07.16

문자열 함수

문자열 추출 함수 - SUBSTR()기본형SUBSTR(문자열, 시작위치, 길이)문자열에서 특정 위치부터 원하는 길이만큼 문자열을 잘라서 반환합니다.예시SELECT SUBSTR('HELLO', 1, 3) FROM DUAL; -- HELSELECT SUBSTR('HELLO', 3) FROM DUAL; -- LLO (끝까지)SELECT SUBSTRB('HELLO', 3) FROM DUAL; -- 바이트 기준 추출예제생년월일(BIRTHDAY)에서 월 정보(3~4자리)만 추출: SELECT NAME, SUBSTR(BIRTHDAY, 3, 2) FROM MEMBERS;전화번호가 '011'로 시작하는 회원 조회: SELECT * FROM MEMBERS WHERE SUBSTR(PHONE, 1, 3) ..

SQL 2025.07.16

ROWNUM

ROWNUM 이란?ROWNUM은 Oracle 전용 가상 컬럼입니다.SELECT 결과에 순차적으로 번호를 부여합니다.가장 먼저 선택된 행이 ROWNUM = 1, 두 번째가 2...⚠️ 주의사항:ROWNUM은 정렬(ORDER BY)이 적용되기 전에 부여됩니다! 기본 예제SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 1 AND 5;이 쿼리는 MEMBER 테이블에서 처음 나온 5개 행을 가져옵니다.단순히 출력 순서대로 5행까지 자른다는 의미입니다.만약 정렬이 없으면 테이블에 들어간 순서로 출력됩니다. 문제점 (정렬과 함께 쓸 때)SELECT * FROM MEMBER WHERE ROWNUM 이 쿼리는 잘못된 결과를 줄 수 있습니다.왜냐하면 ROWNUM은 ORDER BY 전에 붙기 때문..

SQL 2025.07.15