# 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