■ 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
- 국비지원과정 수업 참조
'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 |