DataBase/관계형 DB
데이터 조작어 (DML)
sellen
2025. 7. 18. 22:21

💡 이 내용 이후로 모든 SQL 관련 내용은 NomadCoder 강의를 듣고 정리한 글입니다.
아래의 링크에 SQL 학습에 필요한 데이터가 존재합니다.
https://nomadcoders.co/sql-masterclass
아래의 글과 함께 보시면 좋습니다.
개념
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 |
|
|
| IN (A, B, …) |
|
|
| LIKE |
|
|
| % | 문자열 길이 상관없이 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;