sellen

데이터 조작어 (DML) 본문

DataBase/관계형 DB

데이터 조작어 (DML)

sellen 2025. 7. 18. 22:21

💡 이 내용 이후로 모든 SQL 관련 내용은 NomadCoder 강의를 듣고 정리한 글입니다.
아래의 링크에 SQL 학습에 필요한 데이터가 존재합니다.
https://nomadcoders.co/sql-masterclass
아래의 글과 함께 보시면 좋습니다.

2025.07.15 - [Programming/DataBase] - 데이터 조작어 (DML)

개념

Data Manipulation Language - 데이터 조작어


INSERT

INSERT INTO {테이블 명} VALUES (입력할 레코드)
  • 데이터는 컬럼의 순서에 맞춰서 입력해야 한다.
  • 모든 컬럼에 대해 생략하는 것 없이 전부 값을 입력해야 한다.
INSERT INTO {테이블 명} (입력할 컬럼 명) VALUES (입력할 레코드)
  • 원하는 컬럼에 대한 데이터만 입력하고 나머지는 NULL이 입력된다.
  • ()에 입력한 컬럼의 순서에 맞춰서 데이터를 입력해야 한다.

단일 레코드 입력

/*
CREATE TABLE movies (
    title,
    released,
    overview,
    rating,
    director
);
*/

INSERT INTO movies VALUES (
	'The Godfather',
	1980,
	'The best movie in the world',
	10,
	'F.F.c' -- 이 부분은 update를 통해 변경할 예정
);

-- 특정 컬럼 지정           
INSERT INTO movies (title, rating) VALUES ('변호사', 7);

다중 레코드 입력

INSERT INTO movies VALUES
        ('Iron Man', 2007, NULL, 10, 'Jon Favreau'),
        ('Thor', 2010, 'Thor : God of Thunder', 8, 'Sir Kenneth Branagh');
                       
-- 특정 컬럼 지정
INSERT INTO movies (title, rating) VALUES 
	('Kung Fu Panda', 9),
	('How to Train Your Dragon', 7);

UPDATE

UPDATE {테이블 명} SET {변경할 컬럼 = 업데이트할 데이터} WHERE {변경할 레코드를 찾을 조건문}
  • 조건문에서 NULL인 값을 찾을 경우 {Column} = NULL이 아니라 {Column} IS NULL을 사용한다
UPDATE movies set director = 'F.F.C' WHERE title = 'The Godfather';

DELETE

WHERE로 조건을 지정하지 않을 경우 테이블 내의 모든 데이터가 삭제된다.

DELETE FROM {테이블 명} WHERE {변경할 레코드를 찾을 조건문};

SELECT

SELECT 명령문은 FROM을 통해 테이블을 먼저 조회하고 SELECT를 통해 특정 컬럼을 가져온다.

SELECT {컬럼 명} FROM {테이블 명} WHERE {조건문}
-- 조건문에 해당하는 모든 컬럼 테이블 반환
SELECT * FROM {테이블 명} WHERE {조건문}
SELECT title, rating FROM movies;
SELECT * FROM movies;
-- 컬럼에 함수를 사용할 수 있다.
-- AS를 통해 테이블에 표시할 이름을 변경할 수 있다.
SELECT
    replace(title, ':', ' - ') AS Title,
    rating * 2 AS Double_Rating,
    upper(overview) AS Overview_Upper
FROM movies;

WHERE

SELECT count(*)
FROM movies
WHERE
    director != 'Guy Ritchie'; -- '!= == <>' 둘 다 같은 역할
    
SELECT *
FROM movies
WHERE
    rating > 9
   OR (rating IS NULL AND genres = 'Documentary'); -- NULL 값을 찾기 위해 IS NULL 사용

구문 설명

BETWEEN A AND B
  • A ≤ records ≤ B를 만족하는 모든 레코드
  • 이때 A는 B보다 작아야 한다.
IN (A, B, …)
  • A 또는 B 또는 …
  • column = A OR column = B
  • NOT IN을 사용할 경우 ( ) 안에 있는 값을 포함하지 않는 레코드를 찾는다.
LIKE
  • 와일드카드와 함께 패턴과 일치하는 레코드를 찾는 데 사용
  • LIKE ‘text’
% 문자열 길이 상관없이
LIKE ‘%kimchi’ → kimchi로 끝나는 모든 텍스트
_  무작위 1 글자
LIKE ‘_kimchi’ → 무작위 1 글자 + kimchi ⇒ kimchi로 끝나는 7글자

CASE

  • 조건 목록을 선언하고 조건에 따라 표현식을 반환
  • 다른 프로그래밍 언어의 If-Else와 유사
SELECT
    title,
    CASE
        WHEN rating >= 8 THEN '👍'
        WHEN rating <= 6 THEN '👎'
        ELSE '👀' -- ELSE가 없을 경우 6과 8사이의 값 들은 NULL로 출력된다.
        END AS Recommend -- AS를 사용하지 않을 경우 CASE ~ END 까지 입력한 내용이 전부 나온다.
FROM movies;

ORDER BY

조회한 레코드들을 특정 조건에 따라 정렬

옵션 설명
ASC 오름차순 (옵션을 입력하지 않을 경우 ASC로 설정된다.)
DESC 내림차순
SELECT
    *
FROM movies
WHERE
    director = 'Darren Aronofsky'
order by revenue DESC;
SELECT
    *
FROM movies
order by
    release_date DESC, -- 먼저 realease_date에 대해 내림차순 정렬
    revenue DESC; -- 그 후, 같은 realease_date 값에 대해 revenue를 기준으로 내림차순 정렬

LIMIT & OFFSET

옵션 설명
LIMIT 표시할 레코드의 개수를 정함
OFFSET 건너뛸 행의 수를 정함
SELECT *
FROM movies
LIMIT 5 -- 5개의 레코드만 표시
OFFSET 2 * 5; -- 10번째까지 건너뛰고 11번째부터 가져옴

GROUP BY

동일한 데이터를 묶어 그룹으로 정렬

SQLite에 내장된 집계 함수 들 : https://www.sqlite.org/lang_aggfunc.html

SELECT
    director,
    revenue, -- 단순히 revenue만 입력할 경우 해당 그룹 revenue의 최솟값을 출력한다.
    max(revenue) AS MAX,
    min(revenue) AS MIN,
    SUM(revenue) AS Total_Revenue, -- 해당 그룹의 모든 revenue을 합산하여 출력
    AVG(runtime) AS Runtime_AVG, -- 해당 그룹의 모든 runtime에 대한 평균값을 출력
    AVG(rating) AS Rating_AVG
FROM movies
WHERE
    director IS NOT NULL AND revenue IS NOT NULL
GROUP BY director
ORDER BY
    Rating_AVG DESC, Total_Revenue DESC;

가장 평점이 높았던 연도를 조회하는 쿼리

SELECT
    release_date,
    round(AVG(rating), 2) AS Rating_AVG -- 연도 별로 그룹화된 평점을 평균을 계산하여 반올림
FROM movies
WHERE
    director IS NOT NULL AND rating IS NOT NULL AND release_date IS NOT NULL
GROUP BY release_date
ORDER BY Rating_AVG DESC;

주의점

  • GROUP BY를 실행하고 집계 함수를 사용하지 않아도 병합은 발생한다.
  • 이렇게 실행할 경우 연도를 기준으로 그룹화했으므로 연도가 중복되지 않게 출력된다.
SELECT
    release_date
FROM movies
WHERE
    director IS NOT NULL AND rating IS NOT NULL AND release_date IS NOT NULL
GROUP BY release_date
ORDER BY Rating_AVG DESC;
  • GROUP BY 하지 않은 column을 조회할 경우 해당 column이 속한 그룹의 마지막 행을 가져온다.
  • 이렇게 실행할 경우 그룹화된 연도의 마지막 title을 출력하게 된다.
SELECT
    release_date,
    title
FROM movies
WHERE
    director IS NOT NULL AND rating IS NOT NULL AND release_date IS NOT NULL
GROUP BY release_date
ORDER BY Rating_AVG DESC;
  • GROUP BY를 사용하지 않고 집계 함수를 사용할 경우 해당 테이블 전체를 하나의 그룹으로 간주한다.
  • 이렇게 실행할 경우 모든 데이터의 평균을 출력하게 된다.
SELECT
    release_date,
    round(AVG(rating), 2) AS Rating_AVG 
FROM movies
WHERE
    director IS NOT NULL AND rating IS NOT NULL AND release_date IS NOT NULL
ORDER BY Rating_AVG DESC;

HAVING

  • GROUP BY 절에 의해 생성된 컬럼에 추가적인 조건을 지정
  • 그룹 필터링을 한다.
SELECT
    release_date,
    round(AVG(rating), 2) AS Rating_AVG
FROM movies
WHERE
    director IS NOT NULL AND rating IS NOT NULL AND release_date IS NOT NULL
GROUP BY release_date
-- SELECT가 HAVING 다음에 실행되지만 sql문을 처리할 때 자동으로 Rating_AVG를 식별한다.
HAVING Rating_AVG >= 6 -- 그룹화와 집계함수로 새로 생성된 Rating_AVG 컬럼에 대해 조건 지정
ORDER BY  Rating_AVG DESC;
SELECT
    release_date,
    round(AVG(rating), 2) AS Rating_AVG
FROM movies
WHERE
    director IS NOT NULL AND rating IS NOT NULL AND release_date IS NOT NULL
  AND Rating_AVG >= 6 -- SELECT보다 WHERE이 먼저 실행되므로 오류 발생
GROUP BY release_date
ORDER BY  Rating_AVG DESC;

'DataBase > 관계형 DB' 카테고리의 다른 글

SubQuery & CTE 문제 풀기  (0) 2025.07.18
SubQuery & CTE  (0) 2025.07.18
DML - 연습문제  (0) 2025.07.18
데이터 정의어 (DDL)  (1) 2025.07.18
SQLite 설치  (1) 2025.07.18