DB/sqld

DML

원2 2025. 12. 22. 17:44
728x90
반응형

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 문 실제 실행 순서

  1. FROM: 데이터를 가져올 테이블을 결정(여기서 JOIN 처리)
  2. WHERE: 가져온 데이터에서 행(Row) 단위로 조건을 검사하여 필터링 (그룹화 전 처리)
  3. GROUP BY: 남은 행들을 지정된 컬럼을 기준으로 그룹으로 묶음
  4. HAVING: 묶은 그룹에 조건을 검사하여 필터링 (집계 함수 사용 가능)
  5. SELECT: 그룹화 및 필터링이 완료된 데이터에서 표시할 컬럼이나 집계 값을 계산하여 선택
  6. 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

서브쿼리의 결과가 한 줄이라도 존재하느냐만 따짐 (존재여부)

 


 

 

728x90
반응형

'DB > sqld' 카테고리의 다른 글

[sqld]엔티티 / 속성과 도메인  (0) 2025.09.03
[sqld] 데이터 모델링  (0) 2025.09.03