
SELECT5 : SELECT 칼럼
1 : FROM 테이블
2 : WHERE 조건
3 : GROUP BY 그룹
4 : HAVING 그룹조건
6 : ORDER BY 정렬
-- 사원 테이블에서 부서별 사원수를 조회하시오.
-- 가능
SELECT DEPARTMENT_ID, COUNT(*) -- 3
FROM EMPLOYEES -- 1
GROUP BY DEPARTMENT_ID; -- 2
-- 불가능
SELECT DEPARTMENT_ID AS DEPT_ID, COUNT(*) -- 3
FROM EMPLOYEES -- 1
GROUP BY DEPT_ID; -- 2 (GROUP BY 절이 실행되는 순서에서는 DEPT_ID가 존재하지 않기 때문에 오류가 발생)
-- 사원 테이블에서 부서별 연봉 평균과 사원수를 조회하시오. 부서별 사원수가 2명 이상인 부서만 조회하시오.
-- 불가능
SELECT DEPARTMENT_ID AS 부서번호
, ROUND(AVG(SALARY), 2) AS 평균연봉
, COUNT(*) AS 사원수 -- 4
FROM EMPLOYEES -- 1
GROUP BY DEPARTMENT_ID -- 2
HAVING 사원수 >= 2 -- 3 (HAVING 절이 실행되는 순서에서는 "사원수"가 존재하지 않기 때문에 오류가 발생)
ORDER BY DEPARTMENT_ID; -- 5
-- 가능
SELECT DEPARTMENT_ID AS 부서번호
, ROUND(AVG(SALARY), 2) AS 평균연봉
, COUNT(*) AS 사원수 -- 4
FROM EMPLOYEES -- 1
GROUP BY DEPARTMENT_ID -- 2
HAVING COUNT(*) >= 2 -- 3
ORDER BY 부서번호; -- 5 (ORDER BY 절이 실행되기 직전인 SELECT 절에서 "부서번호" 별명이 지정되었기 때문에 사용 가능)
- WHERE 조건문
- 테이블의 데이터 중에서 원하는 데이터만 선택적으로 조회하고자 할 때 사용하는 절
- 칼럼 이름, 연산자, 상수 값, 표현식 등을 결합하여 다양한 형태로 작성
’)로 묶어서 작성’)로 묶어서 작성하거나 TO_DATE / TO_TIMESTAMP 함수로 작성IS NULL 또는 IS NOT NULL
- 상수 값은 대/소문자를 구분하므로 주의해야 함
- WHERE MODEL =
‘A120’과- WHERE MODEL =
‘a120’은 다른 조건식이므로 다른 결과가 조회됨
PK, UNIQUE 칼럼은 자동으로 인덱스가 추가되므로 조건으로 사용하면 유리함함수 등으로 가공하면 인덱스를 사용할 수 없음
- 같은 값을 가진 데이터들을 하나의 그룹으로 묶어서 처리한다.
- 통계를 내는 목적을 사용한다. (합계, 평균, 최댓값, 최솟값, 갯수 등)
- SELECT 절에서 조회하려는 칼럼은 "반드시" GROUP BY 절에 명시되어 있어야 한다.
-- 1. 사원 테이블에서 동일한 부서번호를 가진 사원들을 그룹화하여 각 그룹별로 몇 명의 사원이 있는지 조회하시오.
SELECT DEPARTMENT_ID -- GROUP BY 절에서 지정한 칼럼만 조회할 수 있다.
, COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
SELECT 집계함수(
컬럼명) OVER(PARTITION BY컬럼명)
FROM테이블명;
-- 참고. GROUP BY 절 없이 통계내기
SELECT DISTINCT DEPARTMENT_ID
, COUNT(*) OVER(PARTITION BY DEPARTMENT_ID)
, ROUND(AVG(SALARY) OVER(PARTITION BY DEPARTMENT_ID), 2)
FROM EMPLOYEES;
- GROUP BY 절 이후에 나타난다.
- GROUP BY 절을 이용한 조회 결과에 조건을 지정하는 경우에 사용한다.
- GROUP BY 절이 필요하지 않는 조건은
WHERE절로 지정한다.
(성능 향상의 문제)HAVING 처리-- 4. 사원 테이블에서 각 부서별 사원수가 20명 이상인 부서를 조회하시오.
-- 조건 : 부서별사원수 >= 20
-- 조건에서 사용되는 부서별사원수는 GROUP BY절이 필요하므로 HAVING 처리
SELECT DEPARTMENT_ID
, COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*) >= 20;
WHERE 처리-- 5. 사원 테이블에서 각 부서별 사원수를 조회하시오. 단, 부서번호가 없는 사원은 제외하시오.
-- 조건 : 부서번호 IS NOT NULL
-- 조건에서 사용되는 부서번호는 GROUP BY 절이 필요 없으므로 WHERE 절로 처리
SELECT DEPARTMENT_ID
, COUNT(*)
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID;
ASC(Ascending), 내림차순 정렬은 DESC(Descending)
- 타입이 다른 데이터가 섞여 있는 경우 아래 기준으로 동작
- 문자
- 영문 : 알파벳 순
- 한글 : 가나다 순
- 숫자
작은 숫자를 먼저 출력- 날짜
과거 날짜를 먼저 출력- NULL
-- 11. 사원 테이블의 사원들을 연봉순으로 조회하기 (높은 연봉을 먼저 조회)
SELECT *
FROM EMPLOYEES
ORDER BY SALARY; -- 기본 정렬 방식은 오름차순이다.
-- ASC(오름차순)는 생략 가능
SELECT *
FROM EMPLOYEES
ORDER BY SALARY ASC; -- ASC : Ascending(오름차순)
SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC; -- DESC : Descending(내림차순)
SELECT
DISTINCT칼럼명 FROM 테이블명;
* Asterisk : 모든 칼럼 조회*를 금지한다 (이유 : 성능 떨어짐)별명을 지정해서 조회할 수 있다SELECT 칼럼명
AS별명 FROM 테이블명;
AS를 사용하거나 생략도 가능하다(생략은 권장X)띄어쓰기(공백)