SQL 문의 3가지 종류
DDL (Data Definition Language) - 구조 정의
목표: 데이터베이스의 테이블이나 구조를 정의/생성/변경/삭제합니다.
주요 명령어
- CREATE: 테이블, 뷰, 인데스 생성
- ALTER: 구조 변경 (컬럼 추가/삭제/변경)
- DROP: 구조 자체를 삭제 (테이블 전체 삭제)
DCL (Data Control Language) - 접근 제어
목표: 데이터베이스에 대한 접근 권한을 부여하거나 회수합니다.
주요 명령어
- GRANT: 권한 부여 (예: SELECT 권한 부여)
- REVOKE: 권한 회수
DML (Data Mainpolation Language) - 데이터 조작
목표: 테이블 안에 있는 실제 데이터를 검색, 삽입, 수정, 삭제합니다.
주요 명령어
- SELECT: 데이터 검색
- INSERT: 데이터 삽입
- UPDATE: 데이터 수정
- DELETE: 데이터 삭제
DML (SELECT 문) 심화
기본 구문
- WHERE: 조건 필터링 (AND,OR,BETWEEN,IN,LIKE)
- ORDER BY: 정렬 (ASC 오름차순, DESC 내림차순)
집계 및 그룹화
집계 함수: COUNT, SUM, AVG, MAX, MIN
- GROUP BY: 특정 컬럼을 기준으로 그룹화
- HAVING: GROUP BY 로 묶인 결과에 다시 조건을 걸 때 사용 (WHERE 은 그룹화 전에 사용)
테이블 간 관계
JOIN의 종류
- INNER JOIN: 두 테이블에서 일치하는 행만 변환
- LEFT JOIN / RIGHT JOIN: 한쪽 테이블의 모든 행을 포함하여 변환
서브쿼리 (Subquery)
SELECT 문 안에 또 다른 SELECT 문을 넣어 사용하는 방법
WHERE 절에 사용하는 서브쿼리 (조건 비교), FROM 절에 사용하는 서브쿼리 (가상 테이블 생성)
* 서브쿼리는 가장 안쪽 쿼리부터 순서대로 실행된다
1. SELECT 문의 기본 구조와 동작 순서
A. SELECT 문 기본 구조 (작성순서)
SELECT 컬럼명들, 집계함수(컬럼)
FROM 테이블명
WHERE 조건식
GROUP BY 그룹 컬럼명
HAVING 그룹 조건식
ORDER BY 정렬 컬렴명 [ASC/DESC];
B. SELECT 문 실제 실행 순서
- FROM: 데이터를 가져올 테이블을 결정(여기서 JOIN 처리)
- WHERE: 가져온 데이터에서 행(Row) 단위로 조건을 검사하여 필터링 (그룹화 전 처리)
- GROUP BY: 남은 행들을 지정된 컬럼을 기준으로 그룹으로 묶음
- HAVING: 묶은 그룹에 조건을 검사하여 필터링 (집계 함수 사용 가능)
- SELECT: 그룹화 및 필터링이 완료된 데이터에서 표시할 컬럼이나 집계 값을 계산하여 선택
- ORDER BY: 최종 결과를 지정된 컬럼을 기준으로 정렬
2. DML 기초 명령어
SELECT (검색)
-- 모든 컬럼(*)과 모든 행을 검색
SELECT * FROM 테이블명;
-- 특정 컬럼만 검색
SELECT 이름, 학과, FROM 학생;
-- 중복 제거
SELECT DISTINCT 학과 FROM 학생;
-- 별칭 사용
SELECT 이름 AS 학생이름, 학과 FROM 학생;
WHERE 절 (조건 필터링)
| 연산자 | 용도 | 예시 |
| AND, OR | 여러 조건 결합 | WHERE 학과='컴퓨터' AND 학년=4 |
| BETWEEN | 범위 지정 | WEHRE 점수 BETWEEN 80 AND 90 (80과 90 포함) |
| IN | 목록 중 하나 | WHERE 학과 IN ('컴퓨터', '경영') |
| LIKE | 패턴 검색 | WHERE 이름 LIKE '김%' (김으로 시작) |
| IS NULL | NULL 값 확인 | WHERE 연락처 IS NULL |
집계 함수(AGGREGATE FUNCTIONS)
데이터를 요약하고 통계를 내는 데 필수적 , 집계 함수는 여러 행의 값을 하나의 결과 값으로 묶어 계산
SELECT 절이나 HAVING 절에 주로 사용
| 함수 | 용도 | 예시 |
| COUNT | 행의 개수 (레코드 수) 계산 | COUNT(*) : 전체 레코드 수 |
| SUM | 숫자 컬럼의 합계 계산 | SUM(점수) |
| AVG | 숫자 컬럼의 평균 계산 | AVG(점수) |
| MAX | 컬럼 값 중 최댓값 계산 | MAX(점수) |
| MIN | 컬럼 값 중 최솟값 계산 | MIN(점수) |
GROUP BY (그룹화)
GROUP BY는 테이블의 행들을 특정 컬럼의 값을 기준으로 그룹으로 묶음
그룹화된 데이터는 집계 함수를 통해 요약될 수 있음
SELECT
학과, -- (A) 그룹 기준 컬럼
COUNT(*) AS 학생수 -- (B) 그룹별 집계 함수 적용
FROM
학생 테이블
GROUP BY
학과; --(C) '학과' 기준으로 묶음
------------
학과 학생수
컴퓨터 10
경영 15
디자인 5
-------------
WHERE vs. HAVING
WHERE와 HAVING은 모두 조건을 걸어 필터링하지만, 적용되는 대상과 시점이 다름
| 구분 | WHERE 절 | HAVING 절 |
| 적용 대상 | 개별 행(Row) | 그룹 (Group) |
| 사용 시점 | GROUP BY 이전 (데이터를 그룹화하기 전에 거름) | GROUP BY 이후 (그룹화된 결과에서 거름) |
| 집계 함수 사용 | 사용 불가 (집계 함수는 그룹화 후에만 의미 있음) | 사용 가능 (그룹별 통계 결과를 조건으로 사용) |
예시: WHERE와 HAVING의 비교
-- 예시 테이블
학과 이름 점수
컴퓨터 김철수 90
컴퓨터 이영희 70
경영 박민수 85
경영 최지아 95
SELECT
학과,
AVG(점수) AS 평균점수
FROM
학생 테이블
WHERE
점수 >= 80 -- 1단계: 80점 미만(이영희) 제거 (WHERE)
GROUP BY
학과
HAVING
AVG(점수) >= 90; -- 2단계: 그룹 평균이 90점 이상인 그룹만 선택 (HAVING)
-- 결과
학과 평균점수
컴퓨터 90
경영 90
JOIN
| 구분 | 특징 | |
| INNER JOIN | 양쪽 테이블 모두 데이터가 존재하는 경우만 | |
| LEFT OUTER JOIN | 왼쪽 테이블의 모든 데이터 출력, 오른쪽 테이블에 데이터가 없으면 NULL | |
| RIGHT OUTER JOIN | 오른쪽 테이블의 모든 데이터 출력, 왼쪽 테이블에 데이터가 없으면 NULL | |
Subquery
쿼리 안의 쿼리, 전체 쿼리(Main Query)를 실행하기 위해 필요한 중간 결과 값을 구하는 용도
괄호 안의 서브쿼리를 먼저 실행하고 그 결과를 이용해 바깥쪽 쿼리를 실행
서브쿼리가 쓰이는 위치 3가지
1. WHERE 절에 오는 서브 쿼리 (중첩 서브쿼리)
- 평균 급여보다 많이 받는 사원의 이름을 조회해라
SELECT 이름
FROM 사원
WHERE 급여 > (
SELECT AVG(급여)
FROM 사원
);
2. FROM 절에 오는 서브쿼리 (인라인 뷰, Inline View)
- 서브쿼리의 결과 자체를 하나의 임시 테이블처럼 취급
- 특징: 반드시 별칭(Alias)을 붙여줘야 하는 경우가 많음
SELECT a.이름, a.급여
FROM (
SELECT *
FROM 사원
WHERE 부서='영업'
) AS a; -- 영업부만 모은 임시 테이블
3. SELECT 절에 오는 서브쿼리
- 하나의 컬럼처럼 사용됨, 단 하나의 값(1행 1열)만 반환해야함
서브쿼리 사용 시 주의점
1. 단일행 vs 다중행
- 서브쿼리 결과가 1개라면 =, >, < 연산자 사용 가능
- 서브쿼리 결과가 여러 개라면 IN, ANY, ALL, EXISTS 같은 다중행 연산자를 사용해야함
2. 괄호 필수
3. ORDER BY 금지: 서브쿼리 내부에서는 정렬을 사용할 수 없음
다중행 연산자-
IN
서브쿼리 결과 중 하나라도 일치하는 게 있으면 참
WHERE 부서코드 IN (10, 20) -> 부서코드가 10이거나 20인 사람 모두 출력
ANY/ SOME
서브쿼리 결과물들과 하나하나 비교해서 하나라도 만족하면 참
주로 비교연산자 (>, <)와 함께 씀
> ANY (최솟값보다 크면): 결과 중 가장 작은 것보다만 크면 참
< ANY (최댓값보다 작으면): 결과 중 가장 큰 것보다만 작으면 참
ALL
서브쿼리 결과물 모두를 동시에 만족해야함
> ALL (최댓값보다 크면): 결과 중 가장 큰놈보다 커야 참
< ALL (최솟값보다 작으면): 결과 중 가장 작은 놈보다도 작아야 참
EXISTS
서브쿼리의 결과가 한 줄이라도 존재하느냐만 따짐 (존재여부)
'DB > sqld' 카테고리의 다른 글
| [sqld]엔티티 / 속성과 도메인 (0) | 2025.09.03 |
|---|---|
| [sqld] 데이터 모델링 (0) | 2025.09.03 |