simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바메모리구조
  • 참조변수
  • 404
  • 자바프로그램
  • controllerTest
  • 컨트롤러
  • scanner #next() #nextLine()
  • null
  • 스프링
  • 자바
  • 참조타입
  • JVM메모리구조
  • 자바프로그래밍

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

Language/SQL

[DATABASE] SELECT쿼리 진행 순서, 서브쿼리

2022. 4. 17. 19:52

■ SELECT 쿼리 진행 순서

  FROM, JOIN > WHERE, GROUP BY, HAVING > SELECT > ORDER BY > DISTINCT > LIMIT

 

▼ 자세한 진행 순서 [더보기]

더보기

1. FROM과 JOIN

- JOIN이 먼저 실행되어 데이터가 SET으로 모아지게 된다. 서브쿼리도 함께 포함되어 임시 테이블을 만들 수 있게 도와준다.

2. WHERE

- 데이터셋을 형성하게 되면 WHERE의 조건이 개별 행에 적용된다. WHERE절의 제약 조건은 FROM절로 가져온 테이블에 적용될 수 있다.

3. GROUP BY

- WHERE의 조건 적용 후 나머지 행은 GROUP BY절에 지정된 열의 공통 값을 기준으로 그룹화된다. 쿼리에 집계 기능이 있는 경우에만 이 기능을 사용해야 한다.

4. HAVING

- GROUP BY절이 쿼리에 있을 경우 HAVING 절의 제약조건이 그룹화된 행에 적용된다.

5. SELECT

- SELECT에 표현된 식이 마지막으로 적용된다.

6. DISTINCT

- 표현된 행에서 중복된 행은 삭제

7.ORDER BY

- 지정된 데이터를 기준으로 오름차순, 내림차순 지정

8. LIMIT

- LIMIT에서 벗어나는 행들은 제외되어 출력된다.



출처: https://dev-coco.tistory.com/158 [슬기로운 개발생활😃]

 

 

■ 서브 쿼리

단일 행(Sing-Row) 서브쿼리 SELECT 문장으로 부터 오직 하나의 행 만을 검색하는 질의
다중 행(Multiple-Row) 서브쿼리 SELECT 문장으로부터 하나 이상의 행을 검색하는 질의
다중 열(Multiple-Column) 서브쿼리 SELECT 문장으로부터 하나 이상의 컬럼을 검색하는 질의
FROM절상의 서브쿼리(INLINE VIEW) FROM절상에 오는 서브쿼리로 VIEW처럼 작용
상관관계 서브 쿼리 바깥쪽 쿼리의 컬럼 중의 하나가 안쪽 서브쿼리의 조건에 이용되는 처리 방식

 

[단일행 서브쿼리 예시]

-- Q1. 사원 테이블에서 이미자와 동일한 계절에 입사한 직원 추출
SELECT * FROM SAWON 
  WHERE TRUNC(TO_NUMBER(TO_CHAR(sahire,'MM')) / 3, 0) = (
                                                            SELECT
                                                               TRUNC(TO_NUMBER(TO_CHAR(sahire,'MM')) / 3, 0)
                                                               FROM SAWON
                                                               WHERE SANAME = '이미자'
                                                         );


-- Q2. 사원 테이블에서 총 급여 평균 보다 더 급여를 많이 받는 직원 추출
SELECT * FROM SAWON
  WHERE SAPAY > (SELECT AVG(SAPAY) FROM SAWON);


-- Q3. 사원 테이블에서 최초 입사한 직원을 추출
SELECT * FROM SAWON
 WHERE SAHIRE = (SELECT MIN(SAHIRE) FROM SAWON)


-- Q4. 사원 테이블에서 가장 최근 입사한 직원을 추출 
SELECT * FROM SAWON
 WHERE SAHIRE = (SELECT MAX(SAHIRE) FROM SAWON)

-- Q5. 사원 테이블에서 일자를 기준으로 최초입사자, 최근입사자를 모두 추출
SELECT * FROM SAWON
  WHERE SAHIRE = (SELECT MIN(SAHIRE) FROM SAWON)
        or
        SAHIRE = (SELECT MAX(SAHIRE) FROM SAWON);

 

[다중행 연산자]

IN 연산자 하나의 컬럼이 여러개의 '=' 조건을 가지는 경우 사용. 포함된다는 의미
ANY 연산자 Subquery의 여러 결과값 중 어느 하나의 값만 만족이 되면 행을 반환
ALL 연산자 Subquery의 여러 결과값 중 모든 결과 값을 만족해야 행을 반환
EXISTS 연산자  Subquery 데이터가 존재하는가를 체크해 존재 여부(TRUE,FALSE)를 결과로 반환
-- IN은 같냐를 바꾼 것
SELECT * FROM sawon
 WHERE deptno IN (SELECT deptno FROM sawon WHERE saname = '최불암')
   
-- ANY를 붙이면 다중행 있을 때,
-- 3000이상 받는지 OR 3500이상 받는지
-- (이미자가 둘 이상 있을 떄) 사원 테이블에서 이미자와 같거나 더 큰 급여를 받는 직원 추출
SELECT * FROM sawon
 WHERE sajob >= ANY (SELECT sajob FROM sawon WHERE saname = '이미자')

-- ALL를 붙이면 다중행 있을 때.
-- 3000이상이면서 35000이상이어야한다. 
-- (이미자가 둘 이상 있을 떄) 사원 테이블에서 이미자와 같거나 더 큰 급여를 받는 직원 추출
SELECT * FROM sawon
 WHERE sajob >= ALL (SELECT sajob FROM sawon WHERE saname = '이미자')

 

[상관쿼리]

- 주 쿼리의 정보를 서브쿼리가 이용해서 추출된 결과를 주쿼리를 선택하는데 이용한다.

-- 사원 테이블에서 각 부서별 최고 급여자를 추출한다고 했을 때

[방법1] 조건을 하나씩 달아준다.
-- >> 아래 코드의 경우, 부서가 증가하거나, 부서번호가 변경되면 일일히 수정해야한다.
SELECT * FROM SAWON
  WHERE SAPAY = (SELECT MAX(SAPAY) FROM SAWON WHERE DEPTNO = 10) and DEPTNO = 10
        OR
        SAPAY = (SELECT MAX(SAPAY) FROM SAWON WHERE DEPTNO = 20) and DEPTNO = 20
        OR
        SAPAY = (SELECT MAX(SAPAY) FROM SAWON WHERE DEPTNO = 30) and DEPTNO = 30
        OR
        SAPAY = (SELECT MAX(SAPAY) FROM SAWON WHERE DEPTNO = 40) and DEPTNO = 40
  ORDER BY DEPTNO ASC;  -- 부서번호별 오름차순

[방법2] 상관쿼리르 사용한다.
-- 위의 SQL문의 문제점(코드가 너무 길다) 해결 
-- >> 상관쿼리 : 주쿼리의 정보를 서브쿼리가 이용해서 추출된 결과를 주쿼리를 선택하는데 이용한다. 
SELECT * FROM SAWON S1
  WHERE SAPAY = (SELECT MAX(SAPAY) FROM SAWON WHERE DEPTNO = S1.DEPTNO)
  ORDER BY S1.DEPTNO ASC;

 

 

[출처]

- https://dev-coco.tistory.com/158

- https://myjamong.tistory.com/172

- http://www.gurubee.net/

- 국비지원과정 수업 참조

'Language > SQL' 카테고리의 다른 글

[DATABASE] DECODE, CASE~END 문  (0) 2022.04.18
[DATABASE] 정렬(ORDER NY) 및 그룹 통계(GROUP BY)  (0) 2022.04.18
[DATABASE] 중복 값 제거 _ DISTINCT  (0) 2022.04.16
[DATABASE] 함수  (0) 2022.04.15
[DATABASE] 연산을 통한 데이터 조회  (0) 2022.04.14
    'Language/SQL' 카테고리의 다른 글
    • [DATABASE] DECODE, CASE~END 문
    • [DATABASE] 정렬(ORDER NY) 및 그룹 통계(GROUP BY)
    • [DATABASE] 중복 값 제거 _ DISTINCT
    • [DATABASE] 함수
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바