[Oracle] SQL문

dooboocookie·2022년 9월 29일

DB

목록 보기
6/13

SELECT 문 (Query)

  • DQL(Query)
  • 대상 : 하나 이상의 테이블, 뷰
  • 데이터를 가져오는 데 사용

clause(절) 작성, 처리 순서

WITH        --1 (생략가능)
SELECT      --6
FROM        --2
WHERE       --3 (생략가능)
GROUP BY    --4 (생략가능)
HAVING      --5 (생략가능)
ORDER BY    --7 (생략가능)

SELECT 절에서 사용하는 키워드

키워드내용
DISTINCT컬럼에 중복된 내용 배제
ALL중복된 내용도 모두 조회 (생략되어 있음)
AS컬럼의 별칭(alias)을 부여 (생략할 수 있음)

SELECT절 & FROM 절

  • 테이블 또는 뷰
SELECT * --모든 정보
FROM emp;
--FROM 스키마.테이블명;

SELECT ename
        , job
FROM emp;
-- emp 테이블에서 ename, job 컬럼만 조회
  • 문자열 합치기
    • || 연산자
    • concat(a, b) : a와 b 문자열을 합침
SELECT ename || ' ' ||job AS "Name_Job"
--SELECT concat(concat(ename, ' '), job) "Name_Job"
--'SMITH CLERK'의 형태로 "Name_Job" 이름의 컬럼 생성 (AS 생략 가능)
FROM emp;
-- emp 테이블에서 ename, job 컬럼만 조회
  • 숫자 연산 & null 값 처리
    • + 연산자
    • NVL(expr1, expr2) : expr1이 널일때 expr2로 변환
    • NVL2(expr1, expr2, expr3) : expr1이 널이 아니면 expr2, 널이면 expr3로 변환
SELECT comm
        , NVL(comm, 0) -- comm이 null이면 0으로 출력
        , sal + NVL(comm, 0) -- sal과 NVL(comm, 0)덧셈 연산
FROM emp;

WHERE 절

  • 조건을 묻는 절
  • 절안에서 연산자들을 많이 씀
SELECT *
FROM emp
WHERE deptno = 10;
-- deptno 가 10인 값만 조회
  • 날짜 비교
SELECT ibsadate, name
FROM insa
WHERE SUBSTR(ibsadate, 0, 2) = '98';
--WHERE ibsadate BETWEEN '1998.1.1' AND '1998.12.31';
--WHERE ibsadate >= '1998.1.1' AND ibsadate <= '1998.12.31';
--WHERE ibsadate >= '1998-01-01' AND ibsadate <= '1998-12-31';
--WHERE ibsadate >= '98/01/01' AND ibsadate <= '98/12/31';
-- YY/MM/dd형태인 날짜 ibsadate 컬럼에서 98년도에 해당되는 조건을 묻는 절들

ORDER BY 절

  • 정렬을 위한 절
  • ASC : 오름차순 (생략 시 기본)
  • DESC : 내림차순
SELECT deptno, empno, ename, hiredate
FROM emp  
ORDER BY deptno , hiredate ;
ORDER BY deptno ASC, hiredate DESC;
-- 1차 정렬 : deptno 부서별로 1차 오름차순 정렬
-- 2차 정렬 : 입사일자를 기준으로 내림차순 정렬

WITH 절

  • 서브쿼리 블럭을 미리 선언하여 나중에 반복하여 사용하기 위한 절
  • 하나의 WITH절에 여러개 쿼리 블럭 사용 가능
  • (WITH절이 없는) SELECT 문 이 쿼리 블럭 안에 포함
  • 코딩을 간결하게 함

서브 쿼리

  • SQL 문 부속된 또다른 SQL문
  • 연산자 오른쪽에 위치
  • ()로 묶음
  • ORDER BY절을 사용할 수 없음
위치이름
FROM 절Inline view
WHERE 절Nested subquery
parent, child관계Correlated subquery
WITH temp AS (
    -- 서브쿼리(subquery)
    SELECT deptno, ename, sal + NVL(comm, 0) pay
    FROM emp
    WHERE deptno =30
)
SELECT t.* 
FROM temp t -- t 테이블의 별칭 선언
WHERE pay BETWEEN 1000 AND 2000;
  • 인라인 뷰(inline view)
    • FROM절 안에 서브쿼리
    • 하나의 테이블 명처럼 사용되는 서브쿼리
SELECT t.*
FROM (
    SELECT deptno, ename, sal + NVL(comm, 0) pay
    FROM emp
    WHERE deptno =30
) t
WHERE t.pay BETWEEN 1000 AND 2000;

상관 서브 쿼리(Correlated subquery)

  • 일반 서브 쿼리의 경우, 결과를 메인 쿼리에서 이용
  • 상관 서브 쿼리는 서브 쿼리 안에서 메인 쿼리의 값을 이용
    • 서브쿼리에서 메인쿼리의 값 사용
    • 그 서브쿼리의 결과를 메인 쿼리에서 사용
SELECT *
FROM emp e
WHERE sal = (SELECT MAX(sal) FROM emp WHERE deptno = e.deptno);
-- 조회하려는 행의 deptno의 sal의 최대값을 조회하는 서브쿼리

GROUP BY 절

  • 레코드들의 그룹을 만들기 위한 절
  • 그룹에 대한 정보를 한 행으로 표시
  • 그룹 함수를 사용하는 쿼리문에서 자주 사용
SELECT MAX(sal) max_pay
FROM emp;
-- sal의 최댓값 출력

SELECT deptno,
   MAX(sal) max_pay
FROM emp
GROUP BY deptno;
-- 부서별(deptno로 그룹화) sal 최대값

ROLLUP, CUBE

  • GROUP BY 절에 쓰이는 연산자
  • 그룹에 대해 부분합을 구하는 연산자
  • ROLLUP은 (GROUP BY 컬럼 수) + 1 개의 부분합 출력
    • deptno별 - job별 부분합
    • deptno별 부분합
    • 전체의 부분합
SELECT deptno, job, count(*)
FROM emp
GROUP BY ROLLUP (deptno, job);
deptnoclerksalesmanmanageranalystpresident부분합
101-1-13
201-11-3
10141--6
부분합-----12
  • CUBE는 (GROUP BY 컬럼 수) * 2 개의 부분합 출력
    • deptno별 - job별 부분합
    • deptno별 부분합
    • job별 부분합
    • 전체의 부분합
SELECT deptno, job, count(*)
FROM emp
GROUP BY CUBE (deptno, job);
deptnoclerksalesmanmanageranalystpresident부분합
101-1-13
201-11-3
10141--6
부분합3431112

HAVING 절

  • GROUP BY 절에서 그룹화한 그룹에 대한 조건을 주는 절
  • 반드시 GROUP BY 뒤에 위치 (단독으로는 사용 불가)
  • WHERE절과 달리 그룹 함수 같이 그룹에 대한 조건이 가능
SELECT deptno, MAX(sal) --  [5]부서번호(deptno), 최대급여(sal) 조회하고
FROM emp -- [1] emp 테이블에서
WHERE EXTRACT(YEAR FROM hiredate) = 1981; -- [2] 입사일이 81년도인 사람들을
GROUP BY deptno -- [3] 부서별로 그룹지어(deptno로 그룹화)
HAVING COUNT(*) >= 2 -- [4] 부서원수(그룹의 행 수)가 2명 이상인
ORDER BY deptno; -- [6] 부서번호로 오름차순 정렬하여 출력하라

-- [번호] 순서대로 처리
profile
1일 1산책 1커밋

0개의 댓글