예전 글에서 Python Django Queryset을 이용해 Database에 데이터를 추가해 본 적이 있었다. 하지만 SQL를 직접 사용하지 않고 데이터를 추가했기 때문에 이번에는 SQL과 Database에 대해 다뤄보려고 한다.
데이터베이스(Database)는 구조화된 데이터의 집합체로, 데이터를 효과적으로 저장, 관리, 검색할 수 있도록 설계된 시스템입니다. 이를 통해 빠르고 정확한 정보 검색이 가능해지며, 특히 대용량 데이터를 다루는 환경에서 필수적인 도구로 자리 잡고 있습니다.
테이블은 데이터베이스에서 데이터를 저장하는 가장 기본적인 단위입니다. 테이블은 행과 열로 이루어져 있으며, 각 테이블은 특정한 주제나 엔티티에 대한 데이터를 저장합니다. 예를 들어, 사용자 정보를 저장하는 users 테이블이나 상품 정보를 저장하는 products 테이블을 만들 수 있습니다.
각 테이블은 데이터의 집합으로, 데이터를 행 단위로 쌓아가며, 각각의 행이 개별 데이터를 나타냅니다.

컬럼(Column): 컬럼은 데이터베이스 테이블에서 같은 종류의 데이터를 저장하는 세로축의 필드입니다. 예를 들어, 회원 정보 테이블에서 "이름", "이메일", "가입일"과 같은 속성이 각각 컬럼으로 정의됩니다. 컬럼은 테이블에서 각 데이터 항목의 속성을 지정하고, 저장할 데이터 유형(텍스트, 숫자, 날짜 등)을 결정합니다.
로우(Row): 로우는 테이블의 가로축으로, 각 항목에 대한 실제 데이터를 담고 있습니다. 예를 들어, 회원 테이블에서 각 사용자는 하나의 로우로 표현되며, 컬럼의 속성(이름, 이메일 등)에 해당하는 데이터를 가집니다. 즉, 로우는 데이터베이스의 각 인스턴스를 나타내며, 특정 개체의 모든 데이터를 포함합니다.

스키마는 데이터베이스의 구조를 정의하는 청사진입니다. 테이블, 열의 데이터 타입, 제약 조건 등을 포함하여 데이터베이스의 전체 구조와 관계를 나타냅니다.
스키마는 데이터베이스 설계의 기반이 되는 요소로, 데이터 무결성과 효율성을 높이는 데 중요한 역할을 합니다.

키는 데이터베이스에서 데이터의 무결성을 보장하기 위해 사용됩니다.
기본 키(Primary Key): 테이블 내에서 각 행을 고유하게 식별하는 열입니다. 예를 들어, users 테이블에서 각 사용자의 id는 기본 키가 될 수 있습니다.
외래 키(Foreign Key): 한 테이블이 다른 테이블의 기본 키를 참조하는 열로, 테이블 간의 관계를 정의합니다. 외래 키는 데이터베이스의 관계를 형성하고 데이터의 무결성을 유지하는 데 중요한 역할을 합니다.

관계형 데이터베이스(RDBMS): 테이블 형식으로 데이터를 저장하며, MySQL, PostgreSQL, Oracle 등이 대표적입니다. SQL 언어를 사용하여 데이터를 다루며, 데이터의 무결성과 정확성이 중요한 경우에 많이 사용됩니다.
비관계형 데이터베이스(NoSQL): 문서 지향(Document), 키-값(Key-Value), 그래프(Graph) 데이터베이스 등으로 구성됩니다. MongoDB, Cassandra, Redis 등이 대표적입니다. 대용량 데이터를 빠르게 처리해야 할 때 주로 사용됩니다.
SQL(Structured Query Language)은 데이터베이스와 상호작용하고 데이터를 관리하기 위한 언어입니다. SQL은 특히 관계형 데이터베이스에서 데이터를 조회, 추가, 수정, 삭제하는 데 필수적이며, 데이터베이스의 구조를 정의하고 제어할 수 있는 여러 기능을 제공합니다.
1. 데이터 쿼리
데이터 쿼리(Query)는 데이터베이스에서 원하는 데이터를 검색하거나 조회하는 작업입니다. 이 작업을 위해 SQL에서는 SELECT 명령어를 사용합니다.
SELECT
- SELECT 문은 데이터베이스에서 특정 열이나 조건에 맞는 데이터를 조회할 때 사용됩니다.
- 예를 들어, 특정 테이블에서 이름과 이메일을 조회하는 쿼리는 다음과 같습니다.
SELECT name, email FROM users;
- 필터링 조건을 추가해 특정 조건에 맞는 데이터만 조회할 수도 있습니다.
SELECT * FROM users WHERE age > 20;JOIN
- JOIN은 두 개 이상의 테이블을 연결해 필요한 데이터를 가져오는 기능입니다. 관계형 데이터베이스에서 테이블 간 관계를 활용하는 데 매우 유용합니다.
SELECT users.name, orders.order_id FROM users JOIN orders ON users.id = orders.user_id;
2. 데이터 수정
SQL에서는 데이터를 추가하고 수정하거나 삭제하는 작업을 통해 데이터베이스를 유지관리할 수 있습니다. 이러한 작업을 위해 INSERT, UPDATE, DELETE 명령어가 사용됩니다.
INSERT
- 새로운 데이터를 테이블에 추가할 때 사용합니다. 예를 들어, 새로운 사용자를 추가하는 쿼리는 다음과 같습니다.
INSERT INTO users (name, email, age) VALUES ('bawool', 'bawool@example.com', 25);UPDATE
- 기존 데이터를 수정할 때 사용합니다. 특정 사용자의 이메일을 변경하는 경우는 다음과 같습니다.
UPDATE users SET email = 'new_email@example.com' WHERE name = 'bawool';DELETE
- 데이터를 삭제할 때 사용합니다. 예를 들어, 특정 사용자를 삭제하려면 다음과 같이 쿼리합니다.
DELETE FROM users WHERE name = 'bawool';
3. 데이터베이스 관리
SQL은 데이터베이스의 구조를 정의하고 관리하는 역할도 합니다. 이를 위해 CREATE, ALTER, DROP 명령어가 사용됩니다.
CREATE
- 데이터베이스, 테이블 등을 새로 생성할 때 사용합니다. 예를 들어, 새로운 테이블을 생성하는 쿼리는 다음과 같습니다.
CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), age INT );ALTER
- 기존 테이블의 구조를 변경할 때 사용합니다. 예를 들어, 새로운 열을 추가하는 쿼리는 다음과 같습니다.
ALTER TABLE users ADD COLUMN phone VARCHAR(20);DROP
- 테이블이나 데이터베이스를 삭제할 때 사용합니다. 예를 들어, 특정 테이블을 삭제하려면 다음과 같이 쿼리합니다.
DROP TABLE users;
데이터 무결성을 보장하기 위해 SQL은 다양한 제약 조건을 제공합니다. 데이터 무결성은 데이터가 정확하고 일관되게 유지되는 것을 의미합니다.
PRIMARY KEY: 테이블의 각 행을 고유하게 식별하는 열에 적용됩니다.
FOREIGN KEY: 두 테이블 간의 관계를 정의할 때 사용되며, 참조 무결성을 보장합니다.
NOT NULL: 열이 반드시 값을 가져야 할 때 사용합니다.
UNIQUE: 열에 고유한 값이 저장되도록 제한합니다.
SQL은 데이터베이스의 작업 단위를 트랜잭션으로 관리할 수 있습니다. 트랜잭션은 여러 SQL 명령어를 하나의 단위로 묶어 처리하는 방식으로, 데이터 무결성을 보장하는 데 중요한 역할을 합니다.
BEGIN TRANSACTION: 트랜잭션을 시작합니다.
COMMIT: 트랜잭션에서 변경된 내용을 데이터베이스에 저장합니다.
ROLLBACK: 트랜잭션에서 변경된 내용을 취소합니다.
예를 들어, 다음과 같은 트랜잭션 처리는 데이터가 중간에 잘못 입력되지 않도록 보호할 수 있습니다.
BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; COMMIT;