오늘은 힘들지만 조금씩 신나는 목요일입니다.
SELECT 구문에서 마지막으로 오늘 GROUP BY, HAVING절을 배우는 시간입니다.
• 기본 구문
SELECT 칼럼1, 칼럼2, ...
FROM 테이블_이름
[WHERE 조회_조건]
[GROUP BY 그룹_칼럼
[HAVING 그룹_조건]
[ORDER BY 정렬_칼럼]
• GROUP BY 절
① 같은 값을 가진 데이터들을 하나의 그룹으로 묶어서 처리한다.
② 통계를 내는 목적으로 사용한다. (합계, 평균, 최댓값, 최솟값, 갯수 등)
③ SELECT 절에서 조회하려는 칼럼은 "반드시" GROUP BY 절에 명시되어 있어야 한다.
가지고있는 값이 같으면 모인다!! (통계함수랑 같이씁니다.) 모아서 계산을 해봤더니 이렇더라~
(sum, avg, max, min, count)
ex) 사원 테이블에서 같은 직업을 가진 사원들을 그룹화하여 각 그룹별로 연봉의 평균이 얼마인지 조회하시오.
SELECT JOB_ID
, ROUND( AVG ( SALARY ), 2 ) --소수점 2자리까지 보여준다는뜻
FROM EMPLOYEES
GROUP BY JOB_ID;
ex) 참고. GROUP BY 절 없이 통계내기
SELECT DISTINCT(중복제거) DEPARTMENT_ID
, COUNT(*) OVER(PARTITION BY DEPARTMENT_ID)
, ROUND(AVG (SALARY) OVER(PARTITION BY DEPARTMENT_ID),2)
FROM EMPLOYEES;
• HAVING 절
① GROUP BY 절 이후에 나타난다.
② GROUP BY 절을 이용한 조회 결과에 조건을 지정하는 경우에 사용한다.
③ GROUP BY 절이 필요하지 않는 조건은 WHERE 절로 지정한다.
• HAVING절 vs WHERE절
HAVING절 : 그룹화된 결과를 대상으로 조건을 지정할 때 사용
WHERE절 : 그룹화 하지 않아도 처리할 수 있는 조건을 지정할 때 사용
HAVING절과 WHERE절에서 모두 처리되는 조건이 있다면 언제나 WHERE절에서 처리하는 것이 유리함
where 절로 하면 이미 제거된다 (쿼리문작성하기 좋음 빠르게 실행)
셈플링(모수)를 줄이는게 중요 성능이 더좋아유
기껏다 모은 다음에 하는게 (having절)
ex)
• SELECT 문의 실행 순서★★★
SELECT 칼럼 5번
FROM 테이블 1번(첫번째)
WHERE 조건 2번
GROUP BY 그룹 3번
HAVING 그룹조건 4번
ORDER BY 정렬 6번(마지막)
설명 ) 만약 AS로 별명(부서별사원수)을 한 후 그 별명으로 호출하면 오류이다. 이유는 실행순서 때문이다.
하지만 ORDER BY(DEPT_ID)는 마지막 순서이므로 호출 가능하다!
• 조인
① 2개 이상의 테이블을 한 번에 조회하는 방식이다.
② 각 테이블의 관계(1:M)를 이용해서 조인 조건을 만든다.
③ 조인 종류
1) 내부 조인 : 2개 테이블에 모두 존재하는 데이터만 조회하는 방식
2) 외부 조인 : 2개 테이블에 모두 존재하지 않더라도 조회하는 방식
• 조인 형식 ( ANSI 구문 )
SELECT 테이블1.칼럼, 테이블2.칼럼, ...
FROM 테이블1 JOIN 테이블2
ON 조인_조건
ex) 1:M 라고 하면 회원(1) : 구매 (M)
A, B 회원이 사먹은 내용을 내부조인
C 회원은 구매내역이없어 외부조인으로 가능 즉, 존재하지않은것을 조회 방식
ex) 내부조인 예시 → 겹치는부분을 ON부분에 써줍니다. 별명을 정해준 후 다른 컬럼들 앞에 명시
ex) 외부조인 예시 → 1:M 관계라고 생각하고 FROM 1 RIGHT (LEFT도가능 위치가 중요)OUTER JOIN M
ex) 3개 테이블 조인 예시
3개 테이블 조인은 위와 같이 INNER JOIN을 더 붙여 생성해주면 됩니다.
지금까지 ANSI 타입으로 했을 때구요 ORACLE 타입은
ex) 사원번호, 사원명, 부서번호, 부서명을 조회하시오.
SELECT E.EMPLOYEE_ID
, E.FIRST_NAME
, E.LAST_NAME
, D.DEPARTMENT_ID
, D.DEPARTMENT_NAME
FROM DEPARTMENTS D, EMPLOYEES E -- INNER JOIN 대신 콤마(,)를 사용한다.
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID; -- ON 대신 WHERE을 사용한다.
'코딩기록 저장소 🐕 > 데이터베이스' 카테고리의 다른 글
{집합, 인덱스, 뷰,...} (0) | 2023.07.10 |
---|---|
{서브쿼리 WITH 콩} (0) | 2023.07.07 |
7{ 날 힘들게 하는 함수 } (0) | 2023.07.05 |
{ DML, DQL } (0) | 2023.07.04 |
{ DDL, DML } (0) | 2023.07.03 |