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
*/
----------------------------------------------------------------------------
-- 다 풀었어요~!!!!!!!!!!!!!!!!!!!!!!!!
-- 와~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 추가문제도 완료~!!! 와~~~~~~~~~~~~
'[Oracle] > SQL (Program source)' 카테고리의 다른 글
[Oracle] 20231031 [팀 과제 - 샘플 스키마 재구성] - 20231031_03_HR (0) | 2023.11.01 |
---|---|
[Oracle] 20231031 [프로그램소스] - 20231031_01_HR (0) | 2023.11.01 |
[Oracle] 20231027 [프로그램소스] - 20231027_01_SCOTT, TBL_INSA(중간 수행평가) (0) | 2023.10.27 |
[Oracle] 20231026 [프로그램소스] - 231026_01_SCOTT, 231026_02_HR, 231026_03_SCOTT (0) | 2023.10.26 |
[Oracle] 20231025 [프로그램소스] - 20231025_01_scott (0) | 2023.10.25 |