서브쿼리, 집합 연산자 ,단일 행 함수 , GROUP BY, HAVING

1. 서브 쿼리 

 

서브 쿼리는 SQL문에 완전한 SELECT문이 포함되며, 원래 SQL문은 메인 쿼리, 내부 SELECT문은 서브 쿼리라고 부른다. 서브 쿼리의 종류는 단일 행 서브 쿼리, 다중 행 서브 쿼리, 다중 열 서브 쿼리가 있다. 

 

1-1 단일 행 서브쿼리 

 

===============================================

SELECT 컬럼 ...

FROM 테이블

WHERE 컬럼 단일_행_연산자 (SELECT 문장 : Sub query문)

......;

===============================================

  • 단일 행 연산자가사용됨으로 반드시 서브 쿼리의 결과 값은 한 개만 검색돼야 한다.
  • 서브 쿼리는 반드시 괄호로 묶는다.
  • 서브 쿼리는 메인 쿼리 실행 전에 실행된다.
  • 서브 쿼리의 검색된 결과 값은 메인 쿼리에 사용된다.
  • 단일 행 연산자 오른쪽에 기술한다.
  • WHERE절에 기술된 열의 숫자와 타입은 SELECT절과 1:1 대응 관계가 되어야 한다.

 

1-2 다중 행 서브 쿼리

 

=====================================================

SELECT 컬럼 ...

FROM 테이블

WHERE 컬럼 다중_행_연산자 (SELECT 문장 : Sub query문)

......;

=====================================================

  • 서브 쿼리에 여러 행이 검색되는 경우 사용
  • 다중 행 연산자를 이용
  • 다중 행 연산자의 종류(IN, ANY, ALL)
  • IN은 나열된 값 중에 하나만 일치하면 된다.
  • ANY : 나열된 값 일부와 일치하면 된다.
  • ALL : 나열된 값 전체와 일치해야 한다. 
  • 컬럼 > ALL → 컬럼 > MAX() : 가장 큰값보다크다
  • 컬럼 < ALL → 컬럼 < MIN() : 가장 작은값보다작다.
  • 컬럼 > ANY → 컬럼> MIN() : 가장작은값보다크다.
  • 컬럼 < ANY → 컬럼 < MAX() : 가장큰값보다작다.

 - ALL은 범위가 좁고, ANY는 범위가 넓다. 

 

1-3 다중 열 서브 쿼리 

 

==============================================

SELECT 컬럼 ...

FROM 테이블

WHERE (컬럼1, 컬럼2, ...) IN (SELECT 문장 : Sub query문)

......;

==============================================

  • IN 연산자만 있으며, 반드시 써야할 수도 있음
  • 서브 쿼리의 SELECT문에 여러 개의 컬럼을 검색
  • 여러 개의 컬럼을 검색하는 서브 쿼리 문을 이용할 때는 반드시 비교 대상 컬럼과 대응돼야 함
  • 다중 열 서브쿼리에서 서브 쿼리의 검색 결과가 단지 하나의 행이면 = 연산자가 가능은 하지만 되도록 IN 연산자를 이용

 

2. 집합 연산자

 

===========================================

SELECT ...

 [UNION ALL | UNION | INTERSECT | MINUS]

SELECT ...

===========================================

  • UNION : 합집합, 검색된 결과의 합으로 중복이 제거, 중복을 제거하기 때문에 정렬이 내부적
  • UNION ALL : 합집합, 검색된 결과의 합으로 중복이 허용, 정렬 안함
  • INTERSECT : 교집합 , 양쪽 모두에 포함된 결과만 검색
  • MINUS : 차집합, 첫 번재 검색 결과에서 두 번째 검색 결과를 제외한 나머지만 검색

3. 단일 행 함수

  • 단일 행 함수를 이용하면 검색된 데이터에 대해서 각 행별로 연산된 결과 값을 얻을 수 있으며 중첩이 가능하다.
  • 단일 행 함수는 응용프로그램의 오류를 줄이고 개발 시간을 단축 할 수 있다.
  • 인수로는 컬럼명, 수식, 변수, 상수 등을 사용할 수있다 =  함수명(인수1, 인수2, ...)
  • 단일 행 함수는 SELECT절이나 WHERE절 또는 HAVING 절 등 값이 필요한거의 모든 구문에 사용이 가능하다.
  • 단일 행 함수의 종류 - 문자함수, 숫자함수, 날짜함수, 변환함수, 일반함수...

 

 

3-1 문자 함수

함수명 기능 
LOWER 문자열을 소문자로 변환 : LOWER('ORACLE') → oracle
UPPER 문자열을 대문자로 변환 : UPPER('oracle') → ORACLE
INITCAP 첫 번째 문자는 대문자로 나머지는 소문자로 변환 : INITCAP('oracle') → Oracle
SUBSTR 문자열내 지정된 위치의 문자열을 검색 : SUBSTR('oracle', 1, 2) → or
INSTR 문자의 위치 반환 : INSTR('ORACLE', 'A') → 3
TRIM 접두(접미) 글자를 잘라냄 : TRIM('o' FROM 'oracle') → racle
LENGTH / LENGTHB 문자열의 길이나 BYTE를 반환 : LENGTH('디비') → 2 LENGTHB('디비') → 4
LPAD/ RPAD 지정된 문자열의 길이 만큼 빈 부분에 문자를 채움 : LPAD('20000', 10, '*') → *****20000

 

 

3-2 문자 치환 함수

단일행 기능 
TRANSLATE 문자 단위로 치환된 값을 반환 : TRANSLATE('oracle', 'a','#') → or#cle
REPLACE 문자열 단위로 치환된 값을 반환: REPLACE('oracle', 'or', '##') → ##acle

 

 

3-3 숫자 함수 

함수명 기능
ROUND 반올림해서 소수 이하 n자리까지 출력 : ROUND(123.4567, 3) → 123.457
TRUNC 소수이하 n 자리 미만을 절삭 : TRUNC(123.4567, 3) → 123.456
MOD m을 n으로 나눈 나머지를 계산 : MOD(10, 4) → 2
POWER m의 n승을 계산  : POWER(2, 4) → 16
CEIL m 보다 큰 가장 작은 정수를 검색 : CEIL(2.34) → 3
FLOOR m 보다 작은 가장 큰 정수를 검색 : FLOOR(2.34) → 2
SQRT 제곱근을 검색 : SQRT(9) → 3
SIGN  음수: -1, 양수: 1, 0 이면 0을 검색 : SIGN(-3) → -1

 

3-4 날짜 함수 

함수명 기능
ROUND 형식에 따라 반올림 : ROUND(sysdate, 'DD') → '2021/09/23'
TRUNC 형식에 따라 절삭 : TRUNC(sysdate, 'YYYY') → '2021/01/01'
MONTHS_ BETWEEN 두 날짜간의 기간을 월수로 계산 :  MONTHS_BETWEEN('2013/09/01', '2013/01/01') → 8
LAST_DAY 날짜를 포함한 달의 마지막 날짜를 검색 :  LAST_DAY('2013/09/24') → 2013/09/30
ADD_ MONTHS 날짜에n 달을더한날짜를검색한다. ADD_MONTHS('2011/07/01', 23) → 2013/06/01
NEXT_DAY 날짜 이후 지정된 요일에 해당하는 날짜를 검색 :  NEXT_DAY('2013/07/14', '일요일') → 2013/07/21

 

3-5 변환 함수

함수명 기능
TO_CHAR 날짜나 숫자를 지정된 형식의 문자로 변환 : TO_CHAR(날짜, 형식), TO_CHAR(숫자, 형식)
TO_DATE 문자를 지정된 형식의 날짜로 해석 : TO_DATE(문자, 형식)
TO_NUMBER 문자를 숫자로 해석 , 대부분의 경우 오라클의 자동 형변환에 의해 SQL 구문 작성시에는 사용빈도가 매우 낮다
  • TO_CHAR : 데이터를 출력하거나 전달할 때 서식에 맞추어 가공하는 기능을제공 이를 통해 응용프로그램의 부담을 줄이고 가독성과 생산성을 높임
  • TO_DATE : 사용자가 입력하거나 전달받은 문자열을 시스템이 정확한 형식에 따라 날짜로 해석하도록 하는함수로 날짜데이터에 반드시 사용

 

4. 그룹 함수

함수 설명
MAX(컬럼) 컬럼값 중에 최대값을 반환
MIN(컬럼) 컬럼값 중에 최소값을 반환
AVG(컬럼) 평균값을 반환
COUNT(컬럼| *) NULL이 아닌 행의수를 반환(*는모든행의 수를 반환)
SUM(컬럼) 컬럼의 합계를 반환
STDDEV(컬럼) 표준편차를 반환
VARIANCE(컬럼) 분산을 반환

※ 그룹함수에서 NULL은 무시

 

5. GROUP BY

 

=========================

SELECT ...

FROM 테이블 ...

WHERE 조건 ...

GROUP BY 컬럼

ORDER BY 정렬_대상 ... ;

=========================

  • GROUP BY 절은 컬럼의 동일한 값을 바탕으로 소그룹에 대한 통계정보를 검색
  • SELECT 절에 그룹함수와 같이쓰인 일반컬럼이 GROUP BY 절에 기술되지 않으면 카디널리티(cardinality)가 일치하지 않아 ‘ORA-00937: not a single-group group function’에러가 발생
  • 결과값이 정렬되길 원한다면 반드시 ORDER BY절을 추가
  • GROUP BY 절은 정렬을 수행

6. 카디널리티와 정렬

  • 값의 개수(기수)를 의미
  • SELECT 문의 각 컬럼은 반드시 카디널리티가 같아야됨
  • '그룹 함수와 같이 검색되는 모든 컬럼은 반드시 GROUP BY절에 기술
  • GROUP BY 절에 기술되어도 그룹함수와 같이 검색되지 않는 경우도 있음
  • 카디널리티가 일치하는 것이 중요
  • 오라클은 해시알고리즘을 이용함으로 정렬되지 않음
  • 정렬된 결과를 위해서는 반드시 ORDER BY 절을 이용

 

 

7. HAVING

 

========================

SELECT ...

FROM 테이블 ...

WHERE 조건 ...

GROUP BY 컬럼

HAVING [그룹조건] ...

ORDER BY 정렬_대상 ... ;

=======================

  • HAVING : 조건 중에 그룹함수를 포함하는 조건을 기술
  • HAVING절은 그룹된 결과에 대한 조건이므로 가능한 GROUP BY절 뒤에 기술하는 것을 권함
  • 일반조건은 WHERE 절에 기술
  • 그룹된 컬럼(GROUP BY 절에 기술된)에 대한 조건은 HAVING절에 기술가능 > 권하지 않음

'SQL' 카테고리의 다른 글

ORDER BY , WHERE 절 , JOIN  (0) 2025.10.06
관계형 데이터베이스와 SQL  (0) 2025.10.06