Kursy i Poradniki IT - Adrian Kowalski
Kurs SQL dla Początkujących
O lekcji

Tworzenie kompletnej bazy danych

Zadanie: Zaprojektuj i stwórz kompletną bazę danych.
Projekt końcowy polega na zaprojektowaniu funkcjonalnej bazy danych dla konkretnej aplikacji lub systemu. Scenariusz może być dowolny, np. system do zarządzania rezerwacjami w hotelu, platforma e-commerce albo mała baza dla aplikacji fitness.

Wymagania:
  1. Kompleksowa struktura:

    • Powinna zawierać co najmniej 4-5 tabel.
    • Każda tabela powinna mieć odpowiednie klucze główne i obce.
    • Zastosuj różne typy danych (INTVARCHARDATE itp.).
  2. Związki:
    Uwzględnij związki pomiędzy tabelami. W projekcie powinny wystąpić relacje, takie jak:

    • Relacja jeden-do-wielu (np. klienci i zamówienia w sklepie internetowym).
    • Relacja wiele-do-wielu (np. kursy i studenci na uniwersytecie).
  3. Przygotowanie przykładowych danych testowych:

    • Wstaw co najmniej 5-10 rekordów do każdej tabeli.
Propozycja projektu: System zarządzania hotelem

Tabele:

  • Pokoje: informacje o pokojach w hotelu.
  • Goście: dane osobowe gości.
  • Rezerwacje: zawiera szczegóły o każdej rezerwacji.

Tworzenie bazy:

CREATE DATABASE hotel;

USE hotel;

CREATE TABLE pokoje (
    id INT AUTO_INCREMENT PRIMARY KEY,
    numer_pokoju INT,
    rodzaj VARCHAR(50),
    cena_doba DECIMAL(10, 2)
);

CREATE TABLE goście (
    id INT AUTO_INCREMENT PRIMARY KEY,
    imię VARCHAR(50),
    nazwisko VARCHAR(50),
    telefon VARCHAR(15)
);

CREATE TABLE rezerwacje (
    id INT AUTO_INCREMENT PRIMARY KEY,
    id_pokoju INT,
    id_gościa INT,
    data_przyjazdu DATE,
    data_wyjazdu DATE,
    FOREIGN KEY (id_pokoju) REFERENCES pokoje(id),
    FOREIGN KEY (id_gościa) REFERENCES goście(id)
);

-- Dodawanie danych testowych
INSERT INTO pokoje (numer_pokoju, rodzaj, cena_doba)
VALUES (101, 'Standard', 150.00), (102, 'Premium', 250.00);

INSERT INTO goście (imię, nazwisko, telefon)
VALUES ('Anna', 'Nowak', '123-456-789'), ('Jan', 'Kowalski', '987-654-321');

INSERT INTO rezerwacje (id_pokoju, id_gościa, data_przyjazdu, data_wyjazdu)
VALUES (1, 1, '2025-02-15', '2025-02-20');

Praktyka w optymalizacji zapytań i zarządzaniu danymi

Po stworzeniu bazy danych należy napisać optymalne zapytania do zarządzania danymi, w tym:

  • Wyszukiwanie danych:
    Znajdź wszystkich gości z rezerwacjami na miesiąc luty:

    SELECT g.imię, g.nazwisko, r.data_przyjazdu, r.data_wyjazdu
    FROM goście g
    JOIN rezerwacje r ON g.id = r.id_gościa
    WHERE MONTH(r.data_przyjazdu) = 2;
    
  • Optymalizacja zapytań:
    Zastosuj indeksy w tabelach z dużą ilością danych, aby przyspieszyć wyszukiwanie:

    CREATE INDEX idx_numer_pokoju ON pokoje(numer_pokoju);
    
  • Zapytania analityczne:
    Oblicz przychód z wynajmu pokoi w lutym 2025:

    SELECT SUM(p.cena_doba * DATEDIFF(r.data_wyjazdu, r.data_przyjazdu)) AS przychód
    FROM rezerwacje r
    JOIN pokoje p ON r.id_pokoju = p.id
    WHERE MONTH(r.data_przyjazdu) = 2;