KIC/ORACLE

[Oracle] select를 이용한 검색방법 및 SQLPlus 명령어 사용법

octopengj 2020. 10. 12. 09:39

<문1> 작업한내용(sql명령어)을 파일로 저장하고 싶다?

형식) spool 경로포함해서 경로지정 ~.sql or .txt =>20200630.txt

SQL>spool c:\webtest\2.db\print\20200630.txt

 

 

<문2>id가 1인 홍길동인 데이터를 찾아서 김길동으로 변경하시오. (name이 홍길동인 데이터를 찾아서 김길동으로 변경하시오.)

SQL>select * from prtest;
        ID NAME
---------- ----------
         1 홍길동   => 김길동
         2 테스트
         3 임시
         4 임시2
         5 테스트2
SQL> update prtest set name='김길동' where id=1;
1 행이 갱신되었습니다.

sql>select * from prtest

        ID NAME
---------- ----------
         1 김길동
         2 테스트
         3 임시
         4 임시2
         5 테스트2

 

 

<문3> name 임시2를 삭제하시오.

형식)

  1. delete from 삭제시킬 테이블명; => 테이블의 모든 데이터 삭제

  2. delete from 삭제시킬 테이블명 where 조건식 => 조건식에 만족하는 데이터를 삭제

    (잘못 삭제되는 경우도 있기 때문에 백업테이블을 꼭 생성)


백업테이블 생성

create table 백업t명(b_테이블명) as select * from 원본t명 where 조건식; //조건에 만족하는 데이터를 찾아서 복사하라                                                                           part backup(=부분 backup)

prtes t=> b_prtest 백업테이블을 생성->내용,구조를 똑같이 복사

 

SQL>create table b_prtest as select * from prtest;

id가 3번인 데이터를 prtest에서 찾아서 b_prtest2라는 백업테이블을 생성하라.

SQL>create table b_prtest2 as select * from prtest

SQL> select * from b_prtest2;

     ID NAME
---------- ----------
      3 임시

백업테이블 b_prtest의 모든 내용을 삭제하라

SQL>delete from b_prtest;

 

SQL>delete from prtest where name='임시2';
1 행이 삭제되었습니다.

SQL> select * from prtest;

        ID NAME
---------- ----------
         1 김길동
         2 테스트
         3 임시
         5 테스트2

 

 

검색

 

형식) select 보고자하는 필드명,,,,(=컬럼명),,(*)

        from 검색할 테이블명,,,

        where 조건식(검색하는 필드명 연산자 검색할 값

 

 

 

테이블의 구조를 확인하고 싶다. =>필드?,몇개,자료형으로 구성

                                          =>desc 구조확인할 테이블명

 

테이블의 내용을 확인하고 싶다.=>select * from 테이블명

계정으로 로그인했을때 그때 작업한 내용을 확인 => select * from tab;

SQL> desc emp
 이름                                      널?       유형
 ----------------------------------------- -------- ----------------------------
 EMPNO(사원번호)                       NOT NULL NUMBER(4)=>숫자
 ENAME(사원명)
                                                  VARCHAR2(10)=>영문자(10글자)
 JOB(업무 또는 직책)                                                                    한글 5글자
                                                  VARCHAR2(9)
 MGR(직속상관 사원번호)
                                                   NUMBER(4)
 HIREDATE(입사일)
                                                   DATE(날짜)
 SAL(급여)
                                                   NUMBER(7,2)=>전체 7자리중에서
 COMM(보너스)                                           소수점 둘째자리까지(실수)
                                                   NUMBER(7,2)
 DEPTNO(부서번호)
                                                   NUMBER(2)

sql>select * from emp; //실무X -> where 조건식 사용

                              //데이터 갯수가 적을때 사용

 

SQL>select * from emp;
                         

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 80/12/17        800
        20

      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
        30

      7521 WARD       SALESMAN        7698 81/02/22       1250        500
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7566 JONES      MANAGER         7839 81/04/02       2975
        20

      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
        30

      7698 BLAKE      MANAGER         7839 81/05/01       2850
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      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


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
        30

      7876 ADAMS      CLERK           7788 87/05/23       1100
        20

      7900 JAMES      CLERK           7698 81/12/03        950
        30


     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
      7902 FORD       ANALYST         7566 81/12/03       3000
        20

      7934 MILLER     CLERK           7782 82/01/23       1300
        10


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

 

 

<문4>emp테이블에서 사원번호,이름,업무만 검색하는 SQL구문을 작성?

sql> select empno,ename,job from emp;

     EMPNO ENAME      JOB =>필드명이 영어로 만들어져 있다.
---------- ---------- ---------      =>한국어로 가상으로 변경(=가상필드)
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN
      7521 WARD       SALESMAN
      7566 JONES      MANAGER
      7654 MARTIN     SALESMAN
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER
      7788 SCOTT      ANALYST
      7839 KING       PRESIDENT
      7844 TURNER     SALESMAN
      7876 ADAMS      CLERK

     EMPNO ENAME      JOB
---------- ---------- ---------
      7900 JAMES      CLERK
      7902 FORD       ANALYST
      7934 MILLER     CLERK

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

 

 

<문5>위의 문4의 sql문장중에서 EMPNO ENAME JOB 사원이름 업무로 별칭을 부여해서 출력하는 문장을 작성하시오.

 

*** edit or ed=>sql구문을 편집할 수 있는 편집창(=SQL Buffer창)이 실행

                     현재 방금 실행한 SQL구문의 내용을 수정하고 싶을때 사용

                    =>관리자 권한으로 실행했을때 사용할 수 있는 명령어

                    =>SQL Buffer창에서는 문장 끝에 ;을 쓰면 안된다.

 

SQL Buffer창=>마지막 SQL구문이 저장된 오라클의 메모리영역

형식) select 필드명 as 변경할단어(별칭명),필드명 별칭명 from 테이블명

 

 

 

<문6> 수정을 하고나서 실행시키는 방법

1) /

 

1* select empno,ename as "irum",job j from emp

SQL> / =>SQL Buffer에 저장된 SQL명령어를 실행해서 결과를 보여주는 역할

 

 

SQL> /

     EMPNO irum       J
---------- ---------- ---------
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN
      7521 WARD       SALESMAN
      7566 JONES      MANAGER
      7654 MARTIN     SALESMAN
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER
      7788 SCOTT      ANALYST
      7839 KING       PRESIDENT
      7844 TURNER     SALESMAN
      7876 ADAMS      CLERK

     EMPNO irum       J
---------- ---------- ---------
      7900 JAMES      CLERK
      7902 FORD       ANALYST
      7934 MILLER     CLERK

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

 

2) run or r

 

SQL> r =>한번 버퍼에 저장된 내용을 보여주고 나서 출력

      1* select empno,ename as "irum",job j from emp

 

SQL> r
  1* select empno,ename as "irum",job j from emp

     EMPNO irum       J
---------- ---------- ---------
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN
      7521 WARD       SALESMAN
      7566 JONES      MANAGER
      7654 MARTIN     SALESMAN
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER
      7788 SCOTT      ANALYST
      7839 KING       PRESIDENT
      7844 TURNER     SALESMAN
      7876 ADAMS      CLERK

     EMPNO irum       J
---------- ---------- ---------
      7900 JAMES      CLERK
      7902 FORD       ANALYST
      7934 MILLER     CLERK

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

 

 

* 별칭 작성시 주의사항

1* select empno,ename as ir um,job j from emp
SQL> /
select empno,ename as ir um,job j from emp
                      *
1행에 오류:
ORA-00923: FROM 키워드가 필요한 위치에 없습니다

=>별칭을 작성할때 공백이나 특수기호가 포함된 별칭을 만들때에는 반드시 " "을 줘야 된다.

=>1* select empno,ename as "ir um",job j from emp

 

 

 

<문7> 계산필드 => 기존의 필드를 이용해서 수식도입 -> 가상으로 필드를 생성

emp 테이블에서 직원별로 연봉을 계산해서 출력?

사원이름(ename), 업무(job), 급여(sal), 연봉순(sal*12)으로 출력하는 SQL 작성하라.

sql> select ename,job,sal,sal*12 from emp;

ENAME      JOB              SAL     SAL*12   => 연봉 => "연   봉"
---------- --------- ---------- ----------
SMITH      CLERK            800       9600
ALLEN      SALESMAN        1600      19200
WARD       SALESMAN        1250      15000
JONES      MANAGER         2975      35700
MARTIN     SALESMAN        1250      15000
BLAKE      MANAGER         2850      34200
CLARK      MANAGER         2450      29400
SCOTT      ANALYST         3000      36000
KING       PRESIDENT       5000      60000
TURNER     SALESMAN        1500      18000
ADAMS      CLERK           1100      13200

ENAME      JOB              SAL     SAL*12
---------- --------- ---------- ----------
JAMES      CLERK            950      11400
FORD       ANALYST         3000      36000
MILLER     CLERK           1300      15600

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

sal*12 에 별칭 적용

SQL>ed
SQL> r
  1* select ename,job,sal,sal*12 as "year price" from emp

ENAME      JOB              SAL year price
---------- --------- ---------- ----------
SMITH      CLERK            800       9600
ALLEN      SALESMAN        1600      19200
WARD       SALESMAN        1250      15000
JONES      MANAGER         2975      35700
MARTIN     SALESMAN        1250      15000
BLAKE      MANAGER         2850      34200
CLARK      MANAGER         2450      29400
SCOTT      ANALYST         3000      36000
KING       PRESIDENT       5000      60000
TURNER     SALESMAN        1500      18000
ADAMS      CLERK           1100      13200

ENAME      JOB              SAL year price
---------- --------- ---------- ----------
JAMES      CLERK            950      11400
FORD       ANALYST         3000      36000
MILLER     CLERK           1300      15600

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

 

 

 

<문8> 하나이상의 필드들의 데이터들을 결합->출력(가상의 필드생성)

  •  

    언어->'a',"ab"=>"ab"+"cd"=>"abcd"

     

+ 문자열 결합=>+ 대신에 `||` 
+  "ab"+" "+cd"=>"ab cd"   

 

|| 결합

select ename || job as "concat field" from emp;

concat field
-------------------
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
SCOTTANALYST
KINGPRESIDENT
TURNERSALESMAN
ADAMSCLERK

concat field
-------------------
JAMESCLERK
FORDANALYST
MILLERCLERK

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

 

|| ' ' || 띄어쓰기 적용

 1* select ename || ' ' || job as "concat field" from emp
SQL> /

concat field
--------------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK

concat field
--------------------
JAMES CLERK
FORD ANALYST
MILLER CLERK

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

 

 

<문9> emp테이블에서 급여가 3000이상인 직원을 찾아서 그 직원들의 이름,업무,급여 순으로 출력하는 SQL 작성하시오.

 

관계연산자

  • =>>,>=,<,<=, =(정확하게 알고 있는 경우)

  • 부정!= ,^= ,<>

 

급여가 3000보다 큰 경우

 

SQL> select ename,job,sal
  2  from emp
  3  where sal >= 3000;

ENAME      JOB              SAL
---------- --------- ----------
SCOTT      ANALYST         3000
KING       PRESIDENT       5000
FORD       ANALYST         3000

급여가 3000이 아닌 경우

ed
  1  select ename,job,sal
  2  from emp
  3* where sal != 3000   =>3000가 아닌 데이터를 찾는것
SQL> /

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            800
ALLEN      SALESMAN        1600
WARD       SALESMAN        1250
JONES      MANAGER         2975
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
KING       PRESIDENT       5000
TURNER     SALESMAN        1500
ADAMS      CLERK           1100
JAMES      CLERK            950

ENAME      JOB              SAL
---------- --------- ----------
MILLER     CLERK           1300

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

 

 

<문10> emp테이블에서 업무(job)이 Manager인 사원을 찾아서 그 사원의 사원번호,이름,업무순으로 출력하시오.

select empno as num,ename irum,job
from emp
where job='Manager'; //영문자는 대,소문자를 비교해서 찾는다.
선택된 레코드가 없습니다.

조건에 만족하는 데이터가 없다는 의미

Manager -> MANAGER 수정

1 select empno as num,ename irum,job
 2 from emp
 3 where job='MANAGER'
 
        NUM IRUM       JOB
---------- ---------- ---------
      7566 JONES      MANAGER
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER

 

 

 

<문11>emp테이블에서 급여가 1300에서 1800사이의 직원의 정보를 출력(단 사원이름,업무,급여순)

  • 범위를 지정=>between A and B

select ename,job,sal 
from emp
where sal between 1300 and 1800;

ENAME      JOB              SAL
---------- --------- ----------
ALLEN      SALESMAN        1600
TURNER     SALESMAN        1500
MILLER     CLERK           1300

 

범위 밖의 직원을 구하고자 할 때

  select ename,job,sal
  from emp
  where sal not between 1300 and 1800
  
  ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            800
WARD       SALESMAN        1250
JONES      MANAGER         2975
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
SCOTT      ANALYST         3000
KING       PRESIDENT       5000
ADAMS      CLERK           1100
JAMES      CLERK            950
FORD       ANALYST         3000

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

 

 

 

<문12> SQL구문 작성=>자주 사용이 되거나 검색이 되는 SQL구문 있으면 파일로 저장

  •  

    형식) save '경로포함해서 저장할 파일명(~.sql or .txt)

     

sql>save 'c:\webtest\2.db\print\notbetween.txt'
file c:\webtest\2.db\print\notbetween.txt(이)가 생성되었습니다

 

 

 

<문13> 저장된 파일을 불러오기

  • 형식) get 경로포함해서 불러올 파일명 or @경로포함해서 불러올 파일명

  • get=>파일을 불러올때 바로 실행하는 것이 아니라 실행시킬 SQL구문을 출력시켜준다. =>확인 후 / or r으로 실행시킨다.

  • ***@=>파일을 불러오면서 바로 그 파일의 내용대로 실행시킨다. (파일의 내용을 정확하게 알고 있을때 사용하는 방법)

SQL> @'c:\webtest\2.db\print\notbetween.txt'

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            800
WARD       SALESMAN        1250
JONES      MANAGER         2975
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
SCOTT      ANALYST         3000
KING       PRESIDENT       5000
ADAMS      CLERK           1100
JAMES      CLERK            950
FORD       ANALYST         3000

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

 

 

 

 

<문14> 문자열 검색=> 사원이름이 ALLEN 을 찾아라 (사원이름이 A자로 시작하는 사원을 찾아라(일부분))

  • like 연산자=>정확히 찾고자하는 데이터를 모를때 사용 %,_ 를 이용 %(문자열의 길이를 정확히 모를때) _(문자열의 한글자로 매치) ___

  • ex) 이%=>이로 시작하는 사람 김% ->김길수,김외,김수(김으로 시작하는 사람이름 전부) 김_ =>찾는문자열은 2글자

    %수=>수로 끝나는 사람이름, 단어 ​ %동이름% =>동이름이 포함된 단어 찾기

 

 

emp테이블에서 사원명이 A자로 시작하는 사원을 찾아서 그 사원의 이름과 급여를 출력하는 SQL문장?

 

SQL> select ename,sal
  2  from emp
  3  where ename like 'A%';
  
  ENAME             SAL
---------- ----------
ALLEN            1600
ADAMS            1100

not like

ed

  1  select ename,sal
  2  from emp
  3* where ename not like 'A%'
SQL> /              

ENAME             SAL
---------- ----------
SMITH             800
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
JAMES             950
FORD             3000

ENAME             SAL
---------- ----------
MILLER           1300

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

 

 

 

<문15> 급여가 1000에서 3000 사이에 있는 사원을 찾아라(이름,업무,급여순으로 출력) =>between A and B

  •  

    where 조건식 or 조건식2 =>둘중의 하나만 만족해도 결과출력 and 조건식2 =>조건이 모두 만족해야 결과 출력

     

SQL> select ename,job,sal from emp
       where sal>=1000 and sal <=3000;  //between 1000 and 3000;

ENAME      JOB              SAL
---------- --------- ----------
ALLEN      SALESMAN        1600
WARD       SALESMAN        1250
JONES      MANAGER         2975
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
SCOTT      ANALYST         3000
TURNER     SALESMAN        1500
ADAMS      CLERK           1100
FORD       ANALYST         3000
MILLER     CLERK           1300

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

 

 

 

<문16> emp테이블에서 두번째 글자가 L자가 나오는 직원의 정보를 찾아서 이름,급여순으로 출력?

 

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

ENAME             SAL
---------- ----------
ALLEN            1600
BLAKE            2850
CLARK            2450

 

 

 

<문17>emp테이블에서 사원번호가 7782,7788,7844 인 사원을 검색해서 이 사원의 급여,연봉을 출력?

 

SQL> select sal,sal*12 as "year price" from emp
     where empno=7782 or empno=7788 or empno=7844;

AB+AC+AD=A(B+C+D) => in 범위연산자 사용하여 수정

 select sal,sal*12 as "year price" from emp
     where empno in (7782,7788,7844)
     
        SAL year price     
---------- ----------
      2450      29400
      3000      36000
      1500      18000

not in

ed
 1  select sal,sal*12 as "year price" from emp
 2  where empno not in (7782,7788,7844)
SQL> /

       SAL year price
---------- ----------
       800       9600
      1600      19200
      1250      15000
      2975      35700
      1250      15000
      2850      34200
      5000      60000
      1100      13200
       950      11400
      3000      36000
      1300      15600

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

 

 

 

<문18>emp테이블에서 업무가 PRESIDENT 이고(=and) 급여가 1500이상이거나(or) 업무가 SALESMAN인 사원을 찾아서 그 사원의 사번,이름,업무,급여순으로 출력하는 SQL 작성?

select empno,ename,job,sal
from emp
where (job='SALESMAN' or job='PRESIDENT') and sal>=1500;

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7499 ALLEN      SALESMAN        1600
      7839 KING       PRESIDENT       5000
      7844 TURNER     SALESMAN        1500

 

 

 

<문19> 정렬문제

  • select 출력할 필드명,,, from 테이블명 where 조건식=>생략이 가능하다. order by 정렬하고자하는 필드명,필드명2,,,[정렬기준(선택)] default ->asc

  • 오름차순->ㄱ~ㅎ, A~Z 내림차순->ㅎ~ㄱ, Z~A(게시판) asc(ending) desc(ending) 1,2,3,,,10 10,9,8,7~

계산필드(=가상필드)=>연봉=>고액연봉자순으로 정렬하시오(=내림차순)

 

SQL> select ename as "name", sal, sal*12 year
     from emp
     order by year desc;

KING             5000      60000
FORD             3000      36000
SCOTT            3000      36000
JONES            2975      35700
BLAKE            2850      34200
CLARK            2450      29400
ALLEN            1600      19200
TURNER           1500      18000
MILLER           1300      15600
WARD             1250      15000
MARTIN           1250      15000

name              SAL       YEAR
---------- ---------- ----------
ADAMS            1100      13200
JAMES             950      11400
SMITH             800       9600

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

 

 

 

<문20> 데이터 검색시 중복된 데이터를 한번만 출력하게 작성.

직원의 업무를 출력하라

SQL> select job from emp;

 

중복제거

  • 형식) select distinct 중복된 필드명 from 테이블명

SQL> select distinct job from emp;

JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST

 

 

 

<문21>파라미터 인수 질의=매개변수 질의 (자주 검색이 되는 검색어를 입력받아서 처리해주는 SQL문장)

 

emp테이블에서 부서번호가 10번인 사원을 찾아서 그 사원들의 사원이름 급여,부서번호순으로 출력하되 급여가 많은순으로 정렬하시오.(=내림차순)

 

SQL> select ename,sal,deptno
from emp
where deptno=10
order by sal desc;

ENAME             SAL     DEPTNO
---------- ---------- ----------
KING             5000         10
CLARK            2450         10
MILLER           1300         10

 

형식) where deptno=&변수명(=>필드명을 변수명)

 

SQL> select ename,sal,deptno
from emp
where deptno=&deptno
order by sal desc

deptno의 값을 입력하십시오: 20
구   3: where deptno=&deptno
신   3: where deptno=20

ENAME             SAL     DEPTNO
---------- ---------- ----------
SCOTT            3000         20
FORD             3000         20
JONES            2975         20
ADAMS            1100         20
SMITH             800         20
SQL> select ename,sal,deptno
from emp
where deptno=&deptno
order by sal desc

deptno의 값을 입력하십시오: 30
구   3: where deptno=&deptno
신   3: where deptno=30

ENAME             SAL     DEPTNO
---------- ---------- ----------
BLAKE            2850         30
ALLEN            1600         30
TURNER           1500         30
WARD             1250         30
MARTIN           1250         30
JAMES             950         30