[모의해킹 스터디] 2주차 정리

바울·2024년 10월 31일
0

모의해킹 스터디

목록 보기
3/40

예전 글에서 Python Django Queryset을 이용해 Database에 데이터를 추가해 본 적이 있었다. 하지만 SQL를 직접 사용하지 않고 데이터를 추가했기 때문에 이번에는 SQL과 Database에 대해 다뤄보려고 한다.

Database?

데이터베이스(Database)는 구조화된 데이터의 집합체로, 데이터를 효과적으로 저장, 관리, 검색할 수 있도록 설계된 시스템입니다. 이를 통해 빠르고 정확한 정보 검색이 가능해지며, 특히 대용량 데이터를 다루는 환경에서 필수적인 도구로 자리 잡고 있습니다.

Table?

  • 테이블은 데이터베이스에서 데이터를 저장하는 가장 기본적인 단위입니다. 테이블은 행과 열로 이루어져 있으며, 각 테이블은 특정한 주제나 엔티티에 대한 데이터를 저장합니다. 예를 들어, 사용자 정보를 저장하는 users 테이블이나 상품 정보를 저장하는 products 테이블을 만들 수 있습니다.

  • 각 테이블은 데이터의 집합으로, 데이터를 행 단위로 쌓아가며, 각각의 행이 개별 데이터를 나타냅니다.

Column & Row?

  • 컬럼(Column): 컬럼은 데이터베이스 테이블에서 같은 종류의 데이터를 저장하는 세로축의 필드입니다. 예를 들어, 회원 정보 테이블에서 "이름", "이메일", "가입일"과 같은 속성이 각각 컬럼으로 정의됩니다. 컬럼은 테이블에서 각 데이터 항목의 속성을 지정하고, 저장할 데이터 유형(텍스트, 숫자, 날짜 등)을 결정합니다.

  • 로우(Row): 로우는 테이블의 가로축으로, 각 항목에 대한 실제 데이터를 담고 있습니다. 예를 들어, 회원 테이블에서 각 사용자는 하나의 로우로 표현되며, 컬럼의 속성(이름, 이메일 등)에 해당하는 데이터를 가집니다. 즉, 로우는 데이터베이스의 각 인스턴스를 나타내며, 특정 개체의 모든 데이터를 포함합니다.

Schema?

  • 스키마는 데이터베이스의 구조를 정의하는 청사진입니다. 테이블, 열의 데이터 타입, 제약 조건 등을 포함하여 데이터베이스의 전체 구조와 관계를 나타냅니다.

  • 스키마는 데이터베이스 설계의 기반이 되는 요소로, 데이터 무결성과 효율성을 높이는 데 중요한 역할을 합니다.

Key?

키는 데이터베이스에서 데이터의 무결성을 보장하기 위해 사용됩니다.

  • 기본 키(Primary Key): 테이블 내에서 각 행을 고유하게 식별하는 열입니다. 예를 들어, users 테이블에서 각 사용자의 id는 기본 키가 될 수 있습니다.

  • 외래 키(Foreign Key): 한 테이블이 다른 테이블의 기본 키를 참조하는 열로, 테이블 간의 관계를 정의합니다. 외래 키는 데이터베이스의 관계를 형성하고 데이터의 무결성을 유지하는 데 중요한 역할을 합니다.

RDBMS & NoSQL?

  • 관계형 데이터베이스(RDBMS): 테이블 형식으로 데이터를 저장하며, MySQL, PostgreSQL, Oracle 등이 대표적입니다. SQL 언어를 사용하여 데이터를 다루며, 데이터의 무결성과 정확성이 중요한 경우에 많이 사용됩니다.

  • 비관계형 데이터베이스(NoSQL): 문서 지향(Document), 키-값(Key-Value), 그래프(Graph) 데이터베이스 등으로 구성됩니다. MongoDB, Cassandra, Redis 등이 대표적입니다. 대용량 데이터를 빠르게 처리해야 할 때 주로 사용됩니다.

SQL?

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;

0개의 댓글