Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[Oracle] 20231030 [프로그램소스] - 20231030_01_HR, TBL_INSA(중간 수행평가) 본문

[Oracle]/SQL (Program source)

[Oracle] 20231030 [프로그램소스] - 20231030_01_HR, TBL_INSA(중간 수행평가)

Jelly-fish 2023. 10. 30. 17:49

 

20231030_01_hr.sql

SELECT USER
FROM DUAL;
--==>> HR

--                      코드생산 (실수하면 그 부분만 고치고 다시 진행하면 됨)
--                     ~~~~~~~~~~
-- 1                                    2
-- |------------------|---------|---|---|---->

--  ~~~~~~~~~~~~~~~~~~  
--  ★DB설계, 데이터베이스 생산 기간 (실수하면 코드 생산한 것 다 날림)




-- 코드생산 과정에서 문제가 발생한다면 앞 부분으로 돌아가
-- 잘못된 부분을 고친다.
-- 잘못된 부분이 또 있으면 또 다시 고치고 이어서 진행한다.
-- :
-- 문제가 발견됐다 하면 프로젝트를 갈아엎거나 하진 않는다.


-- 데이터베이스 생산 기간에서 문제가 발생했다면 상황이 다르다.
-- 코드 부분을 아예 전부 삭제하고 처음부터 다시 시작해야 한다...
-- 데이터 베이스 구조를 잘못 잡으면
-- 그 문제를 해결하고 나서 원래대로 복귀해서 하던 걸 이어서 할 수 있는 것이 아니라
-- 다시 처음부터 시작해야 하므로 기획 단계에서 굉장히 신중해야 한다.

-- 코드 진행 단계에서 진행한 게 많으면 많을 수록... 데이터 베이스의 특정 부분에
-- 문제가 발생한 것을 뒤늦게 알게되면...
-- 원래 코드 진행 상황에서 이어서 하는 것이 아니라...
-- 데이터베이스 제작 후 코드 생산기간 맨 처음부터 다시 시작해야 한다....



-- 다음과 같이 프로그램 개발 기간을 구성해선 안된다...
-- 아무리 개발자라도, DB 설계 기간에 충분한 시간을 갖고 이후에 문제가 발생하지 않도록
-- 열심히 검토해 봐야만 한다. 


-- 1              코드생산기간           2
-- |-----------|----------------|---|---|---->
--  DB 설계기간



-- DB 설계 기간을 충분히 여유있게, 신중하게 구성해야만 나중에 프로그램 진행 과정에서
-- 큰 문제가 발생하지 않는다... 

-- [총정리!]★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
-- 1. DB 설계 절대 경시하면 안 된다.
-- 2. DB 설계가 잘못되면 코드 생산을 처음부터 다시 해야 된다.
-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★



-- 이 부분이 잘 되느냐 안 되느냐에 따라 
-- final project 때 결과물이 달라진다...
-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
--             중요!!
-- ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

/*
정규화란 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다. 
이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 된다. 
이를 구분하여 정규형이 높아질수록 이상현상은 줄어들게 된다.

즉, 쉽게말하면 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 
중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, 
DB의 저장 용량 역시 줄일 수 있다.
이러한 테이블을 분해하는 정규화 단계가 정의 되어 있다.


중복을 배제하여 삽입, 삭제, 갱신 이상의 발생을 방지

각 릴레이션에 중복된 종속성을 여러개의 릴레이션에 분할

(릴레이션 : 릴레이션이란 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위이다.
결국, 릴레이션은 DB 테이블이다.)


데이터베이스 정규화는 관계형 데이터베이스 데이터 모델의 중복을 최소화하고 
데이터의 일관성, 유연성을 확보하기 위한 목적으로 데이터를 분해하는 과정을 뜻합니다. 
일반적으로 크고 제대로 조직되지 않은 테이블들을 
잘 조직된 여러 개의 테이블을 나누는 과정이라고 생각하시면 이해가 쉬울 듯합니다. 
이렇게 정규화를 하는 목적은 데이터들을 조금 더 효율적으로 관리하는 것에 그 목적이 있습니다. 


*/

-- 테이블 하나를 나누는데... 나중에 합칠 수 있게끔 나누어야 한다.
-- 그 나누는 기준이 식별자이다!!!
-- 총 5개의 컬럼을 갖는 테이블을 2개 2개 1개 의 테이블로 분리하되
-- 나중에 JOIN 으로 결합하여 볼 수 있도록 구성한다.

-- 부서번호 DEPTNO 가, EMP TABLE과 DEPT TABLE의 식별자이다!
-- 이 컬럼으로 두 테이블을 결합할 수 있는 것이다.

-- 테이블을 나누는 것을 정규화라고 한다. (분리, 쪼개기)

-- 테이블을 결합할 수 없을 정도로 작게 쪼개면 안 된다!
-- DEPTNO 처럼 식별자를 갖게끔 테이블을 쪼개는 것이 정규화의 기본 핵심이다!!!


-- 테이블을 왜 나눠요? : 메모리 낭비를 막을 수 있으니까!
-- 하나의 테이블로 보면 편할 텐데 왜 쪼개야만 메모리 낭비를 막을 수 있는가
-- 한 번에 많은 양의 데이터를 퍼올리기 때문에??

-- 조회하는 것이 적다고 해서, 메모리를 적게 사용하는 것이 아니라
-- TABLE과 WHERE 조건에 맞는 메모리들을 모두 퍼올리기 때문에 
-- SELECT 문과 상관 없이 메모리에 똑같이 퍼올려지므로... 차이가 없다


SELECT EMP E, DEPT D, E.JOB, E.MGRR, E.HIREDATE, E.SAL, E.COMM, D.DNAME, D.LOC
FROM 


SELECT *
FROM EMP;

SELECT ENAME
FROM EMP;
-- 둘 다 똑같다!



-- 원하는 컬럼을 조회하고 싶을 때, 테이블이 크면 클 수록 나는 조금만 필요한데 
-- 많은 양의 메모리를 퍼올리는 상황이 발생할 수 있다.

-- 테이블이 쪼개져있으면 쪼개져 있을수록 한번 조회할 때 퍼올리는 메모리의 양이 적어지므로
-- 훨씬 메모리 낭비가 덜할 것임을 알 수 있다.


-- 컬럼 하나당 30BYTE라고 가정한다면, 테이블의 컬럼 수가 많으면 많을 수록
-- 그 만큼 메모리 낭비가 심해진다.









--■■■ 정규화(Normalization) ■■■--

--○ 정규화란? 
--   한 마디로 데이터베이스 서버의 메모리 낭비를 막기 위해
--   어떤 하나의 테이블을... 식별자를 가지는 여러 개의 테이블로
--   나누는 과정을 말한다.


-- ex) 윤수가... 옥장판을 판매한다.
--     고객리스트 → 거래처 직원 명단이 적혀있는 수첩의 정보를
---                 데이터베이스화 하려고 한다.

-- 테이블명 : 거래처직원
/*

  10Byte     10Byte      10Byte       10Byte      10Byte 10Byte       10Byte
--------------------------------------------------------------------------------
거래처회사명 회사주소     회사전화    거래처직원명   직급  이메일        휴대폰 
--------------------------------------------------------------------------------
    LG      서울여의도   02-345-6789   최혜인       부장 chi@na...     010-23...
    LG      서울여의도   02-345-6789   채다선       과장 cds@da...     010-76...
    LG      서울여의도   02-345-6789   정현욱       대리 chy@da...     010-98...
    LG      서울여의도   02-345-6789   정한울       부장 chw@na...     010-39...
    SK      서울소공동   02-987-6543   임하성       부장  lhs@na...    010-12...
    LG      부산동래구   051-221-2211  이주형       대리  ljs@em...    010-55...
    SK      서울소공동   02-987-6543   오수경       과장  osk@na...    010-88...
--------------------------------------------------------------------------------



가정) 서울 여의도 LG(본사) 라는 회사에 근무하는 거래처 직원 명단이
      총 100만 명이라고 가정한다.
      (한 행(레코드)은 70Byte)
      
      
      어느 날... 『서울여의도』에 위치한 LG 본사가 『경기분당』으로
      사옥을 이전하게 되었다.
      회사주소는 『경기분당』으로 바뀌고, 회사전화는 『031-111-2222』로 바뀌게 되었다.
      
      그러면... 100만 명의 회사주소와 회사전화를 변경해야 한다.
      
      -- 이 때 수행되어야 할 쿼리문 → UPDATE
      
      
      
      UPDATE 거래처직원
      SET 회사주소 = '경기분당', 회사전화 = '031-111-2222'
      WHERE 거래처회사명 = 'LG'
        AND 회사주소 = '서울여의도';
        
    
    
      -- 100만 개 행을 하드디스크상에서 읽어다가
         메모리에 로드시켜 주어야 한다.
         즉, 100만 * 70Byte 를 모두
         하드디스크상에서 읽어다가 메모리에 로드시켜 주어야 한다는 말이다.
         
         → 이는 테이블의 설계가 잘못되었으므로
            DB 서버는 조만간 메모리 고갈로 인해 DOWN 될 것이다.
            
            
            → 그러므로 정규화 과정을 수행해야 한다.


*/

-- 제 1 정규화(형)
--> 어떤 하나의 테이블에 반복되는 컬럼 값들이 존재한다면
--  값들이 반복되어 나오는 컬럼을 분리하여
--  새로운 테이블을 만들어준다.


/*
-- 테이블명 : 회사 → 부모 테이블 (참조받는 테이블)

  10Byte     10Byte      10Byte        10Byte   
---------------------------------------------------
  회사ID    거래처회사명  회사주소       회사전화  
 ++++++++
 참조받는 컬럼
---------------------------------------------------
   10        LG          서울여의도   02-345-6789 
   20        SK          서울소공동   02-987-6543 
   30        LG          부산동래구   051-221-2211
---------------------------------------------------




-- 테이블명 : 직원 → 자식 테이블 (참조하는 테이블)


    10Byte      10Byte     10Byte         10Byte         10Byte
------------------------------------------------------------------
 거래처직원명     직급      이메일         휴대폰         회사ID
                                                        =======
                                                        참조하는 컬럼
------------------------------------------------------------------
     최혜인       부장     chi@na...     010-23...       10
     채다선       과장     cds@da...     010-76...       10
     정현욱       대리     chy@da...     010-98...       10
     정한울       부장     chw@na...     010-39...       10
     임하성       부장     lhs@na...     010-12...       20
     이주형       대리     ljs@em...     010-55...       30
     오수경       과장     osk@na...     010-88...       20
------------------------------------------------------------------

*/

--> 제 1 정규화를 수행하는 과정에서 분리되 테이블은
--  반드시 부모 테이블과 자식 테이블의 관계를 갖게 된다.


--> 부모 테이블 → 참조받는 컬럼 → PRIMARY KEY(기본키, 고유키) 
--  자식 테이블 → 참조하는 컬럼 → FOREIGN KEY(외래키, 참조키)

--※ 참조받는 컬럼이 갖는 특징
--   반드시 고유한 값(데이터)만 들어와야 한다.
--   즉, 중복된 값(데이터)이 있어서는 안 된다.
--   또한, 비어있으면(NULL이 있어서는) 안 된다.
--   즉, NOT NULL 이어야 한다.

-- 고유한 값만 존재해야 한다 : 중복되어선 안 된다.
-- 비어있으면 안된다 : NOT NULL
--> PRIMARY KEY로 제약조건을 구성하자


--> 제 1 정규화를 수행하는 과정에서
--  부모 테이블의 PRIMARY KEY 는 항상 자식 테이블의 FOREIGN KEY 로 전이된다.


-- 테이블이 분리(분할)되기 이전 상태로 조회
/*




가정) 서울 여의도 LG(본사) 라는 회사에 근무하는 거래처 직원 명단이
      총 100만 명이라고 가정한다.
      
      
      어느 날... 『서울여의도』에 위치한 LG 본사가 『경기분당』으로
      사옥을 이전하게 되었다.
      회사주소는 『경기분당』으로 바뀌고, 회사전화는 『031-111-2222』로 바뀌게 되었다.
      
      그러면... 회사 테이블에서 1건의 회사주소와 회사전화를 변경해야 한다.
      
      -- 이 때 수행되어야 할 쿼리문 → UPDATE
      
      
      
      UPDATE 거래처직원
      SET 회사주소 = '경기분당', 회사전화 = '031-111-2222'
      WHERE 거래처회사명 = 'LG'
        AND 회사주소 = '서울여의도';
        
            ↓
            
    
     UPDATE 회사
     SET 회사주소 = '경기분당', 회사전화 = '031-111-2222'
     WHERE 회사ID = 10;
        
    
    
      -- 1 개 행을 하드디스크상에서 읽어다가
         메모리에 로드시켜 주어야 한다.
         즉, 1 * 40Byte 를 모두
         하드디스크상에서 읽어다가 메모리에 로드시켜 주어야 한다는 말이다.
         
            
            
            → 정규화 이전에는 100만 건을 처리해야 할 업무에서
            1건만 처리하면 되는 업무로 바뀐 상황이기 때문에
            DB 서버는 메모리 고갈이 일어나지 않고 아주 빠르게 처리될 것이다.
            

-- 거래처회사명, 회사전화 (회사테이블만 조회)

[정규화 이후]                    | [정규화 이전]
SELECT 거리처회사명, 회사전화     | SELECT 거래처회사명, 회사전화
FROM 회사;                       | FROM 거래처직원;
--> 3 * 40 Byte                  | → 200만 * 70 Byte
(컬럼 수 4개 = 40Byte)
(3개 항목 : LG(서울여의도), SK(서울소공동), LG(부산동래구)




-- 거래처직원명, 직급 (직왼테이블만 조회)

[정규화 이후]                     | [정규화 이전]
SELECT 거래처직원명, 직급          | SELECT 거래처직원명, 직급
FROM 직원;                        | FROM 거래처직원;
--> 200만 * 50Byte                | --> 200만 * 70 Byte
(직원 컬럼 수 5개  = 50Byte)      |




-- 거래처회사명, 거래처직원명 (회사, 직원 테이블 모두 조회)



(* 쪼개서 컬럼을 추가했기 때문에
정규화 이후 사용하는 메모리 용량이 더  커지는 건 아닐까 하는 생각이 들 수 있지만
결과적으로, 테이블을 나눠서 JOIN해서 조회하는 것이 메모리를 덜 쓰는 것을 확인할 수 있다.)


[정규화 이후]                           | [정규화 이전]
SELECT 거래처회사명, 거래처직원명        | SELECT 거래처회사명, 거래처직원명
FROM 회사 A JOIN 직원B                  | FROM 거래처직원
ON A.회사ID = B.회사ID;                 |
--> (3 * 40 Byte) + (200만 * 50 Byte)   | --> (200만 * 70Byte) 



*/




-- 테이블명 : 주문

/*

-- ① 두 개의 컬럼(고객ID, 제품고드)을 PRIMARY KEY(복합) 구성을 한다면?
   : 한 명이 같은 상품을 여러 번 구매하지 못한다. (재용님이 꿀꽈배기를 다시 구매할 수는 없다.)
   

-- ② 세 개의 컬럼(고객ID, 제품코드, 주문일자)를 복합 프라이머리 키로 구성하면
--    절대 중복될 일이 없다! 이렇게 구성해야 한다! -> 제 2 정규화 필요!

--------------------------------------------------------------------------------
    고객ID              제품코드              주문일자                주문수량
   ++++++++++++++++++++++++++++ ① Ⅹ
   
   +++++++++++++++++++++++++++++++++++++++++++++++++++++② ○
                       PRIMARY KEY P.K
                       (고객ID, 제품코드, 주문일자)
   
--------------------------------------------------------------------------------
    UJY1234(엄재용)     P-KKBK(꿀꽈배기)       2023-10-30 07:20:31        20
    PBK8835(박범구)     P-KKBC(꼬북칩)         2023-10-30 07:21:40        20
    PNY3235(박나영)     P-KKDS(쿠크다스)        2023-10-30 08:10:10       13
    PKY5834(박가영)     P-SWKK(새우깡)         2023-10-30 09:07:04        12
    
                                    :
                                    :
--------------------------------------------------------------------------------
-- 고유한 값만 존재해야 한다 : 중복되어선 안 된다.
-- 비어있으면 안된다 : NOT NULL
--> PRIMARY KEY로 제약조건을 구성하자


-- 고객ID를 PRIMARYKEY 가 되면 한번 주문 후에 다시 주문할 수가 없다!! (중복X)
-- 제품코드 PRIMARYKEY 가 되면 한번 판매한 후에 다시 판매할 수가 없다!! (중복X)
-- 주문일자 PRIMARYKEY 가 되면 똑같은 일자에 절대로 다시 판매가 불가능하다!! (중복X)
--                       장바구니 기능도 절대 사용할 수 없다. 동시에 구매가 불가능하므로!! (날짜가 중복됨 X)

-- 주문수량 PRIMARYKEY 가 되면 주문 수량이 똑같을 때 20개 20개 이렇게 구매가 불가능하다!! (중복X)

★★ 주문 테이블에서는 PRIMARYKEY 가 절대 존재할 수가 없다.

하나의 테이블에 PRIMARYKEY 가 존재할 수 있는 개수는 최대 한 개이다.
PRIMARYKEY 제약 조건이 1개를 초과하는 테이블은 안된다...
PRIMARYKEY의 제약 조건이... 컬럼이 되면 여러 개가 된다.

-- 테이블에 PRIMARY KEY가 존재하지 않으면 바람직하지 않다.

-- 복합 프라이머리 키는 관계형 데이터베이스에 그렇게 바람직하진 않다.

-- 단일 프라이머리 키이면 제 1정규화만으로 정규화를 끝낼 수 있지만
-- 복합 프라이머리 키의 경우에는 반드시 제 2정규화 과정을 해야만 한다.



*/


--※ 하나의 테이블에 존재하는 PRIMARY KEY의 최대 개수는 1개이다.
--   하지만, PRIMARY KEY 를 이루는(구성하는) 컬럼의 개수는 복수(여러 개)인 것이 가능하다.
--   컬럼 1개로만 구성된 PRIMARY KEY 를 SINGLE PRIMARY KEY 라고 부른다.
--   (단일 프라이머리 키)
--   두 개 이상의 컬럼으로 구성된 PRIMARRY KEY 를 COMPOSITE PRIMARY KEY 라고 부른다.
--   (복합 프라이머리 키)






-- 제 2 정규화(형)
--> 제 1정규화를 마친 결과물에서 PRIMARY KEY 가 SINGLE COLUMN 이라면
--  제 2 정규화는 수행하지 않는다.
-- 하지만, PRIMARY KEY 가 COMPOSITE COLUMN 이라면
-- 반.드.시 제 2 정규화를 수행해야 한다.



--> 식별자가 아닌 컬럼은 식별자 전체 컬럼에 대해 의존적이어야 하는데
--   식별자 전체 컬럼이 아닌 일부 식별자 컬럼에 대해서만 의존적이라면
---  이를 분리하여 새로운 테이블을 생성해 준다.
--  이 과정을 제 2 정규화라 한다.

-- 식별자가 아닌 컬럼(교수자명, 강의실코드, 강의실설명) 식별자에게 의존적인 존재여야 한다.

-- 제 2 정규화
-- 교수자명 컬럼 하나, 과모 컬럼 하나를 구성하고 각각에 대한 교수ID, 과목ID 컬럼을 구성하여
-- 최종적으로
-- 강의실 코드, 강의실명, 교수ID, 과목ID
-- 교수 ID 교수이름 교수 정보 ...
-- 과목 ID 과목이름 과목 정보...

/*
-- 테이블명 : 과목 → 부모 테이블
--------------------------------------------------------------------------------
과목번호    과목명     교수번호   교수자명   강의실코드     강의실명
++++++++              ++++++++
            P.K
--------------------------------------------------------------------------------
 J0101  자바기초      21         슈바이처      A301       전산실습관 3층 40석 규모
 J0102  자바중급      22          테슬라       T502       전자공학관 5층 60석 규모
 O3188  오라클중급    22          테슬라       A301       전산실습관 3층 40석 규모
 O3189  오라클심화    10         장영실        T502       전자공학관 5층 60석 규모
 J3345  JSP응용       20         맥스웰        K101       인문과학관 1층 90석 규모
  
                                :
--------------------------------------------------------------------------------                                

-- 부모테이블의 PRIMARY KEY가
-- 자식테이블의 FORIGN KEY가 되었다.

-- 점수 테이블의 프라이머리키?  : 과목번호, 학번

-- 테이블명 : 점수 → 자식 테이블
--------------------------------------------------
 과목번호   교수번호    학번              점수
 ==================
     F.K(FORIGN KEY)
     
 ++++++              ++++++++++
        P.K(PRIMARY KEY)
--------------------------------------------------
 O3188      22      2308225(김동민)        92
 O3188      22      2308227(김수환)        80
 O3189      10      2308229(노은하)        92
                        :
--------------------------------------------------


*/

-- 현재, 강의실 설명(식별자가 아닌 컬럼)의 경우 강의실 코드에만 의존적이어야 하므로
-- 다시 테이블을 분리해 주어야 한다. (강의실 코드, 강의실 설명) 
-- 이것이 바로 제 3 정규화!!

-- 제 3 정규화(형)
--> 식별자가 아닌 컬럼이 식별자가 아닌 컬럼에 의존적인 상황이라면
--  이를 분리하여 새로운 테이블을 생성해 주어야 한다.
--  이 과정을 제 3 정규형이라 한다.


-- 정규화란 나누는 과정이다. (테이블을...)
-- 기본 개념 : 분리하는 것. 테이브르 분리
-- 테이블 불니하는 작업 (메모리 낭비를 마긱 위해서)
-- 테이블은 더 이상 나눠지지 않을 때까지 분리하게 되면
-- 하나의 테이블이 한 컬럼을 갖게끔 구성되면 다시 합칠 수가없으므로 원래 형태의 표로 합치기 어려워지거나
-- 아예 불가능해질 수있ㄷ다.

-- 다시 합칠 수 있도록 식별자를 보유해야 한다.

-- 어떤 테이블을 식별자를 갖게끔 분리하는 과정을 정규화라고 한다.

-- DB서버 메모리 낭비를 막기위해


-- 식별자를 갖기 위해 쪼개면 되는거냐? 아니다

-- 지금까지 정규화과정을 거치다보니
-- 규칙을 적용하니 정규화 과정이 편하더라


-- 정규화 과정이 있다 (1, 2, 3 정규화 역정규화)

-- 순차적으로 진행한다. 무조건 순차적으로 실행한다.
-- 전체 테이블을 대상으로 해서 제 1 2 34 순차적으로..


--- 제 1정규화란 : 어떤 테이블의 특정 컬럼에 들어있는 데이터의 갑싱 
-- 계속 중복해서 나타날경우 분리시켜 주는 것이다.

-- 회사 테이블, 직원 테이블로 나뉜다.

-- 이 두 개의 테이블은 다시 나눠질 수 있다.
-- 부모 자식 테이블로 나뉘게 된다.
-- 붑모 : 참조받는컬럼, 자식 : 참조하는컬럼

-- 반드시 1대 다의 관계가 만들어지고 이를 통해 부모, 자식 테이블의 관계가 구성된다.
-- 부모 키 :PRIMARYKEY 자식 폴인키
-- PRIMARY KEY  반드시 제약조건
-- 중복 X , NOT NULL 이 합쳐지는 형태로 프라이머리키 제약조건이 구성된다.

-- 테이블 당 최대 한 개 ㅇ존재한다.

-- 프라이머리키가 없는 테이블도 있을 수 있지만 그런건 바라직하지 않다
-- 하나의 프라이머리 키 내부에 컬럼이 다수로 들어갈 수 있다. - 복합 프라이머리키

-- 단일 키의 경우 PRIMARY KEY


--제 2정규화 : 제 1정규화를 마친 다음에 수행하는 것.
-- 단일 프라임머리키로 구성된 테이블은 2정규화로 구성할 필요가 없다.
-- 하지만 복합프라ㅇ이머리키의 경우 반드시 제 2정규화를 진행해야 한다.
-- 프라이머리키가 복합적일 경우 ...다시 2


-- 식별자 전체 컬럼에 의존적이어야 하는데
-- 일부 식별자에만 의존적인 컬럼의 경우 이를 다시 테이블로 나누어주어야 한다.

-- 교수코드 교수명, 과목코드 과목명

-- 식별자.... 강의실 코드, 강의실 설명... 강의실 코드에만 의존적이므로 이것도 다른 테이블로 구성하면된다.







-- 제 4 정규화로 넘어가기 전에, 관계에 대해 살펴보고 넘어가야 한다.

-- 관계형 데이터베이스 안에서 어떤 관계들이 있는지 살펴보고 가는데...

--※ 관계(Relation)의 종류

-- 1 : 다(many) (=일대다) 

-- (EX: DEPTNO 10을 참고하는 여러 명의 사원들...)
--> 제 1 정규화를 적용하여 수행을 마친 결과물에서 나타나는 바랆직한 관계.
--  관계형 데이터베이스를 활용하는 과정에서 추구해야 하는 관계.




-- 가급적이면 관계형 데이터베이스에서 안 만들면 좋은 관계
-- 이런 관계가 있다면 다시 검토를 하고 난 후에, 굳이 1:1이어야 하는지를 
-- 확인하고 넘어가야 할 관계이다.

--○ 1 : 1 (=일대일)

--> 논리적, 물질적으로 존재할 수 있는 관계이긴 하지만
--  관계형 데이트베이스 설계 과정에서 가급적이면 피해야 할 관계.


-- 

--○  다(many) : 다(many) (=다대다)
--> 논리적인 모델링에서는 존재할 수 있지만
--  실제 물리적인 모델링에서는 존재할 수 없는 관계.
/*
*[개인필기]
이렇게 구성하게 되면 어떤 고객도 어떤 제품을 구매할 수가 없어진다.
다대 다의 관계이다 이것이... 
다대 다의 관계를 일대 다로 깨뜨리는 작업을 해 주어야 한다.
머릿속으로 그려지는 모델링에서 존재할 수 있기 때문에 할 수 있는 실수이다.
둘이 제대로 일을 하게끔 만드려면... 주문접수에 대한 테이블이 존재해야 하는 것이다.



-- 테이블명 : 고객                              - 테이블명 : 제품
------------------------------------------    ----------------------------------------------
고객번호    고객명     이메일     전화번호        제품번호    제품명  제품단가     제품설명
------------------------------------------    ----------------------------------------------
 1001       강혜성     khs@test... 010-1....       pswk      새우깡     500       새우가...
 1002       길현욱     khw@test... 010-2....       pkjk      감자깡     700       감자를...
 1003       김경태     kkt@test... 010-3....       pkkm      고구마깡   800       고구마를...
 1004       김다슬     kds@test... 010-4....       pjkc      자갈치     400       자갈을...
              :                                                :
------------------------------------------    ----------------------------------------------

                            - 테이블명 : 주문접수(판매)
                            --------------------------------------------------
                            주문번호  고객번호  제품번호  주문일자   주문수량
                            --------------------------------------------------
                                :
                                25      1001     pjkc    2023-10-30     20
                                26      1002     pjhw    2023-10-30     10
                                27      1003     pkkm    2023-10-30 ..   10
                                28      1003     pkkm    2023-10=30 ..   13
                                                    :
                            --------------------------------------------------                        
하나의 혜성이가... 주문접수 테이블에 중복될 수 있고,
하나의 제품번호가 주문접수 테이블에 중복될 수 있다.


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
이렇듯 다대다 관계를 1대 다로 깨뜨리는 것을 제 4 정규화이다.
* (주문번호라는 하나의 PRIMARY KEY로
다 대 다에 관한 정보들을 모두 통합시켜 둔 것을 확인할 수 있다!)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


*/





-- 제 4 정규화(형)
--> 위에서 확인한 내용과 같이 『many(다) : many(다)』 관계를
-- 『1(일) : many(다)』 관계로 깨뜨리는 과정이 바로 제 4 정규화 수행 과정이다.
-- → 파생 테이블 생성 → 다:다 관계를 1:다 관계로 깨뜨리는 역할을 수행하게 된다.









--[추가 필기]*******************************************************************

-- * 어느 하나는 무조건 자식, 다른 하나는 무조건 부모.
-- * [회사 테이블 : 부모]  [직원 테이블 : 자식]

-- 무결점 : 결점이 있어서는 안 된다.
-- 만약, 10번인 회사 ID가 또 있다면 안 된다. (결점 발생)

-- 무결점 컴퓨터 : 불량 화소에 대한 처리를 거친 컴퓨터

-- 불량 화소가 포함된 컴퓨터의 경우 모니터에 빨간 점이나 검은 점이 발생되었다.
-- 불량 화소 : 화면에 불량한 화소 (빨간 점, 검은 점)

-- 두 개의 테이블을 확인해봤을 떄 회사 테이블에 회사 ID가 10번인 항목이
-- 두 개가 존재한다면...

-- ---------------------------------------------
--  회사ID  거래처회사명  회사주소     회사전화
-- ---------------------------------------------
--   10       LG         서울여의도   02-345-6789
--   10      삼보        서울용산구   02-995-5589
-- ---------------------------------------------

-- 어느 한 부분에 문제가 생기면 그 데이터만 신뢰성이 깨지는 게 아니라
-- 도미노처럼 다른 것들(데이터) 도 신뢰도가 떨어지기 때문에
-- 신뢰도도 깨지고 테이블의 관계성도 없어진다.

-- 10 번 회사 ID에서 근무하는 사원들도 진짜 근무하는 사람이 맞는지를 알 수가 없다.


-- 제약 조건 : 무결점을 위해 존재하는 오라클의 기능
-- 테이블과 테이블들 끼리 관계를 명확하게 지켜가면서 무결점이 지켜지게끔 구성하려면
-- 제약조건 자유롭게 데이터를 저장하는 과정을 제약...





-- 메모리 낭비 X
-- 식별자를 갖게끔 쪼개야 한다. -> 정규화

-- 1정규화 2정규화 순차적으로 한다.
-- 제일 먼저 수행해야 하는 정규화는 1정규화다

-- 어떤 테이블에 특정 테이블의 값이 반복해서 등장하면
-- 이를 분리해서 테이블로 구성해주는 것이 제1정규화이다.

-- 제 1정규화를 하게 되면 부모, 자식 테이블로 분리된다

-- 부모 테이블에는 참조받는 컬럼, 자식 참조하는 컬럼

-- 중복 X 비어있어선 안된다 : PRIMARY KEY

-- 자식 테이블의 참조하는 컬럼은 부모 테이블의 컬럼을 전이받는다.


/*
윤수              국어
하성              산수
민지              사회
현욱              자연

    수강신청
    (수강신청 번호를 갖게끔 하여 학생과 과목을 연결짓게끔하는 관계를 생성해야 한다.)
    (이것이 파생된 테이블!!!!!)
    수강신청번호      신청자학번       과목코드
    1001            2310123(윤수)     1210(국어)
    1002            

수강신청을 한 사람들만 90이라는 점수를 부여할 수 있다.
만약, 점수를 이러한 관계에 의거해서 만들지 않으면... 

수강신청번호      평가점수
    1001            90
    

    학번      과목코드        점수

수강신청이 되어있지 않더라도 점수를 부여받을 수 있기에 올바르지 않다.
그러나 수강신청번호가 존재할 때만 점수를 부여한다면 수강신청 했을 때에만 점수를 부여할 수 있다.


수강신청 번호가 있어야 한다!!


윤수          가방
하성          신발
민지          바지
현욱          치마


    구매
    구매번호        구매자     제품코드        일자 ......
    ---------------------------------------------------------
    1234            120(민지) 2023(치마)      2023.....
                        :
                        



반품 (잘못된 테이블!! 하성이는 치마를 구매하지 않았는데 잘못 데이터가 들어감)
-------------------------------------------------------
 구매자      제품코드      일자      반품사유
 117(하성)    2023(치마)    2023... 사이즈가 안맞아서...흑흑...
 
 
 
 구매했을 떄의 구매코드를 부여해서 이 코드를 가지고
 이 날짜에 민지가 치마를 구매했던 것을 반품하려고 하는구나를 알 수 있는 것이다...
 
 반품
-------------------------------------------------------
 구매코드      일자      반품사유
 2023... 사이즈가 안맞아서...흑흑...
 
 */
 


-- 수강신청을 했을 때 그 식별 번호가 없을 수가 없다.
-- 성적 표에 수강신청 번호가 없다고 해서 실제 테이블 구조에서 수강신청 번호가 
-- 없어도 된다고 생각하면 안 된다.



--역정규화(비정규화)(형)



-- 제 1 정규화 
-- 어떤 커럼에 값들이 중복될 경우 이걸 분리에서 테이블로 만들어준다.
-- LG, KT... 회사 테이블
-- 사원테이블


-- 부모 테이블, 자식 테이블
-- 참조 받는 컬럼, 참조 하는 컬럼

-- 제약조건 : 중복되면 안 된다.(유니크해야 한다.), NOT NULL


-- 자식 테이블의 FORIGN KEY : 부모의 PRIMARY KEY 전이



-- 제 2 정규화
-- PRIMARY KEY 제약 조건 단일 키 : X
-- PRIMARY KEY 복합 키 : 반드시 제 2 정규화 시행

-- 식별자가 아닌 컬럼이 일부 식별자에게만 의존적일경우 이를 분리

-- 과목 번호, 과목명
-- 교수자 번호, 교수자명


-- 제 3 정규화
-- 식별자인 컬럼과 식별자가 아닌 컬럼의 관계에서 나뉜다
-- 식별자가 아닌 컬럼의 식별자가 아닌 컬럼에게 의존적일 경우

-- 제 3 정규화(형)
--> 식별자가 아닌 컬럼이 식별자가 아닌 컬럼에 의존적인 상황이라면
--  이를 분리하여 새로운 테이블을 생성해 주어야 한다.
--  이 과정을 제 3 정규형이라 한다.

-- 강의실 코드, 강의실 설명



-- 관계 
-- 1 대 1 : 가급적 만들지 말자
-- 1 대 다 : 이상적인 형식이다
-- 다 대 다 : 실제 물리적 데이터베이스로 구성할 수 없다.

-- 다 대 다 → 1 대 다 로 관계를 깨뜨려야 한다.
-- 이 과정에서 파생 테이블이 생성된다.


-- 주문 테이블, 수강신청 테이블




-- 정규화 : 분리
-- 역정규화 : 분리된 것을 합치는 것. (거스를 역. 정규화를 역행한다.)
-- 비정규화 : 정규화가 아니다. (아닐 비)

-- 역정규화 여부는 업무 파악을 확실히 해야한다.
--*****************************************************************************



-- 조회를 계속 부서명, 사원명, 직급, 급여로 해야하므로 부서명을 사원 테이블에
-- 추가하는 것이다.

-- 역정규화(비정규화)(형)

-- A 경우 → 역정규화를 수행하지 않는 것이 바람직한 경우


-- 테이블명 : 부서            -- 테이블명 : 사원
--    10     10     10         10     10    10  10    10      10         10
-----------------------     --------------------------------------- + --------
-- 부서번호 부서명 주소      사원번호 사원명 직급 급여 입사일 부서번호    부서명
-----------------------     --------------------------------------- + --------
-- 10 개 레코드(행)          1,000,000개 레코드(행)
-----------------------     --------------------------------------- + --------

--> 조회 결과물
--------------------------
-- 부서명 사원명 직급 급여 
--------------------------

--> 『부서』 테이블과 『사원』 테이블을 JOIN 했을 때의 크기
--  (10 * 30Byte)  +  (1000000 * 60Byte) = 300 + 60000300 Byte
-- 부서테이블 풀 스캔 메모리 + 사원 테이블 풀 스캔 메모리


--> 『사원』 테이블을 역정규화 한 후 이 테이블만 읽어올 때의 크기
--  (즉, 부서 테이블의 부서명 컬럼을 사원 테이블에 추가한 경우)
--  1000000 * 70 Byte = 70000000 Byte



-- B 경우 → 역정규화를 수행하는 것이 바람직한 경우~!!!



-- 테이블명 : 부서            -- 테이블명 : 사원
--    10     10     10         10     10    10  10    10      10         10
-----------------------     --------------------------------------- + --------
-- 부서번호 부서명 주소      사원번호 사원명 직급 급여 입사일 부서번호    부서명
-----------------------     --------------------------------------- + --------
-- 500,000 개 레코드(행)          1,000,000개 레코드(행)
-----------------------     --------------------------------------- + --------

--> 조회 결과물
--------------------------
-- 부서명 사원명 직급 급여 
--------------------------

--> 『부서』 테이블과 『사원』 테이블을 JOIN 했을 때의 크기
--  (500000 * 30Byte)  +  (1000000 * 60Byte) = 15000000 + 75000000 Byte
-- 부서테이블 풀 스캔 메모리 + 사원 테이블 풀 스캔 메모리


--> 『사원』 테이블을 역정규화 한 후 이 테이블만 읽어올 때의 크기
--  (즉, 부서 테이블의 부서명 컬럼을 사원 테이블에 추가한 경우)
--  1000000 * 70 Byte = 70000000 Byte

-- 경우에 따라 역정규화를 수행하는 것이 더욱 효율적일 수도 있고
-- 그렇지 않을 수도 있기 때문에(JOIN이 더욱 메모리 낭비가 덜한 경우)
-- 업무 파악이 제대로 되어야 역정규화를 할지 안 할지를 판단할 수 있다.


-- ★☆ 역정규화 할지 말지 TIP!! ★☆============================
-- ⓐ 부모테이블과 자식 테이블의 테이블 수가 별 차이 없으면
--    → 역정규화를 하는것이 낫다.

-- ⓑ 부모테이블과 자식 테이블의 테이블 수의 차이가 크면
--    → 역정규화를 안 하는 것이 낫다.
-- ============================================================

-- 빈번하게 사원 테이블과 부서테이블의 부서명을 합쳐서 조회하지 않을 경우에도
-- 역정규화를 굳이 할 필요 없다.




--------------------------------------------------------------------------------

--※ 참고
/*
1. 관계(relationship, relation)
   - 모든 엔트리(entry)는 단일값을 가진다.
   - 각 열(column)은 유일한 이름을 가지며 순서는 무의미하다.
   - 테이블은 모든 행(row==튜플==tuple)은 동일하지 않으며 순서는 무의미하다.
   

2. 속성(attribute)
   - 테이블의 열(column)을 나타낸다.
   - 자료의 이름을 가진 최소 논리적 단위 : 객체의 성질, 상태 기술
   - 일반 파일(file)의 항목(아이템==item==필드==field)에 해당한다.
   - 엔티티(entity)의 특성과 상태를 기술
   - 속성(attribute)의 이름은 모두 달라야 한다.
   

3. 튜플(tuple)
   - 테이블의 행(row==엔티티==entity)
   - 연관된 몇 개의 속성으로 구성
   - 개념 정보 단위
   - 일반 파일(file)의 레코드(record)에 해당한다.
   - 튜플 변수(tuple variable)
     : 튜플(tuple)을 가리키는 변수, 모든 튜플 집합을 도메인으로 하는 변수
     

4. 도메인(domain)
   - 각 속성(attribute)이 가질 수 있도록 허용된 값들의 집합
   - 속성 명과 도메인 명이 반드시 동일할 필요는 없음.
   - 모든 릴레이션에서 모든 속성들의 도메인은 원자적(atomic)이어야 함.
   - 원자적 도메인
     : 도메인의 원소가 더 이상 나누어질 수 없는 단일체일 때를 나타냄.
     
5. 릴레이션(relation)
   - 파일 시스템에서 파일과 같은 개념
   - 중복된 튜플(tuple==entity==엔티티)을 포함하지 않는다. → 모두 상이함(튜플의 유일성)
   - 릴레이션은 튜플(tuple==entity엔티티)의 집합. 따라서 튜플의 순서는 무의미하다.
   -- 속성(attribute)간에는 순서가 없다.
   
   



*/



-- 제약조건과 관련.

--■■■ 무결성(Integrity) ■■■--

/*
1. 무결성에는 개체 무결성(Entity integrity)
              참조 무결성(Relational Integrity)
              도메인 무결성(Domain Integrity)이 있다.
    

2. 개체 무결성(Entity integrity)
   개체 무결성은 릴레이션에서 저장되는 튜플(tuple)의
   유일성을 보장하기 위한 제약조건이다.
   (EX : SMITH의 사원정보 튜플(레코드, 행)은 하나여야 함.)
   
   
3. 참조 무결성(Relational Integrity)
   참조 무결성은 릴레이션 간의 데이터 일관성을
   보장하기 위한 제약조건이다.
   (EX : 가영 사원의 부서번호 60 → 그러나, DEPT 테이블에 그 부서번호가 없다.)

   

4. 도메인 무결성(Domain Integrity)
   도메인 무결성은 허용 가능한 값의 범위를
   지정하기 위한 제약조건이다.
   (컬럼에 대한 데이터 타입.)
   (EX : HIREDATE에 DATE 타입이 아닌 1234 NUMBER 타입이 들어가 있으면 안 된다.)
   (DATE 타입이 아닌 데이트는 INSERT 되지 않도록 막아야 한다.)
   (또한, DATE 타입이라 할지라도 13월, 57일 이런 형식의 데이터도 막아야 한다.)
   
   

5. 제약조건의 종류

   - PRIMARY KEY(PK:P) → 기본키, 고유키, 식별키, 식별자
     해당 컬럼의 값은 반드시 존재해야 하며, 유일해야 한다.
     (NOT NULL 과 UNIQUE 가 결합된 형태)
     

    - (REFERENCE : 참조) 
    - FOREIGN KEY(FK:F:R) → 외래키, 외부키, 참조키
      해당 컬럼의 값은 참조되는 테이블의 컬럼 데이터들 중 하나와
      일치하거나 NULL 을 가진다.
      

    - UNIQUE(UK:U)
      테이블 내에서 해당 컬럼의 값은 항상 유일해야 한다.
      
      
    - NOT NULL(NN:CK:C)
      해당 컬럼은 NULL 을 포함할 수 없다.
      
    - CHECK(CK:C)
      해당 컬럼에 저장 가능한 데이터의 범위나 조건을 지정한다.
      NUMBUR(999) → -999 ~ 999
      CHECK을 통해 강제 규정 → 0 ~ 100까지만 데이터를 입력받도록.
      NOT NULL의 제약조건도 포함할 수 있다. (CHECK의 일부이다.)
      
*/

--------------------------------------------------------------------------------


--■■■ PRIMARY KEY ■■■--


-- 1. 테이블에 대한 기본 키를 생성한다.

-- 2. 테이블에서 각 행을 유일하게 식별하는 컬럼(SINGLE) 또는 컬럼의 집합 (COMPOSITE PRIMARY KEY)이다.
--    기본 키는 테이블 당 하나만 존재한다.
--    그러나 반드시 하나의 컬럼으로만 구성되는 것은 아니다.
--    NULL 일 수 없고, 이미 테이블에 존재하고 있는 데이터를
--    다시 입력할 수 없도록 처리한다. (유일성)
--    UNIQUE INDEX 가 오라클 내부적으로 자동으로 생성된다.
--PRIMARY KEY로 등록되면 오라클 자체적으로 이 값이 자주 찾아진다는 것을 파악하므로
-- UNIQUE INDEX를 자동 부여한다.




-- 3. 형식 및 구조

-- 컬럼 레벨의 형식의 경우 []에 넣은 값들은 생략 가능하다.
-- ① 컬럼 레벨의 형식
--    컬럼명 데이터 타입 [CONSTRAINT CONSTRAINT명] PRIMARY KEY[(컬럼명, ...)]


-- 제약 조건의 이름, 컬럼 구조를 파악해가며 구성해 낼 수 있는 형식이
-- 테이블 레벨 형식이므로 제약조건을 테이블 레벨 형식으로 구성하자.
-- 테이블 → 컬럼 : 쉬움
-- 컬럼 → 테이블 : 헤맬 수 있음.



-- CONSTRAINT 를 절대 생략할 수 없다.
-- ② ★ 테이블 레벨의 형식 -- [권장!!!]
--    컬럼명 데이터타입,
--    컬럼명 데이터타입,
--    CONSTRAINT CONSTRAINT명 PRIMARY KEY(컬럼명, ...)

-- 4. CONSTRAINT 추가 시 CONSTRAINT명을 생략하면
--    오라클 서버가 자동적으로 CONSTRAINT명을 부여한다.
--    일반적으로 CONSTRAINT명은 『테이블명_컬럼명_CONSTRAINT약자』
--    형식으로 기술한다.





--○ PK 지정 실습 (① 컬럼 레벨의 형식)

-- 테이블 생성

-- 컬럼 레벨에서의 형식으로 테이블 지정
CREATE TABLE TBL_TEST1
( COL1  NUMBER(5)       PRIMARY KEY
, COL2  VARCHAR2(30)
);
--==>> Table TBL_TEST1이(가) 생성되었습니다.


-- 데이터는 없지만, 구조가 확인된다.
SELECT *
FROM TBL_TEST1;


-- 컬럼 구조 확인
DESC TBL_TEST1;
--==>>
/*
(첫 번째 컬럼이 PRIMARY KEY라는 것을 확인할 수 없다.)

이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    → NOT NULL 을 지정하지 않았는데도 
COL2          VARCHAR2(30)    PRIMARY KEY 제약조건을 설정만 해 주어도 자동 설정된다.

*/


-- 데이터입력
-- [INSERT INTO TBL_TEST1 VALUES (컬럼1에 넣을 값, 컬럼2에 넣을 값) -- Ⅹ 지양하자!]

-- ★ 권장 사항. ****************************************************************
-- INSERT INTO TBL_TEST1(컬럼명1, 컬럼명2) VALUES (컬럼1에 넣을 값, 컬럼2에 넣을 값)
-- 1. 컬럼의 구조 확인 후 입력할 수 있다.
-- 2. 컬럼의 순서와 상관없이 값 대입 가능하다.
-- 3. 선택한 컬럼에만 값을 대입할 수 있다.

-- INSERT INTO TBL_TEST1(컬럼명2, 컬럼명1) VALUES (컬럼2에 넣을 값, 컬럼1에 넣을 값)
-- INSERT INTO TBL_TEST1(컬럼명1) VALUES (컬럼1에 넣을 값)
--******************************************************************************

-- 개체 무결성이 깨지지 않기 위해서는 중복되는 데이터가 들어가면 안 된다.
-- PRIMARY KEY 제약조건

INSERT INTO TBL_TEST1(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(1, 'TEST');    --> 에러 발생
-- 같은 데이터를 여러 번 실행시켜서 입력했을 때 원래는 됐었지만
-- PRIMARY KEY 로 등록한 컬럼의 데이터를 중복하여
-- 여러 번 입력하자 오류가 발생하는 것을 확인할 수 있다.

-- 오라클이 강제적으로 중복데이터가 들어가지 않도록 제한하고 있는 것이다.


INSERT INTO TBL_TEST1(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(1, 'TEST');    --> 에러 발생
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(1, 'ABCD');    --> 에러 발생
-- 두 번쨰 값만 바꿨을 때도 입력되지 않는다. 
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(2, 'TEST');    --> 입력 가능(PRIMARY KEY인 컬럼의 값이 변경되었으므로(중복X))
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(3, NULL);      --> PRIMARY KEY로 설정한 컬럼은 두 번째 컬럼이 아니라 첫 번쨰 컬럼이므로
                                                        -- 두 번째 컬럼에 NULL을 넣더라도 문제가 없다.
                                                        
INSERT INTO TBL_TEST1(COL1) VALUES(4);  --> 위의 구문과 비슷한 구문이다(두 번쨰 컬럼이 NULL이므로.)                                         
INSERT INTO TBL_TEST1(COL1) VALUES(4);  --> 에러 발생
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(5, 'ABCD');
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(NULL, NULL);   --> 에러 발생 (PRIMARY KEY인 첫 번째 컬럼에 NULL 값이 들어갔으므로 에러 발생.)
INSERT INTO TBL_TEST1(COL2) VALUES('ABCD');  --> 에러 발생 (컬럼1에 NULL 을 대입한다는 것과 마찬가지이므로 에러 발생.)


-- 확인
SELECT *
FROM TBL_TEST1;

-- 커밋
COMMIT;
--==>> 커밋 완료


DESC TBL_TEST1;
--==>>
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)         -> PK 제약조건 확인 불가
COL2          VARCHAR2(30) 
*/

--※ 제약조건 확인

SELECT *
FROM USER_CONSTRAINTS;
--==>>
/*
OWNER	CONSTRAINT_NAME	CONSTRAINT_TYPE	TABLE_NAME	SEARCH_CONDITION	R_OWNER	R_CONSTRAINT_NAME	DELETE_RULE	STATUS	DEFERRABLE	DEFERRED	VALIDATED	GENERATED	BAD	RELY	LAST_CHANGE	INDEX_OWNER	INDEX_NAME	INVALID	VIEW_RELATED
HR	SYS_C004102	O	EMP_DETAILS_VIEW					ENABLED	NOT DEFERRABLE	IMMEDIATE	NOT VALIDATED	GENERATED NAME			2014-05-29				
HR	JHIST_DATE_INTERVAL	C	JOB_HISTORY	end_date > start_date				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_JOB_NN	C	JOB_HISTORY	"JOB_ID" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_END_DATE_NN	C	JOB_HISTORY	"END_DATE" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_START_DATE_NN	C	JOB_HISTORY	"START_DATE" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_EMPLOYEE_NN	C	JOB_HISTORY	"EMPLOYEE_ID" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_SALARY_MIN	C	EMPLOYEES	salary > 0				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_JOB_NN	C	EMPLOYEES	"JOB_ID" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_HIRE_DATE_NN	C	EMPLOYEES	"HIRE_DATE" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_EMAIL_NN	C	EMPLOYEES	"EMAIL" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_LAST_NAME_NN	C	EMPLOYEES	"LAST_NAME" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JOB_TITLE_NN	C	JOBS	"JOB_TITLE" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	DEPT_NAME_NN	C	DEPARTMENTS	"DEPARTMENT_NAME" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	LOC_CITY_NN	C	LOCATIONS	"CITY" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	COUNTRY_ID_NN	C	COUNTRIES	"COUNTRY_ID" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	REGION_ID_NN	C	REGIONS	"REGION_ID" IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_EMP_FK	R	JOB_HISTORY		HR	EMP_EMP_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	DEPT_MGR_FK	R	DEPARTMENTS		HR	EMP_EMP_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_MANAGER_FK	R	EMPLOYEES		HR	EMP_EMP_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_JOB_FK	R	JOB_HISTORY		HR	JOB_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_JOB_FK	R	EMPLOYEES		HR	JOB_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_DEPT_FK	R	JOB_HISTORY		HR	DEPT_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_DEPT_FK	R	EMPLOYEES		HR	DEPT_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	DEPT_LOC_FK	R	DEPARTMENTS		HR	LOC_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	LOC_C_ID_FK	R	LOCATIONS		HR	COUNTRY_C_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	COUNTR_REG_FK	R	COUNTRIES		HR	REG_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	COUNTRY_C_ID_PK	P	COUNTRIES					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	COUNTRY_C_ID_PK		
HR	DEPT_ID_PK	P	DEPARTMENTS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	DEPT_ID_PK		
HR	EMP_EMAIL_UK	U	EMPLOYEES					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	EMP_EMAIL_UK		
HR	EMP_EMP_ID_PK	P	EMPLOYEES					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	EMP_EMP_ID_PK		
HR	JHIST_EMP_ID_ST_DATE_PK	P	JOB_HISTORY					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	JHIST_EMP_ID_ST_DATE_PK		
HR	JOB_ID_PK	P	JOBS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	JOB_ID_PK		
HR	LOC_ID_PK	P	LOCATIONS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	LOC_ID_PK		
HR	REG_ID_PK	P	REGIONS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	REG_ID_PK		
HR	SYS_C007076	P	TBL_TEST1					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	GENERATED NAME			2023-10-30	HR	SYS_C007076		
*/



SELECT *
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='TBL_TEST1';
--==>>
/*
    ↓ (오라클이 자체적으로 부여한 UNIQUE INDEX)
HR	SYS_C007076	P	TBL_TEST1					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	GENERATED NAME			2023-10-30	HR	SYS_C007076		
*/




--※ 제약조건이 지정된 컬럼 확인(조회)


SELECT *
FROM USER_CONS_COLUMNS;
--==>>
/*
HR	REGION_ID_NN	REGIONS	REGION_ID	
HR	REG_ID_PK	REGIONS	REGION_ID	1
HR	COUNTRY_ID_NN	COUNTRIES	COUNTRY_ID	
HR	COUNTRY_C_ID_PK	COUNTRIES	COUNTRY_ID	1
HR	COUNTR_REG_FK	COUNTRIES	REGION_ID	1
HR	LOC_ID_PK	LOCATIONS	LOCATION_ID	1
HR	LOC_CITY_NN	LOCATIONS	CITY	
HR	LOC_C_ID_FK	LOCATIONS	COUNTRY_ID	1
HR	DEPT_ID_PK	DEPARTMENTS	DEPARTMENT_ID	1
HR	DEPT_NAME_NN	DEPARTMENTS	DEPARTMENT_NAME	
HR	DEPT_MGR_FK	DEPARTMENTS	MANAGER_ID	1
HR	DEPT_LOC_FK	DEPARTMENTS	LOCATION_ID	1
HR	JOB_ID_PK	JOBS	JOB_ID	1
HR	JOB_TITLE_NN	JOBS	JOB_TITLE	
HR	EMP_EMP_ID_PK	EMPLOYEES	EMPLOYEE_ID	1
HR	EMP_LAST_NAME_NN	EMPLOYEES	LAST_NAME	
HR	EMP_EMAIL_NN	EMPLOYEES	EMAIL	
HR	EMP_EMAIL_UK	EMPLOYEES	EMAIL	1
HR	EMP_HIRE_DATE_NN	EMPLOYEES	HIRE_DATE	
HR	EMP_JOB_NN	EMPLOYEES	JOB_ID	
HR	EMP_JOB_FK	EMPLOYEES	JOB_ID	1
HR	EMP_SALARY_MIN	EMPLOYEES	SALARY	
HR	EMP_MANAGER_FK	EMPLOYEES	MANAGER_ID	1
HR	EMP_DEPT_FK	EMPLOYEES	DEPARTMENT_ID	1
HR	JHIST_EMPLOYEE_NN	JOB_HISTORY	EMPLOYEE_ID	
HR	JHIST_EMP_ID_ST_DATE_PK	JOB_HISTORY	EMPLOYEE_ID	1
HR	JHIST_EMP_FK	JOB_HISTORY	EMPLOYEE_ID	1
HR	JHIST_START_DATE_NN	JOB_HISTORY	START_DATE	
HR	JHIST_DATE_INTERVAL	JOB_HISTORY	START_DATE	
HR	JHIST_EMP_ID_ST_DATE_PK	JOB_HISTORY	START_DATE	2
HR	JHIST_END_DATE_NN	JOB_HISTORY	END_DATE	
HR	JHIST_DATE_INTERVAL	JOB_HISTORY	END_DATE	
HR	JHIST_JOB_NN	JOB_HISTORY	JOB_ID	
HR	JHIST_JOB_FK	JOB_HISTORY	JOB_ID	1
HR	JHIST_DEPT_FK	JOB_HISTORY	DEPARTMENT_ID	1
HR	SYS_C007076	TBL_TEST1	COL1	1
*/






SELECT *
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'TBL_TEST1';
--==>>
/*
HR	SYS_C007076	TBL_TEST1	COL1	1
*/

--○ USER_CONSTRAINTS 와 USER_CONS_COLUMNS 를 대상으로
--   제약조건이 설정된 내용에 대해서
--   소유주, 제약조건명, 테이블명, 제약조건종류, 컬럼명 항목을 조회한다.



SELECT *
FROM USER_CONSTRAINTS;
WHERE TABLE_NAME='TBL_TEST1';

SELECT *
FROM USER_CONS_COLUMNS;
WHERE TABLE_NAME = 'TBL_TEST1';




SELECT UCON.OWNER "소유주"
     , UCON.CONSTRAINT_NAME "제약조건명"
     , UCON.TABLE_NAME "테이블명"
     , UCON.CONSTRAINT_TYPE "제약조건종류"
     , UCOL.COLUMN_NAME "컬럼명"
FROM USER_CONSTRAINTS UCON
INNER JOIN USER_CONS_COLUMNS UCOL

-- UCON.CONSTRAINT_NAME = UCOL.CONSTRAINT_NAME 만 ON 조건으로 걸어도 36개가 나온다
ON  UCON.TABLE_NAME = UCOL.TABLE_NAME
    --AND
    --UCON.OWNER = UCOL.OWNER -- (테이블의 소유주가 이미 HR로 고정되어 있으므로 조건이 필요 없다!)
    AND
    UCON.CONSTRAINT_NAME = UCOL.CONSTRAINT_NAME
    
WHERE UCON.CONSTRAINT_NAME IS NOT NULL;




SELECT UC.OWNER, UC.CONSTRAINT_NAME, UC.TABLE_NAME, UC.CONSTRAINT_TYPE
     , UCC.COLUMN_NAME
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST1';
--==>> HR	SYS_C007076	TBL_TEST1	P	COL1






--○ PK 지정 실습 (② 테이블 레벨의 형식)
-- 테이블 생성



CREATE TABLE TBL_TEST2
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
-- ① 제약 조건의 이름      ② 실제 부여할 제약 조건(어떤 컬럼에 적용할 건지 명시=COL1)
, CONSTRAINT TEST2_COL1_PK PRIMARY KEY(COL1)
);
--==>> Table TBL_TEST2이(가) 생성되었습니다.

-- 데이터 입력

INSERT INTO TBL_TEST2(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(1, 'TEST'); --> 에러 발생 (PRIMARY KEY인 COL1 값의 항목이 중복됨)
                                                     -- (ORA-00001: unique constraint (HR.TEST2_COL1_PK) violated)
                                                     --  유니크한 키(중복X)여야 하는 COL1의 값이 위반되었다.

INSERT INTO TBL_TEST2(COL1, COL2) VALUES(1, 'ABCD'); --> 에러 발생 (사유는 위와 같음. 첫 번째 COL1의 값이 그대로 1임(중복))
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(2, 'ABCD');
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(3, NULL);
INSERT INTO TBL_TEST2(COL1) VALUES(4);
INSERT INTO TBL_TEST2(COL1) VALUES(4);  --> 에러 발생( 위에서 입력한 COL1의 값 '4'와 중복됨)
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(5, 'ABCD');
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(NULL, NULL); --> 에러 발생(PRIMARY KEY 인 COL1 값에 NULL 이 들어갔으므로 오류.)
INSERT INTO TBL_TEST2(COL2) VALUES('KKKK'); --> 에러 발생 (COL1의 값에 NULL 을 넣겠다는 의미이므로 에러가 발생한다.)


-- 확인
SELECT *
FROM TBL_TEST2;
--==>>
/*
COL1	COL2
1	    TEST
2	    ABCD
3	    (null)
4	    (null)
5	    ABCD
*/


-- 커밋
COMMIT;
--==>> 커밋 완료.




--○ USER_CONSTRAINTS 와 USER_CONS_COLUMNS 를 대상으로
--   제약조건이 설정된 내용에 대해서
--   소유주, 제약조건명, 테이블명, 제약조건종류, 컬럼명 항목을 조회한다.



SELECT UC.OWNER, UC.CONSTRAINT_NAME, UC.TABLE_NAME, UC.CONSTRAINT_TYPE
     , UCC.COLUMN_NAME
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST2';
--==>>  HR	TEST2_COL1_PK	TBL_TEST2	P	COL1
-- 아까 전엔, SYS_ ... 오라클이 임의로 지정한 문자가 지정된 반면
-- 테이블 레벨로 지정했을 경우에는
-- CONSTRAINT_NAME 이 TEST2_COL1_PK임을 확인할 수 있다.








--○ PK 지정 실습(③ 다중 컬럼 PK 지정)
/*
CREATE TABLE TBL_TEST1
( COL1  NUMBER(5)       PRIMARY KEY
, COL2  VARCHAR2(30)    PRIMARY KEY ← 이렇게는 지정할 수 없다! (두 개의 PRIMARY KEY를 지정하는 것이다!)
);
*/

-- PRIMARY KEY 는 하나만 올 수 있으므로,
-- 컬럼들을 묶어서 하나의 프라이머리 키로 지정한다.


/*
※ [이렇게 하면 안된다!]
CREATE TABLE TBL_TEST3
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
, CONSTRAINT TEST3_COL1_PK PRIMARY KEY (COL1)
, CONSTRAINT TEST3_COL2_PK PRIMARY KEY (COL2)
);

*/

CREATE TABLE TBL_TEST3
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
, CONSTRAINT TEST3_COL1_COL2_PK PRIMARY KEY (COL1, COL2)
);
--==>> Table TBL_TEST3이(가) 생성되었습니다.


-- 데이터 입력

INSERT INTO TBL_TEST3(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(1, 'TEST');    --> 에러 발생(중복된 데이터를 입력했다. 두 개의 COL1, COL2 모두...)
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(1, 'ABCD');    --> 실행 가능!!! (왜냐면... 『1, TEST』 이거 하나가 KEY 하나이므로!!
                                                        -- 두 개가 묶여 있으면, 이 두 개가 정확히 일치할 때만 중복으로 판단함.
                                                        -- 1 TEST != 1 ABCD 이므로 중복이 아니다!
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(2, 'ABCD');    -- 두 개가 모두 일치하는 것만 중복으로 판단하므로 이 경우도 가능하다.
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(2, 'TEST');    
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(3, NULL);      --> 에러 발생 (NULL 처리에 있어서는 두 개의 컬럼 COL1, COL2 중 하나라도 NULL 이 들어가면 안 된다!)
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(NULL, 'TEST'); --> 에러 발생
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(NULL, NULL);   --> 에러 발생

-- 확인
SELECT *
FROM TBL_TEST3;
--==>>
/*
1	ABCD
1	TEST
2	ABCD
2	TEST
*/

-- 커밋
COMMIT;
--==>> 커밋 완료.


--○ USER_CONSTRAINTS 와 USER_CONS_COLUMNS 를 대상으로
--   제약조건이 설정된 내용에 대해서
--   소유주, 제약조건명, 테이블명, 제약조건종류, 컬럼명 항목을 조회한다.



SELECT UC.OWNER, UC.CONSTRAINT_NAME, UC.TABLE_NAME, UC.CONSTRAINT_TYPE
     , UCC.COLUMN_NAME
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST3';
--==>>
/*
HR	TEST3_COL1_COL2_PK	TBL_TEST3	P	COL1
HR	TEST3_COL1_COL2_PK	TBL_TEST3	P	COL2
*/


--○ PK 지정 실습(④ 테이블 생성 이후 제약조건 추가 설정)
-- 테이블 생성
CREATE TABLE TBL_TEST4
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
);
--==>> Table TBL_TEST4이(가) 생성되었습니다.

-- 데이터가 미리 입력되어 있는 상태에서 PRIMARY KEY를 설정하려 하는데...
-- 테이블안에 이미 제약 조건을 위반하는 데이터가 있다면?
-----> 이건 불가능하다! 이미 위반된 데이터 형태가 들어간 상태에서는 제약 조건을 설정할 수 없다.


--※ 이미 생성된(만들어져 있는) 상태의 테이블에
--   부여하려는 제약조건을 위반한 데이터가 포함되어 있을 경우
--   해당 테이블에 제약조건을 추가하는 것은 불가능하다.


-- 제약조건 추가 (테이블의 구조를 변경하는 것이므로 ALTER를 사용.)

ALTER TABLE TBL_TEST4
ADD CONSTRAINT TEST4_COL1_PK PRIMARY KEY(COL1); 
--==>> Table TBL_TEST4이(가) 변경되었습니다.



--○ USER_CONSTRAINTS 와 USER_CONS_COLUMNS 를 대상으로
--   제약조건이 설정된 내용에 대해서
--   소유주, 제약조건명, 테이블명, 제약조건종류, 컬럼명 항목을 조회한다.

SELECT UC.OWNER, UC.CONSTRAINT_NAME, UC.TABLE_NAME, UC.CONSTRAINT_TYPE
     , UCC.COLUMN_NAME
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST4';
--==>> HR	TEST4_COL1_PK	TBL_TEST4	P	COL1

-- 선생님의 조언
-- 제약조건을 이미 설정했으면... 기존의 제약조건을 제거하고 다시 설정하도록 하자.
-- 제약조건을 바꾸려는 시도는 하지 말도록 하자.


--※ 제약조건 확인 전용 뷰(VIEW) 생성


CREATE OR REPLACE VIEW VIEW_CONSTCHECK
AS
SELECT UC.OWNER "OWNER"
     , UC.CONSTRAINT_NAME "CONSTRAINT_NAME"
     , UC.TABLE_NAME "TABLE_NAME"
     , UC.CONSTRAINT_TYPE "CONSTRAINT_TYPE"
     , UCC.COLUMN_NAME "COLUMN_NAME"
     , UC.SEARCH_CONDITION "SEARCH_CONDITION"
     , UC.DELETE_RULE "DELETE_RULE"
FROM USER_CONSTRAINTS UC JOIN USER_CONS_COLUMNS UCC
ON UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME;
--==>> View VIEW_CONSTCHECK이(가) 생성되었습니다.



--○ 생성된 뷰(VIEW)를 통한 제약조건 확인

SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST4';
--==>> HR	TEST4_COL1_PK	TBL_TEST4	P	COL1		

--------------------------------------------------------------------------------


-- NOT NULL 제약조건이 추가되어 있지 않은 상황이다.

--■■■ UNIQUE(UK:U) ■■■--

-- 1. 테이블에서 지정한 컬럼의 데이터가 중복되지 않고 유일할 수 있도록 설정하는 제약조건.
--    PRIMARY KEY 와 유사한 제약조건이지만, ★NULL 을 허용한다★는 차이점이 있다.
--    내부적으로 PRIMARY KEY 와 마찬가지로 UNIQUE INDEX 가 자동 생성된다.
--    하나의 테이블 내에서 ★UNIQUE 제약조건은 여러 번 설정하는 것이 가능★하다.
--    즉, 하나의 테이블에 UNIQUE 제약조건을 여러 개 만드는 것은 가능하다는 것이다.



--2. 형식 및 구조
--① 컬럼 레벨의 형식
-- 컬럼명 데이터타입 [CONSTRAINT CONSTRAINT명] UNIQUE


--② 테이블 레벨의 형식
-- 컬럼명 데이터타입, 
-- 컬럼명 데이터타입,
-- CONSTRAINT CONSTRAINT명 UNIQUE(컬럼명, ...)



/*
『회원』 테이블
회원번호  아이디   패스워드  성명  주민번호   휴대폰번호    우편번호    주소1
 P.K    (아이디도 중복되어선 안 되는데, PRIMARY KEY 제약조건을 또 하나 설정할 수 없다!)
            U (아이디는 고유해야 하므로 UNIQUE 제약 조건을 건다!)
                                    U (주민번호도 하나의 고유한 번호여야 하므로 유니크제약조건 걸 수 있다!)
                                                U (휴대폰번호도 하나의 회원이 한 휴대폰번호를 가져야 하므로 유니크를 사용할 수 있다.)
                                                  (단, 미성년자가 부모의 휴대번호를 쓰거나 가족의 번호를 쓸 수 있도록 한다면 불가능.)
                                                  


                                                
*/



--○ UK 지정 실습(① 컬럼 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST5
( COL1  NUMBER(5)       PRIMARY KEY
, COL2  VARCHAR2(30)    UNIQUE -- 유니크 제약 조건!
);
--==>> Table TBL_TEST5이(가) 생성되었습니다.



-- 제약조건 조회

SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST5';
--==>>
/*
OWNER	CONSTRAINT_NAME	TABLE_NAME	CONSTRAINT_TYPE	COLUMN_NAME	SEARCH_CONDITION	    DELETE_RULE
HR	    SYS_C007080	    TBL_TEST5	    P	           COL1		    (null)              (null)
HR	    SYS_C007081	    TBL_TEST5	    U	           COL2		    (null)              (null)
*/



-- 어떤 제약조건을 위반했는지 파악하기 위해
-- 이름 조건에 근거해서 만들었다면... (CONSTRAINT_NAME)
-- 이름 조건이 CONSTRAINT_COL1_UNIQUE 이런 형식일 때 이름만 보고도 어떤 제약조건을 위반했는지 파악할 수 있다.


-- 데이터 입력
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(1, 'TEST'); --> 에러 발생 (중복발생)
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(2, 'ABCD'); 
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(3, 'ABCD'); --> 에러 발생 (PRIMARY KEY 는 중복이 아니지만, 'ABCD'인 UNIQUE 제약조건을 위반했으므로 에러!)
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(3, NULL);   --> 위에서 에러가 발생하여 3번 데이터가 없다.
                                                     --  UNIQUE 는 NULL 을 허용하므로 입력 된다!
INSERT INTO TBL_TEST5(COL1) VALUES(4);
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(5, 'ABCD'); --> 에러 발생 (UNIQUE 제약조건 위반 (중복 데이터 발생!))


-- 확인

SELECT *
FROM TBL_TEST5;

--==>>
/*
COL1	COL2
1	    TEST
2	    ABCD
3	    (null)
4	    (null)
*/


-- 커밋
COMMIT;
--==>> 커밋 완료.





--○ UK 지정 실습(② 테이블 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST6
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
, CONSTRAINT TEST6_COL1_PK PRIMARY KEY (COL1)
, CONSTRAINT TEST6_COL2_UK UNIQUE (COL2)
);
--==>> Table TBL_TEST6이(가) 생성되었습니다.


-- 제약조건 확인

SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST6';
--==>>
/*
OWNER	CONSTRAINT_NAME	TABLE_NAME	CONSTRAINT_TYPE	COLUMN_NAME	SEARCH_CONDITION	DELETE_RULE
HR	    TEST6_COL1_PK	TBL_TEST6	    P	            COL1		
HR	    TEST6_COL2_UK	TBL_TEST6	    U	            COL2		
*/



--○ UK 지정 실습(③ 테이블 생성 이후 제약조건 추가)
-- 테이블 생성

CREATE TABLE TBL_TEST7
( COL1  NUMBER(5)
, COL2  VARCHAR2(30)
);
--==>> Table TBL_TEST7이(가) 생성되었습니다.


-- 제약조건 확인

SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST7';
--==>> 조회 결과 없음.


-- 제약조건 추가

ALTER TABLE TBL_TEST7
ADD CONSTRAINT TEST7_COL1_PK PRIMARY KEY(COL1);
--  +

ALTER TABLE TBL_TEST7
ADD CONSTRAINT TEST7_COL2_UK UNIQUE(COL2);
--  ↓

ALTER TABLE TBL_TEST7
ADD ( CONSTRAINT TEST7_COL1_PK PRIMARY KEY(COL1)
    , CONSTRAINT TEST7_COL2_UK UNIQUE(COL2) );
--==>> Table TBL_TEST7이(가) 변경되었습니다.

-- 제약조건 추가 이후 다시 확인

SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST7';
--==>>
/*
OWNER	CONSTRAINT_NAME	TABLE_NAME	CONSTRAINT_TYPE	COLUMN_NAME	SEARCH_CONDITION	DELETE_RULE
HR	    TEST7_COL1_PK	TBL_TEST7	    P	            COL1		
HR	    TEST7_COL2_UK	TBL_TEST7	    U	            COL2		
*/

 



 
[최종 제출물 - 3차 결과물]
 
TBL_INSA(4팀_김지민).sql

SELECT USER
FROM DUAL;
--==>> SCOTT


--○ 테이블 생성 (SCOTT.TBL_INSA)
CREATE TABLE TBL_INSA
( NUM      NUMBER(5)    NOT NULL
, NAME     VARCHAR2(20) NOT NULL
, SSN      VARCHAR2(14) NOT NULL
, IBSADATE DATE         NOT NULL
, CITY     VARCHAR2(10)
, TEL      VARCHAR2(15)
, BUSEO    VARCHAR2(15) NOT NULL
, JIKWI    VARCHAR2(15) NOT NULL
, BASICPAY NUMBER(10)   NOT NULL
, SUDANG   NUMBER(10)   NOT NULL
, CONSTRAINT TBL_INSA_NUM_PK PRIMARY KEY(NUM)
);
--==>> Table TBL_INSA이(가) 생성되었습니다.


--※ 세션 기본값 설정
ALTER SESSION SET NLS_DATE_FORMAT ='YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.


--○ 데이터 입력
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1001, '홍길동', '771212-1022432', '1998-10-11', '서울', '011-2356-4528', '기획부', '부장', 2610000, 200000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1002, '이순신', '801007-1544236', '2000-11-29', '경기', '010-4758-6532', '총무부', '사원', 1320000, 200000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1003, '이순애', '770922-2312547', '1999-02-25', '인천', '010-4231-1236', '개발부', '부장', 2550000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1004, '김정훈', '790304-1788896', '2000-10-01', '전북', '019-5236-4221', '영업부', '대리', 1954200, 170000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1005, '한석봉', '811112-1566789', '2004-08-13', '서울', '018-5211-3542', '총무부', '사원', 1420000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1006, '이기자', '780505-2978541', '2002-02-11', '인천', '010-3214-5357', '개발부', '과장', 2265000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1007, '장인철', '780506-1625148', '1998-03-16', '제주', '011-2345-2525', '개발부', '대리', 1250000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1008, '김영년', '821011-2362514', '2002-04-30', '서울', '016-2222-4444', '홍보부', '사원', 950000 , 145000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1009, '나윤균', '810810-1552147', '2003-10-10', '경기', '019-1111-2222', '인사부', '사원', 840000 , 220400);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1010, '김종서', '751010-1122233', '1997-08-08', '부산', '011-3214-5555', '영업부', '부장', 2540000, 130000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1011, '유관순', '801010-2987897', '2000-07-07', '서울', '010-8888-4422', '영업부', '사원', 1020000, 140000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1012, '정한국', '760909-1333333', '1999-10-16', '강원', '018-2222-4242', '홍보부', '사원', 880000 , 114000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1013, '조미숙', '790102-2777777', '1998-06-07', '경기', '019-6666-4444', '홍보부', '대리', 1601000, 103000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1014, '황진이', '810707-2574812', '2002-02-15', '인천', '010-3214-5467', '개발부', '사원', 1100000, 130000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1015, '이현숙', '800606-2954687', '1999-07-26', '경기', '016-2548-3365', '총무부', '사원', 1050000, 104000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1016, '이상헌', '781010-1666678', '2001-11-29', '경기', '010-4526-1234', '개발부', '과장', 2350000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1017, '엄용수', '820507-1452365', '2000-08-28', '인천', '010-3254-2542', '개발부', '사원', 950000 , 210000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1018, '이성길', '801028-1849534', '2004-08-08', '전북', '018-1333-3333', '개발부', '사원', 880000 , 123000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1019, '박문수', '780710-1985632', '1999-12-10', '서울', '017-4747-4848', '인사부', '과장', 2300000, 165000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1020, '유영희', '800304-2741258', '2003-10-10', '전남', '011-9595-8585', '자재부', '사원', 880000 , 140000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1021, '홍길남', '801010-1111111', '2001-09-07', '경기', '011-9999-7575', '개발부', '사원', 875000 , 120000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1022, '이영숙', '800501-2312456', '2003-02-25', '전남', '017-5214-5282', '기획부', '대리', 1960000, 180000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1023, '김인수', '731211-1214576', '1995-02-23', '서울', NULL           , '영업부', '부장', 2500000, 170000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1024, '김말자', '830225-2633334', '1999-08-28', '서울', '011-5248-7789', '기획부', '대리', 1900000, 170000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1025, '우재옥', '801103-1654442', '2000-10-01', '서울', '010-4563-2587', '영업부', '사원', 1100000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1026, '김숙남', '810907-2015457', '2002-08-28', '경기', '010-2112-5225', '영업부', '사원', 1050000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1027, '김영길', '801216-1898752', '2000-10-18', '서울', '019-8523-1478', '총무부', '과장', 2340000, 170000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1028, '이남신', '810101-1010101', '2001-09-07', '제주', '016-1818-4848', '인사부', '사원', 892000 , 110000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1029, '김말숙', '800301-2020202', '2000-09-08', '서울', '016-3535-3636', '총무부', '사원', 920000 , 124000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1030, '정정해', '790210-2101010', '1999-10-17', '부산', '019-6564-6752', '총무부', '과장', 2304000, 124000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1031, '지재환', '771115-1687988', '2001-01-21', '서울', '019-5552-7511', '기획부', '부장', 2450000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1032, '심심해', '810206-2222222', '2000-05-05', '전북', '016-8888-7474', '자재부', '사원', 880000 , 108000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1033, '김미나', '780505-2999999', '1998-06-07', '서울', '011-2444-4444', '영업부', '사원', 1020000, 104000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1034, '이정석', '820505-1325468', '2005-09-26', '경기', '011-3697-7412', '기획부', '사원', 1100000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1035, '정영희', '831010-2153252', '2002-05-16', '인천', NULL           , '개발부', '사원', 1050000, 140000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1036, '이재영', '701126-2852147', '2003-08-10', '서울', '011-9999-9999', '자재부', '사원', 960400 , 190000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1037, '최석규', '770129-1456987', '1998-10-15', '인천', '011-7777-7777', '홍보부', '과장', 2350000, 187000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1038, '손인수', '791009-2321456', '1999-11-15', '부산', '010-6542-7412', '영업부', '대리', 2000000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1039, '고순정', '800504-2000032', '2003-12-28', '경기', '010-2587-7895', '영업부', '대리', 2010000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1040, '박세열', '790509-1635214', '2000-09-10', '경북', '016-4444-7777', '인사부', '대리', 2100000, 130000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1041, '문길수', '721217-1951357', '2001-12-10', '충남', '016-4444-5555', '자재부', '과장', 2300000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1042, '채정희', '810709-2000054', '2003-10-17', '경기', '011-5125-5511', '개발부', '사원', 1020000, 200000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1043, '양미옥', '830504-2471523', '2003-09-24', '서울', '016-8548-6547', '영업부', '사원', 1100000, 210000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1044, '지수환', '820305-1475286', '2004-01-21', '서울', '011-5555-7548', '영업부', '사원', 1060000, 220000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1045, '홍원신', '690906-1985214', '2003-03-16', '전북', '011-7777-7777', '영업부', '사원', 960000 , 152000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1046, '허경운', '760105-1458752', '1999-05-04', '경남', '017-3333-3333', '총무부', '부장', 2650000, 150000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1047, '산마루', '780505-1234567', '2001-07-15', '서울', '018-0505-0505', '영업부', '대리', 2100000, 112000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1048, '이기상', '790604-1415141', '2001-06-07', '전남', NULL           , '개발부', '대리', 2050000, 106000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1049, '이미성', '830908-2456548', '2000-04-07', '인천', '010-6654-8854', '개발부', '사원', 1300000, 130000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1050, '이미인', '810403-2828287', '2003-06-07', '경기', '011-8585-5252', '홍보부', '대리', 1950000, 103000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1051, '권영미', '790303-2155554', '2000-06-04', '서울', '011-5555-7548', '영업부', '과장', 2260000, 104000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1052, '권옥경', '820406-2000456', '2000-10-10', '경기', '010-3644-5577', '기획부', '사원', 1020000, 105000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1053, '김싱식', '800715-1313131', '1999-12-12', '전북', '011-7585-7474', '자재부', '사원', 960000 , 108000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1054, '정상호', '810705-1212141', '1999-10-16', '강원', '016-1919-4242', '홍보부', '사원', 980000 , 114000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1055, '정한나', '820506-2425153', '2004-06-07', '서울', '016-2424-4242', '영업부', '사원', 1000000, 104000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1056, '전용재', '800605-1456987', '2004-08-13', '인천', '010-7549-8654', '영업부', '대리', 1950000, 200000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1057, '이미경', '780406-2003214', '1998-02-11', '경기', '016-6542-7546', '자재부', '부장', 2520000, 160000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1058, '김신제', '800709-1321456', '2003-08-08', '인천', '010-2415-5444', '기획부', '대리', 1950000, 180000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1059, '임수봉', '810809-2121244', '2001-10-10', '서울', '011-4151-4154', '개발부', '사원', 890000 , 102000);
INSERT INTO TBL_INSA (NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
VALUES (1060, '김신애', '810809-2111111', '2001-10-10', '서울', '011-4151-4444', '개발부', '사원', 900000 , 102000);
--==>> 1 행 이(가) 삽입되었습니다. * 60


--○ 커밋
COMMIT;
--==>> 커밋 완료.


SELECT *
FROM TBL_INSA;
 

------------------------------------------------------------------------------------------------------------
-- 김지민_4팀

-- 01. TBL_INSA 테이블 전체자료 조회


SELECT * -- (ALL : 테이블의 모든 컬럼들을 조회합니다.)
FROM TBL_INSA;
--==>>
/*
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1002	이순신	801007-1544236	2000-11-29	경기	010-4758-6532	총무부	사원	1320000	200000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000
1005	한석봉	811112-1566789	2004-08-13	서울	018-5211-3542	총무부	사원	1420000	160000
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1008	김영년	821011-2362514	2002-04-30	서울	016-2222-4444	홍보부	사원	950000	145000
1009	나윤균	810810-1552147	2003-10-10	경기	019-1111-2222	인사부	사원	840000	220400
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1011	유관순	801010-2987897	2000-07-07	서울	010-8888-4422	영업부	사원	1020000	140000
1012	정한국	760909-1333333	1999-10-16	강원	018-2222-4242	홍보부	사원	880000	114000
1013	조미숙	790102-2777777	1998-06-07	경기	019-6666-4444	홍보부	대리	1601000	103000
1014	황진이	810707-2574812	2002-02-15	인천	010-3214-5467	개발부	사원	1100000	130000
1015	이현숙	800606-2954687	1999-07-26	경기	016-2548-3365	총무부	사원	1050000	104000
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1018	이성길	801028-1849534	2004-08-08	전북	018-1333-3333	개발부	사원	880000	123000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
1020	유영희	800304-2741258	2003-10-10	전남	011-9595-8585	자재부	사원	880000	140000
1021	홍길남	801010-1111111	2001-09-07	경기	011-9999-7575	개발부	사원	875000	120000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000
1026	김숙남	810907-2015457	2002-08-28	경기	010-2112-5225	영업부	사원	1050000	150000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000
1028	이남신	810101-1010101	2001-09-07	제주	016-1818-4848	인사부	사원	892000	110000
1029	김말숙	800301-2020202	2000-09-08	서울	016-3535-3636	총무부	사원	920000	124000
1030	정정해	790210-2101010	1999-10-17	부산	019-6564-6752	총무부	과장	2304000	124000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1032	심심해	810206-2222222	2000-05-05	전북	016-8888-7474	자재부	사원	880000	108000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1035	정영희	831010-2153252	2002-05-16	인천		개발부	사원	1050000	140000
1036	이재영	701126-2852147	2003-08-10	서울	011-9999-9999	자재부	사원	960400	190000
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000
1042	채정희	810709-2000054	2003-10-17	경기	011-5125-5511	개발부	사원	1020000	200000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000
1045	홍원신	690906-1985214	2003-03-16	전북	011-7777-7777	영업부	사원	960000	152000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000
1049	이미성	830908-2456548	2000-04-07	인천	010-6654-8854	개발부	사원	1300000	130000
1050	이미인	810403-2828287	2003-06-07	경기	011-8585-5252	홍보부	대리	1950000	103000								
*/

--★ 까먹었어...

-- 02. SCOTT 사용자 소유 테이블 목록 확인(2가지 구문 활용)

SELECT *
FROM ALL_TABLES
WHERE OWNER = 'SCOTT';

SELECT *
FROM USER_TABLES;
--==>>
/*
TBL_EMP
DEPT
EMP
BONUS
SALGRADE
TBL_EXAMPLE2
EMP4
EMP5
TBL_DEPT
TBL_SAWON
TBL_WATCH
TBL_FILES
TBL_BOARD
TBL_JUMUN
TBL_JUMUN_TEST_TABLE
TBL_JUMUNBACKUP2
TBL_SAWONBACKUP
TBL_JUMUNBACKUP
TEST_TABLE
TBL_INSA
*/



--03. TBL_INSA 테이블 구조 확인
DESC TBL_INSA;
--==>>
/*
이름       널?       유형           
-------- -------- ------------ 
NUM      NOT NULL NUMBER(5)    
NAME     NOT NULL VARCHAR2(20) 
SSN      NOT NULL VARCHAR2(14) 
IBSADATE NOT NULL DATE         
CITY              VARCHAR2(10) 
TEL               VARCHAR2(15) 
BUSEO    NOT NULL VARCHAR2(15) 
JIKWI    NOT NULL VARCHAR2(15) 
BASICPAY NOT NULL NUMBER(10)   
SUDANG   NOT NULL NUMBER(10)
*/

-- 04. TBL_INSA 테이블의 이름(NAME), 기본급(BASICPAY) 조회


SELECT NAME, BASICPAY
FROM TBL_INSA;
--==>>
/*
홍길동	2610000
이순신	1320000
이순애	2550000
김정훈	1954200
한석봉	1420000
이기자	2265000
장인철	1250000
김영년	950000
나윤균	840000
김종서	2540000
유관순	1020000
정한국	880000
조미숙	1601000
황진이	1100000
이현숙	1050000
이상헌	2350000
엄용수	950000
이성길	880000
박문수	2300000
유영희	880000
홍길남	875000
이영숙	1960000
김인수	2500000
김말자	1900000
우재옥	1100000
김숙남	1050000
김영길	2340000
이남신	892000
김말숙	920000
정정해	2304000
지재환	2450000
심심해	880000
김미나	1020000
이정석	1100000
정영희	1050000
이재영	960400
최석규	2350000
손인수	2000000
고순정	2010000
박세열	2100000
문길수	2300000
채정희	1020000
양미옥	1100000
지수환	1060000
홍원신	960000
허경운	2650000
산마루	2100000
이기상	2050000
이미성	1300000
이미인	1950000
권영미	2260000
권옥경	1020000
김싱식	960000
정상호	980000
정한나	1000000
전용재	1950000
이미경	2520000
김신제	1950000
임수봉	890000
김신애	900000
*/


--05. TBL_INSA 테이블의 이름(NAME), 기본급(BASICPAY), 수당(SUDANG), 기본급+수당 조회


SELECT NAME "이름", BASICPAY "기본급", SUDANG "수당", BASICPAY + SUDANG "기본급+수당"
FROM TBL_INSA;
--==>>
/*
홍길동	2610000	200000	2810000
이순신	1320000	200000	1520000
이순애	2550000	160000	2710000
김정훈	1954200	170000	2124200
한석봉	1420000	160000	1580000
이기자	2265000	150000	2415000
장인철	1250000	150000	1400000
김영년	950000	145000	1095000
나윤균	840000	220400	1060400
김종서	2540000	130000	2670000
유관순	1020000	140000	1160000
정한국	880000	114000	994000
조미숙	1601000	103000	1704000
황진이	1100000	130000	1230000
이현숙	1050000	104000	1154000
이상헌	2350000	150000	2500000
엄용수	950000	210000	1160000
이성길	880000	123000	1003000
박문수	2300000	165000	2465000
유영희	880000	140000	1020000
홍길남	875000	120000	995000
이영숙	1960000	180000	2140000
김인수	2500000	170000	2670000
김말자	1900000	170000	2070000
우재옥	1100000	160000	1260000
김숙남	1050000	150000	1200000
김영길	2340000	170000	2510000
이남신	892000	110000	1002000
김말숙	920000	124000	1044000
정정해	2304000	124000	2428000
지재환	2450000	160000	2610000
심심해	880000	108000	988000
김미나	1020000	104000	1124000
이정석	1100000	160000	1260000
정영희	1050000	140000	1190000
이재영	960400	190000	1150400
최석규	2350000	187000	2537000
손인수	2000000	150000	2150000
고순정	2010000	160000	2170000
박세열	2100000	130000	2230000
문길수	2300000	150000	2450000
채정희	1020000	200000	1220000
양미옥	1100000	210000	1310000
지수환	1060000	220000	1280000
홍원신	960000	152000	1112000
허경운	2650000	150000	2800000
산마루	2100000	112000	2212000
이기상	2050000	106000	2156000
이미성	1300000	130000	1430000
이미인	1950000	103000	2053000
권영미	2260000	104000	2364000
권옥경	1020000	105000	1125000
김싱식	960000	108000	1068000
정상호	980000	114000	1094000
정한나	1000000	104000	1104000
전용재	1950000	200000	2150000
이미경	2520000	160000	2680000
김신제	1950000	180000	2130000
임수봉	890000	102000	992000
김신애	900000	102000	1002000
*/




--06. TBL_INSA 테이블의 이름(NAME), 출신도(CITY), 부서명(BUSEO) 조회. 별칭(ALIAS) 사용.


SELECT NAME "이름", CITY "출신도", BUSEO "부서명"
FROM TBL_INSA;
--==>>
/*
홍길동	서울	기획부
이순신	경기	총무부
이순애	인천	개발부
김정훈	전북	영업부
한석봉	서울	총무부
이기자	인천	개발부
장인철	제주	개발부
김영년	서울	홍보부
나윤균	경기	인사부
김종서	부산	영업부
유관순	서울	영업부
정한국	강원	홍보부
조미숙	경기	홍보부
황진이	인천	개발부
이현숙	경기	총무부
이상헌	경기	개발부
엄용수	인천	개발부
이성길	전북	개발부
박문수	서울	인사부
유영희	전남	자재부
홍길남	경기	개발부
이영숙	전남	기획부
김인수	서울	영업부
김말자	서울	기획부
우재옥	서울	영업부
김숙남	경기	영업부
김영길	서울	총무부
이남신	제주	인사부
김말숙	서울	총무부
정정해	부산	총무부
지재환	서울	기획부
심심해	전북	자재부
김미나	서울	영업부
이정석	경기	기획부
정영희	인천	개발부
이재영	서울	자재부
최석규	인천	홍보부
손인수	부산	영업부
고순정	경기	영업부
박세열	경북	인사부
문길수	충남	자재부
채정희	경기	개발부
양미옥	서울	영업부
지수환	서울	영업부
홍원신	전북	영업부
허경운	경남	총무부
산마루	서울	영업부
이기상	전남	개발부
이미성	인천	개발부
이미인	경기	홍보부
권영미	서울	영업부
권옥경	경기	기획부
김싱식	전북	자재부
정상호	강원	홍보부
정한나	서울	영업부
전용재	인천	영업부
이미경	경기	자재부
김신제	인천	기획부
임수봉	서울	개발부
김신애	서울	개발부
*/




--07. 서울 사람의 이름(NAME), 출신도(CITY), 부서명(BUSEO), 직위(JIKWI) 조회

SELECT NAME "이름", CITY "출신도", BUSEO "부서명", JIKWI "직위"
FROM TBL_INSA
WHERE CITY LIKE '서울';
--==>>
/*
홍길동	서울	기획부	부장
한석봉	서울	총무부	사원
김영년	서울	홍보부	사원
유관순	서울	영업부	사원
박문수	서울	인사부	과장
김인수	서울	영업부	부장
김말자	서울	기획부	대리
우재옥	서울	영업부	사원
김영길	서울	총무부	과장
김말숙	서울	총무부	사원
지재환	서울	기획부	부장
김미나	서울	영업부	사원
이재영	서울	자재부	사원
양미옥	서울	영업부	사원
지수환	서울	영업부	사원
산마루	서울	영업부	대리
권영미	서울	영업부	과장
정한나	서울	영업부	사원
임수봉	서울	개발부	사원
김신애	서울	개발부	사원
*/




--08. 출신도가 서울 사람이면서       → WHERE 구문
    기본급이 150만원 이상인 사람   → WHERE 구문
    조회 (NAME, CITY, BASICPAY, SSN)


SELECT NAME, CITY, BASICPAY, SSN
FROM TBL_INSA
WHERE CITY LIKE '서울'
      AND
      BASICPAY >= 1500000;
--==>>
/*
홍길동	서울	2610000	771212-1022432
박문수	서울	2300000	780710-1985632
김인수	서울	2500000	731211-1214576
김말자	서울	1900000	830225-2633334
김영길	서울	2340000	801216-1898752
지재환	서울	2450000	771115-1687988
산마루	서울	2100000	780505-1234567
권영미	서울	2260000	790303-2155554
*/


--09. 출신도가 '인천' 이면서, 기본급이 100만원이상 ~ 200만원 미만인 경우만 모든정보 조회.


SELECT *
FROM TBL_INSA
WHERE CITY LIKE '인천'
      AND
      BASICPAY BETWEEN 1000000 AND 1999999;
--==>>
/*
1014	황진이	810707-2574812	2002-02-15	인천	010-3214-5467	개발부	사원	1100000	130000
1035	정영희	831010-2153252	2002-05-16	인천		개발부	사원	1050000	140000
1049	이미성	830908-2456548	2000-04-07	인천	010-6654-8854	개발부	사원	1300000	130000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000
*/





--10. 출신도가 서울 사람이거나 부서가 개발부인 자료 조회 (NAME, CITY, BUSEO)


SELECT NAME, CITY, BUSEO
FROM TBL_INSA
WHERE CITY LIKE '서울'
      OR
      BUSEO LIKE '개발부';
--==>>
/*
홍길동	서울	기획부
이순애	인천	개발부
한석봉	서울	총무부
이기자	인천	개발부
장인철	제주	개발부
김영년	서울	홍보부
유관순	서울	영업부
황진이	인천	개발부
이상헌	경기	개발부
엄용수	인천	개발부
이성길	전북	개발부
박문수	서울	인사부
홍길남	경기	개발부
김인수	서울	영업부
김말자	서울	기획부
우재옥	서울	영업부
김영길	서울	총무부
김말숙	서울	총무부
지재환	서울	기획부
김미나	서울	영업부
정영희	인천	개발부
이재영	서울	자재부
채정희	경기	개발부
양미옥	서울	영업부
지수환	서울	영업부
산마루	서울	영업부
이기상	전남	개발부
이미성	인천	개발부
권영미	서울	영업부
정한나	서울	영업부
임수봉	서울	개발부
김신애	서울	개발부
*/




-- 11. 출신도가 서울, 경기인 사람만 조회 (NAME, CITY, BUSEO). IN 연산자 사용.

SELECT NAME, CITY, BUSEO
FROM TBL_INSA
WHERE CITY IN ('서울', '경기');
--==>>
/*
홍길동	서울	기획부
이순신	경기	총무부
한석봉	서울	총무부
김영년	서울	홍보부
나윤균	경기	인사부
유관순	서울	영업부
조미숙	경기	홍보부
이현숙	경기	총무부
이상헌	경기	개발부
박문수	서울	인사부
홍길남	경기	개발부
김인수	서울	영업부
김말자	서울	기획부
우재옥	서울	영업부
김숙남	경기	영업부
김영길	서울	총무부
김말숙	서울	총무부
지재환	서울	기획부
김미나	서울	영업부
이정석	경기	기획부
이재영	서울	자재부
고순정	경기	영업부
채정희	경기	개발부
양미옥	서울	영업부
지수환	서울	영업부
산마루	서울	영업부
이미인	경기	홍보부
권영미	서울	영업부
권옥경	경기	기획부
정한나	서울	영업부
이미경	경기	자재부
임수봉	서울	개발부
김신애	서울	개발부
*/




--12. 부서가 '개발부' 이거나 '영업부'인 사원의 모든정보 조회. IN 연산자 사용.


SELECT *
FROM TBL_INSA
WHERE BUSEO IN ('개발부', '영업부');
--==>>
/*
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1011	유관순	801010-2987897	2000-07-07	서울	010-8888-4422	영업부	사원	1020000	140000
1014	황진이	810707-2574812	2002-02-15	인천	010-3214-5467	개발부	사원	1100000	130000
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1018	이성길	801028-1849534	2004-08-08	전북	018-1333-3333	개발부	사원	880000	123000
1021	홍길남	801010-1111111	2001-09-07	경기	011-9999-7575	개발부	사원	875000	120000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000
1026	김숙남	810907-2015457	2002-08-28	경기	010-2112-5225	영업부	사원	1050000	150000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1035	정영희	831010-2153252	2002-05-16	인천		개발부	사원	1050000	140000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1042	채정희	810709-2000054	2003-10-17	경기	011-5125-5511	개발부	사원	1020000	200000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000
1045	홍원신	690906-1985214	2003-03-16	전북	011-7777-7777	영업부	사원	960000	152000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000
1049	이미성	830908-2456548	2000-04-07	인천	010-6654-8854	개발부	사원	1300000	130000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000
1055	정한나	820506-2425153	2004-06-07	서울	016-2424-4242	영업부	사원	1000000	104000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000
1059	임수봉	810809-2121244	2001-10-10	서울	011-4151-4154	개발부	사원	890000	102000
1060	김신애	810809-2111111	2001-10-10	서울	011-4151-4444	개발부	사원	900000	102000
*/




--13. 급여(BASICPAY + SUDANG)가 250만원 이상인 사람 조회. → WHERE 구문
--    단, 필드명은 한글로 출력. → 별칭(ALIAS)
--    (NAME, BASICPAY, SUDANG, BASICPAY+SUDANG);
    
    
SELECT NAME "이름", BASICPAY "기본급", SUDANG "수당", BASICPAY+SUDANG "급여"
FROM TBL_INSA
WHERE BASICPAY + SUDANG >= 2500000;
--==>>
/*
홍길동	2610000	200000	2810000
이순애	2550000	160000	2710000
김종서	2540000	130000	2670000
이상헌	2350000	150000	2500000
김인수	2500000	170000	2670000
김영길	2340000	170000	2510000
지재환	2450000	160000	2610000
최석규	2350000	187000	2537000
허경운	2650000	150000	2800000
이미경	2520000	160000	2680000
*/


--14. 주민번호를 기준으로 남자(성별 자릿수가 1, 3)만 조회. 
--    ( 이름(NAME), 주민번호(SSN) )
--    단, SUBSTR() 함수 이용;


SELECT NAME "이름", SSN "주민번호"
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '3');
--==>>
/*
홍길동	771212-1022432
이순신	801007-1544236
김정훈	790304-1788896
한석봉	811112-1566789
장인철	780506-1625148
나윤균	810810-1552147
김종서	751010-1122233
정한국	760909-1333333
이상헌	781010-1666678
엄용수	820507-1452365
이성길	801028-1849534
박문수	780710-1985632
홍길남	801010-1111111
김인수	731211-1214576
우재옥	801103-1654442
김영길	801216-1898752
이남신	810101-1010101
지재환	771115-1687988
이정석	820505-1325468
최석규	770129-1456987
박세열	790509-1635214
문길수	721217-1951357
지수환	820305-1475286
홍원신	690906-1985214
허경운	760105-1458752
산마루	780505-1234567
이기상	790604-1415141
김싱식	800715-1313131
정상호	810705-1212141
전용재	800605-1456987
김신제	800709-1321456
*/
    
    
-- 15. 주민번호를 기준으로 80년대 태어난 사람만 조회. 
--    ( 이름(NAME), 주민번호(SSN) );


SELECT NAME, SSN
FROM TBL_INSA
WHERE SUBSTR(SSN, 1, 1) LIKE '8' -- 80년대 이면서...
      AND
      SUBSTR(SSN, 8, 1) IN ('1', '2');  -- 2000년대 이전 출생자.
--==>>
/*
이순신	801007-1544236
한석봉	811112-1566789
김영년	821011-2362514
나윤균	810810-1552147
유관순	801010-2987897
황진이	810707-2574812
이현숙	800606-2954687
엄용수	820507-1452365
이성길	801028-1849534
유영희	800304-2741258
홍길남	801010-1111111
이영숙	800501-2312456
김말자	830225-2633334
우재옥	801103-1654442
김숙남	810907-2015457
김영길	801216-1898752
이남신	810101-1010101
김말숙	800301-2020202
심심해	810206-2222222
이정석	820505-1325468
정영희	831010-2153252
고순정	800504-2000032
채정희	810709-2000054
양미옥	830504-2471523
지수환	820305-1475286
이미성	830908-2456548
이미인	810403-2828287
권옥경	820406-2000456
김싱식	800715-1313131
정상호	810705-1212141
정한나	820506-2425153
전용재	800605-1456987
김신제	800709-1321456
임수봉	810809-2121244
김신애	810809-2111111
*/

-- 나이 계산하기 (한국식)
SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '2') -- 1990년도 출생자라면...
            THEN EXTRACT(YEAR FROM SYSDATE) - 1900 - (TO_NUMBER(SUBSTR(SSN, 1, 2))) + 1
            WHEN SUBSTR(SSN, 8, 1) IN ('3', '4') -- 2000년도 출생자라면...
            THEN EXTRACT(YEAR FROM SYSDATE) - 2000 - (TO_NUMBER(SUBSTR(SSN, 1, 2))) + 1
            ELSE -1 -- 알 수 없음.
       END "현재 나이"
       , NAME
            

-- 나이 계산
SELECT EXTRACT(YEAR FROM SYSDATE) - 1900 - (TO_NUMBER(SUBSTR(SSN, 1, 2)) + 1)
FROM TBL_INSA;
    
    

--16. 서울 사람 중에서 70년대 태어난 사람만 조회. SUBSTR() 함수 이용.


SELECT *
FROM TBL_INSA
WHERE CITY LIKE '서울'
      AND
      SUBSTR(SSN, 1, 1) = '7'   -- 70년대생이면서...
      AND
      SUBSTR(SSN, 8, 1) IN ('1', '2');   -- 2000년대 이전 출생자.
--==>>
/*
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
1023	    김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1036	이재영	701126-2852147	2003-08-10	서울	011-9999-9999	자재부	사원	960400	190000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000
*/



-- 17. 서울 사람 중에서 70년대 태어난 남자만 조회. SUBSTR() 함수 이용.

SELECT *
FROM TBL_INSA
WHERE CITY LIKE '서울'
      AND 
      SUBSTR(SSN, 1, 1) = '7'   -- 70년대생이면서...
      AND
      SUBSTR(SSN, 8, 1) = '1';   -- 2000년대 이전 남자는 주민번호 7번째 자리 1
--==>>
/*
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
1023	    김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
*/




--18. 서울 사람이면서 김씨만 조회
--    단, 성씨가 한 글자라는 가정. 
--    ( 이름, 출신도 )
--    SUBSTR() 함수 이용.;

--SELECT NAME
--FROM TBL_INSA
--WHERE NAME LIKE '김%'
--      AND
--      CITY LIKE '서울';
    
SELECT *
FROM TBL_INSA
WHERE CITY LIKE '서울'
      AND
      SUBSTR(NAME, 1, 1) = '김';
--==>>
/*
1008	김영년	821011-2362514	2002-04-30	서울	016-2222-4444	홍보부	사원	950000	145000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000
1029	김말숙	800301-2020202	2000-09-08	서울	016-3535-3636	총무부	사원	920000	124000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1060	김신애	810809-2111111	2001-10-10	서울	011-4151-4444	개발부	사원	900000	102000
*/






-- 19. 2000년도에 입사한 사람 조회. (이름, 출신도, 입사일).

SELECT NAME "이름", CITY "출신도", IBSADATE "입사일"
FROM TBL_INSA
WHERE SUBSTR(IBSADATE, 1, 1) LIKE '2';
--==>>
/*
이순신	경기	2000-11-29
김정훈	전북	2000-10-01
한석봉	서울	2004-08-13
이기자	인천	2002-02-11
김영년	서울	2002-04-30
나윤균	경기	2003-10-10
유관순	서울	2000-07-07
황진이	인천	2002-02-15
이상헌	경기	2001-11-29
엄용수	인천	2000-08-28
이성길	전북	2004-08-08
유영희	전남	2003-10-10
홍길남	경기	2001-09-07
이영숙	전남	2003-02-25
우재옥	서울	2000-10-01
김숙남	경기	2002-08-28
김영길	서울	2000-10-18
이남신	제주	2001-09-07
김말숙	서울	2000-09-08
지재환	서울	2001-01-21
심심해	전북	2000-05-05
이정석	경기	2005-09-26
정영희	인천	2002-05-16
이재영	서울	2003-08-10
고순정	경기	2003-12-28
박세열	경북	2000-09-10
문길수	충남	2001-12-10
채정희	경기	2003-10-17
양미옥	서울	2003-09-24
지수환	서울	2004-01-21
홍원신	전북	2003-03-16
산마루	서울	2001-07-15
이기상	전남	2001-06-07
이미성	인천	2000-04-07
이미인	경기	2003-06-07
권영미	서울	2000-06-04
권옥경	경기	2000-10-10
정한나	서울	2004-06-07
전용재	인천	2004-08-13
김신제	인천	2003-08-08
임수봉	서울	2001-10-10
김신애	서울	2001-10-10
*/



--20. 2000년 10월에 입사한 사람 조회. (이름, 출신도, 입사일).


SELECT NAME "이름", CITY "출신도", IBSADATE "입사일"
FROM TBL_INSA
WHERE TO_CHAR(IBSADATE, 'YYYY-MM') = '2000-10';
--==>>
/*
김정훈	전북	2000-10-01
우재옥	서울	2000-10-01
김영길	서울	2000-10-18
권옥경	경기	2000-10-10
*/






--21. 주민번호를 기준으로 직원의 나이 조회.
--    단, 모든 직원이 1900년대에 태어났다는 가정. (이름, 주민번호, 나이)

-- 나이 계산하기 (한국식, 1900년대 출생자)
SELECT NAME "이름"
     , SSN "주민번호"
     , EXTRACT(YEAR FROM SYSDATE) - 1900 - (TO_NUMBER(SUBSTR(SSN, 1, 2))) + 1 "나이"
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '2');
--==>>
/*
홍길동	771212-1022432	47
이순신	801007-1544236	44
이순애	770922-2312547	47
김정훈	790304-1788896	45
한석봉	811112-1566789	43
이기자	780505-2978541	46
장인철	780506-1625148	46
김영년	821011-2362514	42
나윤균	810810-1552147	43
김종서	751010-1122233	49
유관순	801010-2987897	44
정한국	760909-1333333	48
조미숙	790102-2777777	45
황진이	810707-2574812	43
이현숙	800606-2954687	44
이상헌	781010-1666678	46
엄용수	820507-1452365	42
이성길	801028-1849534	44
박문수	780710-1985632	46
유영희	800304-2741258	44
홍길남	801010-1111111	44
이영숙	800501-2312456	44
김인수	731211-1214576	51
김말자	830225-2633334	41
우재옥	801103-1654442	44
김숙남	810907-2015457	43
김영길	801216-1898752	44
이남신	810101-1010101	43
김말숙	800301-2020202	44
정정해	790210-2101010	45
지재환	771115-1687988	47
심심해	810206-2222222	43
김미나	780505-2999999	46
이정석	820505-1325468	42
정영희	831010-2153252	41
이재영	701126-2852147	54
최석규	770129-1456987	47
손인수	791009-2321456	45
고순정	800504-2000032	44
박세열	790509-1635214	45
문길수	721217-1951357	52
채정희	810709-2000054	43
양미옥	830504-2471523	41
지수환	820305-1475286	42
홍원신	690906-1985214	55
허경운	760105-1458752	48
산마루	780505-1234567	46
이기상	790604-1415141	45
이미성	830908-2456548	41
이미인	810403-2828287	43
권영미	790303-2155554	45
권옥경	820406-2000456	42
김싱식	800715-1313131	44
정상호	810705-1212141	43
정한나	820506-2425153	42
전용재	800605-1456987	44
이미경	780406-2003214	46
김신제	800709-1321456	44
임수봉	810809-2121244	43
김신애	810809-2111111	43
*/


--22. 주민번호 기준으로 현재 나이대가 20대인 사람만 조회.

SELECT *
FROM
TBL_INSA INSA
INNER JOIN
(    
    SELECT EXTRACT(YEAR FROM SYSDATE) - 1900 - (TO_NUMBER(SUBSTR(SSN, 1, 2))) + 1 "나이"
         , SSN "주민번호"
    FROM TBL_INSA
) T
ON INSA.SSN = T.주민번호
WHERE T.나이 BETWEEN 20 AND 29;
--==>> 조회 결과 없음. 다 40대예요~!!!



--23. 주민번호 기준으로 5월 생만 조회. 
--    단, SUBSTR() 함수 이용.
    
SELECT *
FROM TBL_INSA
WHERE TO_NUMBER(SUBSTR(SSN, 3, 2)) = 5;


--==>>
/*
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1055	정한나	820506-2425153	2004-06-07	서울	016-2424-4242	영업부	사원	1000000	104000
*/


--
--24. 주민번호 기준으로 5월 생만 조회. 
--    단, TO_CHAR() 함수 이용.

--① 주민번호 앞 6자리를 서브스트링으로 가져옵니다.
--② 앞에 문자 '19'를 붙여 ①과 문자열 결합합니다.
--③ 그것을 DATE 형식으로 바꿉니다.
--④ 그것을 다시 문자 형식으로 바꾸기 위해 TO_CHAR() 함수를 사용했습니다.

SELECT *
FROM TBL_INSA
WHERE TO_CHAR(TO_DATE(CONCAT(19, SUBSTR(SSN, 1, 6)), 'YYYY-MM-DD'), 'MM') = '05';
--==>>
/*
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1055	정한나	820506-2425153	2004-06-07	서울	016-2424-4242	영업부	사원	1000000	104000
*/




--25. 출신도 내림차순으로 정렬하고, 출신도가 같으면 기본급 내림차순 정렬 조회.

SELECT *
FROM TBL_INSA
ORDER BY CITY DESC, BASICPAY DESC;
--==>> 
/*
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1028	이남신	810101-1010101	2001-09-07	제주	016-1818-4848	인사부	사원	892000	110000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000
1053	김싱식	800715-1313131	1999-12-12	전북	011-7585-7474	자재부	사원	960000	108000
1045	홍원신	690906-1985214	2003-03-16	전북	011-7777-7777	영업부	사원	960000	152000
1032	심심해	810206-2222222	2000-05-05	전북	016-8888-7474	자재부	사원	880000	108000
1018	이성길	801028-1849534	2004-08-08	전북	018-1333-3333	개발부	사원	880000	123000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1020	유영희	800304-2741258	2003-10-10	전남	011-9595-8585	자재부	사원	880000	140000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000
1049	이미성	830908-2456548	2000-04-07	인천	010-6654-8854	개발부	사원	1300000	130000
1014	황진이	810707-2574812	2002-02-15	인천	010-3214-5467	개발부	사원	1100000	130000
1035	정영희	831010-2153252	2002-05-16	인천		개발부	사원	1050000	140000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1005	한석봉	811112-1566789	2004-08-13	서울	018-5211-3542	총무부	사원	1420000	160000
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1011	유관순	801010-2987897	2000-07-07	서울	010-8888-4422	영업부	사원	1020000	140000
1055	정한나	820506-2425153	2004-06-07	서울	016-2424-4242	영업부	사원	1000000	104000
1036	이재영	701126-2852147	2003-08-10	서울	011-9999-9999	자재부	사원	960400	190000
1008	김영년	821011-2362514	2002-04-30	서울	016-2222-4444	홍보부	사원	950000	145000
1029	김말숙	800301-2020202	2000-09-08	서울	016-3535-3636	총무부	사원	920000	124000
1060	김신애	810809-2111111	2001-10-10	서울	011-4151-4444	개발부	사원	900000	102000
1059	임수봉	810809-2121244	2001-10-10	서울	011-4151-4154	개발부	사원	890000	102000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1030	정정해	790210-2101010	1999-10-17	부산	019-6564-6752	총무부	과장	2304000	124000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1050	이미인	810403-2828287	2003-06-07	경기	011-8585-5252	홍보부	대리	1950000	103000
1013	조미숙	790102-2777777	1998-06-07	경기	019-6666-4444	홍보부	대리	1601000	103000
1002	이순신	801007-1544236	2000-11-29	경기	010-4758-6532	총무부	사원	1320000	200000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1015	이현숙	800606-2954687	1999-07-26	경기	016-2548-3365	총무부	사원	1050000	104000
1026	김숙남	810907-2015457	2002-08-28	경기	010-2112-5225	영업부	사원	1050000	150000
1052	권옥경	820406-2000456	2000-10-10	경기	010-3644-5577	기획부	사원	1020000	105000
1042	채정희	810709-2000054	2003-10-17	경기	011-5125-5511	개발부	사원	1020000	200000
1021	홍길남	801010-1111111	2001-09-07	경기	011-9999-7575	개발부	사원	875000	120000
1009	나윤균	810810-1552147	2003-10-10	경기	019-1111-2222	인사부	사원	840000	220400
1054	정상호	810705-1212141	1999-10-16	강원	016-1919-4242	홍보부	사원	980000	114000
1012	정한국	760909-1333333	1999-10-16	강원	018-2222-4242	홍보부	사원	880000	114000
*/






--26. 서울 사람 중에서 기본급+수당(→급여) 내림차순으로 정렬.
--    ( 이름, 출신도, 기본급+수당 )
    
    
    
SELECT NAME "이름", CITY "출신도", BASICPAY + SUDANG "급여"
FROM TBL_INSA
WHERE CITY LIKE '서울'
ORDER BY 급여 DESC;
--==>>
/*
홍길동	서울	2810000
김인수	서울	2670000
지재환	서울	2610000
김영길	서울	2510000
박문수	서울	2465000
권영미	서울	2364000
산마루	서울	2212000
김말자	서울	2070000
한석봉	서울	1580000
양미옥	서울	1310000
지수환	서울	1280000
우재옥	서울	1260000
유관순	서울	1160000
이재영	서울	1150400
김미나	서울	1124000
정한나	서울	1104000
김영년	서울	1095000
김말숙	서울	1044000
김신애	서울	1002000
임수봉	서울	992000
*/
    
    
    



--27. 여자 중 부서 오름차순으로 정렬하고, 부서가 같으면 기본급 내림차순 정렬. 
--    ( 이름, 주민번호, 부서, 기본급 );


SELECT NAME "이름", SSN "주민번호", BUSEO "부서", BASICPAY "기본급"
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
ORDER BY 부서 ASC, 기본급 DESC;
--==>>
/*
이순애	770922-2312547	개발부	2550000
이기자	780505-2978541	개발부	2265000
이미성	830908-2456548	개발부	1300000
황진이	810707-2574812	개발부	1100000
정영희	831010-2153252	개발부	1050000
채정희	810709-2000054	개발부	1020000
김신애	810809-2111111	개발부	900000
임수봉	810809-2121244	개발부	890000
이영숙	800501-2312456	기획부	1960000
김말자	830225-2633334	기획부	1900000
권옥경	820406-2000456	기획부	1020000
권영미	790303-2155554	영업부	2260000
고순정	800504-2000032	영업부	2010000
손인수	791009-2321456	영업부	2000000
양미옥	830504-2471523	영업부	1100000
김숙남	810907-2015457	영업부	1050000
김미나	780505-2999999	영업부	1020000
유관순	801010-2987897	영업부	1020000
정한나	820506-2425153	영업부	1000000
이미경	780406-2003214	자재부	2520000
이재영	701126-2852147	자재부	960400
유영희	800304-2741258	자재부	880000
심심해	810206-2222222	자재부	880000
정정해	790210-2101010	총무부	2304000
이현숙	800606-2954687	총무부	1050000
김말숙	800301-2020202	총무부	920000
이미인	810403-2828287	홍보부	1950000
조미숙	790102-2777777	홍보부	1601000
김영년	821011-2362514	홍보부	950000
*/





-- 28. 남자 중 나이를 기준으로 오름차순 정렬하여 조회.

-- 나이구하기
--SELECT EXTRACT(YEAR FROM SYSDATE) - 1900 - (TO_NUMBER(SUBSTR(SSN, 1, 2))) + 1 "나이"
--FROM TBL_INSA

-- 너 남자니?
--WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')

-- INNER JOIN 으로 구성.
SELECT *
FROM
TBL_INSA INSA
INNER JOIN 
(
    SELECT EXTRACT(YEAR FROM SYSDATE) - 1900 - (TO_NUMBER(SUBSTR(SSN, 1, 2))) + 1 "나이"
         , SSN "주민번호"
    FROM TBL_INSA
)T
ON INSA.SSN = T.주민번호
WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
ORDER BY T.나이 ASC;
-- 나이를 기준으로 오름차순 정렬하여 조회
--==>>
/*
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000	42	820507-1452365
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000	42	820305-1475286
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000	42	820505-1325468
1054	정상호	810705-1212141	1999-10-16	강원	016-1919-4242	홍보부	사원	980000	114000	43	810705-1212141
1005	한석봉	811112-1566789	2004-08-13	서울	018-5211-3542	총무부	사원	1420000	160000	43	811112-1566789
1009	나윤균	810810-1552147	2003-10-10	경기	019-1111-2222	인사부	사원	840000	220400	43	810810-1552147
1028	이남신	810101-1010101	2001-09-07	제주	016-1818-4848	인사부	사원	892000	110000	43	810101-1010101
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000	44	800709-1321456
1002	이순신	801007-1544236	2000-11-29	경기	010-4758-6532	총무부	사원	1320000	200000	44	801007-1544236
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000	44	800605-1456987
1053	김싱식	800715-1313131	1999-12-12	전북	011-7585-7474	자재부	사원	960000	108000	44	800715-1313131
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000	44	801216-1898752
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000	44	801103-1654442
1021	홍길남	801010-1111111	2001-09-07	경기	011-9999-7575	개발부	사원	875000	120000	44	801010-1111111
1018	이성길	801028-1849534	2004-08-08	전북	018-1333-3333	개발부	사원	880000	123000	44	801028-1849534
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000	45	790304-1788896
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000	45	790604-1415141
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000	45	790509-1635214
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000	46	780505-1234567
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000	46	781010-1666678
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000	46	780506-1625148
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000	46	780710-1985632
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000	47	771115-1687988
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000	47	771212-1022432
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000	47	770129-1456987
1012	정한국	760909-1333333	1999-10-16	강원	018-2222-4242	홍보부	사원	880000	114000	48	760909-1333333
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000	48	760105-1458752
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000	49	751010-1122233
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000	51	731211-1214576
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000	52	721217-1951357
1045	홍원신	690906-1985214	2003-03-16	전북	011-7777-7777	영업부	사원	960000	152000	55	690906-1985214
*/






-- 29. 서울 지역 사람들 중에서 입사일이 빠른 사람을 먼저 볼 수 있도록 조회.

SELECT *
FROM TBL_INSA
WHERE CITY LIKE '서울'
ORDER BY IBSADATE ASC;
--==>>
/*
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000
1011	유관순	801010-2987897	2000-07-07	서울	010-8888-4422	영업부	사원	1020000	140000
1029	김말숙	800301-2020202	2000-09-08	서울	016-3535-3636	총무부	사원	920000	124000
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1059	임수봉	810809-2121244	2001-10-10	서울	011-4151-4154	개발부	사원	890000	102000
1060	김신애	810809-2111111	2001-10-10	서울	011-4151-4444	개발부	사원	900000	102000
1008	김영년	821011-2362514	2002-04-30	서울	016-2222-4444	홍보부	사원	950000	145000
1036	이재영	701126-2852147	2003-08-10	서울	011-9999-9999	자재부	사원	960400	190000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000
1055	정한나	820506-2425153	2004-06-07	서울	016-2424-4242	영업부	사원	1000000	104000
1005	한석봉	811112-1566789	2004-08-13	서울	018-5211-3542	총무부	사원	1420000	160000
*/





--30. 성씨가 김씨가 아닌 사람 조회. 
--    단, 성씨는 한 글자라고 가정.
--    ( 이름, 출신도, 기본급 );

SELECT NAME "이름", CITY "출신도", BASICPAY "기본급"
FROM TBL_INSA
WHERE SUBSTR(NAME, 1, 1) != '김';
--==>>
/*
홍길동	서울	2610000
이순신	경기	1320000
이순애	인천	2550000
한석봉	서울	1420000
이기자	인천	2265000
장인철	제주	1250000
나윤균	경기	840000
유관순	서울	1020000
정한국	강원	880000
조미숙	경기	1601000
황진이	인천	1100000
이현숙	경기	1050000
이상헌	경기	2350000
엄용수	인천	950000
이성길	전북	880000
박문수	서울	2300000
유영희	전남	880000
홍길남	경기	875000
이영숙	전남	1960000
우재옥	서울	1100000
이남신	제주	892000
정정해	부산	2304000
지재환	서울	2450000
심심해	전북	880000
이정석	경기	1100000
정영희	인천	1050000
이재영	서울	960400
최석규	인천	2350000
손인수	부산	2000000
고순정	경기	2010000
박세열	경북	2100000
문길수	충남	2300000
채정희	경기	1020000
양미옥	서울	1100000
지수환	서울	1060000
홍원신	전북	960000
허경운	경남	2650000
산마루	서울	2100000
이기상	전남	2050000
이미성	인천	1300000
이미인	경기	1950000
권영미	서울	2260000
권옥경	경기	1020000
정상호	강원	980000
정한나	서울	1000000
전용재	인천	1950000
이미경	경기	2520000
임수봉	서울	890000
*/




--31. 출신도가 서울, 부산, 대구 이면서
--    전화번호에 5 또는 7이 포함된 데이터를 조회하되
--    부서명의 마지막 부는 출력되지 않도록함. (개발부 → 개발)
--    ( 이름, 출신도, 부서명, 전화번호 );


-- #1 출신도가 서울, 부산, 대구
SELECT NAME "이름", CITY "출신도", BUSEO "부서", TEL "전화번호"
FROM TBL_INSA
WHERE CITY IN ('서울', '부산', '대구');


-- #2 전화번호에 5 또는 7이 포함

SELECT TEL
FROM TBL_INSA
WHERE SUBSTR(TEL, 5, 9) LIKE '%5%'
      OR
      SUBSTR(TEL, 5, 9) LIKE '%7%';

-- #3 부서명의 마지막 부는 출력되지 않도록함. (개발부 → 개발)

SELECT SUBSTR(BUSEO, 1, 2) "부서"
FROM TBL_INSA;


-- #4 최종 결과

SELECT NAME "이름", CITY "출신도", SUBSTR(BUSEO, 1, 2) "부서명", TEL "전화번호"
FROM TBL_INSA
WHERE CITY IN ('서울', '부산', '대구')
      AND
      SUBSTR(TEL, 5, 9) LIKE '%5%'
      OR
      SUBSTR(TEL, 5, 9) LIKE '%7%';
--==>>
/*
홍길동	서울	기획	011-2356-4528
이순신	경기	총무	010-4758-6532
한석봉	서울	총무	018-5211-3542
이기자	인천	개발	010-3214-5357
김종서	부산	영업	011-3214-5555
황진이	인천	개발	010-3214-5467
박문수	서울	인사	017-4747-4848
홍길남	경기	개발	011-9999-7575
김말자	서울	기획	011-5248-7789
우재옥	서울	영업	010-4563-2587
김영길	서울	총무	019-8523-1478
김말숙	서울	총무	016-3535-3636
정정해	부산	총무	019-6564-6752
지재환	서울	기획	019-5552-7511
심심해	전북	자재	016-8888-7474
이정석	경기	기획	011-3697-7412
최석규	인천	홍보	011-7777-7777
손인수	부산	영업	010-6542-7412
고순정	경기	영업	010-2587-7895
박세열	경북	인사	016-4444-7777
양미옥	서울	영업	016-8548-6547
지수환	서울	영업	011-5555-7548
홍원신	전북	영업	011-7777-7777
산마루	서울	영업	018-0505-0505
권영미	서울	영업	011-5555-7548
권옥경	경기	기획	010-3644-5577
김싱식	전북	자재	011-7585-7474
전용재	인천	영업	010-7549-8654
이미경	경기	자재	016-6542-7546
임수봉	서울	개발	011-4151-4154
김신애	서울	개발	011-4151-4444
*/








--32. 전화번호가 있으면 '-'을 제거하여 조회하고, 
--    없으면 '전화번호없음'으로 조회.
    

--SELECT TEL
--FROM TBL_INSA;

-- 전화번호 쪼개서 '-' 없애기   
--SELECT SUBSTR(TEL, 0, 3) || SUBSTR(TEL, 5, 4) || SUBSTR(TEL, 10, 4) "전화번호"
--FROM TBL_INSA;    

SELECT NVL(T.전화번호, '전화번호없음') "전화번호"
FROM
(        
    SELECT SUBSTR(TEL, 0, 3) || SUBSTR(TEL, 5, 4) || SUBSTR(TEL, 10, 4) "전화번호"
    FROM TBL_INSA
) T;
--==>>
/*
01123564528
01047586532
01042311236
01952364221
01852113542
01032145357
01123452525
01622224444
01911112222
01132145555
01088884422
01822224242
01966664444
01032145467
01625483365
01045261234
01032542542
01813333333
01747474848
01195958585
01199997575
01752145282
전화번호없음
01152487789
01045632587
01021125225
01985231478
01618184848
01635353636
01965646752
01955527511
01688887474
01124444444
01136977412
전화번호없음
01199999999
01177777777
01065427412
01025877895
01644447777
01644445555
01151255511
01685486547
01155557548
01177777777
01733333333
01805050505
전화번호없음
01066548854
01185855252
01155557548
01036445577
01175857474
01619194242
01624244242
01075498654
01665427546
01024155444
01141514154
01141514444
*/
    
    
    
    

--추가문제. (기본 문제 풀이가 모두 끝난 후 작성한다.)
--          HR계정의 EMPLOYEES 테이블에서 커미션 받는 사람의 수와
--          안받는 사람의 수를 조회한다.
--          출력형태 ---------------
--              구분        인원수
--          ------------------------
--          커미션받는사원    XXX
--          커미션없는사원    XXX
--          모든사원          XXX

SELECT USER
FROM DUAL;
--==>> HR

SELECT *
FROM USER_TABLES;


SELECT COUNT(COMMISSION_PCT) "커미션받는사원"
FROM EMPLOYEES;
--==>> 35

SELECT COUNT(*) "전체사원수"
FROM EMPLOYEES;
--==>> 107

      출력형태 ---------------
              구분        인원수
          ------------------------
          커미션받는사원    XXX
          커미션없는사원    XXX
          모든사원          XXX

--
-- 이렇게 구성했더니... 맨 마지막 모든사원이 절대 출력되지 않는다.
-- 위의 '커미션받는사원', '커미션없는사원' 둘 중 하나의 결과로 모두 조회되기 때문에...
-- 따라서... UNION ALL을 쓴다면 어떨까 싶었다...
-- 레코드를 세로로 길게 연결시키기 위해서...

--SELECT CASE WHEN COMMISSION_PCT IS NOT NULL
--            THEN '커미션받는사원'
--            WHEN COMMISSION_PCT IS NULL
--            THEN '커미션없는사원'
--            ELSE '모든사원'
--        END "구분"
--FROM EMPLOYEES;
--
--
--SELECT T.구분, COUNT(*)
--FROM 
--(
--    SELECT CASE WHEN COMMISSION_PCT IS NOT NULL
--                THEN '커미션받는사원'
--                WHEN COMMISSION_PCT IS NULL
--                THEN '커미션없는사원'
--                
--            END "구분"
--    FROM EMPLOYEES    
--)T
--GROUP BY T.구분;
--
--
--
--SELECT CASE WHEN COMMISSION_PCT IS NOT NULL
--                THEN '커미션받는사원'
--                WHEN COMMISSION_PCT IS NULL
--                THEN '커미션없는사원'
--                
--            END "구분"
--FROM EMPLOYEES 
--UNION ALL
--SELECT CASE WHEN EMPLOYEE_ID IS NOT NULL
--            THEN '모든사원'
--        END "구분"
--FROM EMPLOYEES;
--
-- # 제대로 합쳐지는지 확인.
--SELECT *
--FROM EMPLOYEES;
--
--  SELECT CASE WHEN COMMISSION_PCT IS NOT NULL
--                THEN '커미션받는사원'
--                WHEN COMMISSION_PCT IS NULL
--                THEN '커미션없는사원'
--                
--            END "구분"
--    FROM EMPLOYEES 
--    UNION ALL
--    SELECT CASE WHEN EMPLOYEE_ID IS NOT NULL
--                THEN '모든사원'
--            END "구분"
--    FROM EMPLOYEES;


-- 최종 답안.
SELECT T.구분, COUNT(*) "인원수"
FROM
(
    SELECT CASE WHEN COMMISSION_PCT IS NOT NULL
                THEN '커미션받는사원'
                WHEN COMMISSION_PCT IS NULL
                THEN '커미션없는사원'
                
            END "구분"
    FROM EMPLOYEES 
    UNION ALL
    SELECT CASE WHEN EMPLOYEE_ID IS NOT NULL
                THEN '모든사원'
            END "구분"
    FROM EMPLOYEES
)T
GROUP BY T.구분
ORDER BY T.구분 DESC;
      출력형태 ---------------
              구분        인원수
          ------------------------
          커미션받는사원    XXX
          커미션없는사원    XXX
          모든사원          XXX
          
--==>>
/*
구분	            인원수
커미션없는사원	72
커미션받는사원	35
모든사원        	107
*/


--[또다른 풀이!!] : ROLLUP을 사용한 풀이! (혜성오빠 출처...)


SELECT COMMISSION_PCT, COUNT(*)
FROM EMPLOYEES
GROUP BY COMMISSION_PCT;


SELECT DECODE(COMMISSION_PCT, NULL, '커미션없는사원', '커미션받는사원')
FROM EMPLOYEES;


SELECT T.커미션구분, COUNT(*) "인원수"
FROM
(
    SELECT DECODE(COMMISSION_PCT, NULL, '커미션없는사원', '커미션받는사원') "커미션구분"
    FROM EMPLOYEES
) T
GROUP BY T.커미션구분;



SELECT NVL(T.커미션구분, '모든사원') "구분"
     , COUNT(*) "인원수"
FROM
(
    SELECT DECODE(COMMISSION_PCT, NULL, '커미션없는사원', '커미션받는사원') "커미션구분"
    FROM EMPLOYEES
) T
GROUP BY ROLLUP(T.커미션구분); -- ROLLUP() 함수를 통해, 전체 사원수까지 포함할 수 있도록 설정!
-- ROLLUP() 함수를 사용하면, 


/*
DECODE() 함수를 사용하지 않고, CASE 문을 통해 사원을 구분.
[혜성오빠 풀이!!]===============================================================================================================
SELECT NVL(CASE WHEN COMMISSION_PCT IS NOT NULL THEN '커미션없는사원' ELSE '커미션받는사원' END, '모든사원') 구분, COUNT(*) 인원수
FROM EMPLOYEES
GROUP BY ROLLUP (CASE WHEN COMMISSION_PCT IS NOT NULL THEN '커미션없는사원' ELSE '커미션받는사원' END);
===============================================================================================================================
*/



--33. TBL_INSA 테이블에서 BASICPAY + SUDANG 이 
--    100만원 미만, 100만원 이상~200만원 미만, 
--    200만원 이상인 직원들의 수 조회.



--SELECT BASICPAY + SUDANG "급여"
--FROM TBL_INSA;

--테스트
--SELECT ROUND(BASICPAY + SUDANG, -6) "급여"
--        , BASICPAY + SUDANG "이게 진짜 급여"
--FROM TBL_INSA;


SELECT T.급여
     , COUNT(*) "해당급여를받는직원수"
FROM
(
  SELECT ROUND(BASICPAY + SUDANG, -6) "급여"
        , SSN "주민번호"
  FROM TBL_INSA
)T
GROUP BY T.급여;
--==>>
/*
1000000	31
3000000	10
2000000	19
*/




--34. TBL_INSA 테이블에서 주민번호를 가지고 생년월일의 ★년도별★ 직원수 조회.



-- 생년월일 'YYYY-MM-DD' 형식으로 구하기
--SELECT CONCAT('19', SUBSTR(SSN, 1, 6)) "생년월일"
--FROM TBL_INSA
--WHERE SUBSTR(SSN, 8, 1) IN ('1', '2');

-- 아 년도별이지... 아 죄송해요...ㅠㅠ
--SELECT BIRTH.생년월일, COUNT(*)
--FROM
--(
--    SELECT CONCAT('19', SUBSTR(SSN, 1, 6)) "생년월일"
--    FROM TBL_INSA
--    WHERE SUBSTR(SSN, 8, 1) IN ('1', '2')
--) BIRTH
--GROUP BY BIRTH.생년월일;



-- 생년 'YYYY' 구하기
SELECT CONCAT('19', SUBSTR(SSN, 1, 2)) "생년"
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '2');


-- 생년 별 직원 수 구하기.
SELECT BIRTH.생년
     , COUNT(*) "직원수"
FROM
(
    SELECT CONCAT('19', SUBSTR(SSN, 1, 2)) "생년"
    FROM TBL_INSA
    WHERE SUBSTR(SSN, 8, 1) IN ('1', '2')
) BIRTH
GROUP BY BIRTH.생년;
--==>>
/*
생년	    직원수
1970	1
1977	4
1980	14
1976	2
1983	4
1982    	6
1969	1
1979	7
1978	7
1975	1
1972	    1
1981	11
1973	1
*/



--35. 주민번호를 기준으로 월별 오름차순, 월이 같으면 년도 내림차순 조회.
--    (이름, 주민번호);
    
-- 월, 년도 구하기
--SELECT TO_NUMBER(SUBSTR(SSN, 3, 2)) "월"
--     , TO_NUMBER(SUBSTR(SSN, 1, 2)) "년도"
--     , SSN "주민번호" -- 테이블 결합 조건으로 쓰고 싶어서 넣었어요...
--FROM TBL_INSA;




-- (이름, 주민번호)
SELECT TI.NAME, TI.SSN
FROM TBL_INSA TI
INNER JOIN
(
     SELECT TO_NUMBER(SUBSTR(SSN, 3, 2)) "월"
         , TO_NUMBER(SUBSTR(SSN, 1, 2)) "년도"
         , SSN "주민번호"
    FROM TBL_INSA   
)B
ON TI.SSN = B.주민번호
ORDER BY B.월 ASC, B.년도 DESC;
-- 주민번호를 기준으로 월별 오름차순, 월이 같으면 년도 내림차순 조회.
--==>>
/*
이남신	810101-1010101
조미숙	790102-2777777
최석규	770129-1456987
허경운	760105-1458752
김말자	830225-2633334
심심해	810206-2222222
정정해	790210-2101010
지수환	820305-1475286
유영희	800304-2741258
김말숙	800301-2020202
김정훈	790304-1788896
권영미	790303-2155554
권옥경	820406-2000456
이미인	810403-2828287
이미경	780406-2003214
양미옥	830504-2471523
엄용수	820507-1452365
정한나	820506-2425153
이정석	820505-1325468
고순정	800504-2000032
이영숙	800501-2312456
박세열	790509-1635214
산마루	780505-1234567
김미나	780505-2999999
이기자	780505-2978541
장인철	780506-1625148
전용재	800605-1456987
이현숙	800606-2954687
이기상	790604-1415141
채정희	810709-2000054
정상호	810705-1212141
황진이	810707-2574812
김신제	800709-1321456
김싱식	800715-1313131
박문수	780710-1985632
나윤균	810810-1552147
임수봉	810809-2121244
김신애	810809-2111111
이미성	830908-2456548
김숙남	810907-2015457
이순애	770922-2312547
정한국	760909-1333333
홍원신	690906-1985214
정영희	831010-2153252
김영년	821011-2362514
이성길	801028-1849534
홍길남	801010-1111111
이순신	801007-1544236
유관순	801010-2987897
손인수	791009-2321456
이상헌	781010-1666678
김종서	751010-1122233
한석봉	811112-1566789
우재옥	801103-1654442
지재환	771115-1687988
이재영	701126-2852147
김영길	801216-1898752
홍길동	771212-1022432
김인수	731211-1214576
문길수	721217-1951357
*/





--36. 입사일을 기준으로  월별 오름차순, 월이 같으면 년도 내림차순 조회.
--    단, 모든 정보 조회.
--    (주의. 입사일은 자료형이 DATE이다.);

-- 입사일 IBSADATE

--SELECT IBSADATE
--FROM TBL_INSA;

-- 입사월, 입사년도 구하기.
--SELECT TO_CHAR(IBSADATE, 'MM') "입사월"
--     , TO_CHAR(IBSADATE, 'YYYY') "입사년도"
--     , SSN "주민번호" 
--FROM TBL_INSA;


-- 단, 모든 정보 조회.
SELECT TI.*
FROM TBL_INSA TI
INNER JOIN
(
    SELECT TO_CHAR(IBSADATE, 'MM') "입사월"
     , TO_CHAR(IBSADATE, 'YYYY') "입사년도"
     , SSN "주민번호" 
    FROM TBL_INSA
)IBSA
ON TI.SSN = IBSA.주민번호
ORDER BY IBSA.입사월 ASC, IBSA.입사년도 DESC;
-- 입사일을 기준으로  월별 오름차순, 월이 같으면 년도 내림차순 조회.


--==>>
/*
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1014	황진이	810707-2574812	2002-02-15	인천	010-3214-5467	개발부	사원	1100000	130000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1045	홍원신	690906-1985214	2003-03-16	전북	011-7777-7777	영업부	사원	960000	152000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1008	김영년	821011-2362514	2002-04-30	서울	016-2222-4444	홍보부	사원	950000	145000
1049	이미성	830908-2456548	2000-04-07	인천	010-6654-8854	개발부	사원	1300000	130000
1035	정영희	831010-2153252	2002-05-16	인천		개발부	사원	1050000	140000
1032	심심해	810206-2222222	2000-05-05	전북	016-8888-7474	자재부	사원	880000	108000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000
1055	정한나	820506-2425153	2004-06-07	서울	016-2424-4242	영업부	사원	1000000	104000
1050	이미인	810403-2828287	2003-06-07	경기	011-8585-5252	홍보부	대리	1950000	103000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
1013	조미숙	790102-2777777	1998-06-07	경기	019-6666-4444	홍보부	대리	1601000	103000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000
1011	유관순	801010-2987897	2000-07-07	서울	010-8888-4422	영업부	사원	1020000	140000
1015	이현숙	800606-2954687	1999-07-26	경기	016-2548-3365	총무부	사원	1050000	104000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000
1018	이성길	801028-1849534	2004-08-08	전북	018-1333-3333	개발부	사원	880000	123000
1005	한석봉	811112-1566789	2004-08-13	서울	018-5211-3542	총무부	사원	1420000	160000
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000
1036	이재영	701126-2852147	2003-08-10	서울	011-9999-9999	자재부	사원	960400	190000
1026	김숙남	810907-2015457	2002-08-28	경기	010-2112-5225	영업부	사원	1050000	150000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1021	홍길남	801010-1111111	2001-09-07	경기	011-9999-7575	개발부	사원	875000	120000
1028	이남신	810101-1010101	2001-09-07	제주	016-1818-4848	인사부	사원	892000	110000
1029	김말숙	800301-2020202	2000-09-08	서울	016-3535-3636	총무부	사원	920000	124000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000
1020	유영희	800304-2741258	2003-10-10	전남	011-9595-8585	자재부	사원	880000	140000
1009	나윤균	810810-1552147	2003-10-10	경기	019-1111-2222	인사부	사원	840000	220400
1042	채정희	810709-2000054	2003-10-17	경기	011-5125-5511	개발부	사원	1020000	200000
1059	임수봉	810809-2121244	2001-10-10	서울	011-4151-4154	개발부	사원	890000	102000
1060	김신애	810809-2111111	2001-10-10	서울	011-4151-4444	개발부	사원	900000	102000
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000
1052	권옥경	820406-2000456	2000-10-10	경기	010-3644-5577	기획부	사원	1020000	105000
1012	정한국	760909-1333333	1999-10-16	강원	018-2222-4242	홍보부	사원	880000	114000
1030	정정해	790210-2101010	1999-10-17	부산	019-6564-6752	총무부	과장	2304000	124000
1054	정상호	810705-1212141	1999-10-16	강원	016-1919-4242	홍보부	사원	980000	114000
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000
1002	이순신	801007-1544236	2000-11-29	경기	010-4758-6532	총무부	사원	1320000	200000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000
1053	김싱식	800715-1313131	1999-12-12	전북	011-7585-7474	자재부	사원	960000	108000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
*/






--37. 전체인원수, 남자인원수, 여자인원수를 동시 조회.


-- #1 전체 인원수 구하기

SELECT COUNT(*)
FROM TBL_INSA;


-- #2 남자 인원수 구하기

SELECT COUNT(*)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '3');


-- #3 여자 인원수 구하기

SELECT COUNT(*)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('2', '4');


-- #4 상단 서브 쿼리 스칼라 서브 쿼리 사용.
-- 전체인원수, 남자인원수, 여자인원수를 동시 조회.

SELECT  (
            SELECT COUNT(*)
            FROM TBL_INSA
        )   "전체인원수"
        , 
        (
            SELECT COUNT(*)
            FROM TBL_INSA
            WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
        )   "남자인원수"
        ,
        (
            SELECT COUNT(*)
            FROM TBL_INSA
            WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
        )   "여자인원수"
FROM DUAL;
--==>>
/*
전체인원수	남자인원수	여자인원수
60	        31	        29
*/

-- UNION ALL 을 이용한 풀이
SELECT T.구분, COUNT(*) "인원수"
FROM
(
    SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                THEN '남자인원수'
                WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                THEN '여자인원수'
            END "구분"
    FROM TBL_INSA
    UNION ALL
    SELECT CASE WHEN NAME IS NOT NULL
                THEN '전체인원수'
            END "구분"
    FROM TBL_INSA
) T
GROUP BY T.구분
ORDER BY 인원수 ASC;
--==>>
/*
구분	        인원수
여자인원수	29
남자인원수	31
전체인원수	60
*/


--38. 개발부, 영업부, 총무부 인원수 조회.  COUNT(), DECODE() 함수 이용.


---- 아래와 같은 형식으로 구성해야 함...
--DECODE(BUSEO, '개발부', 개발부인원수, '영업부', 영업부인원수, '총무부', 총무부인원수);
--
--
--
--
---- #1 개발부 인원수 조회
--SELECT COUNT(*)
--FROM TBL_INSA
--WHERE BUSEO LIKE '개발부';
--
--
---- #2 영업부 인원수 조회
--SELECT COUNT(*)
--FROM TBL_INSA
--WHERE BUSEO LIKE '영업부';
--
--
---- #3 총무부 인원수 조회
--SELECT COUNT(*)
--FROM TBL_INSA
--WHERE BUSEO LIKE '총무부';

-- #4 최종 결과 
--    인원수를 나타내는 쿼리문을 하나로 통합. CROSS JOIN (92)

SELECT DISTINCT TI.BUSEO "부서명"
              , DECODE(TI.BUSEO, '개발부', G.개발부인원수
                               , '영업부', Y.영업부인원수
                               , '총무부', C.총무부인원수, NULL) "부서별인원수"
      -- G.개발부인원수, Y.영업부인원수, C.총무부인원수
FROM
TBL_INSA TI
,
(
    SELECT COUNT(*) "개발부인원수"
    FROM TBL_INSA
    WHERE BUSEO LIKE '개발부'
) G
,

(
    SELECT COUNT(*) "영업부인원수"
    FROM TBL_INSA
    WHERE BUSEO LIKE '영업부'
) Y
,
(
    SELECT COUNT(*) "총무부인원수"
    FROM TBL_INSA
    WHERE BUSEO LIKE '총무부'
) C
-- NULL 은 결과에서 제외.
WHERE DECODE(TI.BUSEO, '개발부', G.개발부인원수
                     , '영업부', Y.영업부인원수
                     , '총무부', C.총무부인원수, NULL) IS NOT NULL
ORDER BY 1 ASC; -- 그냥 오름차순...




-- [38번 문제 또 다른 풀이!! 이 방식이 훨씬 간단하고 좋은 것 같아요]---------------

-- COUNT()와 같은 집계함수(그룹함수)는 NULL을 COUNT 하지 않기 때문에
-- NULL 값을 제외한 1 값만을 세어서 결과를 반환합니다.

SELECT COUNT(개발부), COUNT(영업부), COUNT(총무부)
FROM
(
    SELECT DECODE(BUSEO, '개발부',1) "개발부"  -- ⓐ 개발부일 경우, 레코드에 '1'을 추가하고
                                              --    그렇지 않을 경우 NULL 값이 됩니다.
         , DECODE(BUSEO, '영업부', 1) "영업부" -- ⓑ 영업부일 경우, 레코드에 '1'을 추가하고
                                              --    그렇지 않을 경우 NULL 값이 됩니다. 
         , DECODE(BUSEO, '총무부',1) "총무부"  -- ⓒ 총무부일 경우, 레코드에 '1'을 추가하고
                                              --    그렇지 않을 경우 NULL 값이 됩니다.
    FROM TBL_INSA
    WHERE BUSEO IN ('개발부','영업부','총무부')
);

--------------------------------------------------------------------------------


--39. 서울 사람의 남자 인원수 조회.

SELECT COUNT(*) "서울남자인원수"
FROM TBL_INSA
WHERE CITY LIKE '서울'
      AND
      SUBSTR(SSN, 8, 1) IN ('1', '3');
--==>> 9




--40. 부서가 영업부이고, 남자 인원수, 여자 인원수 조회.  COUNT(), DECODE() 함수 이용.





-- #1 영업부 남자 인원수

SELECT COUNT(*) "영업부남자인원수"
FROM TBL_INSA
WHERE BUSEO LIKE '영업부'
      AND
      SUBSTR(SSN, 8, 1) IN ('1', '3');
      
      
-- #2 영업부 여자 인원수

SELECT COUNT(*) "영업부여자인원수"
FROM TBL_INSA
WHERE BUSEO LIKE '영업부'
      AND
      SUBSTR(SSN, 8, 1) IN ('2', '4');


SELECT DISTINCT CASE WHEN SUBSTR(TI.SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(TI.SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
                END "성별"
                , DECODE(SUBSTR(TI.SSN, 8, 1), '1', YM.영업부남자인원수
                               , '2', YW.영업부여자인원수
                               , NULL) "영업부남녀인원수"
FROM TBL_INSA TI
,
(
    SELECT COUNT(*) "영업부남자인원수"
    FROM TBL_INSA
    WHERE BUSEO LIKE '영업부'
          AND
          SUBSTR(SSN, 8, 1) IN ('1', '3')
) YM
,
(
    SELECT COUNT(*) "영업부여자인원수"
    FROM TBL_INSA
    WHERE BUSEO LIKE '영업부'
          AND
          SUBSTR(SSN, 8, 1) IN ('2', '4')
) YW;

--==>>
/*
성별  	영업부남녀인원수
남자  	8
여자  	8
*/

-- [DECODE를 이용한 또다른 풀이!]------------------------------------------------

-- 주민번호 8번째 자리가 1이면 남자, 2이면 여자.
SELECT DECODE(SUBSTR(SSN, 8, 1), '1', '남자', '3', '남자', '2', '여자', '4', '여자') "성별"
     , COUNT(*) "여자"
FROM TBL_INSA
WHERE BUSEO LIKE '영업부'
GROUP BY SUBSTR(SSN, 8, 1)
ORDER BY SUBSTR(SSN, 8, 1) ASC;

--------------------------------------------------------------------------------



--41. 개발부, 영업부, 총무부 인원수 조회. 단, 지역은 '서울'로 한정.



-- #1 서울 개발부 인원수 조회
SELECT COUNT(*)
FROM TBL_INSA
WHERE BUSEO LIKE '개발부'
      AND
      CITY LIKE '서울';

--==>> 2

-- #2 서울 영업부 인원수 조회
SELECT COUNT(*)
FROM TBL_INSA
WHERE BUSEO LIKE '영업부'
      AND
      CITY LIKE '서울';

--==>> 9


-- #3 서울 총무부 인원수 조회
SELECT COUNT(*)
FROM TBL_INSA
WHERE BUSEO LIKE '총무부'
      AND
      CITY LIKE '서울';

--==>> 3


-- #4 위의 쿼리문을 서브 상단 쿼리로 이용.


SELECT 
       (
            SELECT COUNT(*)
            FROM TBL_INSA
            WHERE BUSEO LIKE '개발부'
                  AND
                  CITY LIKE '서울'
       ) "서울개발부인원수"
       ,
       (
            SELECT COUNT(*)
            FROM TBL_INSA
            WHERE BUSEO LIKE '영업부'
                  AND
                  CITY LIKE '서울'
        
       ) "서울영업부인원수"
       ,
       (
            SELECT COUNT(*)
            FROM TBL_INSA
            WHERE BUSEO LIKE '총무부'
                  AND
                  CITY LIKE '서울'
       ) "서울총무부인원수"
FROM DUAL;
--==>>
/*
서울개발부인원수	서울영업부인원수	서울총무부인원수
2	            9	            3
*/


-- [이건 GROUP BY를 이용한 풀이!]------------------------------------------------
SELECT BUSEO "부서명"
     , COUNT(*) "인원수"
FROM TBL_INSA
WHERE BUSEO IN ('개발부', '영업부', '총무부')
GROUP BY BUSEO;

--==>>
/*
부서명	인원수
총무부	7
개발부	14
영업부	16
*/
--------------------------------------------------------------------------------


--42. 서울 사람의 남자와 여자의 기본급합 조회.


--SELECT 
--FROM TBL_INSA
--WHERE SUBSTR(SSN, 8, 1) IN ('1', '3');



--SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
--                     THEN '남자'
--                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
--                     THEN '여자'
--                     ELSE '알수없음'
--                END "성별"
--FROM TBL_INSA

-- 취소취소취소
--SELECT GD.성별
--FROM TBL_INSA TI
--INNER JOIN
--(
--    SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
--                     THEN '남자'
--                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
--                     THEN '여자'
--                     ELSE '알수없음'
--                END "성별"
--            , SSN "주민번호"
--    FROM TBL_INSA
--) GD
--ON TI.SSN = GD.주민번호
--GROUP BY GD.성별;


-- 서울 사람의 남자와 여자의 기본급합 조회.

-- #1 서울 사람의 남자 기본급합
SELECT SUM(BASICPAY)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
      AND
      CITY LIKE '서울';


-- #2 서울 사람의 여자 기본급합
SELECT SUM(BASICPAY)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
      AND
      CITY LIKE '서울';


-- #3 상단 서브 쿼리(스칼라 서브 쿼리)로 구성.


SELECT (
         SELECT SUM(BASICPAY)
         FROM TBL_INSA
         WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
              AND
              CITY LIKE '서울'
       ) "서울남자기본급합"
       ,
       (
         SELECT SUM(BASICPAY)
         FROM TBL_INSA
         WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
              AND
              CITY LIKE '서울'
       ) "서울여자기본급합"
FROM DUAL;

--==>>
/*
서울남자기본급합	서울여자기본급합
17880000	    12920400
*/


-- 이건 GROUP BY 를 이용한 풀이.
SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3') 
            THEN '남자'
            WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
            THEN '여자'
        END "성별"
        , SUM(BASICPAY) "기본급합"
FROM TBL_INSA
WHERE CITY LIKE '서울'
GROUP BY SUBSTR(SSN, 8, 1);
--==>>
/*
성별	    기본급합
남자	    17880000
여자	    12920400
*/




--43. 남자와 여자의 기본급 평균값 조회. AVG(), DECODE() 함수 이용.


-- #1 남자의 기본급 평균값 (소수점 두 번째 자리까지 표현)

SELECT ROUND(AVG(BASICPAY), 2)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '3');
--==>> 1676167.74

-- #2 여자의 기본급 평균값 (소수점 두 번째 자리까지 표현)

SELECT ROUND(AVG(BASICPAY), 2)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('2', '4');
--==>> 1428634.48


-- #3 최종 결과
--    두 쿼리문을 외부(메인)쿼리문에 INNER JOIN 한다.

-- 남자와 여자의 기본급 평균값 조회. AVG(), DECODE() 함수 이용.

-- DECODE() 를 다음과 같이 구성해야함.
-- DECODE(SUBSTR(SSN, 8, 1), '1', 서울남자평균기본급, '2', 서울여자평균기본급)

SELECT DISTINCT 
        CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
              END "성별"
       , DECODE(SUBSTR(SSN, 8, 1), '1', SMP.서울남자평균기본급, '2', SWP.서울여자평균기본급) "서울성별기본급"
FROM TBL_INSA TI
,
(   
    SELECT ROUND(AVG(BASICPAY), 2) "서울남자평균기본급"
    FROM TBL_INSA
    WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
) SMP
,
(
    SELECT ROUND(AVG(BASICPAY), 2) "서울여자평균기본급"
    FROM TBL_INSA 
    WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
) SWP;

--==>>
/*
성별	    서울성별기본급
남자  	1676167.74
여자	    1428634.48
*/



SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
              END "성별"
        , DECODE(SUBSTR(SSN, 8, 1), '1', ROUND(AVG(BASICPAY), 1), '3', ROUND(AVG(BASICPAY), 1)
                , '2', ROUND(AVG(BASICPAY), 1), '4', ROUND(AVG(BASICPAY), 1)) "기본급"
            
FROM TBL_INSA
GROUP BY SUBSTR(SSN, 8, 1);

SELECT CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
              END "성별"
        , DECODE(SUBSTR(JUBUN, 7, 1), '1', ROUND(AVG(SAL), 1), '3', ROUND(AVG(SAL), 1)
                , '2', ROUND(AVG(SAL), 1), '4', ROUND(AVG(SAL), 1)) "기본급"
            
FROM TBL_SAWON
GROUP BY SUBSTR(JUBUN, 7, 1);


SELECT *
FROM TBL_SAWON;

--
--
--
--SELECT --CASE WHEN SUBSTR(JUBUN, 7, 1) = '1'
----            THEN '1900년대생 남자'
----            WHEN SUBSTR(JUBUN, 7, 1) = '3'
----            THEN '2000년대생 남자'
----            WHEN SUBSTR(JUBUN, 7, 1) = '2'
----            THEN '1900년대생 여자'
----            WHEN SUBSTR(JUBUN, 7, 1) = '4'
----            THEN '2000년대생 여자'
----            ELSE '알 수 없음'
----        END "년도별성별"
--        CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3')
--                     THEN '남자'
--                     WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4')
--                     THEN '여자'
--                     ELSE '알수없음'
--              END "성별"
--        , DECODE(SUBSTR(JUBUN, 7, 1), '1' , AVG(SAL), '3', AVG(SAL), '2', AVG(SAL), '4', AVG(SAL))
--        --, DECODE(SUBSTR(JUBUN, 7, 1), '1' , DECODE(SUBSTR(JUBUN, 7, 1), '3', AVG(SAL)), '3', AVG(SAL), '2', AVG(SAL), '4', AVG(SAL))
--FROM TBL_SAWON
--GROUP BY SUBSTR(JUBUN, 7, 1);
--
--
--
--
--SELECT DECODE(SUBSTR(JUBUN, 7, 1), '1', SAL, '3', SAL)
--FROM TBL_SAWON;



--44. 개발부의 남자, 여자 기본급 평균값 조회.

-- #1 개발부, 성별로 그룹화
SELECT BUSEO
     , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
              END "성별"
    , AVG(BASICPAY) "기본급 평균값"
FROM TBL_INSA
GROUP BY BUSEO, SUBSTR(SSN, 8, 1)
HAVING BUSEO LIKE '개발부';

--==>>
/*
BUSEO	성별	    기본급 평균값
개발부	여자	    1384375
개발부	남자	    1392500
*/






--45. 부서별 남자와 여자 인원수 구하기

-- #1 부서, 성별로 그룹화.


SELECT  BUSEO "부서명"
      , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                 THEN '남자'
                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                 THEN '여자'
                 ELSE '알수없음'
         END "성별"
      , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY BUSEO, SUBSTR(SSN, 8, 1)
ORDER BY BUSEO ASC;

--==>>
/*
부서명	성별  	인원수
개발부	남자  	6
개발부	여자  	8
기획부	남자  	4
기획부	여자  	3
영업부	남자  	8
영업부	여자  	8
인사부	남자  	4
자재부	남자  	2
자재부	여자  	4
총무부	남자  	4
총무부	여자  	3
홍보부	남자  	3
홍보부	여자  	3
*/






--46. 지역별 남자와 여자 인원수 구하기


SELECT  CITY "출신도"
      , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                 THEN '남자'
                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                 THEN '여자'
                 ELSE '알수없음'
         END "성별"
      , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY CITY, SUBSTR(SSN, 8, 1)
ORDER BY CITY ASC;
--==>>
/*
출신도	성별	    인원수
강원	    남자  	2
경기	    남자  	5
경기	    여자	    8
경남	    남자	    1
경북	    남자	    1
부산  	남자	    1
부산  	여자  	2
서울	    남자  	9
서울	    여자  	11
인천	    남자  	4
인천	    여자	    5
전남  	남자  	1
전남  	여자  	2
전북	    남자  	4
전북	    여자  	1
제주	    남자  	2
충남  	남자  	1
*/








--47. 입사년도별 남자와 여자 인원수 구하기


SELECT *
FROM TBL_INSA;


SELECT  EXTRACT(YEAR FROM IBSADATE) "입사년도"
      , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                 THEN '남자'
                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                 THEN '여자'
                 ELSE '알수없음'
         END "성별"
      , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY EXTRACT(YEAR FROM IBSADATE), SUBSTR(SSN, 8, 1)
ORDER BY EXTRACT(YEAR FROM IBSADATE) ASC;

--==>>
/*
입사년도	성별	인원수
1995	남자	1
1997	남자	1
1998	남자	3
1998	여자	3
1999	남자	5
1999	여자	5
2000	남자	6
2000	여자	6
2001	남자	7
2001	여자	2
2002	여자	5
2003	남자	3
2003	여자	7
2004	남자	4
2004	여자	1
2005	남자	1

*/



--48. 영업부, 총무부 인원만을 가지고 입사년도별 남자와 여자 인원수 구하기


SELECT  
      EXTRACT(YEAR FROM IBSADATE) "입사년도"
      , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                 THEN '남자'
                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                 THEN '여자'
                 ELSE '알수없음'
         END "성별"
        -- , BUSEO "부서가 맞는지 확인"
      , COUNT(*) "인원수"
FROM TBL_INSA
WHERE BUSEO IN ('영업부', '총무부')
GROUP BY  EXTRACT(YEAR FROM IBSADATE), SUBSTR(SSN, 8, 1)
ORDER BY EXTRACT(YEAR FROM IBSADATE) ASC;
--==>>
/*
입사년도	성별	인원수
1995	남자	1
1997	남자	1
1998	여자	1
1999	남자	1
1999	여자	3
2000	남자	4
2000	여자	3
2001	남자	1
2002	여자	1
2003	남자	1
2003	여자	2
2004	남자	3
2004	여자	1
*/




--49. 서울 사람중 부서별 남자와 여자인원수, 남자와 여자 급여합 조회.

SELECT BUSEO "부서명"
      , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                 THEN '남자'
                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                 THEN '여자'
                 ELSE '알수없음'
         END "성별"
      , COUNT(*) "인원수"
      , SUM(BASICPAY + SUDANG) "급여합"
      
FROM TBL_INSA
WHERE CITY LIKE '서울'
GROUP BY BUSEO, SUBSTR(SSN, 8, 1)
ORDER BY 부서명 ASC, 성별 ASC;
--==>>
/*
부서명	성별	인원수	급여합
개발부	여자	2	1994000
기획부	남자	2	5420000
기획부	여자	1	2070000
영업부	남자	4	7422000
영업부	여자	5	7062000
인사부	남자	1	2465000
자재부	여자	1	1150400
총무부	남자	2	4090000
총무부	여자	1	1044000
홍보부	여자	1	1095000
*/




--50. 부서별 인원수 출력. 인원수가 10 이상인 경우만.


SELECT BUSEO "부서명"
     , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY BUSEO
HAVING COUNT(*) >= 10;
--==>>
/*
부서명	인원수
개발부	14
영업부	16
*/




--51. 부서별 남,여 인원수 출력. 여자인원수가 5명 이상인 부서만 조회.



-- #1 부서들 중, 여자의 인원 수가 5명 이상인 부서명 찾기.


SELECT INWON.부서명, INWON.성별, COUNT(INWON.성별) "인원수"
    FROM
    (
        SELECT BUSEO "부서명"
           , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
             END "성별"
        FROM TBL_INSA
    ) INWON
    GROUP BY INWON.부서명, INWON.성별
    HAVING INWON.성별 = '여자'
           AND
           COUNT(INWON.성별) >= 5;

--==>>
/*
부서명	성별	인원수
영업부	여자	8
개발부	여자	8
*/


-- #2 위의 쿼리를 다시 서브쿼리로 삼아서, 부서명만 SELECT 하도록 처리.
SELECT TAKEBUSEO.부서명
FROM
(
    SELECT INWON.부서명, INWON.성별, COUNT(INWON.성별) "인원수"
    FROM
    (
        SELECT BUSEO "부서명"
           , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
             END "성별"
        FROM TBL_INSA
    ) INWON
    GROUP BY INWON.부서명, INWON.성별
    HAVING INWON.성별 = '여자'
           AND
           COUNT(INWON.성별) >= 5
) TAKEBUSEO;
--==>>
/*
부서명
영업부
개발부
*/



-- #3 최종적으로, 여자 인원수가 5명 이상인 부서별 남, 여 인원수 조회.
--    부서별 남,여 인원수 출력. 여자인원수가 5명 이상인 부서만 조회.
SELECT INWON.부서명, INWON.성별, COUNT(INWON.성별) "인원수"
FROM
(
    SELECT BUSEO "부서명"
       , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                 THEN '남자'
                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                 THEN '여자'
                 ELSE '알수없음'
         END "성별"
    FROM TBL_INSA
    WHERE BUSEO
      IN
        (
            SELECT TAKEBUSEO.부서명
            FROM
            (
                SELECT INWON.부서명, INWON.성별, COUNT(INWON.성별) "인원수"
                FROM
                (
                    SELECT BUSEO "부서명"
                       , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                                 THEN '남자'
                                 WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                                 THEN '여자'
                                 ELSE '알수없음'
                         END "성별"
                    FROM TBL_INSA
                ) INWON
                GROUP BY INWON.부서명, INWON.성별
                HAVING INWON.성별 = '여자'
                       AND
                       COUNT(INWON.성별) >= 5
            ) TAKEBUSEO
            
        )
) INWON

GROUP BY INWON.부서명, INWON.성별;
--==>>
/*
부서명	성별	인원수
영업부	여자	8
개발부	남자	6
영업부	남자	8
개발부	여자	8
*/





--52. 이름, 성별, 나이 조회
--    성별: 주민번호 활용 1,3 → 남자, 2,4 → 여자 (DECODE() 사용)
--    나이: 주민번호 활용



-- #1 이름 구하기
SELECT NAME "이름"
FROM TBL_INSA;


-- #2 성별 구하기 DECODE() 사용.

SELECT DECODE(SUBSTR(SSN, 8, 1), '1', '남자', '3', '남자', '2', '여자', '4', '여자')
FROM TBL_INSA;


-- #3 나이 구하기 

SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '2')
            THEN
            EXTRACT(YEAR FROM SYSDATE) - 1900 - TO_NUMBER(SUBSTR(SSN, 1, 2)) + 1
            WHEN SUBSTR(SSN, 8, 1) IN ('3', '4')
            THEN
            EXTRACT(YEAR FROM SYSDATE) - 2000 - TO_NUMBER(SUBSTR(SSN, 1, 2)) + 1
        END "나이"
FROM TBL_INSA;


-- #4 하나로 통합.
-- 이름, 성별, 나이 조회

SELECT NAME "이름"
     , DECODE(SUBSTR(SSN, 8, 1), '1', '남자', '3', '남자', '2', '여자', '4', '여자') "성별"
     , CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '2')
            THEN
            EXTRACT(YEAR FROM SYSDATE) - 1900 - TO_NUMBER(SUBSTR(SSN, 1, 2)) + 1
            WHEN SUBSTR(SSN, 8, 1) IN ('3', '4')
            THEN
            EXTRACT(YEAR FROM SYSDATE) - 2000 - TO_NUMBER(SUBSTR(SSN, 1, 2)) + 1
        END "나이"
FROM TBL_INSA;

--==>>
/*
이름	성별	나이
홍길동	남자	47
이순신	남자	44
이순애	여자	47
김정훈	남자	45
한석봉	남자	43
이기자	여자	46
장인철	남자	46
김영년	여자	42
나윤균	남자	43
김종서	남자	49
유관순	여자	44
정한국	남자	48
조미숙	여자	45
황진이	여자	43
이현숙	여자	44
이상헌	남자	46
엄용수	남자	42
이성길	남자	44
박문수	남자	46
유영희	여자	44
홍길남	남자	44
이영숙	여자	44
김인수	남자	51
김말자	여자	41
우재옥	남자	44
김숙남	여자	43
김영길	남자	44
이남신	남자	43
김말숙	여자	44
정정해	여자	45
지재환	남자	47
심심해	여자	43
김미나	여자	46
이정석	남자	42
정영희	여자	41
이재영	여자	54
최석규	남자	47
손인수	여자	45
고순정	여자	44
박세열	남자	45
문길수	남자	52
채정희	여자	43
양미옥	여자	41
지수환	남자	42
홍원신	남자	55
허경운	남자	48
산마루	남자	46
이기상	남자	45
이미성	여자	41
이미인	여자	43
권영미	여자	45
권옥경	여자	42
김싱식	남자	44
정상호	남자	43
정한나	여자	42
전용재	남자	44
이미경	여자	46
김신제	남자	44
임수봉	여자	43
김신애	여자	43
*/








--53. 서울 사람 중에서 기본급이 200만원 이상인 사람 조회. 
--    ( 이름, 기본급 );
    
    

SELECT NAME "이름", BASICPAY "기본급"
FROM TBL_INSA
WHERE CITY LIKE '서울'
      AND
      BASICPAY >= 2000000;
--==>>
/*
이름	    기본급
홍길동	2610000
박문수	2300000
김인수	2500000
김영길	2340000
지재환	2450000
산마루	2100000
권영미	2260000
*/
    
    




--54. 입사월별 인원수 구하기. (월, 인원수)   COUNT, GROUP BY, TO_CHAR 사용
--    출력형태 ----------
--     월  인원수
--    1월    10명
--    2월    25명


-- #1 입사월 구해보기 (TO_CHAR() 사용.)
SELECT TO_NUMBER(TO_CHAR(IBSADATE, 'MM')) "입사월"
FROM TBL_INSA;


-- #2-1 그룹화하여 인원수 구하기
-- #2-2 입사월 형태 바꾸기 (1월, 2월, ...)

-- 아 GROUP BY에 '월'까지 포함시켜서 정렬이 이상했구나..
-- 다시 수정했어요... 1부터 12까지 오름차순 정렬...

SELECT TO_NUMBER(TO_CHAR(IBSADATE, 'MM')) || '월' "입사월"
     , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY TO_NUMBER(TO_CHAR(IBSADATE, 'MM'))
ORDER BY TO_NUMBER(TO_CHAR(IBSADATE, 'MM')) ASC;
--==>>
/*
입사월	인원수
1월      	2
2월	        6
3월	        2
4월	        2
5월	        3
6월	        6
7월	        3
8월	        9
9월      	6
10월     	14
11월	        3
12월     	4
*/










--55. 이름, 생년월일, 기본급, 수당을 조회.
--    생년월일은 주민번호 기준 (2000-10-10 형식으로 출력)
--    기본급은 \1,000,000 형식으로 출력
--    
--
--
--
--SELECT NAME "이름"
--FROM TBL_INSA;
--
--SELECT TO_DATE('19' || SUBSTR(SSN, 1, 6), 'YYYY-MM-DD')
--FROM TBL_INSA;
--
--SELECT TO_CHAR(BASICPAY, '9,999,999')
--FROM TBL_INSA;

--SELECT NAME "이름"
--     , TO_DATE('19' || SUBSTR(SSN, 1, 6), 'YYYY-MM-DD') "생년월일"
--     , TO_CHAR(BASICPAY, '9,999,999') "기본급"
--     , SUDANG "수당"
--FROM TBL_INSA;


--==>>
/*
이름	생년월일	기본급	수당
홍길동	1977-12-12	 2,610,000	200000
이순신	1980-10-07	 1,320,000	200000
이순애	1977-09-22	 2,550,000	160000
김정훈	1979-03-04	 1,954,200	170000
한석봉	1981-11-12	 1,420,000	160000
이기자	1978-05-05	 2,265,000	150000
장인철	1978-05-06	 1,250,000	150000
김영년	1982-10-11	   950,000	145000
나윤균	1981-08-10	   840,000	220400
김종서	1975-10-10	 2,540,000	130000
유관순	1980-10-10	 1,020,000	140000
정한국	1976-09-09	   880,000	114000
조미숙	1979-01-02	 1,601,000	103000
황진이	1981-07-07	 1,100,000	130000
이현숙	1980-06-06	 1,050,000	104000
이상헌	1978-10-10	 2,350,000	150000
엄용수	1982-05-07	   950,000	210000
이성길	1980-10-28	   880,000	123000
박문수	1978-07-10	 2,300,000	165000
유영희	1980-03-04	   880,000	140000
홍길남	1980-10-10	   875,000	120000
이영숙	1980-05-01	 1,960,000	180000
김인수	1973-12-11	 2,500,000	170000
김말자	1983-02-25	 1,900,000	170000
우재옥	1980-11-03	 1,100,000	160000
김숙남	1981-09-07	 1,050,000	150000
김영길	1980-12-16	 2,340,000	170000
이남신	1981-01-01	   892,000	110000
김말숙	1980-03-01	   920,000	124000
정정해	1979-02-10	 2,304,000	124000
지재환	1977-11-15	 2,450,000	160000
심심해	1981-02-06	   880,000	108000
김미나	1978-05-05	 1,020,000	104000
이정석	1982-05-05	 1,100,000	160000
정영희	1983-10-10	 1,050,000	140000
이재영	1970-11-26	   960,400	190000
최석규	1977-01-29	 2,350,000	187000
손인수	1979-10-09	 2,000,000	150000
고순정	1980-05-04	 2,010,000	160000
박세열	1979-05-09	 2,100,000	130000
문길수	1972-12-17	 2,300,000	150000
채정희	1981-07-09	 1,020,000	200000
양미옥	1983-05-04	 1,100,000	210000
지수환	1982-03-05	 1,060,000	220000
홍원신	1969-09-06	   960,000	152000
허경운	1976-01-05	 2,650,000	150000
산마루	1978-05-05	 2,100,000	112000
이기상	1979-06-04	 2,050,000	106000
이미성	1983-09-08	 1,300,000	130000
이미인	1981-04-03	 1,950,000	103000
권영미	1979-03-03	 2,260,000	104000
권옥경	1982-04-06	 1,020,000	105000
김싱식	1980-07-15	   960,000	108000
정상호	1981-07-05	   980,000	114000
정한나	1982-05-06	 1,000,000	104000
전용재	1980-06-05	 1,950,000	200000
이미경	1978-04-06	 2,520,000	160000
김신제	1980-07-09	 1,950,000	180000
임수봉	1981-08-09	   890,000	102000
김신애	1981-08-09	   900,000	102000
*/



-- 아 백스페이스도 포함인 줄 몰랐어요... 죄송해요...

--★★★ [최종 결과]

-- [TEST]
--SELECT CONCAT('\', TRIM(TO_CHAR(10023423, '99,999,999')))
--FROM DUAL;


SELECT NAME "이름"
     , TO_DATE('19' || SUBSTR(SSN, 1, 6), 'YYYY-MM-DD') "생년월일"
     , CONCAT('\', TRIM(TO_CHAR(BASICPAY, '99,999,999'))) "기본급"
     , SUDANG "수당"
FROM TBL_INSA;
--==>>
/*
이름	생년월일	기본급	수당
홍길동	1977-12-12	\2,610,000	200000
이순신	1980-10-07	\1,320,000	200000
이순애	1977-09-22	\2,550,000	160000
김정훈	1979-03-04	\1,954,200	170000
한석봉	1981-11-12	\1,420,000	160000
이기자	1978-05-05	\2,265,000	150000
장인철	1978-05-06	\1,250,000	150000
김영년	1982-10-11	\950,000	145000
나윤균	1981-08-10	\840,000	220400
김종서	1975-10-10	\2,540,000	130000
유관순	1980-10-10	\1,020,000	140000
정한국	1976-09-09	\880,000	114000
조미숙	1979-01-02	\1,601,000	103000
황진이	1981-07-07	\1,100,000	130000
이현숙	1980-06-06	\1,050,000	104000
이상헌	1978-10-10	\2,350,000	150000
엄용수	1982-05-07	\950,000	210000
이성길	1980-10-28	\880,000	123000
박문수	1978-07-10	\2,300,000	165000
유영희	1980-03-04	\880,000	140000
홍길남	1980-10-10	\875,000	120000
이영숙	1980-05-01	\1,960,000	180000
김인수	1973-12-11	\2,500,000	170000
김말자	1983-02-25	\1,900,000	170000
우재옥	1980-11-03	\1,100,000	160000
김숙남	1981-09-07	\1,050,000	150000
김영길	1980-12-16	\2,340,000	170000
이남신	1981-01-01	\892,000	110000
김말숙	1980-03-01	\920,000	124000
정정해	1979-02-10	\2,304,000	124000
지재환	1977-11-15	\2,450,000	160000
심심해	1981-02-06	\880,000	108000
김미나	1978-05-05	\1,020,000	104000
이정석	1982-05-05	\1,100,000	160000
정영희	1983-10-10	\1,050,000	140000
이재영	1970-11-26	\960,400	190000
최석규	1977-01-29	\2,350,000	187000
손인수	1979-10-09	\2,000,000	150000
고순정	1980-05-04	\2,010,000	160000
박세열	1979-05-09	\2,100,000	130000
문길수	1972-12-17	\2,300,000	150000
채정희	1981-07-09	\1,020,000	200000
양미옥	1983-05-04	\1,100,000	210000
지수환	1982-03-05	\1,060,000	220000
홍원신	1969-09-06	\960,000	152000
허경운	1976-01-05	\2,650,000	150000
산마루	1978-05-05	\2,100,000	112000
이기상	1979-06-04	\2,050,000	106000
이미성	1983-09-08	\1,300,000	130000
이미인	1981-04-03	\1,950,000	103000
권영미	1979-03-03	\2,260,000	104000
권옥경	1982-04-06	\1,020,000	105000
김싱식	1980-07-15	\960,000	108000
정상호	1981-07-05	\980,000	114000
정한나	1982-05-06	\1,000,000	104000
전용재	1980-06-05	\1,950,000	200000
이미경	1978-04-06	\2,520,000	160000
김신제	1980-07-09	\1,950,000	180000
임수봉	1981-08-09	\890,000	102000
김신애	1981-08-09	\900,000	102000

*/





--56. 이름, 출신도, 기본급을 조회하되 출신도 내림차순 출력(1차 정렬 기준).
--    출신도가 같으면 기본급 오름차순 출력(2차 정렬 기준).



SELECT NAME "이름", CITY "출신도", BASICPAY "기본급"
FROM TBL_INSA
ORDER BY 출신도 DESC, 기본급 ASC;
--==>>
/*
이름	출신도	기본급
문길수	충남	2300000
이남신	제주	892000
장인철	제주	1250000
이성길	전북	880000
심심해	전북	880000
김싱식	전북	960000
홍원신	전북	960000
김정훈	전북	1954200
유영희	전남	880000
이영숙	전남	1960000
이기상	전남	2050000
엄용수	인천	950000
정영희	인천	1050000
황진이	인천	1100000
이미성	인천	1300000
전용재	인천	1950000
김신제	인천	1950000
이기자	인천	2265000
최석규	인천	2350000
이순애	인천	2550000
임수봉	서울	890000
김신애	서울	900000
김말숙	서울	920000
김영년	서울	950000
이재영	서울	960400
정한나	서울	1000000
김미나	서울	1020000
유관순	서울	1020000
지수환	서울	1060000
양미옥	서울	1100000
우재옥	서울	1100000
한석봉	서울	1420000
김말자	서울	1900000
산마루	서울	2100000
권영미	서울	2260000
박문수	서울	2300000
김영길	서울	2340000
지재환	서울	2450000
김인수	서울	2500000
홍길동	서울	2610000
손인수	부산	2000000
정정해	부산	2304000
김종서	부산	2540000
박세열	경북	2100000
허경운	경남	2650000
나윤균	경기	840000
홍길남	경기	875000
채정희	경기	1020000
권옥경	경기	1020000
김숙남	경기	1050000
이현숙	경기	1050000
이정석	경기	1100000
이순신	경기	1320000
조미숙	경기	1601000
이미인	경기	1950000
고순정	경기	2010000
이상헌	경기	2350000
이미경	경기	2520000
정한국	강원	880000
정상호	강원	980000
*/






--57. 전화번호가 NULL이 아닌것만 조회. (이름, 전화번호)



SELECT NAME "이름", TEL "전화번호"
FROM TBL_INSA
WHERE TEL IS NOT NULL;
--==>>
/*
이름	전화번호
홍길동	011-2356-4528
이순신	010-4758-6532
이순애	010-4231-1236
김정훈	019-5236-4221
한석봉	018-5211-3542
이기자	010-3214-5357
장인철	011-2345-2525
김영년	016-2222-4444
나윤균	019-1111-2222
김종서	011-3214-5555
유관순	010-8888-4422
정한국	018-2222-4242
조미숙	019-6666-4444
황진이	010-3214-5467
이현숙	016-2548-3365
이상헌	010-4526-1234
엄용수	010-3254-2542
이성길	018-1333-3333
박문수	017-4747-4848
유영희	011-9595-8585
홍길남	011-9999-7575
이영숙	017-5214-5282
김말자	011-5248-7789
우재옥	010-4563-2587
김숙남	010-2112-5225
김영길	019-8523-1478
이남신	016-1818-4848
김말숙	016-3535-3636
정정해	019-6564-6752
지재환	019-5552-7511
심심해	016-8888-7474
김미나	011-2444-4444
이정석	011-3697-7412
이재영	011-9999-9999
최석규	011-7777-7777
손인수	010-6542-7412
고순정	010-2587-7895
박세열	016-4444-7777
문길수	016-4444-5555
채정희	011-5125-5511
양미옥	016-8548-6547
지수환	011-5555-7548
홍원신	011-7777-7777
허경운	017-3333-3333
산마루	018-0505-0505
이미성	010-6654-8854
이미인	011-8585-5252
권영미	011-5555-7548
권옥경	010-3644-5577
김싱식	011-7585-7474
정상호	016-1919-4242
정한나	016-2424-4242
전용재	010-7549-8654
이미경	016-6542-7546
김신제	010-2415-5444
임수봉	011-4151-4154
김신애	011-4151-4444
*/








--58. 근무년수가 10년 이상인 사람 조회. (이름, 입사일)


SELECT NAME "이름", IBSADATE "입사일"
FROM TBL_INSA
WHERE EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM IBSADATE) >= 10;

--==>>
/*
이름	입사일
홍길동	1998-10-11
이순신	2000-11-29
이순애	1999-02-25
김정훈	2000-10-01
한석봉	2004-08-13
이기자	2002-02-11
장인철	1998-03-16
김영년	2002-04-30
나윤균	2003-10-10
김종서	1997-08-08
유관순	2000-07-07
정한국	1999-10-16
조미숙	1998-06-07
황진이	2002-02-15
이현숙	1999-07-26
이상헌	2001-11-29
엄용수	2000-08-28
이성길	2004-08-08
박문수	1999-12-10
유영희	2003-10-10
홍길남	2001-09-07
이영숙	2003-02-25
김인수	1995-02-23
김말자	1999-08-28
우재옥	2000-10-01
김숙남	2002-08-28
김영길	2000-10-18
이남신	2001-09-07
김말숙	2000-09-08
정정해	1999-10-17
지재환	2001-01-21
심심해	2000-05-05
김미나	1998-06-07
이정석	2005-09-26
정영희	2002-05-16
이재영	2003-08-10
최석규	1998-10-15
손인수	1999-11-15
고순정	2003-12-28
박세열	2000-09-10
문길수	2001-12-10
채정희	2003-10-17
양미옥	2003-09-24
지수환	2004-01-21
홍원신	2003-03-16
허경운	1999-05-04
산마루	2001-07-15
이기상	2001-06-07
이미성	2000-04-07
이미인	2003-06-07
권영미	2000-06-04
권옥경	2000-10-10
김싱식	1999-12-12
정상호	1999-10-16
정한나	2004-06-07
전용재	2004-08-13
이미경	1998-02-11
김신제	2003-08-08
임수봉	2001-10-10
김신애	2001-10-10
*/




--59. 주민번호를 기준으로 75~82년생 조회. (이름, 주민번호, 출신도).
--    SUBSTR() 함수, BEWTEEN AND 구문, TO_NUMBER() 함수 이용.


SELECT NAME "이름", SSN "주민번호", CITY "출신도"
FROM TBL_INSA
WHERE TO_NUMBER(SUBSTR(SSN, 1, 2)) BETWEEN 75 AND 82;
--==>>
/*
이름	주민번호	출신도
홍길동	771212-1022432	서울
이순신	801007-1544236	경기
이순애	770922-2312547	인천
김정훈	790304-1788896	전북
한석봉	811112-1566789	서울
이기자	780505-2978541	인천
장인철	780506-1625148	제주
김영년	821011-2362514	서울
나윤균	810810-1552147	경기
김종서	751010-1122233	부산
유관순	801010-2987897	서울
정한국	760909-1333333	강원
조미숙	790102-2777777	경기
황진이	810707-2574812	인천
이현숙	800606-2954687	경기
이상헌	781010-1666678	경기
엄용수	820507-1452365	인천
이성길	801028-1849534	전북
박문수	780710-1985632	서울
유영희	800304-2741258	전남
홍길남	801010-1111111	경기
이영숙	800501-2312456	전남
우재옥	801103-1654442	서울
김숙남	810907-2015457	경기
김영길	801216-1898752	서울
이남신	810101-1010101	제주
김말숙	800301-2020202	서울
정정해	790210-2101010	부산
지재환	771115-1687988	서울
심심해	810206-2222222	전북
김미나	780505-2999999	서울
이정석	820505-1325468	경기
최석규	770129-1456987	인천
손인수	791009-2321456	부산
고순정	800504-2000032	경기
박세열	790509-1635214	경북
채정희	810709-2000054	경기
지수환	820305-1475286	서울
허경운	760105-1458752	경남
산마루	780505-1234567	서울
이기상	790604-1415141	전남
이미인	810403-2828287	경기
권영미	790303-2155554	서울
권옥경	820406-2000456	경기
김싱식	800715-1313131	전북
정상호	810705-1212141	강원
정한나	820506-2425153	서울
전용재	800605-1456987	인천
이미경	780406-2003214	경기
김신제	800709-1321456	인천
임수봉	810809-2121244	서울
김신애	810809-2111111	서울
*/





--60. 근무년수가 5~10년인 사람 조회. (이름, 입사일)


SELECT NAME "이름", IBSADATE "입사일"
FROM TBL_INSA
WHERE (EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM IBSADATE))
       BETWEEN
       5 AND 10;
--==>> 조회 결과 없음.
       






--61. 김씨, 이씨, 박씨만 조회 (이름, 부서). SUBSTR() 함수 이용.

SELECT NAME "이름", BUSEO "부서"
FROM TBL_INSA
WHERE SUBSTR(NAME, 1, 1) IN ('김', '이', '박');
--==>>
/*
이름	부서
이순신	총무부
이순애	개발부
김정훈	영업부
이기자	개발부
김영년	홍보부
김종서	영업부
이현숙	총무부
이상헌	개발부
이성길	개발부
박문수	인사부
이영숙	기획부
김인수	영업부
김말자	기획부
김숙남	영업부
김영길	총무부
이남신	인사부
김말숙	총무부
김미나	영업부
이정석	기획부
이재영	자재부
박세열	인사부
이기상	개발부
이미성	개발부
이미인	홍보부
김싱식	자재부
이미경	자재부
김신제	기획부
김신애	개발부
*/






--62. 입사일을 "년-월-일 요일" 형식으로 남자만 조회 (이름, 주민번호, 입사일)



--SELECT TO_CHAR(IBSADATE, 'YYYY') || '년-'   ||
--       TO_CHAR(IBSADATE, 'MM')   || '월-'   ||
--       TO_CHAR(IBSADATE, 'DD')   || '일-'   ||
--       TO_CHAR(IBSADATE, 'DAY') "입사일"
--
--FROM TBL_INSA;



SELECT NAME "이름"
     , SSN "주민번호"
     , TO_CHAR(IBSADATE, 'YYYY') || '년-'   ||
       TO_CHAR(IBSADATE, 'MM')   || '월-'   ||
       TO_CHAR(IBSADATE, 'DD')   || '일-'   ||
       TO_CHAR(IBSADATE, 'DAY') "입사일"
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('1', '3');
--==>>
/*
이름	주민번호	입사일
홍길동	771212-1022432	1998년-10월-11일-일요일
이순신	801007-1544236	2000년-11월-29일-수요일
김정훈	790304-1788896	2000년-10월-01일-일요일
한석봉	811112-1566789	2004년-08월-13일-금요일
장인철	780506-1625148	1998년-03월-16일-월요일
나윤균	810810-1552147	2003년-10월-10일-금요일
김종서	751010-1122233	1997년-08월-08일-금요일
정한국	760909-1333333	1999년-10월-16일-토요일
이상헌	781010-1666678	2001년-11월-29일-목요일
엄용수	820507-1452365	2000년-08월-28일-월요일
이성길	801028-1849534	2004년-08월-08일-일요일
박문수	780710-1985632	1999년-12월-10일-금요일
홍길남	801010-1111111	2001년-09월-07일-금요일
김인수	731211-1214576	1995년-02월-23일-목요일
우재옥	801103-1654442	2000년-10월-01일-일요일
김영길	801216-1898752	2000년-10월-18일-수요일
이남신	810101-1010101	2001년-09월-07일-금요일
지재환	771115-1687988	2001년-01월-21일-일요일
이정석	820505-1325468	2005년-09월-26일-월요일
최석규	770129-1456987	1998년-10월-15일-목요일
박세열	790509-1635214	2000년-09월-10일-일요일
문길수	721217-1951357	2001년-12월-10일-월요일
지수환	820305-1475286	2004년-01월-21일-수요일
홍원신	690906-1985214	2003년-03월-16일-일요일
허경운	760105-1458752	1999년-05월-04일-화요일
산마루	780505-1234567	2001년-07월-15일-일요일
이기상	790604-1415141	2001년-06월-07일-목요일
김싱식	800715-1313131	1999년-12월-12일-일요일
정상호	810705-1212141	1999년-10월-16일-토요일
전용재	800605-1456987	2004년-08월-13일-금요일
김신제	800709-1321456	2003년-08월-08일-금요일
*/









--63. 부서별 직위별 급여합 구하기. (부서, 직위, 급여합)


-- #1 부서별 급여합
SELECT BUSEO "부서명"
     , SUM(BASICPAY + SUDANG) "급여합"
FROM TBL_INSA
GROUP BY BUSEO;


-- #2 직위별 급여합
SELECT JIKWI "직위명"
     , SUM(BASICPAY + SUDANG) "급여합"
FROM TBL_INSA
GROUP BY JIKWI;



SELECT BP.부서명, BP.급여합, JP.직위명, JP.급여합
FROM
(
    SELECT BUSEO "부서명"
     , SUM(BASICPAY + SUDANG) "급여합"
    FROM TBL_INSA
    GROUP BY BUSEO 
) BP
INNER JOIN
(
    SELECT JIKWI "직위명"
         , BUSEO "부서명"
         , SUM(BASICPAY + SUDANG) "급여합"
    FROM TBL_INSA
    GROUP BY JIKWI, BUSEO
) JP
ON BP.부서명 = JP.부서명
ORDER BY BP.부서명 ASC, JP.직위명 ASC;

--==>>
/*
부서명	급여합	직위명	급여합_1
개발부	21403000	과장	4915000
개발부	21403000	대리	3556000
개발부	21403000	부장	2710000
개발부	21403000	사원	10222000
기획부	14145000	대리	6340000
기획부	14145000	부장	5420000
기획부	14145000	사원	2385000
영업부	28060200	과장	2364000
영업부	28060200	대리	10806200
영업부	28060200	부장	5340000
영업부	28060200	사원	9550000
인사부	6757400	과장	2465000
인사부	6757400	대리	2230000
인사부	6757400	사원	2062400
자재부	9356400	과장	2450000
자재부	9356400	부장	2680000
자재부	9356400	사원	4226400
총무부	13036000	과장	4938000
총무부	13036000	부장	2800000
총무부	13036000	사원	5298000
홍보부	9477000	과장	2537000
홍보부	9477000	대리	3757000
홍보부	9477000	사원	3183000
*/


--SELECT *
--FROM
--(
--    SELECT BUSEO "부서명"
--     , SUM(BASICPAY + SUDANG) "급여합"
--    FROM TBL_INSA
--    GROUP BY BUSEO 
--) BP
--INNER JOIN
--(
--    SELECT JIKWI "직위명"
--         , BUSEO "부서명"
--         , SUM(BASICPAY + SUDANG) "급여합"
--    FROM TBL_INSA
--    GROUP BY JIKWI, BUSEO
--) JP
--ON BP.부서명 = JP.부서명;





--64. 부서별 직위별 인원수, 급여합, 급여평균 구하기. (부서, 직위, 급여합)




SELECT DISTINCT BP.부서명, BP.부서별인원수, BP.부서별급여합, BP.부서별급여평균
              , JP.직위명, JP.직위별인원수, JP.직위별급여합, JP.직위별급여평균
FROM
(
    SELECT BUSEO "부서명"
     , SUM(BASICPAY + SUDANG) "부서별급여합"
     , COUNT(*) "부서별인원수"
     , ROUND(AVG(BASICPAY + SUDANG), 0) "부서별급여평균"
    FROM TBL_INSA
    GROUP BY BUSEO 
) BP
INNER JOIN
(
    SELECT JIKWI "직위명"
         , BUSEO "부서명"
         , SUM(BASICPAY + SUDANG) "직위별급여합"
         , COUNT(*) "직위별인원수"
         , ROUND(AVG(BASICPAY + SUDANG), 0) "직위별급여평균"
    FROM TBL_INSA
    GROUP BY JIKWI, BUSEO
) JP
ON BP.부서명 = JP.부서명
ORDER BY BP.부서명 ASC, JP.직위명 ASC;
--==>>
/*
부서명	부서별인원수	부서별급여합	부서별급여평균	직위명	직위별인원수	직위별급여합	직위별급여평균
개발부	14	21403000	1528786	과장	2	4915000	2457500
개발부	14	21403000	1528786	대리	2	3556000	1778000
개발부	14	21403000	1528786	부장	1	2710000	2710000
개발부	14	21403000	1528786	사원	9	10222000	1135778
기획부	7	14145000	2020714	대리	3	6340000	2113333
기획부	7	14145000	2020714	부장	2	5420000	2710000
기획부	7	14145000	2020714	사원	2	2385000	1192500
영업부	16	28060200	1753763	과장	1	2364000	2364000
영업부	16	28060200	1753763	대리	5	10806200	2161240
영업부	16	28060200	1753763	부장	2	5340000	2670000
영업부	16	28060200	1753763	사원	8	9550000	1193750
인사부	4	6757400	1689350	과장	1	2465000	2465000
인사부	4	6757400	1689350	대리	1	2230000	2230000
인사부	4	6757400	1689350	사원	2	2062400	1031200
자재부	6	9356400	1559400	과장	1	2450000	2450000
자재부	6	9356400	1559400	부장	1	2680000	2680000
자재부	6	9356400	1559400	사원	4	4226400	1056600
총무부	7	13036000	1862286	과장	2	4938000	2469000
총무부	7	13036000	1862286	부장	1	2800000	2800000
총무부	7	13036000	1862286	사원	4	5298000	1324500
홍보부	6	9477000	1579500	과장	1	2537000	2537000
홍보부	6	9477000	1579500	대리	2	3757000	1878500
홍보부	6	9477000	1579500	사원	3	3183000	1061000
*/


-- GROUP BY 를 통해 간단하게 작성.
SELECT BUSEO "부서명"
     , JIKWI "직위명"
     , SUM(BASICPAY + SUDANG) "급여합"
FROM TBL_INSA
GROUP BY BUSEO, JIKWI
ORDER BY 1 ASC;
--==>>
/*
부서명	직위명	급여합
개발부	과장	4915000
개발부	대리	3556000
개발부	부장	2710000
개발부	사원	10222000
기획부	대리	6340000
기획부	부장	5420000
기획부	사원	2385000
영업부	과장	2364000
영업부	대리	10806200
영업부	부장	5340000
영업부	사원	9550000
인사부	과장	2465000
인사부	대리	2230000
인사부	사원	2062400
자재부	과장	2450000
자재부	부장	2680000
자재부	사원	4226400
총무부	과장	4938000
총무부	부장	2800000
총무부	사원	5298000
홍보부	과장	2537000
홍보부	대리	3757000
홍보부	사원	3183000
*/







--65. 부서별 직위별 인원수를 구하되 인원수가 5명 이상인 경우만 조회.



-- #1 인원수가 5명 이상인 부서 찾기

SELECT BUSEO "부서명", COUNT(*) "부서별인원수"
FROM TBL_INSA
GROUP BY BUSEO
HAVING COUNT(*) >= 5;



-- #2 부서가 위와 같은 직원들 중 직위별로 인원수 구하기
SELECT JIKWI "직위명", BUSEO "부서명", COUNT(*) "직위별인원수"
FROM TBL_INSA
GROUP BY JIKWI, BUSEO;




-- #3 두 테이블 결합 INNER JOIN


SELECT BT.부서명, BT.부서별인원수, JT.직위명, JT.직위별인원수
FROM
(
    SELECT BUSEO "부서명", COUNT(*) "부서별인원수"
    FROM TBL_INSA
    GROUP BY BUSEO
    HAVING COUNT(*) >= 5
) BT
INNER JOIN
(
    SELECT JIKWI "직위명", BUSEO "부서명", COUNT(*) "직위별인원수"
    FROM TBL_INSA
    GROUP BY JIKWI, BUSEO
) JT
ON BT.부서명 = JT.부서명
ORDER BY BT.부서명 ASC;

--==>>
/*
부서명	부서별인원수	직위명	직위별인원수
개발부	14	부장	1
개발부	14	과장	2
개발부	14	사원	9
개발부	14	대리	2
기획부	7	사원	2
기획부	7	부장	2
기획부	7	대리	3
영업부	16	대리	5
영업부	16	과장	1
영업부	16	사원	8
영업부	16	부장	2
자재부	6	부장	1
자재부	6	사원	4
자재부	6	과장	1
총무부	7	사원	4
총무부	7	과장	2
총무부	7	부장	1
홍보부	6	대리	2
홍보부	6	과장	1
홍보부	6	사원	3
*/







--66. 2000년에 입사한 여사원 조회. (이름, 주민번호, 입사일)



SELECT NAME "이름", SSN "주민번호", IBSADATE "입사일"
FROM TBL_INSA
WHERE EXTRACT(YEAR FROM IBSADATE) = 2000
      AND
      SUBSTR(SSN, 8, 1) IN ('2', '3');
      
--==>>
/*
이름	주민번호	입사일
유관순	801010-2987897	2000-07-07
김말숙	800301-2020202	2000-09-08
심심해	810206-2222222	2000-05-05
이미성	830908-2456548	2000-04-07
권영미	790303-2155554	2000-06-04
권옥경	820406-2000456	2000-10-10
*/





--67. 성씨가 한 글자(김, 이, 박 등)라는 가정하에 성씨별 인원수 조회 (성씨, 인원수)


SELECT SUBSTR(NAME, 1, 1) "성씨"
      , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY SUBSTR(NAME, 1, 1)
ORDER BY 성씨 ASC;
--==>>
/*
성씨	인원수
고	1
권	2
김	12
나	1
문	1
박	2
산	1
손	1
심	1
양	1
엄	1
우	1
유	2
이	14
임	1
장	1
전	1
정	5
조	1
지	2
채	1
최	1
한	1
허	1
홍	3
황	1
*/






--68. 출신도(CITY)별 성별 인원수 조회.

SELECT CITY "출신도"
     , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
             THEN '남자'
             WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
             THEN '여자'
             ELSE '알수없음'
       END "성별"
     , COUNT(*) "인원수"
FROM TBL_INSA

GROUP BY CITY, SUBSTR(SSN, 8, 1)
ORDER BY CITY ASC;

--==>>
/*
출신도	성별	인원수
강원	남자	2
경기	남자	5
경기	여자	8
경남	남자	1
경북	남자	1
부산	남자	1
부산	여자	2
서울	남자	9
서울	여자	11
인천	남자	4
인천	여자	5
전남	남자	1
전남	여자	2
전북	남자	4
전북	여자	1
제주	남자	2
충남	남자	1
*/



-- 인원수 60명 맞는지 확인.
--SELECT SUM(T.인원수)
--FROM
--(
--    SELECT CITY "출신도"
--     , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
--             THEN '남자'
--             WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
--             THEN '여자'
--             ELSE '알수없음'
--       END "성별"
--     , COUNT(*) "인원수"
--    FROM TBL_INSA
--    
--    GROUP BY CITY, SUBSTR(SSN, 8, 1)
--    ORDER BY CITY ASC
--) T;






--69. 부서별 남자인원수가 5명 이상인 부서와 남자인원수 조회.



SELECT BUSEO
     , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
             THEN '남자'
             WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
             THEN '여자'
             ELSE '알수없음'
       END "성별"
     , COUNT(SUBSTR(SSN, 8, 1)) "인원수"

FROM TBL_INSA
GROUP BY BUSEO, SUBSTR(SSN, 8, 1);


-- 남자 인원수가 5 이상인 것 찾기.
--SELECT BUSEO
--     , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
--             THEN '남자'
--             WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
--             THEN '여자'
--             ELSE '알수없음'
--       END "성별"
--     , COUNT(*) "인원수"
--
--FROM TBL_INSA
--WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
--GROUP BY BUSEO, SUBSTR(SSN, 8, 1)
--HAVING COUNT(*) >= 5;


-- 부서명만 뽑기

SELECT T.BUSEO
FROM 
(
    SELECT BUSEO
     , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
             THEN '남자'
             WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
             THEN '여자'
             ELSE '알수없음'
       END "성별"
     , COUNT(*) "인원수"

    FROM TBL_INSA
    WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
    GROUP BY BUSEO, SUBSTR(SSN, 8, 1)
    HAVING COUNT(*) >= 5

)T;

-- 위의 식의 WHERE 절에 조건으로 넣기.



SELECT BUSEO "부서명"
     , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
             THEN '남자'
             WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
             THEN '여자'
             ELSE '알수없음'
       END "성별"
     , COUNT(SUBSTR(SSN, 8, 1)) "인원수"

FROM TBL_INSA
WHERE BUSEO
      IN 
      (
        SELECT T.BUSEO
        FROM 
        (
            SELECT BUSEO
             , CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
               END "성별"
             , COUNT(*) "인원수"
        
            FROM TBL_INSA
            WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
            GROUP BY BUSEO, SUBSTR(SSN, 8, 1)
            HAVING COUNT(*) >= 5
        
        )T
      )
GROUP BY BUSEO, SUBSTR(SSN, 8, 1);

--==>>
/*
부서명	성별  	인원수
영업부	남자  	8
개발부	여자  	8
개발부	남자  	6
영업부	여자	    8
*/







--70. 입사년도별 인원수 조회.


SELECT EXTRACT(YEAR FROM IBSADATE) "입사년도"
     , COUNT(*) "인원수"
FROM TBL_INSA
GROUP BY EXTRACT(YEAR FROM IBSADATE);
--==>>
/*
입사년도	인원수
1997	1
2005    	1
1999	10
2001    	9
1998	6
2000	    12
1995	1
2004    	5
2003	    10
2002	    5
*/


-- 60명이 맞는지 확인.
--SELECT SUM(T.인원수)
--FROM
--(
--    SELECT EXTRACT(YEAR FROM IBSADATE) "입사년도"
--     , COUNT(*) "인원수"
--    FROM TBL_INSA
--    GROUP BY EXTRACT(YEAR FROM IBSADATE)
--) T;




--71. 전체인원수, 2000년, 1999년, 1998년도에 입사한 인원을 다음의 형식으로 조회.
--    출력형태 ---------------    
--    전체 2000 1999 1998
--      60    x    x    x


-- #1 전체 인원수 구하기


SELECT COUNT(*)
FROM TBL_INSA;


-- #2 2000년도 인원 구하기

SELECT COUNT(*)  "2000년도인원수"
FROM TBL_INSA
WHERE EXTRACT(YEAR FROM IBSADATE) = 2000;



-- #3 1999년도 인원 구하기

SELECT COUNT(*) "1999년도인원수"
FROM TBL_INSA
WHERE EXTRACT(YEAR FROM IBSADATE) = 1999;



-- #4 1998년도 인원 구하기

SELECT COUNT(*) "1998년도인원수"
FROM TBL_INSA
WHERE EXTRACT(YEAR FROM IBSADATE) = 1998;


-- #5 서브 상단 쿼리로 구성하기!!!!


SELECT (
            SELECT COUNT(*)
            FROM TBL_INSA
       ) "전체"
       ,
       (
            SELECT COUNT(*)  "2000년도인원수"
            FROM TBL_INSA
            WHERE EXTRACT(YEAR FROM IBSADATE) = 2000
       ) "2000"
       ,
       (
            SELECT COUNT(*) "1999년도인원수"
            FROM TBL_INSA
            WHERE EXTRACT(YEAR FROM IBSADATE) = 1999        
       ) "1999"
       ,
       (
            SELECT COUNT(*) "1998년도인원수"
            FROM TBL_INSA
            WHERE EXTRACT(YEAR FROM IBSADATE) = 1998 
       ) "1998"
FROM DUAL;

--==>>
/*
전체	    2000    	1999	1998
60	    12	    10	    6
*/

-- 수정... (전체 인원수가 60명으로 나오도록 하는건줄 알았어요...)

--★ [최종 풀이]-------------------------------------------------


SELECT LASTT."2000" + LASTT."1999" + LASTT."1998" "전체인원수"
     , LASTT.*
FROM
(
    SELECT 
           (
                SELECT COUNT(*)  "2000년도인원수"
                FROM TBL_INSA
                WHERE EXTRACT(YEAR FROM IBSADATE) = 2000
           ) "2000"
           ,
           (
                SELECT COUNT(*) "1999년도인원수"
                FROM TBL_INSA
                WHERE EXTRACT(YEAR FROM IBSADATE) = 1999        
           ) "1999"
           ,
           (
                SELECT COUNT(*) "1998년도인원수"
                FROM TBL_INSA
                WHERE EXTRACT(YEAR FROM IBSADATE) = 1998 
           ) "1998"
    FROM DUAL
) LASTT;
--==>>
/*
전체인원수	2000    	1999	1998
28	        12	    10	    6
*/
   
   
   


--72. 아래 형식으로 지역별 인원수 조회.
--    출력형태 -----------------
--    전체 서울  인천  경기
--      60    x     x     x
      
      
-- #1 전체 인원수 구하기


SELECT COUNT(*)
FROM TBL_INSA;

-- 서울  인천  경기

-- #2 서울 인원 구하기

SELECT COUNT(*)  "서울인원수"
FROM TBL_INSA
WHERE CITY LIKE '서울';



-- #3 인천 인원 구하기

SELECT COUNT(*) "인천인원수"
FROM TBL_INSA
WHERE CITY LIKE '인천';



-- #4 경기 인원 구하기

SELECT COUNT(*) "경기인원수"
FROM TBL_INSA
WHERE CITY LIKE '경기';


-- #5 서브 상단 쿼리로 구성하기!!!!
/*
    출력형태 -----------------
    전체 서울  인천  경기
      60    x     x     x
*/

SELECT (
            SELECT COUNT(*)
            FROM TBL_INSA
       ) "전체"
       ,
       (
            SELECT COUNT(*)  "서울인원수"
            FROM TBL_INSA
            WHERE CITY LIKE '서울'
       ) "서울"
       ,
       (
           SELECT COUNT(*) "인천인원수"
            FROM TBL_INSA
            WHERE CITY LIKE '인천'   
       ) "인천"
       ,
       (
            SELECT COUNT(*) "경기인원수"
            FROM TBL_INSA
            WHERE CITY LIKE '경기'
       ) "경기"
FROM DUAL;


--==>>
/*
전체  	서울	    인천	    경기
60	    20	    9	    13
*/
  
-- 이것도 수정... 전체 인원수 60으로 표현하는건줄 알았어요...ㅠㅠ


--★ [최종 풀이]-------------------------------------------------
SELECT (LASTT.서울 + LASTT.인천 + LASTT.경기) "전체인원수"
     , LASTT.*
FROM
(
    SELECT 
           (
                SELECT COUNT(*)  "서울인원수"
                FROM TBL_INSA
                WHERE CITY LIKE '서울'
           ) "서울"
           ,
           (
               SELECT COUNT(*) "인천인원수"
                FROM TBL_INSA
                WHERE CITY LIKE '인천'   
           ) "인천"
           ,
           (
                SELECT COUNT(*) "경기인원수"
                FROM TBL_INSA
                WHERE CITY LIKE '경기'
           ) "경기"
    FROM DUAL
    
)LASTT;
--==>>
/*
전체인원수	서울	    인천	    경기
42	        20	    9	    13
*/




--73. 기본급(BASICPAY)이 평균 이하인 사원 조회. (이름, 기본급). AVG() 함수. 서브쿼리.


-- #1 기본급 평균 구하기 (정수부)

SELECT ROUND(AVG(BASICPAY), 0)
FROM TBL_INSA;
--==>> 1556527

-- #2 평균 이하인 사원 구하기


SELECT NAME "이름", BASICPAY "기본급"
FROM TBL_INSA
WHERE BASICPAY 
      <=
      (
        SELECT ROUND(AVG(BASICPAY), 0)
        FROM TBL_INSA
       );
--==>>
/*
이름	기본급
이순신	1320000
한석봉	1420000
장인철	1250000
김영년	950000
나윤균	840000
유관순	1020000
정한국	880000
황진이	1100000
이현숙	1050000
엄용수	950000
이성길	880000
유영희	880000
홍길남	875000
우재옥	1100000
김숙남	1050000
이남신	892000
김말숙	920000
심심해	880000
김미나	1020000
이정석	1100000
정영희	1050000
이재영	960400
채정희	1020000
양미옥	1100000
지수환	1060000
홍원신	960000
이미성	1300000
권옥경	1020000
김싱식	960000
정상호	980000
정한나	1000000
임수봉	890000
김신애	900000
*/





-- 74. 기본급 상위 10%만 조회. (이름, 기본급)


-- #1. 상위 10%가 몇 명인지 구하기

SELECT (COUNT(*) - COUNT(*) * ((100 - 10) / 100))
FROM TBL_INSA;


-- #2 기본급순위 구하기
SELECT NAME, BASICPAY
     , RANK() OVER (ORDER BY BASICPAY DESC) "기본급순위"
FROM TBL_INSA;


-- #3 기본급 상위 10%인 사원이름, 기본급 구하기

SELECT T.NAME "사원이름"
     , T.BASICPAY "기본급"
FROM
(
    SELECT NAME, BASICPAY
         , RANK() OVER (ORDER BY BASICPAY DESC) "기본급순위"
    FROM TBL_INSA
)T
WHERE T.기본급순위 <= (SELECT (COUNT(*) - COUNT(*) * ((100 - 10) / 100))
                      FROM TBL_INSA);

--==>>
/*
사원이름	기본급
허경운	2650000
홍길동	2610000
이순애	2550000
김종서	2540000
이미경	2520000
김인수	2500000
*/




--75. 기본급 순위가 5순위까지만 조회. (모든 정보)

-- 위에거 복붙했다가 바꾸는걸 깜빡했어요...


SELECT *
FROM TBL_INSA
WHERE NAME 
      IN
      (
        SELECT T.NAME "사원이름"
        FROM
        (
            SELECT NAME, BASICPAY
                 , RANK() OVER (ORDER BY BASICPAY DESC) "기본급순위"
            FROM TBL_INSA
        )T
        WHERE T.기본급순위 <= 5
      );
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000
*/










--76. 입사일이 빠른 순서로 5순위까지만 조회. (모든 정보)


-- #1 입사일 빠른 순으로 순위 정하기

SELECT RANK() OVER(ORDER BY IBSADATE ASC) "입사일순위"
     , IBSADATE "입사일"
     , NAME "이름"
     , SSN "주민번호"
FROM TBL_INSA;


-- #2 위에서 구한 순위, 이름, 주민번호를 이용하여
--    입사일 순위가 1~5위까지인 사원들을 조회하기


SELECT TI.*
FROM TBL_INSA TI
    INNER JOIN
    (
        SELECT RANK() OVER(ORDER BY IBSADATE ASC) "입사일순위"
         , IBSADATE "입사일"
         , NAME "이름"
         , SSN "주민번호"
        FROM TBL_INSA
    ) T
    ON TI.NAME = T.이름
       AND
       TI.SSN = T.주민번호
WHERE T.입사일순위 <= 5;

--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1013	조미숙	790102-2777777	1998-06-07	경기	019-6666-4444	홍보부	대리	1601000	103000
1033	김미나	780505-2999999	1998-06-07	서울	011-2444-4444	영업부	사원	1020000	104000
*/




--77. 평균 급여보다 많은 급여를 받는 직원 정보 조회. (모든 정보)



-- #1 평균 급여 구하기 (정수부)
SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "평균급여"
FROM TBL_INSA;
--==>> 1703917


-- #2 평균 급여보다 더 많은 급여를 받는 직원 정보 모두 조회하기

SELECT TI.*
     , (TI.BASICPAY + TI.SUDANG) "급여"
FROM TBL_INSA TI
WHERE (TI.BASICPAY + TI.SUDANG)
       >
      (
        SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "평균급여"
        FROM TBL_INSA
      );
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG	급여
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000	2810000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000	2710000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000	2124200
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000	2415000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000	2670000
1013	조미숙	790102-2777777	1998-06-07	경기	019-6666-4444	홍보부	대리	1601000	103000	1704000
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000	2500000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000	2465000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000	2140000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000	2670000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000	2070000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000	2510000
1030	정정해	790210-2101010	1999-10-17	부산	019-6564-6752	총무부	과장	2304000	124000	2428000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000	2610000
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000	2537000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000	2150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000	2170000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000	2230000
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000	2450000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000	2800000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000	2212000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000	2156000
1050	이미인	810403-2828287	2003-06-07	경기	011-8585-5252	홍보부	대리	1950000	103000	2053000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000	2364000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000	2150000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000	2680000
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000	2130000
*/




--
--78. '이순애' 직원의 급여보다 더 많은 급여를 받는 직원 조회. (모든 정보)
--    단, 이순애 직원의 급여가 변하더라도 작성된 쿼리문은 기능 수행이 가능하도록 조회.


-- #1 이순애씨의 급여 구하기
SELECT (TI.BASICPAY + TI.SUDANG) "순애씨급여"
FROM TBL_INSA TI
WHERE NAME = '이순애';

-- #2 순애씨보다 더 많은 급여를 받는 직원 정보 모두 조회하기

SELECT TI2.*
    , (TI2.BASICPAY + TI2.SUDANG) "급여"
FROM TBL_INSA TI2
WHERE (TI2.BASICPAY + TI2.SUDANG)
      >
      (
            SELECT (TI.BASICPAY + TI.SUDANG) "순애씨급여"
            FROM TBL_INSA TI
            WHERE NAME = '이순애'
      );
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG	급여
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000	2810000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000	2800000
*/




--79. 총무부의 평균 급여보다 많은 급여를 받는 직원들의 이름, 부서명 조회.



-- #1 총무부 평균 급여 구하기 (정수부)
SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "총무부평균급여"
FROM TBL_INSA
WHERE BUSEO LIKE '총무부';
--==>> 1862286



-- #2 총무부 평균 급여보다 더 많은 급여를 받는 직원 정보 모두 조회하기

SELECT TI2.*
    , (TI2.BASICPAY + TI2.SUDANG) "급여"
FROM TBL_INSA TI2
WHERE (TI2.BASICPAY + TI2.SUDANG)
      >
      (
           SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "총무부평균급여"
            FROM TBL_INSA
            WHERE BUSEO LIKE '총무부'
      );
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG	급여
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000	2810000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000	2710000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000	2124200
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000	2415000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000	2670000
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000	2500000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000	2465000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000	2140000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000	2670000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000	2070000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000	2510000
1030	정정해	790210-2101010	1999-10-17	부산	019-6564-6752	총무부	과장	2304000	124000	2428000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000	2610000
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000	2537000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000	2150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000	2170000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000	2230000
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000	2450000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000	2800000
1047	산마루	780505-1234567	2001-07-15	서울	018-0505-0505	영업부	대리	2100000	112000	2212000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000	2156000
1050	이미인	810403-2828287	2003-06-07	경기	011-8585-5252	홍보부	대리	1950000	103000	2053000
1051	권영미	790303-2155554	2000-06-04	서울	011-5555-7548	영업부	과장	2260000	104000	2364000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000	2150000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000	2680000
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000	2130000
*/







--80. 총무부 직원들의 평균 수당보다 더 많은 수당을 받는 직원 정보 조회.



-- #1 총무부 평균 수당 구하기 (정수부)
SELECT ROUND(AVG(SUDANG), 0) "총무부평균수당"
FROM TBL_INSA
WHERE BUSEO LIKE '총무부';
--==>> 147429




-- #2 총무부 평균 수당보다 더 많은 수당을 받는 직원 정보 모두 조회하기

SELECT TI2.*
FROM TBL_INSA TI2
WHERE TI2.SUDANG
      >
      (
           SELECT ROUND(AVG(SUDANG), 0) "총무부평균수당"
            FROM TBL_INSA
            WHERE BUSEO LIKE '총무부'
      );
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1002	이순신	801007-1544236	2000-11-29	경기	010-4758-6532	총무부	사원	1320000	200000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000
1005	한석봉	811112-1566789	2004-08-13	서울	018-5211-3542	총무부	사원	1420000	160000
1006	이기자	780505-2978541	2002-02-11	인천	010-3214-5357	개발부	과장	2265000	150000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1009	나윤균	810810-1552147	2003-10-10	경기	019-1111-2222	인사부	사원	840000	220400
1016	이상헌	781010-1666678	2001-11-29	경기	010-4526-1234	개발부	과장	2350000	150000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1019	박문수	780710-1985632	1999-12-10	서울	017-4747-4848	인사부	과장	2300000	165000
1022	이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1023	김인수	731211-1214576	1995-02-23	서울		영업부	부장	2500000	170000
1024	김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1025	우재옥	801103-1654442	2000-10-01	서울	010-4563-2587	영업부	사원	1100000	160000
1026	김숙남	810907-2015457	2002-08-28	경기	010-2112-5225	영업부	사원	1050000	150000
1027	김영길	801216-1898752	2000-10-18	서울	019-8523-1478	총무부	과장	2340000	170000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1036	이재영	701126-2852147	2003-08-10	서울	011-9999-9999	자재부	사원	960400	190000
1037	최석규	770129-1456987	1998-10-15	인천	011-7777-7777	홍보부	과장	2350000	187000
1038	손인수	791009-2321456	1999-11-15	부산	010-6542-7412	영업부	대리	2000000	150000
1039	고순정	800504-2000032	2003-12-28	경기	010-2587-7895	영업부	대리	2010000	160000
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000
1042	채정희	810709-2000054	2003-10-17	경기	011-5125-5511	개발부	사원	1020000	200000
1043	양미옥	830504-2471523	2003-09-24	서울	016-8548-6547	영업부	사원	1100000	210000
1044	지수환	820305-1475286	2004-01-21	서울	011-5555-7548	영업부	사원	1060000	220000
1045	홍원신	690906-1985214	2003-03-16	전북	011-7777-7777	영업부	사원	960000	152000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000
1056	전용재	800605-1456987	2004-08-13	인천	010-7549-8654	영업부	대리	1950000	200000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000
*/







--81. 직원 전체 평균 급여보다 많은 급여를 받는 직원의 수 조회.


-- #1 전체평균급여 구하기
SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "전체평균급여"
FROM TBL_INSA;


-- #2 전체 평균급여보다 많은 급여를 받는 직원 정보 조회하기.
SELECT *
FROM TBL_INSA TI
WHERE (TI.BASICPAY + TI.SUDANG)
       >
      (
            SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "전체평균급여"
            FROM TBL_INSA
      );


-- #3 인원수 구하기
SELECT COUNT(*) "평균급여많은직원수"
FROM TBL_INSA TI
WHERE (TI.BASICPAY + TI.SUDANG)
       >
      (
            SELECT ROUND(AVG(BASICPAY + SUDANG), 0) "전체평균급여"
            FROM TBL_INSA
      );
--==>> 
/*
평균급여많은직원수
27
*/



--82. '홍길동' 직원과 같은 부서의 직원 정보 조회.
--    단, 홍길동 직원의 부서가 바뀌더라도 작성된 쿼리문은 기능 수행이 가능하도록 조회.
    
-- #1 홍길동씨의 부서명 찾기
SELECT BUSEO "부서명"
FROM TBL_INSA
WHERE NAME LIKE '홍길동';
--==>> 기획부

-- #2 같은 부서인 직원 조회하기.


SELECT *
FROM TBL_INSA
WHERE BUSEO
      IN
      (
        SELECT BUSEO "부서명"
        FROM TBL_INSA
        WHERE NAME LIKE '홍길동'
      );
--==>>    
/*
NUM	    NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG
1058	김신제	800709-1321456	2003-08-08	인천	010-2415-5444	기획부	대리	1950000	180000
1052	    권옥경	820406-2000456	2000-10-10	경기	010-3644-5577	기획부	사원	1020000	105000
1034	이정석	820505-1325468	2005-09-26	경기	011-3697-7412	기획부	사원	1100000	160000
1031	지재환	771115-1687988	2001-01-21	서울	019-5552-7511	기획부	부장	2450000	160000
1024	    김말자	830225-2633334	1999-08-28	서울	011-5248-7789	기획부	대리	1900000	170000
1022	    이영숙	800501-2312456	2003-02-25	전남	017-5214-5282	기획부	대리	1960000	180000
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
*/



--
--83. '김신애' 직원과 같은 부서, 직위를 가진 직원 정보 조회.
--    단, 김신애 직원의 부서 및 직위가 바뀌더라도 작성된 쿼리문은 기능 수행이 가능하도록 조회.


SELECT BUSEO, JIKWI
FROM TBL_INSA
WHERE NAME LIKE '김신애';
--==>> 
/*
BUSEO	JIKWI
개발부	사원
*/

SELECT *
FROM TBL_INSA
WHERE (BUSEO, JIKWI)
       IN
       (
            SELECT BUSEO, JIKWI
            FROM TBL_INSA
            WHERE NAME LIKE '김신애' 
       );
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG
1060	김신애	810809-2111111	2001-10-10	서울	011-4151-4444	개발부	사원	900000	102000
1059	임수봉	810809-2121244	2001-10-10	서울	011-4151-4154	개발부	사원	890000	102000
1049	이미성	830908-2456548	2000-04-07	인천	010-6654-8854	개발부	사원	1300000	130000
1042	채정희	810709-2000054	2003-10-17	경기	011-5125-5511	개발부	사원	1020000	200000
1035	정영희	831010-2153252	2002-05-16	인천		개발부	사원	1050000	140000
1021	홍길남	801010-1111111	2001-09-07	경기	011-9999-7575	개발부	사원	875000	120000
1018	이성길	801028-1849534	2004-08-08	전북	018-1333-3333	개발부	사원	880000	123000
1017	엄용수	820507-1452365	2000-08-28	인천	010-3254-2542	개발부	사원	950000	210000
1014	황진이	810707-2574812	2002-02-15	인천	010-3214-5467	개발부	사원	1100000	130000
*/




--84. 부서별 기본급이 가장 높은 사람 조회. (이름, 부서, 기본급)
--    단, 사원들의 기본급이 변경되더라도 작성된 쿼리문은 기능 수행이 가능하도록 조회.


-- 부서별 기본급 조회.
SELECT BUSEO,BASICPAY
FROM TBL_INSA
GROUP BY BUSEO,BASICPAY
ORDER BY BUSEO ASC;


-- 부서별 최대 기본급 조회

SELECT T.BUSEO, MAX(T.BASICPAY)
FROM
(
    SELECT BUSEO,BASICPAY
    FROM TBL_INSA
    GROUP BY BUSEO,BASICPAY
    ORDER BY BUSEO ASC
)T
GROUP BY T.BUSEO;


-- 부서별 최대 기본급을 갖는 사원을 찾기
-- (이름, 부서, 기본급)

SELECT TI.NAME "이름", TI.BUSEO "부서명", TI.BASICPAY "기본급"
FROM TBL_INSA TI
WHERE (TI.BUSEO, TI.BASICPAY)
       IN
      (SELECT T.BUSEO, MAX(T.BASICPAY)
        FROM
        (
            SELECT BUSEO,BASICPAY
            FROM TBL_INSA
            GROUP BY BUSEO,BASICPAY
            ORDER BY BUSEO ASC
        )T
        GROUP BY T.BUSEO
       );
--==>>
/*
이름	    부서명	기본급
허경운	총무부	2650000
이순애	개발부	2550000
김종서	영업부	2540000
홍길동	기획부	2610000
이미경	자재부	2520000
박문수	인사부	2300000
최석규	홍보부	2350000
*/









--85. 남, 여별 기본급 순위 조회.


-- 남여 기본급 조회하기
SELECT  CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                     THEN '남자'
                     WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                     THEN '여자'
                     ELSE '알수없음'
               END "성별"
       , BASICPAY "기본급"

FROM TBL_INSA
GROUP BY SUBSTR(SSN, 8, 1), BASICPAY;



-- 남여 기본급 순위 매기기


SELECT T.성별, T.기본급, RANK() OVER(ORDER BY T.기본급 DESC) "기본급순위"
FROM
(
    SELECT  CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                         THEN '남자'
                         WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                         THEN '여자'
                         ELSE '알수없음'
                   END "성별"
           , BASICPAY "기본급"
    
    FROM TBL_INSA
    GROUP BY SUBSTR(SSN, 8, 1), BASICPAY
)T
ORDER BY T.성별 ASC, 기본급순위 ASC;
--==>>
/*
성별	기본급	기본급순위
남자	2650000	1
남자	2610000	2
남자	2540000	4
남자	2500000	6
남자	2450000	7
남자	2350000	8
남자	2340000	9
남자	2300000	11
남자	2100000	14
남자	2050000	15
남자	1954200	19
남자	1950000	20
남자	1420000	24
남자	1320000	25
남자	1250000	27
남자	1100000	28
남자	1060000	30
남자	980000	34
남자	960000	36
남자	950000	37
남자	892000	41
남자	880000	43
남자	875000	45
남자	840000	46
여자	2550000	3
여자	2520000	5
여자	2304000	10
여자	2265000	12
여자	2260000	13
여자	2010000	16
여자	2000000	17
여자	1960000	18
여자	1950000	20
여자	1900000	22
여자	1601000	23
여자	1300000	26
여자	1100000	28
여자	1050000	31
여자	1020000	32
여자	1000000	33
여자	960400	35
여자	950000	37
여자	920000	39
여자	900000	40
여자	890000	42
여자	880000	43
*/

-- 아.. 위에 풀이는 문제를 잘못 이해하고
-- 남여를 통합해서 순위를 매겼어요...

-- 남자 순위 따로, 여자 순위 따로 구한 것은 아래 풀이예요!!

SELECT CASE WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
            THEN '남성'
            WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
            THEN '여성'
        END "성별"
        , T.이름
        , T.순위
FROM
(
    SELECT NAME 이름, RANK() OVER(ORDER BY BASICPAY DESC) 순위
         , SSN AS "주민번호"
    FROM TBL_INSA
    WHERE SUBSTR(SSN, 8, 1) IN ('1', '3')
    
    UNION ALL
    
    SELECT NAME 이름, RANK() OVER(ORDER BY BASICPAY DESC) 순위
         , SSN AS "주민번호"
    FROM TBL_INSA
    WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
) T
INNER JOIN TBL_INSA TI
ON TI.SSN = T.주민번호
ORDER BY 성별 ASC, 순위 ASC;

--==>> 남녀 따로 순위!
/*
성별	이름	    순위
남성	허경운	1
남성	홍길동	2
남성	김종서	3
남성	김인수	4
남성	지재환	5
남성	최석규	6
남성	이상헌	6
남성	김영길	8
남성	문길수	9
남성	박문수	9
남성	박세열	11
남성	산마루	11
남성	이기상	13
남성	김정훈	14
남성	전용재	15
남성	김신제	15
남성	한석봉	17
남성	이순신	18
남성	장인철	19
남성	이정석	20
남성	우재옥	20
남성	지수환	22
남성	정상호	23
남성	홍원신	24
남성	김싱식	24
남성	엄용수	26
남성	이남신	27
남성	이성길	28
남성	정한국	28
남성	홍길남	30
남성	나윤균	31
여성	이순애	1
여성	이미경	2
여성	정정해	3
여성	이기자	4
여성	권영미	5
여성	고순정	6
여성	손인수	7
여성	이영숙	8
여성	이미인	9
여성	김말자	10
여성	조미숙	11
여성	이미성	12
여성	양미옥	13
여성	황진이	13
여성	김숙남	15
여성	이현숙	15
여성	정영희	15
여성	채정희	18
여성	김미나	18
여성	유관순	18
여성	권옥경	18
여성	정한나	22
여성	이재영	23
여성	김영년	24
여성	김말숙	25
여성	김신애	26
여성	임수봉	27
여성	심심해	28
여성	유영희	28
*/






--86. 지역(CITY)별로 급여(기본급+수당) 1순위 직원만 조회.

-- 지역, 급여 조회하기
SELECT CITY "지역"
     , BASICPAY + SUDANG "급여"
FROM TBL_INSA;


-- 그룹화 해서 최대 급여를 받는 직원 구하기

SELECT T.지역, MAX(T.급여)
FROM
(   
    SELECT CITY "지역"
         , BASICPAY + SUDANG "급여"
    FROM TBL_INSA
)T
GROUP BY T.지역;

-- 지역별 최대 급여를 받는 직원을 찾기

SELECT *
FROM TBL_INSA TI
WHERE (TI.CITY, (TI.BASICPAY + TI.SUDANG))
       IN
       (
            SELECT T.지역, MAX(T.급여)
            FROM
            (   
                SELECT CITY "지역"
                     , BASICPAY + SUDANG "급여"
                FROM TBL_INSA
            )T
            GROUP BY T.지역
       );
       

-------- 이건 PARTITION BY 와 RANK() 를 같이 써서 푼 것!!!!----------------------


SELECT CITY, RANK() OVER(PARTITION BY CITY ORDER BY (BASICPAY + SUDANG)) "급여"
FROM TBL_INSA;

SELECT *
FROM
TBL_INSA TI
INNER JOIN
(
    SELECT CITY "도시명"
         , RANK() OVER(PARTITION BY CITY ORDER BY (BASICPAY + SUDANG)) "급여순위"
         , SSN "주민번호"
    FROM TBL_INSA
) CR
ON TI.SSN = CR.주민번호
WHERE CR.급여순위 = 1;




SELECT RANK() OVER(PARTITION BY CITY ORDER BY (BASICPAY + SUDANG)) "급여순위"
FROM TBL_INSA;
       
--==>>
/*
NUM	NAME	SSN	IBSADATE	CITY	TEL	BUSEO	JIKWI	BASICPAY	SUDANG
1001	홍길동	771212-1022432	1998-10-11	서울	011-2356-4528	기획부	부장	2610000	200000
1003	이순애	770922-2312547	1999-02-25	인천	010-4231-1236	개발부	부장	2550000	160000
1004	김정훈	790304-1788896	2000-10-01	전북	019-5236-4221	영업부	대리	1954200	170000
1007	장인철	780506-1625148	1998-03-16	제주	011-2345-2525	개발부	대리	1250000	150000
1010	김종서	751010-1122233	1997-08-08	부산	011-3214-5555	영업부	부장	2540000	130000
1040	박세열	790509-1635214	2000-09-10	경북	016-4444-7777	인사부	대리	2100000	130000
1041	문길수	721217-1951357	2001-12-10	충남	016-4444-5555	자재부	과장	2300000	150000
1046	허경운	760105-1458752	1999-05-04	경남	017-3333-3333	총무부	부장	2650000	150000
1048	이기상	790604-1415141	2001-06-07	전남		개발부	대리	2050000	106000
1054	정상호	810705-1212141	1999-10-16	강원	016-1919-4242	홍보부	사원	980000	114000
1057	이미경	780406-2003214	1998-02-11	경기	016-6542-7546	자재부	부장	2520000	160000
*/




--87. 부서별 인원수가 가장 많은 부서 및 인원수 조회.


-- 부서별 인원수 확인
SELECT BUSEO "부서명"
     , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY BUSEO;


-- 부서별로 가장 많은 인원수 구함
SELECT MAX(T.인원수)
FROM
(
    SELECT BUSEO "부서명"
         , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY BUSEO
)T;

-- 가장 많은 인원수를 갖는 부서 조회

SELECT BUSEO "부서명"
     , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY BUSEO
    HAVING COUNT(*)
           IN
           (
                SELECT MAX(T.인원수)
                FROM
                (
                    SELECT BUSEO "부서명"
                         , COUNT(*) "인원수"
                    FROM TBL_INSA
                    GROUP BY BUSEO
                )T
           );

--==>> 
/*
부서명	인원수
영업부	16
*/



--88. 지역(CITY)별 인원수가 가장 많은 지역 및 인원수 조회.



-- 지역별 인원수 확인
SELECT CITY "지역명"
     , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY CITY;


-- 지역별로 가장 많은 인원수 구함
SELECT MAX(T.인원수)
FROM
(
   SELECT CITY "지역명"
     , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY CITY
)T;

-- 가장 많은 인원수를 갖는 지역 조회

SELECT CITY "지역명"
     , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY CITY
    HAVING COUNT(*)
           IN
           (
               SELECT MAX(T.인원수)
                FROM
                (
                   SELECT CITY "지역명"
                     , COUNT(*) "인원수"
                    FROM TBL_INSA
                    GROUP BY CITY
                )T
           );

--==>>
/*
지역명	인원수
서울     	20
*/



--89. 지역(CITY)별 평균 급여(BASICPAY + SUDANG)가
--    가장 높은 지역 및 평균급여 조회.
--    
    


-- 지역별 평균급여 확인
SELECT CITY "지역명"
     , ROUND(AVG(BASICPAY + SUDANG), 0) "평균급여"
    FROM TBL_INSA
    GROUP BY CITY;


-- 지역별로 가장 많은 평균급여 구함
SELECT MAX(T.평균급여)
FROM
(
    SELECT CITY "지역명"
     , ROUND(AVG(BASICPAY + SUDANG), 0) "평균급여"
    FROM TBL_INSA
    GROUP BY CITY
)T;


-- 가장 많은 평균급여를 갖는 지역 조회

SELECT CITY "지역명"
     , ROUND(AVG(BASICPAY + SUDANG), 0) "평균급여"
    FROM TBL_INSA
    GROUP BY CITY
    HAVING ROUND(AVG(BASICPAY + SUDANG), 0)
           IN
           (
               SELECT MAX(T.평균급여)
                FROM
                (
                    SELECT CITY "지역명"
                     , ROUND(AVG(BASICPAY + SUDANG), 0) "평균급여"
                    FROM TBL_INSA
                    GROUP BY CITY
                )T
           );
--==>>
/*
지역명	평균급여
경남	    2800000
*/



--90. 여자 인원수가 가장 많은 부서 및 인원수 조회.



/*
CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                         THEN '남자'
                         WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                         THEN '여자'
                         ELSE '알수없음'
                   END "성별"
*/


-- #1 부서별 여자 인원수 구하기
SELECT BUSEO
     , COUNT(*)
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
GROUP BY  BUSEO, SUBSTR(SSN, 8, 1);




-- #2 부서별 최대 여자 인원수 구하기


SELECT MAX(T.여자인원수)
FROM
(
    SELECT BUSEO "부서명"
     , COUNT(*) "여자인원수"
    FROM TBL_INSA
    WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
    GROUP BY  BUSEO, SUBSTR(SSN, 8, 1)
) T;


-- # 부서별 남녀 상관없이 인원수 구하기
SELECT BUSEO
     ,CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                         THEN '남자'
                         WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                         THEN '여자'
                         ELSE '알수없음'
                   END "성별"
     , COUNT(*)
FROM TBL_INSA
GROUP BY  BUSEO, SUBSTR(SSN, 8, 1);

---------------------------

-- # 최대 여자 인원수를 갖는 부서, 여자인원수, 성별 조회하기

SELECT T.부서명, T.인원수, T.성별
FROM
(
    SELECT BUSEO "부서명"
     ,CASE  WHEN SUBSTR(SSN, 8, 1) IN ('1', '3')
                         THEN '남자'
                         WHEN SUBSTR(SSN, 8, 1) IN ('2', '4')
                         THEN '여자'
                         ELSE '알수없음'
                   END "성별"
     , COUNT(*) "인원수"
    FROM TBL_INSA
    GROUP BY  BUSEO, SUBSTR(SSN, 8, 1)
) T
GROUP BY T.부서명, T.인원수, T.성별
HAVING T.인원수 
       IN
       (
            SELECT MAX(T.여자인원수)
            FROM
            (
                SELECT BUSEO "부서명"
                 , COUNT(*) "여자인원수"
                FROM TBL_INSA
                WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
                GROUP BY  BUSEO, SUBSTR(SSN, 8, 1)
            ) T
       )
       AND
       T.성별 = '여자';

----- 남, 여 두 개 다...인원수 구해야하는 줄 알고 코드가 길어졌어요...
--==>>
/*
부서명	인원수	성별
영업부	8	여자
개발부	8	여자
*/


-- 여자 인원수가 가장 많은 부서 및 인원수 조회.

-- GROUP BY 를 통한 더욱 간단한 풀이.
SELECT BUSEO "부서명"
     , COUNT(*) "여자인원수"
FROM TBL_INSA
WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
GROUP BY BUSEO
HAVING COUNT(*)
        IN
        (
            SELECT MAX(COUNT(*))
            FROM TBL_INSA
            WHERE SUBSTR(SSN, 8, 1) IN ('2', '4')
            GROUP BY BUSEO
        );
--==>>
/*
부서명	여자인원수
개발부	8
영업부	8
*/




--91. 지역별 인원수 순위 조회.



SELECT CITY "지역명"
     , COUNT(*) "지역별인원수"
FROM TBL_INSA
GROUP BY CITY;


SELECT T.지역명, T.지역별인원수
     , RANK() OVER(ORDER BY T.지역별인원수 DESC) "지역별인원수순위"
FROM
(
    SELECT CITY "지역명"
     , COUNT(*) "지역별인원수"
    FROM TBL_INSA
    GROUP BY CITY
)T;
--==>>
/*
지역명	지역별인원수	지역별인원수순위
서울	20	1
경기	13	2
인천	9	3
전북	5	4
전남	3	5
부산	3	5
제주	2	7
강원	2	7
경남	1	9
경북	1	9
충남	1	9
*/




--92. 지역별 인원수 순위 조회하되 5순위까지만 출력.


SELECT T.지역명, T.지역별인원수
     , RANK() OVER(ORDER BY T.지역별인원수 DESC) "지역별인원수순위"
FROM
(
    SELECT CITY "지역명"
     , COUNT(*) "지역별인원수"
    FROM TBL_INSA
    GROUP BY CITY
)T;


SELECT T2.*
FROM
(
   SELECT T.지역명, T.지역별인원수
     , RANK() OVER(ORDER BY T.지역별인원수 DESC) "지역별인원수순위"
    FROM
    (
        SELECT CITY "지역명"
         , COUNT(*) "지역별인원수"
        FROM TBL_INSA
        GROUP BY CITY
    )T
    
)T2
WHERE T2.지역별인원수순위 <= 5;
--==>>
/*
지역명	지역별인원수	지역별인원수순위
서울      	20	        1
경기      	13      	2
인천      	9	        3
전북      	5	        4
부산      	3	        5
전남	        3	        5
*/



--
--93. 이름, 부서, 출신도, 기본급, 수당, 기본급+수당, 세금, 실수령액 조회
--    단, 세금: 총급여가 250만원 이상이면 2%, 200만원 이상이면 1%, 나머지 0.
--    실수령액: 총급여-세금


-- 요구하는 것 중 바로 출력 가능한 것들 조회.
SELECT NAME, BUSEO, CITY, BASICPAY, SUDANG, (BASICPAY + SUDANG)
FROM TBL_INSA;


-- 세금 구하기


-- 1%를 부과할 경우 (200만원 이상, 250만원 미만)
SELECT (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 1) / 100)
FROM TBL_INSA;


-- 2%를 부과할 경우 (250만원 이상)
SELECT (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 2) / 100)
FROM TBL_INSA;



SELECT CASE WHEN (BASICPAY + SUDANG) >= 2500000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 2) / 100)
            WHEN (BASICPAY + SUDANG) >= 2000000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 1) / 100)
            ELSE 0
        END AS "세금"
FROM TBL_INSA;


-- 실수령액 테스트
SELECT (TI.BASICPAY + TI.SUDANG) - T.세금
FROM
TBL_INSA TI
INNER JOIN
(
    SELECT CASE WHEN (BASICPAY + SUDANG) >= 2500000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 2) / 100)
            WHEN (BASICPAY + SUDANG) >= 2000000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 1) / 100)
            ELSE 0
        END AS "세금"
        , SSN "주민번호"
    FROM TBL_INSA
)T
ON TI.SSN = T.주민번호;




---------------


-- 세금까지 합치기

SELECT NAME "이름"
     , BUSEO "부서명"
     , CITY "지역명"
     , BASICPAY "기본급"
     , SUDANG "수당"
     , (BASICPAY + SUDANG) "총급여"
     , CASE WHEN (BASICPAY + SUDANG) >= 2500000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 2) / 100)
            WHEN (BASICPAY + SUDANG) >= 2000000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 1) / 100)
            ELSE 0
        END AS "세금"
     
FROM TBL_INSA;



-- 실수령액 계산하기 위해, 위의 쿼리문을 서브 쿼리로 지정.


SELECT LASTT.*
     , (TI.BASICPAY + TI.SUDANG) - LASTT.세금 "실수령액"
FROM 
TBL_INSA TI
INNER JOIN
(
    SELECT NAME "이름"
     , BUSEO "부서명"
     , CITY "지역명"
     , BASICPAY "기본급"
     , SUDANG "수당"
     , (BASICPAY + SUDANG) "총급여"
     , CASE WHEN (BASICPAY + SUDANG) >= 2500000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 2) / 100)
            WHEN (BASICPAY + SUDANG) >= 2000000
            THEN (BASICPAY + SUDANG) - (BASICPAY + SUDANG) * ((100 - 1) / 100)
            ELSE 0
        END AS "세금"
      , SSN "주민번호"
     
    FROM TBL_INSA
) LASTT
ON TI.SSN = LASTT.주민번호;

/*
SELECT E.* , E.총급여 - E.세금
FROM(
SELECT NAME, BUSEO, CITY, BASICPAY, SUDANG, BASICPAY + SUDANG 총급여,
       CASE WHEN BASICPAY + SUDANG >= 2500000 THEN (BASICPAY + SUDANG) * 0.02
            WHEN BASICPAY + SUDANG >= 2000000 THEN (BASICPAY + SUDANG) * 0.01
       ELSE 0 END AS 세금
FROM TBL_INSA
) E;
*/

--==>>
/*
이름	부서명	지역명	기본급	수당	총급여	세금	주민번호	실수령액
홍길동	기획부	서울	2610000	200000	2810000	56200	771212-1022432	2753800
이순신	총무부	경기	1320000	200000	1520000	0	801007-1544236	1520000
이순애	개발부	인천	2550000	160000	2710000	54200	770922-2312547	2655800
김정훈	영업부	전북	1954200	170000	2124200	21242	790304-1788896	2102958
한석봉	총무부	서울	1420000	160000	1580000	0	811112-1566789	1580000
이기자	개발부	인천	2265000	150000	2415000	24150	780505-2978541	2390850
장인철	개발부	제주	1250000	150000	1400000	0	780506-1625148	1400000
김영년	홍보부	서울	950000	145000	1095000	0	821011-2362514	1095000
나윤균	인사부	경기	840000	220400	1060400	0	810810-1552147	1060400
김종서	영업부	부산	2540000	130000	2670000	53400	751010-1122233	2616600
유관순	영업부	서울	1020000	140000	1160000	0	801010-2987897	1160000
정한국	홍보부	강원	880000	114000	994000	0	760909-1333333	994000
조미숙	홍보부	경기	1601000	103000	1704000	0	790102-2777777	1704000
황진이	개발부	인천	1100000	130000	1230000	0	810707-2574812	1230000
이현숙	총무부	경기	1050000	104000	1154000	0	800606-2954687	1154000
이상헌	개발부	경기	2350000	150000	2500000	50000	781010-1666678	2450000
엄용수	개발부	인천	950000	210000	1160000	0	820507-1452365	1160000
이성길	개발부	전북	880000	123000	1003000	0	801028-1849534	1003000
박문수	인사부	서울	2300000	165000	2465000	24650	780710-1985632	2440350
유영희	자재부	전남	880000	140000	1020000	0	800304-2741258	1020000
홍길남	개발부	경기	875000	120000	995000	0	801010-1111111	995000
이영숙	기획부	전남	1960000	180000	2140000	21400	800501-2312456	2118600
김인수	영업부	서울	2500000	170000	2670000	53400	731211-1214576	2616600
김말자	기획부	서울	1900000	170000	2070000	20700	830225-2633334	2049300
우재옥	영업부	서울	1100000	160000	1260000	0	801103-1654442	1260000
김숙남	영업부	경기	1050000	150000	1200000	0	810907-2015457	1200000
김영길	총무부	서울	2340000	170000	2510000	50200	801216-1898752	2459800
이남신	인사부	제주	892000	110000	1002000	0	810101-1010101	1002000
김말숙	총무부	서울	920000	124000	1044000	0	800301-2020202	1044000
정정해	총무부	부산	2304000	124000	2428000	24280	790210-2101010	2403720
지재환	기획부	서울	2450000	160000	2610000	52200	771115-1687988	2557800
심심해	자재부	전북	880000	108000	988000	0	810206-2222222	988000
김미나	영업부	서울	1020000	104000	1124000	0	780505-2999999	1124000
이정석	기획부	경기	1100000	160000	1260000	0	820505-1325468	1260000
정영희	개발부	인천	1050000	140000	1190000	0	831010-2153252	1190000
이재영	자재부	서울	960400	190000	1150400	0	701126-2852147	1150400
최석규	홍보부	인천	2350000	187000	2537000	50740	770129-1456987	2486260
손인수	영업부	부산	2000000	150000	2150000	21500	791009-2321456	2128500
고순정	영업부	경기	2010000	160000	2170000	21700	800504-2000032	2148300
박세열	인사부	경북	2100000	130000	2230000	22300	790509-1635214	2207700
문길수	자재부	충남	2300000	150000	2450000	24500	721217-1951357	2425500
채정희	개발부	경기	1020000	200000	1220000	0	810709-2000054	1220000
양미옥	영업부	서울	1100000	210000	1310000	0	830504-2471523	1310000
지수환	영업부	서울	1060000	220000	1280000	0	820305-1475286	1280000
홍원신	영업부	전북	960000	152000	1112000	0	690906-1985214	1112000
허경운	총무부	경남	2650000	150000	2800000	56000	760105-1458752	2744000
산마루	영업부	서울	2100000	112000	2212000	22120	780505-1234567	2189880
이기상	개발부	전남	2050000	106000	2156000	21560	790604-1415141	2134440
이미성	개발부	인천	1300000	130000	1430000	0	830908-2456548	1430000
이미인	홍보부	경기	1950000	103000	2053000	20530	810403-2828287	2032470
권영미	영업부	서울	2260000	104000	2364000	23640	790303-2155554	2340360
권옥경	기획부	경기	1020000	105000	1125000	0	820406-2000456	1125000
김싱식	자재부	전북	960000	108000	1068000	0	800715-1313131	1068000
정상호	홍보부	강원	980000	114000	1094000	0	810705-1212141	1094000
정한나	영업부	서울	1000000	104000	1104000	0	820506-2425153	1104000
전용재	영업부	인천	1950000	200000	2150000	21500	800605-1456987	2128500
이미경	자재부	경기	2520000	160000	2680000	53600	780406-2003214	2626400
김신제	기획부	인천	1950000	180000	2130000	21300	800709-1321456	2108700
임수봉	개발부	서울	890000	102000	992000	0	810809-2121244	992000
김신애	개발부	서울	900000	102000	1002000	0	810809-2111111	1002000
*/




--94. 부서별 평균 급여를 조회하되, A, B, C 등급으로 나눠서 출력.
--    200만원 초과 - A등급
--    150~200만원  - B등급
--    150만원 미만 - C등급
    

-- 각 부서별로 평균 급여 구하기
SELECT BUSEO
     , ROUND(AVG(BASICPAY + SUDANG)) "평균급여"
FROM TBL_INSA
GROUP BY BUSEO;





SELECT T.* 
FROM
(
    SELECT BUSEO "부서명"
     , ROUND(AVG(BASICPAY + SUDANG)) "평균급여"
    FROM TBL_INSA
    GROUP BY BUSEO
)T;

-- 등급 매기기

SELECT T.*
     , CASE WHEN T.평균급여 > 2000000
            THEN 'A등급'
            WHEN T.평균급여 >= 1500000
            THEN 'B등급'
            WHEN T.평균급여 < 1500000
            THEN 'C등급'
            ELSE '알수없음'
        END "평균급여등급"
      
FROM
(
    SELECT BUSEO "부서명"
     , ROUND(AVG(BASICPAY + SUDANG)) "평균급여"
    FROM TBL_INSA
    GROUP BY BUSEO
)T
ORDER BY 평균급여등급 ASC;
--==>>
/*
부서명	평균급여	평균급여등급
기획부	2020714	A등급
개발부	1528786	B등급
영업부	1753763	B등급
홍보부	1579500	B등급
인사부	1689350	B등급
자재부	1559400	B등급
총무부	1862286	B등급
*/




--
--95. 기본급+수당이 가장 많은 사람의 이름, 기본급+수당 조회.
--    MAX() 함수, 하위 쿼리 이용.



SELECT *
FROM TBL_INSA;


SELECT MAX(BASICPAY + SUDANG) "최대급여"
FROM TBL_INSA;


SELECT NAME "이름", BASICPAY + SUDANG "기본급+수당"
FROM TBL_INSA
WHERE (BASICPAY + SUDANG)
      IN
      (
        SELECT MAX(BASICPAY + SUDANG) "최대급여"
        FROM TBL_INSA
      );

--==>> 
/*
이름	    기본급+수당
홍길동	2810000
*/



----------------------------------------------------------------------------



-- 다 풀었어요~!!!!!!!!!!!!!!!!!!!!!!!!
-- 와~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 추가문제도 완료~!!! 와~~~~~~~~~~~~