본문 바로가기

Programming/Database

데이터베이스 4강

# Non-equi Join : 많이 안씀
  비교 연산자 사용
  등급 구간나눔
  속성이 같은 것 없음

# 예제 : 사원 번호 및 사원이 근무하는 부서 번호, 부서 이름을 출력하시오.
  SELECT e.employee_id, e.department_id, d.department_name
  FROM employees e, departments d
  WHERE e.department_id = d.department_id;

# department_id 값이 null인 부서를 배치 받지 못한 사원이 있어 106rows (107x)



# Outer Join(포괄 조인)
  SELECT e.employee_id, e.department_id, d.department_name
  FROM employees e, departments d
  WHERE e.department_id = d.department_id(+);
# 등호(=)를 기준으로 (+)가 붙은 쪽(데이터가 부족한 쪽)에 null값을 주어 매칭시킴





1권 207페이지
# Self-Join(셀프 조인)
# 무결성이 깨지는 것을 막아준다.
  여러 번 FROM절 불러주고 다른 alias를 설정
  자기 테이블을 외래키로 가져옴

# 예제 : 사원번호, 사원이름 그 사원을 관리하는 관리자번호, 관리자 이름을 출력하시오.
  SELECT e.employee_id, e.last_name, e.manager_id, m.last_name
  FROM employees e, employees m
  WHERE e.manager_id = m.employee_id;

# 예제 : 자신의 매니저보다 먼저 고용된 사원들의 이름 및 고용일을 출력하시오.
  SELECT EMP.LAST_NAME, EMP.EMPLOYEE_ID, EMP.HIRE_DATE
  FROM EMPLOYEES EMP, EMPLOYEES MGR
  WHERE EMP.MANAGER_ID = MGR.EMPLOYEE_ID
  AND EMP.HIRE_DATE < MGR.HIRE_DATE
  ORDER BY EMP.LAST_NAME;



# 그룹 함수
  SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)
  FROM employees
  WHERE job_id LIKE '%REP%';
 >
  AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)
  ----------- ----------- ----------- -----------
   8272.72727       11500        6000      273000



  SELECT COUNT(*)
  FROM employees
  WHERE commission_pct IS NOT NULL;
 또는
  SELECT COUNT(commission_pct)
  FROM employees;



# 그룹 함수는 NULL값을 인식 못함 : AVG 구할 때 NULL을 제외하고 계산
  SELECT AVG (nvl( commission_pct, 0)), SUM(commission_pct)/107
  FROM employees;
 x
  SELECT AVG (commission_pct), SUM(commission_pct)/35
  FROM employees;



# 그룹화
# 단일 변수와 그룹을 함께 표시할 수 없음
# 그룹함수가 쓰였을 때, 그룹함수가 아닌 값들은 GROUP BY를 적용해줘야 함
# WHERE 다음 ORDER BY 전 명시
  SELECT department_id, SUM(salary)
  FROM employees
  GROUP BY department_id
  ORDER BY department_id;


  SELECT job_id, AVG(salary)
  FROM employees
  GROUP BY job_id
  ORDER BY AVG(salary);



SELECT department_id  dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id
ORDER BY dept_id



# SELECT문은 WHERE절이 가장 먼저 실행된다.
# 그룹은 값을 저장하고 있는 것이 아니기 때문에 WHERE절을 사용할 수 없음
# WHERE 대신 HAVING을 적어주면 사용할 수 있음
# HAVING절에서 그룹이 아닌 일반 함수 적용할 수 없음
# HAVING과 GROUP BY는 위치가 바뀌어도 가능

  2. SELECT column, group_function
  FROM table
  1. WHERE condition
  3. GROUP BY group_by_expression
  4. HAVING grop_condition
  5. ORDER BY column;




 강의 자료
# 예제 : 회사 전체의 최대 급여, 최소 급여, 급여 총 합 및 평균 급여를 출력하시오.
  SELECT MAX(salary), MIN(salary), SUM(salary), AVG(salary)
  FROM employees;

# 예제 : 각 직업별, 최대 급여, 최소 급여, 급여 총 합 및 평균 급여를 출력하시오.
     단 최대 급여는 MAX, 최소 급여는 MIN, 급여 총 합은 SUM 및
     평균 급여는 AVG로 출력하고, 직업을 오름차순으로 정렬하시오 
  SELECT job_id, MAX(salary) MAX, MIN(salary) MIN, SUM(salary) SUM, AVG(salary) AVG
  FROM employees
  GROUP BY job_id
  ORDER BY job_id

# 동일한 직업을 가진 사원들의 총 수를 출력하시오
  SELECT job_id, COUNT(employee_id)
  FROM employees
  GROUP BY job_id
  ORDER BY job_id



# 매니저로 근무하는 사원들의 총 수를 출력하시오
  SELECT COUNT(DISTINCT manager_id)
  FROM employees




# 사내의 최대 급여 및 최소 급여의 차이를 출력하시오.
  SELECT MAX(salary) - MIN(salary) AS diff
  FROM employees



# 매니저의 사번 및 그 매니저 밑 사원들 중 최소 급여를 받는 사원의 급여를 출력하시오
      - 매니저가 없는 사람들은 제외한다.
      - 최소 급여가 5000 미만인 경우는 제외한다.
      - 급여 기준 역순으로 조회한다.
  SELECT manager_id, MIN(salary)
  FROM employees
  WHERE manager_id IS NOT NULL
  GROUP BY manager_id
  HAVING MIN(salary) >= 5000
  ORDER BY MIN(salary) DESC;

'Programming > Database' 카테고리의 다른 글

데이터베이스 6강  (0) 2020.03.10
데이터베이스 5강  (0) 2020.03.10
데이터베이스 3강  (0) 2020.03.10
데이터베이스 2강  (0) 2020.03.10
데이터베이스 1강  (0) 2020.03.10