[DB-002][입문] SQL로 데이터 조회·추가·수정·삭제하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DB-002][입문] SQL로 데이터 조회·추가·수정·삭제하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 244회 작성일 26-08-29 19:34

본문

[이번 수업]

SQL로 데이터 한 줄을 추가하고, 필요한 줄을 조회하고, 값을 수정하고, 더는 필요 없는 줄을 삭제합니다.

[선수지식]

DB-001의 표·행·열·키 개념과 터미널 사용법을 알면 됩니다. SQLite 명령줄 도구가 필요합니다. Windows는 공식 도구 압축 파일을 받아 sqlite3.exe를 실행하고, macOS·Linux는 터미널에서 sqlite3 --version으로 설치 여부를 확인하세요.

[학습목표]

1. INSERT·SELECT·UPDATE·DELETE의 역할을 구분한다.
2. WHERE로 작업 대상을 제한한다.
3. 기본키와 NOT NULL·CHECK 제약조건을 설명한다.


[핵심개념]

데이터 작업의 네 가지 기본 동작을 CRUD라고 부릅니다. Create는 새 데이터 추가, Read는 조회, Update는 수정, Delete는 삭제입니다. SQL에서는 보통 INSERT, SELECT, UPDATE, DELETE가 각각 대응합니다. CREATE TABLE은 데이터를 넣을 표의 구조를 정의하는 별도 명령입니다.

표는 같은 종류의 행을 모으고 열은 각 값의 의미를 정합니다. PRIMARY KEY는 행을 구분하는 고유한 키입니다. NOT NULL은 값이 비어 있지 않아야 한다는 뜻이고 CHECK는 허용 조건을 지정합니다. 제약조건은 잘못된 데이터를 데이터베이스 가까이에서 막아 줍니다.

INSERT INTO tasks(title) VALUES (...)는 새 행을 넣습니다. SELECT id, title FROM tasks는 원하는 열을 읽고 WHERE는 행을 거릅니다. UPDATE tasks SET done = 1 WHERE id = 1은 조건에 맞는 행을 수정합니다. DELETE FROM tasks WHERE id = 2는 해당 행을 지웁니다. UPDATE나 DELETE에서 WHERE를 생략하면 조건 없이 모든 대상 행에 적용될 수 있으므로 실행 전 같은 WHERE를 붙인 SELECT로 범위를 확인하는 습관이 중요합니다.

[따라하기]

터미널에서 SQLite를 메모리 모드로 엽니다. Windows는 첫 명령, macOS·Linux는 두 번째 명령을 사용합니다.

sqlite3.exe :memory:
sqlite3 :memory:

프롬프트가 나오면 다음을 순서대로 붙여 넣으세요. 각 SQL 문장은 세미콜론으로 끝납니다.

.headers on
.mode column

CREATE TABLE tasks (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  done INTEGER NOT NULL DEFAULT 0 CHECK (done IN (0, 1))
);

INSERT INTO tasks (title)
VALUES ('HTTP 복습'), ('SQL 연습');

SELECT id, title, done
FROM tasks
ORDER BY id;

UPDATE tasks
SET done = 1
WHERE id = 1;

SELECT id, title, done
FROM tasks
ORDER BY id;

DELETE FROM tasks
WHERE id = 2;

SELECT id, title, done
FROM tasks
ORDER BY id;

첫 SELECT에서는 두 행의 done이 0입니다. 두 번째 SELECT에서는 1번 행만 1로 바뀝니다. 마지막 결과는 다음과 같습니다.

id  title      done
--  ---------  ----
1  HTTP 복습  1

UPDATE와 DELETE가 id 조건에 맞는 한 행에만 적용됐습니다. .quit를 입력하면 종료되며 :memory: 데이터는 사라집니다. 파일로 보존하려면 :memory: 대신 lesson.db를 사용하세요.

[흔한 실수]

첫째, 문자열을 작은따옴표로 감싸지 않아 열 이름으로 해석됩니다. 둘째, SQL 끝의 세미콜론을 빼서 입력이 계속됩니다. 셋째, UPDATE·DELETE 전에 WHERE 범위를 확인하지 않습니다. 넷째, id가 항상 연속이라고 가정합니다. 삭제된 번호가 다시 채워진다고 기대하면 안 됩니다. 다섯째, SELECT *에 의존해 열 추가 후 프로그램의 예상 순서가 깨집니다.

[보안 주의]

사용자 입력을 SQL 문자열에 이어 붙이면 SQL 인젝션 위험이 생깁니다. 애플리케이션에서는 Python의 cursor.execute("SELECT title FROM tasks WHERE id = ?", (task_id,))처럼 매개변수 바인딩을 사용하세요. 운영 데이터의 대량 수정·삭제는 먼저 백업하고 트랜잭션 안에서 대상 건수를 확인합니다. 애플리케이션 DB 계정에는 필요한 최소 권한만 주고 개인정보와 인증정보를 예제나 로그에 넣지 마세요. 실습은 본인 소유의 로컬 DB에서만 진행합니다.

[직접 해볼 과제]

'보안 복습' 행을 추가하고 그 행만 완료 상태로 수정하세요. 이어서 done = 1인 행만 조회하고, 삭제 전후 전체 행 수를 SELECT count(*) FROM tasks;로 비교하세요.

[확인문제]

1. CRUD의 네 동작은 어떤 SQL 문과 대응하나요?
2. UPDATE와 DELETE 전에 같은 WHERE를 사용한 SELECT를 실행하는 이유는 무엇인가요?
3. PRIMARY KEY, NOT NULL, CHECK는 각각 무엇을 지키나요?

[다음 학습]

순환 커리큘럼의 다음 글은 OS-002 프로세스·스레드·스케줄링입니다. 데이터베이스 트랙에서는 DB-003 JOIN과 여러 표 연결로 이어집니다.

[공식 참고 자료]

SQLite 명령줄 셸
https://sqlite.org/cli.html

SQLite SELECT
https://sqlite.org/lang_select.html

SQLite INSERT
https://sqlite.org/lang_insert.html

SQLite UPDATE
https://sqlite.org/lang_update.html

SQLite DELETE
https://sqlite.org/lang_delete.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
3,940
어제
6,862
최대
16,772
전체
769,891
Copyright © 소유하신 도메인. All rights reserved.