Fundamental Notes/Data Base

[DB] 09. 03. 16 - CH3 기본적인 SELCT문 & CH5 함수

콩콩댕 2009. 3. 16. 15:34
반응형

CH3 기본적인 SELCT문
SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select e.ename, d.dname, e.sal
  2  from emp e, dept d
  3* where e.deptno = 30 and sal >= 1500 and e.deptno = d.deptno
SQL> /

ENAME      DNAME                 SAL
---------- -------------- ----------
ALLEN      SALES                1600
BLAKE      SALES                2850
TURNER     SALES                1500

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select e.ename, e.deptno, d.dname, e.sal
  2  from emp e, dept d
  3* where e.deptno = 30 and sal >= 1500 and e.deptno = d.deptno
SQL> /

ENAME          DEPTNO DNAME                 SAL
---------- ---------- -------------- ----------
ALLEN              30 SALES                1600
BLAKE              30 SALES                2850
TURNER             30 SALES                1500



SQL>
SQL>
SQL>
SQL> select ename || ' 의' || '년 연봉은 =' || sal //string 연결
  2  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

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


ANY 연산자
=ANY(), IN()은 같은 의미임. ()안에 들어가는 것과 어느것이라도 같으면 된다는 의미.
통상적으로는 ANY보다는 IN을 많이 쓴다.

SQL> select * from emp
  2  where sal = ANY(select sal from emp where deptno = 30);
//=ANY는 뒤에나오는 것의 컬럼들 중에서  sal이 하나라도 같으면 출력 한다.
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30

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



UNION 연산자
첫 번째 쿼리와 두 번째 쿼리의 내용을 모두 보여줌. 단,  중복된 정보는 한 번만 보여줌.

SQL> select * from emp where sal >= 1500
  2  union // union은 연산자 or와 같음. 단, where의 조건이 아니라 sql문장 두개를 이어주는 형태. 중복되는 결과 한번만.
  3  select * from emp where deptno = 30;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      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
      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
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20

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



UNION ALL 연산자
첫 번째 쿼리와 두 뻔째 쿼리에 있는 모든 데이터를 보여줌

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select * from emp where sal >= 1500
  2  union all 
// union all 은 연산자 or와 같음. 단, where의 조건이 아니라 sql문장 두개를 이어주는 형태. 중복되는 결과 모두 출력.

  3* select * from emp where deptno = 30
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      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
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7900 JAMES      CLERK           7698 81/12/03        950                    30

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




MINUS 연산자
두번째 쿼리에는 없고 첫 번째 쿼리에만 있는 데이터를 보여줌. 차집합 연산
SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select * from emp where sal >= 1500
  2  minus
  3* select * from emp where deptno = 30

SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      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
      7902 FORD       ANALYST         7566 81/12/03       3000                    20

같은결과 ↑↓
SQL> select * from emp where sal >=1500 and deptno <> 30;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      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
      7902 FORD       ANALYST         7566 81/12/03       3000                    20




INTERSECT 연산자
두 번째 쿼리와 첫 번째 쿼리에서 중복된 데이터를 보여줌

  1  select * from emp
  2  where sal >=1500
  3  intersect
  4  select * from emp
  5* where deptno = 30
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30




CH5 함수
연습문제 5_1. EMP Table에서 이름, 급여, 커미션, 충액(sal + comm)을 구하여 총액이 많은 순서로 출력하라. 단, 커미션이 NULL인 사람은 제외한다.

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션,  sal+ comm total
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
이름             급여     커미션      TOTAL
---------- ---------- ---------- ----------
TURNER           1500          0       1500
WARD             1250        500       1750
ALLEN            1600        300       1900
MARTIN           1250       1400       2650


연습문제 5_1_new. EMP Table에서 이름, 급여, 커미션, 총액(sal + comm)을 구하여 총액이 많은 순서로 출력하라.
SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션,  sal+ comm total
  2  from emp
  3* order by total
SQL> /
이름             급여     커미션      TOTAL
---------- ---------- ---------- ----------
TURNER           1500          0       1500
WARD             1250        500       1750
ALLEN            1600        300       1900
MARTIN           1250       1400       2650
SMITH             800
JONES            2975
JAMES             950
MILLER           1300
FORD             3000
ADAMS            1100
BLAKE            2850                                         //null값이 들어가있으면 산술연산이 되지 않는다.
이름             급여     커미션      TOTAL
---------- ---------- ---------- ----------
CLARK            2450
SCOTT            3000
KING             5000
14 개의 행이 선택되었습니다.






SQL>
SQL> select ename as '이름', sal '급여', comm '커미션', total sum(sal, comm)
  2  from emp
  3  where comm is not null
  4  order by total;
select ename as '이름', sal '급여', comm '커미션', total sum(sal, comm)
                *
1행에 오류:
ORA-00923: FROM 키워드가 있어야할 곳에 없습니다

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션, total sum(sal, comm)
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
select ename 이름, sal 급여, comm 커미션, total sum(sal, comm)
                                                   *
1행에 오류:
ORA-00923: FROM 키워드가 있어야할 곳에 없습니다

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션, total=sum(sal, comm)
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
select ename 이름, sal 급여, comm 커미션, total=sum(sal, comm)
                                               *
1행에 오류:
ORA-00923: FROM 키워드가 있어야할 곳에 없습니다

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션, sum(sal, comm) total
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
select ename 이름, sal 급여, comm 커미션, sum(sal, comm) total
                                          *
1행에 오류:
ORA-00909: 인수의 개수가 부적합합니다

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션, sum(sal+ comm) total
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
select ename 이름, sal 급여, comm 커미션, sum(sal+ comm) total
       *
1행에 오류:
ORA-00937: 단일 그룹의 그룹 함수가 아닙니다

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션, total = sal+ comm
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
select ename 이름, sal 급여, comm 커미션, total = sal+ comm
                                                *
1행에 오류:
ORA-00923: FROM 키워드가 있어야할 곳에 없습니다

SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션,  sal+ comm total
  2  from emp
  3  where comm is not null
  4* order by total
SQL> /
이름             급여     커미션      TOTAL
---------- ---------- ---------- ----------
TURNER           1500          0       1500
WARD             1250        500       1750
ALLEN            1600        300       1900
MARTIN           1250       1400       2650
SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename 이름, sal 급여, comm 커미션,  sal+ comm total
  2  from emp
  3* order by total
SQL> /
이름             급여     커미션      TOTAL
---------- ---------- ---------- ----------
TURNER           1500          0       1500
WARD             1250        500       1750
ALLEN            1600        300       1900
MARTIN           1250       1400       2650
SMITH             800
JONES            2975
JAMES             950
MILLER           1300
FORD             3000
ADAMS            1100
BLAKE            2850
이름             급여     커미션      TOTAL
---------- ---------- ---------- ----------
CLARK            2450
SCOTT            3000
KING             5000
14 개의 행이 선택되었습니다.



SQL> select ename 이름, sal 급여, sal *0.13 보너스 deptno 부서번호
  2  from emp
  3  where deptno = 10;
select ename 이름, sal 급여, sal *0.13 보너스 deptno 부서번호
                                              *
1행에 오류:
ORA-00923: FROM 키워드가 있어야할 곳에 없습니다


SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select ename, sal, sal*0.13 "BONUS", deptno
  2  from emp
  3* where deptno = 10
SQL> /
ENAME             SAL      BONUS     DEPTNO
---------- ---------- ---------- ----------
CLARK            2450      318.5         10
KING             5000        650         10
MILLER           1300        169         10




각 부서별 부서 번호와 부서인원, 평균급여,  총급여, 최고급여, 최저급여를 출력하시오.

SP2-0734: "각 부서별 ..."(으)로 시작되는 알 수 없는 명령 - 나머지 줄은 무시되었습니다.
SQL> selct * from dept;
SP2-0734: "selct * fr..."(으)로 시작되는 알 수 없는 명령 - 나머지 줄은 무시되었습니다.
SQL> select * from dept;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
SQL> select deptno, count(deptno) "부서인원", avg(sal), max(sal), min(sal)
  2  from emp
  3  group by deptno;
    DEPTNO   부서인원   AVG(SAL)   MAX(SAL)   MIN(SAL)
---------- ---------- ---------- ---------- ----------
        10          3 2916.66667       5000       1300
        20          5       2175       3000        800
        30          6 1566.66667       2850        950
SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select deptno 부서번호, count(deptno) "부서인원", avg(sal) 평균급여, sum(sal) 총급여, max(sal)
  2  from emp
  3* group by deptno
SQL> /
  부서번호   부서인원   평균급여     총급여   최고급여   최저급여
---------- ---------- ---------- ---------- ---------- ----------
        10          3 2916.66667       8750       5000       1300
        20          5       2175      10875       3000        800
        30          6 1566.66667       9400       2850        950








'Fundamental Notes > Data Base' 카테고리의 다른 글

[DB] Quiz1_1 해답  (0) 2009.04.06
2009. 03. 23 - CH5 함수  (0) 2009.03.23
[DB] 09. 03. 13 - Ch3. 기본적인 SELECT문 연습문제  (0) 2009.03.13
[DB] 2009. 03. 09 - SQL*PLUS  (0) 2009.03.09