[Oracle] 데이터 추출 명령 - SELECT

devheyrin·2022년 7월 30일
1

Oracle

목록 보기
2/10

SELECT

  • 데이터를 추출하는 명령(출력 아님!)

컬럼 별칭 설정

select 컬럼명 (as) [별칭|"별 칭*#"] from 테이블명;

예제

SQL> select ename "이름" , job as 업무, hiredate 입사일 from emp;

이름       업무      입사일
---------- --------- --------
SMITH      CLERK     80/12/17
ALLEN      SALESMAN  81/02/20
WARD       SALESMAN  81/02/22
JONES      MANAGER   81/04/02
MARTIN     SALESMAN  81/09/28
BLAKE      MANAGER   81/05/01
CLARK      MANAGER   81/06/09
SCOTT      ANALYST   87/04/19
KING       PRESIDENT 81/11/17
TURNER     SALESMAN  81/09/08
ADAMS      CLERK     87/05/23

이름       업무      입사일
---------- --------- --------
JAMES      CLERK     81/12/03
FORD       ANALYST   81/12/03
MILLER     CLERK     82/01/23

14 개의 행이 선택되었습니다.

데이터 추출

select 컬럼명,... from 테이블명,...; -- 컬럼 제한 
  1. from - 현재 유저가 테이블을 소유하고 있는지 확인 → 테이블 전체가 후보가 된다.
  2. where - 행(데이터)을 제한한다. where절이 참인 행만 추출 대상이 된다.
  3. select - 컬럼을 제한한다.
where 컬럼명 조건 -- 행(데이터) 제한 

연산자

  1. 산술연산자 : +, -, *, /, mod
  2. 관계연산자 : =, ≠, (<>), >, <, ≥, ≤
  3. 문자열 연산자 : like (% 모든 문자, _ 한 개의 문자)
  4. 논리연산자 not, and, or (두 개의 조건을 묻는 연산)

부서 번호가 20번인 사람 추출

select deptno, ename from emp where deptno = 20;

급여가 1000~2000인 사람 추출

SQL> select ename, sal from emp
  2  where sal >= 1000 and sal <= 2000;

ENAME             SAL
---------- ----------
ALLEN            1600
WARD             1250
MARTIN           1250
TURNER           1500
ADAMS            1100
MILLER           1300

6 개의 행이 선택되었습니다.
SQL> select ename, sal from emp
  2  where sal between 1000 and 2000; 
-- 어차피 and 연산으로 변환되어 실행된다. 권장되지 않는 방법 

1000~2000이 아닌 사람 추출

SQL> select ename, sal from emp
  2  where not (sal >= 1000 and sal <= 2000);
-- 인덱스를 사용할 수 없는 추출 (시간이 오래 걸린다) 
SQL> select ename, sal from emp
  2  where sal < 1000 or sal > 2000; 
-- 인덱스를 사용하는 추출 (성능을 위해 권장되는 방법) 

업무가 ‘salesman’, ‘clerk’ 인 사람을 추출

  • Oracle 에서 값은 대/소문자를 구분한다.
  • UPPER & LOSWER 함수를 이용해 바꿔준 뒤 비교한다.
SQL> select ename, job from emp
  2  where job like 'SALESMAN' or job like 'CLERK';

SQL> select ename, job from emp
  2  where lower(job) like 'salesman' or lower(job) like 'clerk';

SQL> select ename, job from emp
  2  where lower(job) = 'salesman' or lower(job) = 'clerk';

SQL> select ename, job from emp
  2  where job in ('SALESMAN', 'CLERK');
-- in: 서브쿼리를 넣을 때 주로 사용하는 문법

ENAME      JOB
---------- ---------
SMITH      CLERK
ALLEN      SALESMAN
WARD       SALESMAN
MARTIN     SALESMAN
TURNER     SALESMAN
ADAMS      CLERK
JAMES      CLERK
MILLER     CLERK

8 개의 행이 선택되었습니다.

입사일이 87/01/01~22/07/18 인 사람 추출(날짜 제한)

select ename, hiredate from emp
where hiredate >= to_date('87/01/01') and hiredate < to_date('22/07/19');

ENAME      HIREDATE
---------- --------
홍동우     22/07/18
SCOTT      87/04/19
ADAMS      87/05/23

-- 날짜비교만 하는 경우는 to_date 없이도 가능 
select ename, hiredate from emp
where hiredate >= '87/01/01' and hiredate < '22/07/19';

입사일이 22/07/18 자정~오후 6시까지인 사람 추출 (시간 제한)

-- 시간비교를 하는 경우 to_date 함수를 사용 
select ename, hiredate from emp
where hiredate >= '22/07/18' 
and hiredate <= to_date('22/07/18 18:00:00', 'YY-MM-DD HH24:MI:SS');

ENAME      HIREDATE
---------- --------
홍동우     22/07/18

[xxx의 급여는 xxx이다] 형태로 추출 - 연결 연산자 || 사용

SQL> select ename||'의 급여는 '||NVL(sal, 0)||'이다' as "직원급여" from emp;

직원급여
----------------------------------------------------------------
홍동우의 급여는 이다
SMITH의 급여는 800이다
ALLEN의 급여는 1600이다
WARD의 급여는 1250이다
JONES의 급여는 2975이다
MARTIN의 급여는 1250이다
BLAKE의 급여는 2850이다
CLARK의 급여는 2450이다
SCOTT의 급여는 3000이다
KING의 급여는 5000이다
TURNER의 급여는 1500이다

직원급여
----------------------------------------------------------------
ADAMS의 급여는 1100이다
JAMES의 급여는 950이다
FORD의 급여는 3000이다
MILLER의 급여는 1300이다

15 개의 행이 선택되었습니다.

COMM 열이 NULL인 행 선택 - NULL은 비교연산할 수 없다!

SQL> select * from emp where comm is null;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/04/19       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7876 ADAMS      CLERK           7788 87/05/23       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

이름, 급여, 커미션, 총급여(급여+커미션) 를 추출

  • COMM이 NULL이면 0으로 대체 - nvl(comm, 0)
SQL> select ename 이름, sal 급여, comm 커미션 , sal+nvl(comm, 0) 총급여  from emp;

이름             급여     커미션     총급여
---------- ---------- ---------- ----------
SMITH             800                   800
ALLEN            1600        300       1900
WARD             1250        500       1750
JONES            2975                  2975
MARTIN           1250       1400       2650
BLAKE            2850                  2850
CLARK            2450                  2450
SCOTT            3000                  3000
KING             5000                  5000
TURNER           1500          0       1500
ADAMS            1100                  1100

이름             급여     커미션     총급여
---------- ---------- ---------- ----------
JAMES             950                   950
FORD             3000                  3000
MILLER           1300                  1300

문자열 연산자 LIKE

이름의 두 번째 문자가 L인 사람 추출

SQL> select ename from emp where ename like '_L%';

ENAME
----------
ALLEN
BLAKE
CLARK

이름에 L을 두 번 이상 포함하는 사람 추출

SQL> select ename from emp where ename like '%L%L%';

ENAME
----------
ALLEN
MILLER

이름에 L을 두번만 포함하는 사람 추출 - instr 함수 사용)

  • 2번째 L은 존재하고, 3번째 L은 존재하지 않는 경우
select ename from emp where instr(ename, 'L', 2) > 0 and instr(ename, 'L', 3) = 0;

이름이 A로 시작하거나 두 번째 문자가 D인 사람 추출

SQL> select ename from emp where ename like 'A%' or ename like '_D%';

ENAME
----------
ALLEN
ADAMS
profile
개발자 헤이린

0개의 댓글