Fullstack-Study-241204-250625

커리큘럼(12-30/변경)

01. Java
02. git
03. Database (v)
04. Jsp [Server]

05. 미니프로젝트 (3W)
06. HTML,CSS  
07. JS

08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)

SQL

분석 함수

함수명 설명
RANK 해당 값에 대한 우선순위를 결정(중복순위 계산)
DENSE_RANK 해당 값에 대한 우선순위 결정(중복순위 계산 안함)
ROW_NUMBER 조건을 만족하는 모든 행의 번호 제공
SELECT FIRST_NAME,
       SALARY,
       RANK() OVER(ORDER BY SALARY DESC) 중복등수,
       DENSE_RANK() OVER(ORDER BY SALARY DESC) 중복없는등수,
       ROW_NUMBER() OVER(ORDER BY SALARY DESC) AS 일련번호,
       ROW_NUM -- 정렬되면 순서가 바뀜
FROM EMPLOYEES;

RANK

  • 중복 순위 계산
  • ex : 2등이 2명이면 다음 순위는 4등

DENSE_RANK

  • 중복순위 계산하지 않음
  • ex : 2등이 2명이더라도 다음 순위는 3등

ROW_NUMBER

  • 조건을 만족하는 모든 행의 번호 제공(일련번호 생성)

.

그룹 함수

함수 설명
AVG(n) NULL값을 무시한 n의 평균
SUM(n) Null값을 무시한 n의 합계
MIN(expr) Null값을 무시한 expr 최솟값
MAX(expr) Null값을 무시한 expr의 최댓값
COUNT({*}expr) 행의 수, expr은 Null값을 제외하고 계산. *를 사용해 중복되거나 Null인 행등을 포함하여 모든 행 계산
SELECT MIN(HIRE_DATE), MAX(HIRE_DATE), MIN(FIRST_NAME), MAX(FIRST_NAME) FROM EMPLOYEES;
  1. NULL이 아닌 데이터에 대해서 집계(기본)
SELECT COUNT(COMMISSION_PCT) FROM EMPLOYEES; --35 : NULL이 아닌 데이터에 대해서 집계
  1. NULL을 포함한 전체 행수
SELECT COUNT(*) FROM EMPLOYEES; -- 107 : NULL값을 포함한 전체 행수
SELECT FIRST_NAME, AVG(SALARY) FROM EMPLOYEES; -- 오류, FIRST_NAME 제외시 작동
SELECT FIRST_NAME, AVG(SALARY) OVER(), COUNT(*) OVER FROM EMPLOYEES;

.

GROUP BY

SELECT column, group_function(column)
FROM table
[WHERE condition(s)]
[GROUP BY group_by_expression]
[ORDER BY {column|expr, ...} [[ASC]|DESC]];
SELECT DEPARTMENT_ID FROM EMPLOYEES GROUP BY DEPARTMENT_ID;
SELECT DEPARTMENT_ID,SUM(SALARY), AVG(SALARY), MIN(SALARY), MAX(SALARY), COUNT(*)
FROM EMPLOYEES GROUP BY DEPARTMENT_ID ;
  • 주의할 점 : GROUP BY 절을 사용했다면 GROUP화했던 컬럼만 SELECT절에서 쓸 수 있음
SELECT DEPARTMENT_ID,FIRST_NAME FROM EMPLOYEES GROUP BY DEPARTMENT_ID; -- 오류
SELECT DEPARTMENT_ID, JOB_ID,AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID, JOB_ID
ORDER BY DEPARTMENT_ID;
  • COUNT(*) OVER() 총 행의 수를 출력
SELECT DEPARTMENT_ID, JOB_ID,COUNT(*),COUNT(*) OVER() AS 전체행수
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID, JOB_ID
ORDER BY DEPARTMENT_ID;
  • GROUP의 조건HAVING절에 넣어야 함
SELECT DEPARTMENT_ID, SUM(SALARY)
FROM EMPLOYEES
WHERE SUM(SALARY) >= 50 -- 오류 : GROUP BY조건을 쓰는 곳은 HAVING이 따로 있음
GROUP BY DEPARTMENT_ID;

.

HAVING

SELECT column, group_function(column)
FROM table
[WHERE condition(s)]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY {column|expr [[ASC]|DESC], ...}];
SELECT DEPARTMENT_ID, AVG(SALARY),COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING AVG(SALARY)>=5000 AND COUNT(*)>=1;
  • 예시
-- 각  JOB_ID가 SA로 시작하는 직무별 급여 평균이 10000이 넘는 직무
SELECT JOB_ID, AVG(SALARY)
FROM EMPLOYEES
WHERE JOB_ID LIKE 'SA%'
GROUP BY JOB_ID
HAVING AVG(SALARY)>=10000
ORDER BY AVG(SALARY) DESC;

.

ROLLUP,CUBE,GROUPING

ROULLUP

  • GROUP BY 절과 같이 사용되며, GROUP BY절에 의해서 그룹 지어진 집합 결과에 대해서 좀 더 상세한 정보를 반환하는 기능 수행
  • GROUP BY 와 함께 사용되고, 상위그룹의 소계를 구함 ROLLUP함수
SELECT DEPARTMENT_ID, AVG(SALARY)
FROM EMPLOYEES
GROUP BY ROLLUP(DEPARTMENT_ID);
SELECT DEPARTMENT_ID, JOB_ID, AVG(SALARY)
FROM EMPLOYEES
GROUP BY ROLLUP(DEPARTMENT_ID,JOB_ID)
ORDER BY DEPARTMENT_ID, JOB_ID;

CUBE

  • 서브 그룹에 대한 Summary를 추출하는데 사용
  • ROLLUP에 의해서 구해진 값 + 서브그룹의 통계 추가 CUBE함수
SELECT DEPARTMENT_ID, JOB_ID,AVG(SALARY)
FROM EMPLOYEES
GROUP BY CUBE(DEPARTMENT_ID,JOB_ID)
ORDER BY DEPARTMENT_ID,JOB_ID;

GROUPING

  • 해당 행이 GROUP BY에 의해 산출된 데이터인지, ROLLUP 이나 CUBE에 의해 산출된 데이터인지 판별을 지원해주는 함수
  • 해당 행이 GROUP BY에 의해서 산출된 ROW인 경우 0을 반환하고, ROLLUP이나 CUBE에 의해서 산출된 행일 경우 1을 반환
SELECT DECODE(GROUPING(DEPARTMENT_ID),1,'총계',DEPARTMENT_ID) AS DEPARTMENT_ID
       ,DECODE(GROUPING(JOB_ID),1,'소계',JOB_ID) AS JOB_ID
       ,JOB_ID
       ,AVG(SALARY)
--       ,GROUPING(DEPARTMENT_ID)
--       ,GROUPING(JOB_ID)
FROM EMPLOYEES
GROUP BY ROLLUP(DEPARTMENT_ID,JOB_ID)
ORDER BY DEPARTMENT_ID;

JOIN

SELECT * FROM INFO JOIN AUTH ON INFO.AUTH_ID = AUTH.AUTH_ID;

  • AUTH_ID는 양쪽에 다 있기 때문에, 출력시 테이블명.컬럼명으로 지정해야 함
SELECT ID , TITLE, CONTENT, AUTH.AUTH_ID, NAME, JOB
FROM INFO INNER JOIN AUTH ON INFO.AUTH_ID = AUTH.AUTH_ID;
SELECT *
FROM INFO I
INNER JOIN AUTH A
ON I.AUTH_ID = A.AUTH_ID;
  • 양쪽 테이블에 동일 키 이름으로 연결할 떄 사용 가능
SELECT *
FROM INFO I
INNER JOIN AUTH A
USING (AUTH_ID)

주요 조인 종류

JOIN 구문

1. INNER JOIN - 내부 조인(EQUALS JOIN)

SELECT * 
FROM INFO 
INNER JOIN AUTH 
ON INFO.AUTH_ID = AUTH.AUTH_ID; -- 붙을 수 없는 데이터는 안나옴

2. OUTER JOIN - 외부 조인

  • LEFT JOIN
  • 왼쪽 테이블이 기준이 되고, 왼쪽 테이블은 다 나옴
SELECT *
FROM INFO I
LEFT OUTER JOIN AUTH A
ON I.AUTH_ID = A.AUTH_ID;
  • RIGHT JOIN
  • 오른쪽 테이블이 기준이 되고, 오른쪽 테이블은 다나옴
SELECT *
FROM INFO I
RIGHT OUTER JOIN AUTH A
ON I.AUTH_ID = A.AUTH_ID;
  • FULL OUTER JOIN
  • 양쪽 테이블이 누락 없이 다 나옴
SELECT *
FROM INFO I
FULL OUTER JOIN AUTH A
ON I.AUTH_ID = A.AUTH_ID;

잘못된 조인의 형태

  • 왼쪽 테이블의 한행마다 오른쪽 테이블의 모든 행이 조인됨
  • 오라클에서 카디시안 프로덕트라고 부름
SELECT *
FROM INFO I
CROSS JOIN AUTH A;