image.png

SELECT

--- 중복 제거
SELECT DISTINCT DEPARTMENT FROM EMPLOYEES;

WHERE 조건절

--- IN 연산자 (OR 대체)
WHERE DEPARTMENT IN ('IT', 'HR', 'Finance')
    
--- BETWEEN (이상, 이하 범위)
WHERE SALARY BETWEEN 2000 AND 5000;

--- NULL 체크
IFNULL(column, '대체값')       -- NULL이면 대체값
WHERE column IS NULL           -- NULL인 행
WHERE column IS NOT NULL       -- NULL 아닌 행
COALESCE(col1, col2, '기본값') -- 첫 번째 NULL 아닌 값

LIKE

--- % : 0개 이상의 임의 문자
WHERE NAME LIKE '김%' --- 김으로 시작
WHERE NAME LIKE '춘%' --- 춘으로 끝
WHERE NAME LIKE '%민%' --- 민 포함

--- _ : 정확히 1개 임의 문자
WHERE CODE LIKE 'A_01' --- A?01 형태

집계 함수 그룹별로 집계 후, HAVING으로 그룹 필터링

SELECT
    COUNT(*),           --- NULL 포함
    COUNT(MANAGER_ID),  --- NULL 제외
    SUM(SALARY),
    AVG(SALARY),
    MAX(SALARY),
    MIN(SALARY)
FROM EMPLOYEES

GROUP BY (~별로)

-- 기본: 그룹별 집계
SELECT dept, COUNT(*) AS cnt
FROM employees
GROUP BY dept

-- HAVING: 집계 결과에 조건
SELECT dept, COUNT(*) AS cnt
FROM employees
GROUP BY dept
HAVING cnt >= 5
-- 규칙: SELECT에서 집계함수 안 쓴 컬럼은 전부 GROUP BY에
-- SELECT에 집계함수, 컬럼있으면 GROUP BY 필수

COUNT

--- 조건부 COUNT (CASE 활용)
SELECT
	COUNT(CASE WHEN GENDER = 'M' THEN 1 END) AS MALE
  COUNT(CASE WHEN GENDER = 'F' THEN 1 END) AS FEMALE
FROM EMPLOYEES;

--- DISTINCT + COUNT L: 중복 없는 갯수
SELECT COUNT(DISTINCT USER_ID) AS UNIQUE_USERS
FROM ORDERS

JOIN

SELECT * FROM A JOIN B ON A.id = B.id -- INNER JOIN: 양쪽 다 있는 것만
SELECT * FROM A LEFT JOIN B ON A.id = B.id -- LEFT JOIN: A 기준, B에 없으면 NULL
SELECT * FROM A JOIN B ON (A.CODE & B.SKILL_CODE) = A.CODE -- 비트 연산 JOIN 

-- 3개 테이블 JOIN
SELECT * FROM A
JOIN B ON A.id = B.a_id
JOIN C ON B.id = C.b_id

--- 없는 것 찾기 (부서가 없는 직원)
SELECT e.name
FROM employees AS e
LEFT JOIN department AS d ON e.dept_id = d.dept_id
WHERE d.dept_id IS NULL;
	
--- 직원과 그 상사 이름 함께 조회
SELECT e.name AS employee, m.name AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.emp_id;

FROM 서브쿼리 (인라인뷰)

SELECT dept_id, avg_sal
FROM (
	SELECT department AS dept, 
	       AVG(salary) AS avg_sal
  FROM employees
  GROUP BY department
) AS dept_avg
WHERE avg_sal >= 4000

WHERE 서브 쿼리

--- 평균 이상 급여 직원
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)

--- IN + 서브 쿼리
SELECT name
FROM employees
WHERE dept_id IN (
    	SELECT dept_id
      FROM departments
      WHERE location = 'Seoul'
);