hyndb

[데이터베이스] hr 스키마 연습문제 (3_4, 5차) 본문

데이터베이스/hr scheme

[데이터베이스] hr 스키마 연습문제 (3_4, 5차)

ttttki913 2023. 11. 23. 01:46

-----------------------------------------------------------3장 4차 연습문제

 

1. 사원 급여의 최고, 최저, 합, 평균을 구하라. Maximum, Minimum, Sum, Average로 컬럼 이름을 정한다.

 

select max(salary) as Maximum, min(salary) Minimum, sum(salary) Sum, avg(salary) Average
from employees;

   MAXIMUM    MINIMUM        SUM    AVERAGE
---------- ---------- ---------- ----------
     24000       2100     691416 6461.83178

 

2. 각 JOB마다(job_id 별로 = group by) 사원 급여의 최고, 최저, 합, 평균을 구하라. Maximum, Minimum, Sum, Average로 컬럼 이름을 정한다.같은 JOB을 하는 사원의 숫 자를 출력하라. JOB_ID를 포함한다.

 

select job_id, max(salary) as Maximum, min(salary) Minimum, sum(salary) Sum, avg(salary) Average, count(*) as employeecount
from employees
group by job_id;

JOB_ID                  MAXIMUM    MINIMUM        SUM    AVERAGE EMPLOYEECOUNT
-------------------- ---------- ---------- ---------- ---------- -------------
SH_CLERK                   4200       2500      64300       3215            20
HR_REP                     6500       6500       6500       6500             1
AD_VP                     17000      17000      34000      17000             2
FI_ACCOUNT                 9000       6900      39600       7920             5
PU_CLERK                   3100       2500      13900       2780             5
AC_MGR                    12008      12008      12008      12008             1
PU_MAN                    11000      11000      11000      11000             1
ST_CLERK                   3600       2100      55700       2785            20
AD_ASST                    4400       4400       4400       4400             1
AC_ACCOUNT                 8300       8300       8300       8300             1
IT_PROG                    9000       4200      28800       5760             5

JOB_ID                  MAXIMUM    MINIMUM        SUM    AVERAGE EMPLOYEECOUNT
-------------------- ---------- ---------- ---------- ---------- -------------
SA_MAN                    14000      10500      61000      12200             5
FI_MGR                    12008      12008      12008      12008             1
ST_MAN                     8200       5800      36400       7280             5
MK_MAN                    13000      13000      13000      13000             1
AD_PRES                   24000      24000      24000      24000             1
MK_REP                     6000       6000       6000       6000             1
PR_REP                    10000      10000      10000      10000             1
SA_REP                    11500       6100     250500       8350            30

19 행이 선택되었습니다.

 

3. MANAGER 역할(상사)을 하고 있는 사원의 숫자를 출력하라.(부서의 상사가 아니다.)  

 

select count(distinct manager_id) Employee
from employees;

EMPLOYEE
-----------------
                 18

 

4. 급여가 $5000 이하인 사원들만 대상으로, 부서번호별 급여의 합을 출력하 라.

 

select department_id, sum(salary) Sum
from employees
where salary <= 5000
group by department_id;

DEPARTMENT_ID        SUM
-------------    ----------
           50     120000
           30      13900
           10       4400
           60      13800

 

5. 사원의 수가 5명 이상인 JOB_ID 별로 급여의 최소값을 구하라.

 

select job_id, min(salary) Minimum
from employees
group by job_id
having count(*) >= 5;

JOB_ID                  MINIMUM
-------------------- ----------
SH_CLERK                   2500
FI_ACCOUNT                 6900
PU_CLERK                   2500
ST_CLERK                   2100
IT_PROG                    4200
SA_MAN                    10500
ST_MAN                     5800
SA_REP                     6100

8 행이 선택되었습니다.

 

6. 같은 부서에서 같은 JOB을 수행중인 사원의 숫자를 부서번호별, JOB_ID별 로 출력하라. 부서번호가 커지는 순서로 정렬하되, 부서번호가 같은 경우는 JOB_ID가 커지는 순서로 정렬하라.     -------------?

 

select department_id, job_id, count(*) as employeecount
from employees

group by department_id, job_id
order by department_id ASC, job_id ASC;

DEPARTMENT_ID JOB_ID               EMPLOYEECOUNT
------------- -------------------- -------------
           10 AD_ASST                          1
           20 MK_MAN                           1
           20 MK_REP                           1
           30 PU_CLERK                         5
           30 PU_MAN                           1
           40 HR_REP                           1
           50 SH_CLERK                        20
           50 ST_CLERK                        20
           50 ST_MAN                           5
           60 IT_PROG                          5
           70 PR_REP                           1

DEPARTMENT_ID JOB_ID               EMPLOYEECOUNT
------------- -------------------- -------------
           80 SA_MAN                           5
           80 SA_REP                          29
           90 AD_PRES                          1
           90 AD_VP                            2
          100 FI_ACCOUNT                       5
          100 FI_MGR                           1
          110 AC_ACCOUNT                       1
          110 AC_MGR                           1
              SA_REP                           1

20 행이 선택되었습니다.

 

7. 급여의 평균이 5000이 넘는 부서를 대상으로, 부서번호와 급여의 합을 구하라.

 

select department_id, sum(salary) SUM

from employees

group by department_id

having avg(salary) >= 5000;              //having은 집계함수절

 

DEPARTMENT_ID        SUM
------------- ----------
           40       6500
          110      20308
           70      10000
           90      58000
                    7000
           20      19000
           60      28800
          100      51608
           80     304500

9 행이 선택되었습니다.

--------------------------------------------------------------------3장 5차 연습문제(조인)

 

1. 100번 이하 부서에 소속된 사원의 사원번호, 성, 부서번호, 부서명을 출력 하라.

 

select e.employee_id, e.last_name, e.department_id, d.department_name
from employees e join departments d on e.department_id = d.department_id
where d.department_id <= 100;

EMPLOYEE_ID LAST_NAME                                          DEPARTMENT_ID DEPARTMENT_NAME
----------- -------------------------------------------------- ------------- ------------------------------------------------------------
        198 OConnell                                                      50 Shipping
        199 Grant                                                         50 Shipping
        200 Whalen                                                        10 Administration
        201 Hartstein                                                     20 Marketing
        202 Fay                                                           20 Marketing
        203 Mavris                                                        40 Human Resources
        204 Baer                                                          70 Public Relations
        100 King                                                          90 Executive
        101 Kochhar                                                       90 Executive
        102 De Haan                                                       90 Executive
        103 Hunold                                                        60 IT

 

... 104행이 선택되었습니다.

 

2. 모든 부서의 주소를 출력한다. location ID, street address, city, state 또는 province, country를 출력해야 한다. NATURAL JOIN을 사용하라.

(= 부서 테이블이랑 내추럴 조인/ 부서의 주소(=locations 테이블) 출력이니까)

 

select *
from locations
natural join departments;

LOCATION_ID STREET_ADDRESS
    POSTAL_CODE       CITY
----------- -------------------------------------------------------------------------------- ------------------------ ------------------------------------------------------------
STATE_PROVINCE                                     COUN DEPARTMENT_ID DEPARTMENT_NAME    MANAGER_ID
-------------------------------------------------- ---- ------------- ------------------------------------------------------------ ----------
       1400 2014 Jabberwocky Rd
    26192                     Southlake
Texas                                              US              60 IT
 103

       1500 2011 Interiors Blvd
    99236                     South San Francisco
California                                         US              50 Shipping
 121

       1700 2004 Charade Rd
    98199                     Seattle
Washington                                         US              30 Purchasing        114

 

...27행이 선택되었습니다.

 

3. Toronto에서 근무하는 사원의 last name, job(job id), department number, department name을 출력하라.

 

select e.last_name, e.job_id, d.department_id, d.department_name
from employees e
join departments d on e.department_id = d.department_id
join locations l on d.location_id = l.location_id
where l.city = 'Toronto';

LAST_NAME                                          JOB_ID               DEPARTMENT_ID DEPARTMENT_NAME
-------------------------------------------------- -------------------- ------------- ------------------------------------------------------------
Hartstein                                          MK_MAN                          20 Marketing
Fay                                                MK_REP                          20 Marketing

 

4. 사원의 번호, 성, JOB_CODE, JOB_TITLE을 출력하라.

 

select e.employee_id, e.last_name, j.job_id, j.job_title

from employees e

join jobs j on e.job_id = j.job_id;

 

EMPLOYEE_ID LAST_NAME                                          JOB_ID               JOB_TITLE
----------- -------------------------------------------------- -------------------- ----------------------------------------------------------------------
        137 Ladwig                                             ST_CLERK             Stock Clerk
        138 Stiles                                             ST_CLERK             Stock Clerk
        139 Seo                                                ST_CLERK             Stock Clerk
        124 Mourgos                                            ST_MAN               Stock Manager
        123 Vollman                                            ST_MAN               Stock Manager
        122 Kaufling                                           ST_MAN               Stock Manager
        121 Fripp                                              ST_MAN               Stock Manager
        120 Weiss                                              ST_MAN               Stock Manager

107 행이 선택되었습니다.

 

5. 모든 부서의 번호, 이름, 부서장의 성을 출력하라.

 

set linesize 200
select d.department_id, d.department_name, e.last_name
from departments d
left join employees e on d.manager_id = e.manager_id;

 

DEPARTMENT_ID DEPARTMENT_NAME                                              LAST_NAME
------------- ------------------------------------------------------------ --------------------------------------------------
          200 Operations
          210 IT Support
          220 NOC
          230 IT Helpdesk
          240 Government Sales
          250 Retail Sales
          260 Recruiting
          270 Payroll

63 행이 선택되었습니다.

 

6. 같은 JOB을 하는 사원의 숫자를 출력하라. JOB의 이름이 출력되어야 한다.

 

 select job_id, count(employee_id)
from employees
group by job_id
order by job_id;

JOB_ID               COUNT(EMPLOYEE_ID)
-------------------- ------------------
AC_ACCOUNT                            1
AC_MGR                                1
AD_ASST                               1
AD_PRES                               1
AD_VP                                 2
FI_ACCOUNT                            5
FI_MGR                                1
HR_REP                                1
IT_PROG                               5
MK_MAN                                1
MK_REP                                1

JOB_ID               COUNT(EMPLOYEE_ID)
-------------------- ------------------
PR_REP                                1
PU_CLERK                              5
PU_MAN                                1
SA_MAN                                5
SA_REP                               30
SH_CLERK                             20
ST_CLERK                             20
ST_MAN                                5

19 행이 선택되었습니다.

 

7. JOB 이력(history)가 있는 사원의 사원 성과 이름, JOB_HISTORY 기록 횟수 를 출력하라. -------?

 

select e.last_name, e.first_name, count(*) as job_history
from employees e
join job_history j on e.employee_id = j.employee_id
group by e.employee_id, e.last_name, e.first_name;

LAST_NAME                                          FIRST_NAME
   JOB_HISTORY
-------------------------------------------------- ---------------------------------------- -----------
Raphaely                                           Den
     1
Whalen                                             Jennifer
     2
Hartstein                                          Michael
     1
Kochhar                                            Neena     

     2
Kaufling                                           Payam
     1
Taylor                                             Jonathon
     2
De Haan                                            Lex
     1

7 행이 선택되었습니다.

 

8. 급여가 4000 이상인 사원들이 속한 부서의 이름을 중복을 제거하고 출력하라.

 

select distinct d.department_name
from departments d
join employees e on d.department_id = e.department_id
where e.salary >= 4000;

DEPARTMENT_NAME
------------------------------------------------------------
Sales
Marketing
Administration
Purchasing
Shipping
IT
Executive
Finance
Public Relations
Human Resources
Accounting

11 행이 선택되었습니다.