이번 글에서는 Supabase와 PostgreSQL의 개념과 역할을 설명하고, SQL을 활용하여 데이터베이스와 테이블을 생성하고 데이터를 다루는 방법을 실습해 보겠습니다. 특히 Supabase를 활용해 간단히 데이터베이스를 생성하고, 테이블을 만들고 데이터를 삽입하는 과정을 설명합니다. 또한 실습 문제와 퀴즈를 통해 관계형 데이터베이스의 주요 특징과 SQL 구문을 이해해보겠습니다.
Supabase는 오픈 소스 Firebase 대안으로 많이 사용되는 백엔드 서비스입니다. PostgreSQL을 기반으로 하여 인증, 실시간 데이터 업데이트, 파일 저장 등 다양한 기능을 제공합니다. Supabase의 주요 목적은 프론트엔드 개발자가 쉽게 백엔드 서비스를 구축할 수 있도록 도와주는 것입니다. Supabase는 데이터베이스 관리와 API 자동 생성 기능을 통해 개발자들이 복잡한 서버 구축 없이 데이터를 손쉽게 다룰 수 있게 해줍니다.
PostgreSQL은 객체 관계형 데이터베이스 관리 시스템(ORDBMS)으로, 안정성과 확장성을 제공하는 오픈 소스 데이터베이스입니다. SQL 표준을 준수하며, 강력한 트랜잭션 처리와 다양한 데이터 타입을 지원하여 복잡한 데이터를 관리하기 적합합니다. Supabase는 이러한 PostgreSQL을 기반으로 하여 서버 측 데이터베이스 기능을 제공하며, 개발자들이 API를 자동으로 생성하고 SQL 쿼리를 쉽게 사용할 수 있게 합니다.
SQL (Structured Query Language)은 관계형 데이터베이스 관리 시스템에서 데이터를 정의, 조작, 관리하기 위한 표준 언어입니다. SQL을 사용하면 데이터베이스의 데이터를 쉽게 조회하고 수정할 수 있으며, 데이터베이스의 구조(스키마)를 정의하고 제어할 수 있습니다. SQL은 관계형 데이터베이스에서 데이터 무결성을 유지하고 복잡한 데이터를 효율적으로 관리하는 데 매우 적합한 언어입니다.
SQL 구문은 크게 DDL (Data Definition Language), DML (Data Manipulation Language), DCL (Data Control Language)로 구분됩니다.
CREATE
, ALTER
, DROP
SELECT
, INSERT
, UPDATE
, DELETE
GRANT
, REVOKE
SQL 구문은 사람이 읽기 쉬운 문법을 사용하여 데이터베이스 작업을 쉽게 수행할 수 있도록 만들어졌으며, 구조화된 데이터 처리를 가능하게 합니다.
이번 실습에서는 Supabase를 이용하여 데이터베이스와 테이블을 생성하고 데이터를 삽입해 보겠습니다.
my_database
를 만드는 SQL문을 작성하세요.CREATE DATABASE my_database;
accommodation 테이블을 생성하고 데이터를 추가하는 실습을 진행합니다. 아래 조건에 맞도록 테이블을 생성하세요.
zip_code
삭제total_visit
(총 방문 횟수) 추가monthly_visit
(월간 방문 횟수) 추가CREATE TABLE accommodation (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
address TEXT NOT NULL,
city VARCHAR(100) NOT NULL,
country VARCHAR(100) NOT NULL,
phone_number VARCHAR(20),
email VARCHAR(100),
website VARCHAR(255),
price_per_night DECIMAL(10, 2),
rating DECIMAL(3, 2),
description TEXT,
total_visit INT DEFAULT 0, -- 추가된 총 방문 횟수
monthly_visit INT DEFAULT 0, -- 추가된 월간 방문 횟수
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
다음으로, 생성한 accommodation
테이블에 10개의 예시 데이터를 추가해 보겠습니다.
INSERT INTO accommodation (name, address, city, country, phone_number, email, website, price_per_night, rating, description, total_visit, monthly_visit, created_at, updated_at) VALUES
('Sunrise Hotel', '123 Sunny St', 'Sunville', 'Sunnyland', '123-456-7890', 'contact@sunrisehotel.com', 'www.sunrisehotel.com', 120.00, 4.5, 'A beautiful hotel with a sunny disposition.', 500, 50, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Moonlight Inn', '456 Moon Blvd', 'Mooncity', 'Moonland', '234-567-8901', 'info@moonlightinn.com', 'www.moonlightinn.com', 90.00, 4.2, 'Experience the tranquility of the moon.', 400, 40, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Starry Lodge', '789 Star Rd', 'Starville', 'Starland', '345-678-9012', 'stay@starrylodge.com', 'www.starrylodge.com', 110.00, 4.7, 'A lodge with a starry ambiance.', 450, 45, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Ocean Breeze Resort', '101 Ocean Dr', 'Seaside', 'Waterland', '456-789-0123', 'reservations@oceanbreezeresort.com', 'www.oceanbreezeresort.com', 150.00, 4.8, 'Relax with the ocean breeze.', 600, 60, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Mountain Peak Hotel', '202 Mountain Ave', 'Hilltown', 'Mountainland', '567-890-1234', 'bookings@mountainpeakhotel.com', 'www.mountainpeakhotel.com', 130.00, 4.6, 'Stay at the peak of comfort.', 550, 55, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Forest Retreat', '303 Forest Ln', 'Treeville', 'Forestland', '678-901-2345', 'contact@forestretreat.com', 'www.forestretreat.com', 100.00, 4.3, 'A peaceful retreat in the forest.', 300, 30, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Desert Oasis', '404 Desert Rd', 'Sandtown', 'Desertland', '789-012-3456', 'info@desertoasis.com', 'www.desertoasis.com', 140.00, 4.5, 'An oasis of comfort in the desert.', 500, 50, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Lakeview Hotel', '505 Lakeview St', 'Laketown', 'Lakeland', '890-123-4567', 'stay@lakeviewhotel.com', 'www.lakeviewhotel.com', 115.00, 4.4, 'Enjoy a view of the lake.', 320, 32, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('City Central Inn', '606 Central Ave', 'Metropolis', 'Cityland', '901-234-5678', 'reservations@citycentralinn.com', 'www.citycentralinn.com', 125.00, 4.1, 'Stay in the heart of the city.', 470, 47, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
('Countryside B&B', '707 Country Rd', 'Countryside', 'Countryside', '012-345-6789', 'contact@countrysidebnb.com', 'www.countrysidebnb.com', 85.00, 4.0, 'A cozy bed and breakfast in the countryside.', 280, 28, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
총 방문 횟수의 평균을 구하는 SQL문을 작성합니다. 결과 컬럼 이름은 avg_total_visit
로 지정합니다.
SELECT AVG(total_visit) AS avg_total_visit FROM accommodation;
평점이 가장 높은 3개의 숙소의 name
, email
, website
를 조회하는 SQL문을 작성합니다.
SELECT name, email, website FROM accommodation ORDER BY rating DESC LIMIT 3;
태국(Thailand)에 위치한 숙소의 최고 평점과 최저 평점을 조회하는 SQL문을 작성합니다. 컬럼 이름은 각각 max_rating
, min_rating
으로 지정합니다.
SELECT MAX(rating) AS max_rating, MIN(rating) AS min_rating FROM accommodation WHERE country = 'Thailand';
관계형 데이터베이스의 주요 특징은 다음과 같습니다:
SELECT DISTINCT
를 사용합니다.SELECT DISTINCT 컬럼명 FROM 테이블명;
ORDER BY 컬럼명 ASC
를 사용합니다.SELECT 열명 FROM 테이블명 ORDER BY 컬럼명 ASC;
SELECT name FROM accommodation WHERE rating >= 4.80 ORDER BY name ASC;
Digital Nomad Loft
, Work & Play Retreat
DELETE FROM accommodation;
명령은 테이블의 모든 데이터를 삭제합니다. 조건 없이 모든 데이터를 삭제하므로 안전 장치가 필요하며, 테이블을 삭제하는 것이 아니라 데이터를 삭제한다는 점을 유의해야 합니다.SELECT COUNT(*) FROM 테이블명
을 사용합니다.SELECT COUNT(*) FROM accommodation;
SELECT COUNT(DISTINCT city)
를 사용합니다.SELECT COUNT(DISTINCT city) FROM accommodation;
VARCHAR(x)
데이터 타입은 최대 x
길이의 문자열을 저장할 수 있으며, 가변 길이입니다. x
이상의 문자열은 저장할 수 없습니다.serial
데이터 타입serial
데이터 타입은 자동 증가하는 정수를 생성하며, 보통 기본 키로 사용됩니다. 음수 값을 저장하지 않습니다.REMOVE FROM accommodation WHERE id = 1;
는 존재하지 않습니다. 데이터를 삭제하려면 DELETE
를 사용해야 합니다.DELETE FROM accommodation WHERE id = 1;
이번 글에서는 Supabase와 PostgreSQL의 개념을 이해하고, SQL을 활용하여 테이블을 생성하고 데이터를 조작하는 방법을 실습했습니다. 또한 관계형 데이터베이스의 주요 특징과 SQL 쿼리의 기본 개념을 퀴즈 형식으로 정리했습니다. 실습과 퀴즈를 통해 데이터베이스의 작동 방식을 보다 깊이 이해할 수 있었기를 바랍니다.