728x90

 

https://github.com/neverGiveUpppppp/Comento_SQL_Oracle

 

GitHub - neverGiveUpppppp/Comento_SQL_Oracle: 직무부트캠프 Comento

직무부트캠프 Comento. Contribute to neverGiveUpppppp/Comento_SQL_Oracle development by creating an account on GitHub.

github.com

 

SQL 조회하기 위한 절차

  1. 주어진 조건을 문장화
  2. 문장에서 조건 추리기
  3. 조건을 쿼리문으로 바꿀 수 있는 부분부분 바꾸기

 

1.조회 할 내용 텍스트화

--3-2) 현재 날짜 기준 재직중인 "이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.
--힌트: substr, count(*)를 사용

2.문장에서 쿼리 조건 리스트화

-- 재직중, 현재 날짜 기준, 이씨성, 자녀수

3.각 조건마다 예상되는 쿼리 짜기

-- 재직중 : RETIRE 99/12/31 조건
-- 현재 날짜 기준
-- 이씨성 : LIKE '이%'
-- 자녀수 : COUNT()

 


 

3-2) 현재 날짜 기준 재직중인 “이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.

힌트: substr , count(*)를 사용

-- 재직중 : RETIRE 99/12/31 조건
-- 현재 날짜 기준
-- 이씨성 : LIKE '이%'
-- 자녀수

-- COUNT + LIKE
SELECT E.EMP_NM 직원명, COUNT(*)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT(SUBSTR)+ LIKE
SELECT E.EMP_NM, COUNT(SUBSTR(E.EMP_NM,2,4)) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT + SUBSTR
SELECT E.EMP_NM, COUNT(*) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND SUBSTR(E.EMP_NM, 1,1) = '이'
GROUP BY E.EMP_NM
;

 

3-3) 자녀 명수가 2명 이상인 직원의 리스트를 구하세요.  (직원번호 / 성명 / 자녀명수 )

힌트 having

-- 조회 컬럼 : 직원번호/성명/자녀명수
-- 자녀수 2명 이상 : REL_TYPE_CD A=27이 자녀이므로 이거 2ROW 이상

SELECT E.EMP_NO 직원번호, E.EMP_NM 성명, COUNT(*)
FROM EMP_C E 
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE F.REL_TYPE_CD = 'A27'    -- 자녀(A27) 조건 적용
GROUP BY E.EMP_NO ,E.EMP_NM    
-- 조회에 필요한 EMP_NO,EMP_NM을 조회하기 위해 GROUP BY 사용 필요. 
-- COUNT가 단일행 그룹 함수이기에 단일행 그룹함수 COUNT와 다른 행도 조회하기 위해 사용함
HAVING COUNT(F.REL_TYPE_CD) > 2;

 

3-4) 현재 기준 조직의 부서별 직원이 몇 명인지 구하는 sql을 작성하세요. (조직코드, 조직명, 직원수)

힌트 group by org_cd, org_nm

-- 현재 기준 : ?
-- 부서별 직원 : GROUP BY ORG_NM
-- 부서별 직원 수 : COUNT(*)

SELECT
    org_nm   조직분류,
    COUNT(*) 직원수
FROM
         emp_c e
    JOIN org_c o USING ( org_cd )
GROUP BY
    org_nm;    
;

 


 

전체 쿼리

--3)20210321 기준으로 재직중인 임직원이며,사내부부인 임직원의 직원번호를 구하는 sql을 작성하세요.
--HINT : EMP_C와 FAM_REL_C를 조인해야 합니다.
-- 조회 : 직원번호
-- 재직중 : RETIRE 99/12/31 조건
-- 사내부부 : ? // 일단 EMP_NO = EMP_REL_NO 아님


-- 직원번호와 직원가족번호 =조건 해봤으나 X
SELECT *
FROM EMP_C E
    JOIN FAM_REL_C FR ON(E.EMP_NO = FR.EMP_NO)
WHERE E.EMP_NO = FR.EMP_REL_NO  -- 직원번호와 직원가족번호 =조건 해봤으나 X
;    


SELECT *
FROM EMP_C E
    JOIN FAM_REL_C FR ON(E.EMP_NO = FR.EMP_REL_NO)
WHERE E.EMP_NO = FR.EMP_REL_NO  -- 직원번호와 직원가족번호 =조건 해봤으나 X
;    

SELECT *
FROM EMP_C E
    JOIN FAM_REL_C FR ON(E.EMP_NO = FR.EMP_REL_NO)
WHERE E.EMP_NO = FR.EMP_REL_NO 
AND REL_TYPE_CD IN('A02', 'A18')
;   

SELECT * FROM EMP_C;
SELECT * FROM FAM_C;
SELECT * FROM ORG_C;
SELECT * FROM FAM_REL_C;

SELECT * 
FROM EMP_C  
WHERE EMP_NO = 11501824;
SELECT * 
FROM FAM_C
WHERE EMP_NO = 11501824;
SELECT * 
FROM FAM_REL_C
WHERE EMP_NO = 11501824;




--3-2) 현재 날짜 기준 재직중인 "이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.
--힌트: substr, count(*)를 사용
-- 재직중 : RETIRE 99/12/31 조건
-- 현재 날짜 기준
-- 이씨성 : LIKE '이%'
-- 자녀수

-- 조건 : 재직중+이씨성
SELECT *
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
;    

-- COUNT + LIKE
SELECT E.EMP_NM 직원명, COUNT(*)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT(SUBSTR)+ LIKE
SELECT E.EMP_NM, COUNT(SUBSTR(E.EMP_NM,2,4)) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT + SUBSTR
SELECT E.EMP_NM, COUNT(*) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND SUBSTR(E.EMP_NM, 1,1) = '이'
GROUP BY E.EMP_NM
;  


--3-3) 자녀 명수가 2명 이상인 직원의 리스트를 구하세요.(직원번호?/?성명?/?자녀명수?)
--힌트 having
-- 조회 컬럼 : 직원번호/성명/자녀명수
-- 자녀수 2명 이상 : REL_TYPE_CD A=27이 자녀이므로 이거 2ROW 이상

-- A27타입인 자녀수만 조회
SELECT COUNT(F.REL_TYPE_CD)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE F.REL_TYPE_CD = 'A27'    
;

SELECT E.EMP_NO 직원번호, E.EMP_NM 성명, COUNT(*)
FROM EMP_C E 
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE F.REL_TYPE_CD = 'A27'    -- 자녀(A27) 조건 적용
GROUP BY E.EMP_NO ,E.EMP_NM    
-- 조회에 필요한 EMP_NO,EMP_NM을 조회하기 위해 GROUP BY 사용 필요. 
-- COUNT가 단일행 그룹 함수이기에 단일행 그룹함수 COUNT와 다른 행도 조회하기 위해 사용함
HAVING COUNT(F.REL_TYPE_CD) > 2 
-- WHERE절에서 자녀있는 직원만 골라낸 후, HAVING으로 2명이상 조건 적용
-- 이후 GROUP BY 직원번호와 성명을 묶어서 조회
;    


SELECT * FROM EMP_C;
SELECT * FROM FAM_C;
SELECT * FROM ORG_C;
SELECT * FROM FAM_REL_C;


--3-4) 현재 기준 조직의 부서별 직원이 몇 명인지 구하는 sql을 작성하세요. (조직코드, 조직명, 직원수)
--힌트 group by org_cd, org_nm
-- 현재 기준 : ?
-- 부
-- 부서별 직원 수 : COUNT(*)서별 직원 : GROUP BY ?(ORG..?)
SELECT
    org_nm   조직분류,
    COUNT(*) 직원수
FROM
         emp_c e
    JOIN org_c o USING ( org_cd )
GROUP BY
    org_nm;    
;
728x90
반응형
728x90

 

SELECT, FUCTION,  GROUP BY, HAVING, JOIN 100제 문제 풀이

100제 중 87문제 풀이 완료

 




--SELECT 문제
--1. EMPLOYEE 테이블의    사번, 이름, 급여   조회
SELECT EMP_NO, EMP_NAME,SALARY
FROM EMPLOYEE;
--2. EMPLOYEE 테이블의    모든    정보    조회
SELECT * FROM EMPLOYEE;
--3. JOB 테이블의   모든    정보   조회
SELECT * FROM JOB;
--4. JOB 테이블의   직급    이름   조회
SELECT JOB_NAME FROM JOB;
--5. DEPARTMENT 테이블의    모든    정보    조회
--6. EMPLOYEE 테이블의    직원    명, 이메일, 전화번호, 고용일    조회
--7. EMPLOYEE 테이블의    고용일, 사원    이름, 월급    조회
--8. EMPLOYEE 테이블에서    직원    명, 급여, 연봉    조회(연봉    = 급여*12)
SELECT EMP_NAME,SALARY,SALARY*12
FROM EMPLOYEE;
--9. EMPLOYEE 테이블에서    직원    명, 연봉, 보너스를    추가한    연봉    조회
SELECT EMP_NAME,SALARY,SALARY*12
FROM EMPLOYEE;
--10.EMPLOYEE  테이블에서      이름,  연봉,  총수령액(보너스      포함),  실수령액(총수령액-(연봉*세금 3%)) 조회
SELECT EMP_NAME 이름,SALARY 급여,SALARY*12-(SALARY*12*0.03) 총수령액, SALARY*12 연봉
FROM EMPLOYEE;
--11.EMPLOYEE  테이블에서      이름,  고용일,  근무일수(오늘      날짜      -  고용일)  조회,  오늘      날짜: SYSDATE
SELECT EMP_NAME, HIRE_DATE, SYSDATE - HIRE_DATE 근무일수, SYSDATE 오늘
FROM EMPLOYEE;
--12.EMPLOYEE 테이블에서    직원의    직원    번호, 사원    명, 급여, 단위    조회
--13.EMPLOYEE 테이블에서    직원의    직급    코드    조회
--14.EMPLOYEE 테이블에서    직원의    직급    코드를    중복    없이    조회
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;
--15.EMPLOYEE 테이블에서    직원의    부서    코드를    중복    없이    조회
SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;
--16.EMPLOYEE 테이블에서    부서    코드가    'D9'인    직원의    이름, 부서    코드    조회
SELECT EMP_NAME,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';
--17.EMPLOYEE 테이블에서    급여가    4000000 이상인    직원의    이름, 급여    조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 4000000;
--18.EMPLOYEE 테이블에서    부서    코드가    ‘D9’가    아닌    사원의    사번, 이름, 부서    코드    조회
SELECT EMP_ID, EMP_NAME,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE != 'D9';
--19.EMPLOYEE  테이블에서    퇴사    여부가    N인    직원을    조회하고    근무    여부를    재직중으로    표시하 고    사번, 이름, 고용일, 근무    여부    조회
SELECT EMP_ID, EMP_NAME, HIRE_DATE, ENT_YN 재직중
FROM EMPLOYEE
WHERE ENT_YN = 'N' ;
--20.EMPLOYEE 테이블에서    월급이    3000000이상인    사원의    이름, 월급, 고용일    조회
--21.EMPLOYEE 테이블에서    SAL_LEVEL이   ‘S1’인    사원의    이름, 월급, 고용일, 연락처    조회
--
--22.EMPLOYEE 테이블에서    실수령액(총수령액    - (연봉*세금%3))이    5천만원    이상인    사원의    이름, 급여, 실수령액, 고용일    조회
--23.EMPLOYEE  테이블에서    부서    코드가    ‘D6’이고    급여를    3000000보다    많이    받는    직원의    이름, 부서    코드, 급여    조회
--24.EMPLOYEE  테이블에서    부서    코드가    ‘D6’이거나    급여를    3000000보다    많이    받는    직원의    이 름, 부서   코드, 급여    조회
--25.EMPLOYEE  테이블에서    급여를    3500000  이상    6000000  이하를    받는    사원의    사번,  이름,  급 여, 부서코드, 직급코드
--26.EMPLOYEE테이블에    월급이    4000000이상이고    JOB_CODE가    ‘J2’인    사원의    전체    내용    조회
--27.EMPLOYEE 테이블에    DEPT_CODE가    ‘D9’이거나    ‘D5’인    사원    중에    고용일이    02년    1월    1일보 다    빠른   사원의    이름, 부서코드, 고용일   조회
--28.EMPLOYEE  테이블에서    급여를    3500000  미만    6000000  초과를    받는    사원의    사번, 이름,  급 여, 부서코드, 직급코드
--29. EMPLOYEE 테이블에    고용일이    90/01/01 ~ 01/01/01인    사원의    전체    내용을    조회
SELECT *
FROM EMPLOYEE
WHERE HIRE_DATE >= '90/01/01' AND HIRE_DATE <= '01/01/01';
--30. EMPLOYEE 테이블에서    성이    ‘전’씨인    사원의    사번, 고용일    조회
--31. EMPLOYEE 테이블에서    이름이    '하'가    포함된    직원의    이름, 주민번호, 부서코드    조회
--32. EMPLOYEE 테이블에서    전화번호    4번째    자리가    9로    시작하는    사원의    사번, 이름, 전화번호 조회
--33. EMPLOYEE  테이블에서    이메일    중    _의    앞    글자가    3자리인    이메일    주소를    가진    사원의    사 번, 이름, 이메일    주소    조회
SELECT EMP_ID,EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___!_%' ESCAPE '!';
--34. EMPLOYEE 테이블에서    이름    중    김씨    성을    가지지    않은    사원의    사번, 이름, 고용일   조회
--35. EMPLOYEE 테이블에서    이름    끝이    '연'으로    끝나는    사원    조회
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%연';
--36. EMPLOYEE 테이블에서    전화번호    처음    세자리가    010이    아닌    사원의    이름, 전화번호    조회
SELECT EMP_NAME,PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
SELECT EMP_NAME,PHONE
FROM EMPLOYEE
WHERE NOT PHONE LIKE '010%';
--37. EMPLOYEE  테이블에서     메일주소     _의     앞이     4자이면서     DEPT_CODE가     ‘D9’     또는     ‘D6’이고, 
-- 고용일이    90/01/01 ~ 00/12/01이고, 급여가   2700000만    이상인    사원의    전체    정보    조회
SELECT *
FROM EMPLOYEE
WHERE EMAIL LIKE '____!_%' ESCAPE '!'
        AND (DEPT_CODE = 'D9' OR DEPT_CODE = 'D6')
        AND HIRE_DATE BETWEEN '90/01/01' AND '00/12/01'
        AND SALARY >= 2700000;
        
--38. EMPLOYEE 테이블에서    보너스를    받지    않는    사원의    사번, 이름, 급여, 보너스    조회
SELECT EMP_ID, EMP_NAME, SALARY,  NVL(BONUS, 0)---------------------
FROM EMPLOYEE
WHERE BONUS = 0;
--39. EMPLOYEE 테이블에서    보너스를    받는    사원의    사번, 이름, 급여, 보너스    조회
SELECT EMP_ID, EMP_NAME, SALARY, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;
--40. EMPLOYEE  테이블에서 관리자도 없고 부서 배치도 받지 않은 직원의 이름,  관리자,  부서코드    조회
SELECT EMP_NAME, MANAGER_ID, DEPT_CODE
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL AND DEPT_CODE IS NULL;

--41. EMPLOYEE  테이블에서    부서    배치를    받지    않았지만    보너스를    지급받는    직원의    이름,  보너 스, 부서코드   조회
SELECT EMP_NAME,BONUS,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;
--42. ‘D6’부서와   ‘D9’부서원들의    이름, 부서코드, 급여    조회
--43. 직급   코드가   ‘J1’, ‘J2’, ‘J3’, ‘J4’인    사람들의    이름, 직급    코드, 급여    조회
SELECT EMP_NAME, JOB_CODE,SALARY
FROM EMPLOYEE
WHERE JOB_CODE IN ('J1','J2','J3','J4');
--44. EMPLOYEE 테이블에서    사번, 이름, 급여를    연결해서    조회    (EX. 200선동일8000000)
SELECT EMP_ID||EMP_NAME||SALARY
FROM EMPLOYEE;
--45. EMPLOYEE 테이블에서    '사원    명의    월급은    급여    원입니다' 형식으로    조회
SELECT '사원명 '||EMP_NAME||'의 월급은 급여 '|| SALARY||'원입니다'
FROM EMPLOYEE;
--
--
--
--FUNCTION 문제
--1. EMPLOYEE  테이블에서    사원    명,  입사일-오늘,  오늘-입사일    조회    (단,  별칭은    근무일수1,  근 무일수2로   하고    모두    정수    처리(내림)와    양수로    처리)
SELECT EMP_NAME, FLOOR(ABS(HIRE_DATE - SYSDATE)) 근무일수1 , FLOOR(ABS(SYSDATE - HIRE_DATE)) 근무일수2
FROM EMPLOYEE;
--2. EMPLOYEE 테이블에서    사번이    홀수인    직원들의    정보    모두    조회
SELECT *
FROM EMPLOYEE
--WHERE MOD(EMP_ID,2) = 1;
WHERE MOD(EMP_ID,2) != 0;
--3. EMPLOYEE 테이블에서    근무연수가    20년    이상인    직원    정보    조회
SELECT *
FROM EMPLOYEE
WHERE MONTHS_BETWEEN(SYSDATE, HIRE_DATE) >= 20;
--4. EMPLOYEE 테이블에서    사원    명, 입사일, 입사한    달의    근무일    수    조회
SELECT EMP_NAME, HIRE_DATE, LAST_DAY(HIRE_DATE)-HIRE_DATE "입사한 달의 근무일수"
FROM EMPLOYEE;
--5. EMPLOYEE 테이블에서    사원의    이름, 입사    연도, 입사    월, 입사일    조회
SELECT EMP_NAME, HIRE_DATE, LAST_DAY(HIRE_DATE)-HIRE_DATE "입사한 달의 근무일수"
FROM EMPLOYEE;
--6. EMPLOYEE테이블에서    사원의    이름,  입사일,  근무연수    조회    (단,  근무연수는    현재    연도    - 입 사연도로    조회)
SELECT EMP_NAME, HIRE_DATE, EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FROM HIRE_DATE) 근무연수
FROM EMPLOYEE;
--7. EMPLOYEE 테이블에서    사원    명, 급여(\9,000,000 형식) 조회
SELECT EMP_NAME ,TO_CHAR(SALARY,'L9,000,000') 급여
FROM EMPLOYEE;
--8. EMPLOYEE 테이블에서    이름, 입사일(2022년    3월    15일    (화) 형식) 조회
SELECT EMP_NAME,TO_CHAR(HIRE_DATE, 'YYYY"년" FMMM"월" DD"일" (DY)')
FROM EMPLOYEE;
--9. 직원의 급여를 인상하고자 한다. 직급코드가 ‘J7’인 직원은 급여의 10%를 인상하고, 직급코 드가 ‘J6’인 직원은 급여의 15%를 인상하고, 
-- 직급코드가 ‘J5’인 직원은 급여의 20%를 인상 하며, 그 외 직급의 직원은 급여의 5%만 인상하며, 직원 테이블에서 직원명,  직급코드,  급 여, 인상급여(위 조건)을 조회
SELECT EMP_NAME, JOB_CODE, SALARY, 
        CASE JOB_CODE WHEN 'J7' THEN SALARY*0.1
                      WHEN 'J6' THEN SALARY*0.15
                      WHEN 'J5' THEN SALARY*0.2
                      ELSE SALARY*0.05
        END 인상급여
FROM EMPLOYEE;
SELECT EMP_NAME, JOB_CODE, SALARY, 
    CASE WHEN JOB_CODE = 'J7' THEN SALARY*1.1
         WHEN JOB_CODE = 'J6' THEN SALARY*1.15
         WHEN JOB_CODE = 'J5' THEN SALARY*1.2
         ELSE SALARY*1.05
    END 인상급여
FROM EMPLOYEE;

SELECT EMP_NAME, JOB_CODE, SALARY 월급, 
        DECODE(JOB_CODE,'J7',SALARY*0.1,
                        'J6',SALARY*0.15,
                        'J5',SALARY*0.2,SALARY*0.5) 인상급여
FROM EMPLOYEE;

                        
--10. EMPLOYEE 테이블에서    전    사원의    급여    총합    조회
SELECT SUM(SALARY) FROM EMPLOYEE;
--11. EMPLOYEE 테이블에서    남자사원의    급여    총합    조회
SELECT SUM(SALARY)
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO,8,1)=1;
--12. EMPLOYEE 테이블에서    전    사원의    급여    평균    조회
SELECT AVG(SALARY)
FROM EMPLOYEE;
--13. EMPLOYEE 테이블에서 전 사원의 보너스 평균 (단, BONUS가 NULL인 사원은 0으로 처리)
SELECT AVG(NVL(BONUS,0))
FROM EMPLOYEE;
--14. EMPLOYEE 테이블에서    최소    급여와    최대    급여    조회
SELECT MIN(SALARY), MAX(SALARY)
FROM EMPLOYEE;
--15. 부서   코드가   있는    사원    수    (NULL 제외) 조회
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE;
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE;




--GROUP BY HAVING 문제
--1. 부서    별   급여    합계    조회
SELECT SUM(SALARY) 급여합계, DEPT_CODE
FROM EMPLOYEE
GROUP BY DEPT_CODE;
--2. EMPLOYEE 테이블에서 부서, 부서 별 급여 합계, 부서 별 급여 평균, 부서 별 인원 수 조회
SELECT DEPT_CODE 부서코드, SUM(SALARY)급여합계,/*AVG(SALARY)*/ CEIL(AVG(SALARY))급여평균, COUNT(*) 부서인원수
FROM EMPLOYEE
GROUP BY DEPT_CODE;
--3. EMPLOYEE 테이블에서    부서코드와    보너스    받는    사원    수    조회
SELECT DEPT_CODE, COUNT(BONUS) "보너스O사원수"
FROM EMPLOYEE
GROUP BY DEPT_CODE;
--4. EMPLOYEE 테이블에서    직급코드와    보너스    받는    사원    수    조회
SELECT JOB_CODE, COUNT(BONUS) "보너스 사원수"
FROM EMPLOYEE
GROUP BY JOB_CODE;
--5. EMPLOYEE 테이블에서    성별과    성별    별    급여    평균(정수처리(내림)), 급여    합계, 인원    수    조회 (인원    수로   내림차순)
SELECT DECODE(SUBSTR(EMP_NO,8,1),1,'남','여') 성별, FLOOR(ABS(AVG(SALARY))) "성별 별 급여평균", SUM(SALARY), COUNT(*)
FROM EMPLOYEE 
GROUP BY SUBSTR(EMP_NO,8,1)
ORDER BY COUNT(*) DESC;
--6. EMPLOYEE 테이블에서    부서    코드별로    같은    직급인    사원의    급여    합계    조회
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING DEPT_CODE IN('D1','D2','D3','D4','D5');

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE
ORDER BY DEPT_CODE;
--7. 부서    코드와   급여    3000000이상인    직원의    그룹    별    평균    급여    조회
SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, SALARY
HAVING SALARY >= 3000000;
--8. 부서    코드와   급여    평균    3000000이상인    그룹   별    평균    급여    조회
SELECT  DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE,SALARY
HAVING AVG(SALARY) >= 3000000;
--9. 부서 별 급여 합계 중 9000000을 초과하는 부서코드와 급여 합계 조회
SELECT DEPT_CODE,SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) > 9000000;
--10.EMPLOYEE테이블에서 각 부서코드마다 직급코드 별 급여 합, 부서 별 급여 합, 총합 조회
SELECT DEPT_CODE,JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE 
ORDER BY DEPT_CODE;
--11. EMPLOYEE  테이블에서 DEPT_CODE가 ‘D5’이거나 급여가 3000000을 초과하는 직원의 사번, 이름, 부서코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;

--
--JOIN 문제
--내부 조인(INNER JOIN) : 일치하지 않는 컬럼 값은 제외시킴 
--1. 사번, 사원 명, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE FROM EMPLOYEE;
--2-1.사번, 이름,부서코드, 부서 명 조회(오라클 전용 구문) 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
--2-2.사번, 이름,부서코드, 부서 명 조회(ANSI 표준 구문)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
    JOIN DEPARTMENT ON(EMPLOYEE.DEPT_CODE = DEPARTMENT.DEPT_ID);
--3-1.사번, 사원 명, 직급코드, 직급명 조회(오라클 전용구문) 
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

SELECT EMP_ID,EMP_NAME, EMPLOYEE.JOB_CODE, JOB.JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
--3-2.사번, 사원 명, 직급코드, 직급명 조회(ANSI 표준구문) 
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE E
    JOIN JOB J USING(JOB_CODE);
    
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE E
    JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);
--4-1.부서   명과   해당    부서의    지역    명    조회(오라클    전용    구문)
SELECT D.DEPT_TITLE, L.LOCAL_NAME
FROM DEPARTMENT D, LOCATION L
WHERE D.LOCATION_ID = L.LOCAL_CODE;

SELECT DEPT_TITLE,LOCAL_NAME
FROM DEPARTMENT, LOCATION
WHERE LOCATION_ID = LOCAL_CODE;
--4-2.    부서   명과   해당    부서의    지역    명    조회(ANSI 표준    구문)
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT D
    JOIN LOCATION L ON(D.LOCATION_ID = L.LOCAL_CODE);
--5. 오라클    전용    구문    ANSI 표준    구문으로    바꾸기
--SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE = DEPT_ID(+);
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE E
    LEFT JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID);
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE
    LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);    
--6. 오라클    전용    구문    ANSI 표준    구문으로    바꾸기
--SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE(+) = DEPT_ID;
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE
    RIGHT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
--7. 오라클    전용    구문에선    FULL [OUTER] JOIN 안    됨. 아래    구문    실행해도    에러    남. 그러니까 밑에    구문을    ANSI 표준으로    바꿔주셈.
--SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE(+) = DEPT_ID(+);
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE
    FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
--8-1.   사번, 이름, 부서    코드, 부서    명, 지역    이름(LOCAL_NAME) 조회(오라클    전용    구문) 
SELECT EMP_ID,EMP_NAME, DEPT_CODE, DEPT_TITLE,LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT,LOCATION
WHERE DEPT_CODE = DEPT_ID
    AND LOCATION_ID = LOCAL_CODE;
--8-2.   사번, 이름, 부서    코드, 부서    명, 지역    이름(LOCAL_NAME)(ANSI 표준    구문)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
    JOIN DEPARTMENT ON ( DEPT_CODE = DEPT_ID)
    JOIN LOCATION ON ( LOCATION_ID = LOCAL_CODE);



--SUBQUERY 문제
--서브    쿼리(SUBQUERY) :  메인    쿼리를    위해    보조    역할을    하는    쿼리이며,  쿼리    안에    쿼리가    포 함되어   있음.
--1. 첫    번째   구문과    두    번째    구문    합쳐주셈.
--①
--SELECT DEPT_CODE FROM EMPLOYEE
--WHERE EMP_NAME = '노옹철';
--②
--
--SELECT EMP_NAME FROM EMPLOYEE
--WHERE DEPT_CODE = 'D9';
--2. 전    직원의   평균    급여보다    많은    급여를   받고    있는    직원의    사번, 이름, 직급    코드, 급여    조회
--3. 노옹철    사원의   급여보다    많이    받는    직원의    사번, 이름, 부서코드, 직급코드, 급여    조회
--4. 가장    적은   급여를    받는    직원의    사번, 이름, 직급코드, 부서코드, 급여    입사일    조회
--5. 부서    별   급여    합계    중    가장    큰    부서의   부서    명, 급여    합계
--6. 부서    별   최고    급여를    받는    직원의    이름, 직급    코드, 부서코드, 급여    조회
--7. 관리자와    일반    직원에    해당하는    사원    정보    추출    : 사번, 이름, 부서명, 직급, 구분(관리자/직 원)
--8. 대리    직급의    직원들    중에서    과장    직급의    최소    급여보다    많이    받는    직원의    사번, 이름, 직급, 급여    조회
--9. 차장    직급의   급여    중    가장    큰    값보다   많이    받는    과장    직급의    사번, 이름, 직급, 급여    조회
--10.퇴사한    여직원과    같은    부서, 같은    직급에    해당하는    사원의    이름, 직급    코드, 부서코드, 입사 일    조회
--11.자기    직급의    평균    급여를    받고    있는    직원의    사번,  이름,  직급    코드,  급여    조회    (단, 급여    평 균은    십   만원    단위로    계산    : TRUNC(컬럼    명, -5))
--12.전    직원   중    급여가    높은    상위    5명의   이름, 급여    조회
--13.전    직원   중    급여가    높은    상위    5명의   이름, 급여    조회

 

 

 

728x90
반응형

+ Recent posts