SQL – analiza i modyfikacja struktury bazy

CREATE DATABASE · ALTER TABLE · klucze obce · indeksy · projektowanie tabel

1 CREATE DATABASE

Utwórz bazę danych

Utwórz bazę danych sklep i przełącz się na nią poleceniem USE.

CREATE DATABASE sklep;
USE sklep;
✏️ Notatki (np. inne nazwy baz, kodowanie znaków):
2 CREATE TABLE

Utwórz tabelę klientów

Utwórz tabelę klienci z kolumnami: identyfikator, imię, nazwisko i adres e‑mail.

CREATE TABLE klienci (
  id        INT AUTO_INCREMENT PRIMARY KEY,
  imie      VARCHAR(50),
  nazwisko  VARCHAR(50),
  email     VARCHAR(100)
);
✏️ Notatki (np. NOT NULL, UNIQUE, dodatkowe pola):
3 CREATE TABLE

Utwórz tabelę produktów

Utwórz tabelę produkty przechowującą nazwę produktu i jego cenę.

CREATE TABLE produkty (
  id    INT AUTO_INCREMENT PRIMARY KEY,
  nazwa VARCHAR(100),
  cena  DECIMAL(10,2)
);
✏️ Notatki (np. waluta, VAT, kategoria):
4 FOREIGN KEY

Utwórz tabelę zamówień z relacjami

Utwórz tabelę zamowienia, która wiąże klientów z produktami poprzez klucze obce.

CREATE TABLE zamowienia (
  id              INT AUTO_INCREMENT PRIMARY KEY,
  klient_id       INT,
  produkt_id      INT,
  data_zamowienia DATE,
  FOREIGN KEY (klient_id) REFERENCES klienci(id),
  FOREIGN KEY (produkt_id) REFERENCES produkty(id)
);
✏️ Notatki (ON DELETE CASCADE, dodatkowe kolumny):
5 DESCRIBE

Wyświetl strukturę tabeli

Wyświetl strukturę tabeli klienci, aby sprawdzić typy kolumn i klucze.

DESCRIBE klienci;
✏️ Notatki (inne polecenia diagnostyczne):
6 INFORMATION_SCHEMA

Wyświetl relacje między tabelami

Wyświetl klucze obce tabeli zamowienia z widoku information_schema.KEY_COLUMN_USAGE.

SELECT *
FROM information_schema.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'zamowienia'
  AND TABLE_SCHEMA = 'sklep';
✏️ Notatki (inne widoki systemowe):
7 ALTER · ADD COLUMN

Dodaj kolumnę „telefon” do klientów

Dodaj kolumnę telefon do tabeli klienci, aby przechowywać numer telefonu klienta.

ALTER TABLE klienci
ADD telefon VARCHAR(15);
✏️ Notatki (NOT NULL, domyślne wartości):
8 NOWA TABELA · FK

Dodaj tabelę „kategorie” i połącz z produktami

Stwórz tabelę kategorie, a następnie dodaj do produkty kolumnę kategoria_id z kluczem obcym.

CREATE TABLE kategorie (
  id    INT AUTO_INCREMENT PRIMARY KEY,
  nazwa VARCHAR(50)
);

ALTER TABLE produkty
ADD kategoria_id INT;

ALTER TABLE produkty 
ADD CONSTRAINT fk_kategoria 
FOREIGN KEY (kategoria_id) REFERENCES kategorie(id);
✏️ Notatki (ON DELETE / ON UPDATE, indeks na kategoria_id):
9 ALTER · DROP COLUMN

Usuń kolumnę „telefon” z klientów

Usuń kolumnę telefon z tabeli klienci, gdy nie jest już potrzebna.

ALTER TABLE klienci
DROP COLUMN telefon;
✏️ Notatki (konsekwencje usuwania kolumn):
10 DROP FK · DROP TABLE

Usuń tabelę „kategorie”

Usuń relację z tabeli produkty do kategorie, a następnie usuń całą tabelę kategorie.

ALTER TABLE produkty
DROP FOREIGN KEY fk_kategoria;

ALTER TABLE produkty
DROP COLUMN kategoria_id;

DROP TABLE kategorie;
✏️ Notatki (kolejność operacji przy FK):
11 ALTER · CHANGE

Zmień nazwę kolumny „imie” na „imie_klienta”

Zmień nazwę kolumny imie w tabeli klienci na imie_klienta, zachowując jej typ.

ALTER TABLE klienci
CHANGE imie imie_klienta VARCHAR(50);
✏️ Notatki (inne zmiany nazw, wpływ na aplikacje):
12 ALTER · MODIFY

Zmień typ kolumny „cena” na FLOAT

Zmień typ kolumny cena w tabeli produkty z DECIMAL(10,2) na FLOAT.

ALTER TABLE produkty
MODIFY cena FLOAT;
✏️ Notatki (różnice DECIMAL vs FLOAT, precyzja):
13 RENAME TABLE

Zmień nazwę tabeli „produkty” na „asortyment”

Zmień nazwę tabeli produkty na asortyment, a następnie sprawdź, czy dane wciąż są dostępne.

RENAME TABLE produkty TO asortyment;

SELECT *
FROM asortyment
LIMIT 5;
✏️ Notatki (wpływ zmiany nazwy na zapytania w aplikacji):
14 RENAME TABLE

Przywróć nazwę tabeli na „produkty”

Przywróć pierwotną nazwę tabeli, zmieniając asortyment ponownie na produkty.

RENAME TABLE asortyment TO produkty;
✏️ Notatki (planowanie nazw tabel przed wdrożeniem):
15 UPDATE

Zaktualizuj email klienta o ID 1

Zaktualizuj adres e‑mail klienta o id = 1 w tabeli klienci.

UPDATE klienci
SET email = 'jan@example.com'
WHERE id = 1;
✏️ Notatki (UPDATE wielu rekordów, transakcje):
16 ALTER · DEFAULT

Dodaj kolumnę „status” do zamówień

Dodaj kolumnę status do tabeli zamowienia z domyślną wartością 'oczekujące'.

ALTER TABLE zamowienia 
ADD status VARCHAR(20) DEFAULT 'oczekujące';
✏️ Notatki (ENUM vs VARCHAR, zmiana domyślnej wartości):
17 ALTER · MODIFY

Zmień długość kolumny „nazwisko”

Zwiększ długość kolumny nazwisko w tabeli klienci do 80 znaków.

ALTER TABLE klienci
MODIFY nazwisko VARCHAR(80);
✏️ Notatki (wpływ na rozmiar tabeli, inne kolumny tekstowe):
18 NOWA TABELA

Stwórz tabelę „pracownicy”

Utwórz tabelę pracownicy z informacjami o imieniu, stanowisku i pensji pracownika.

CREATE TABLE pracownicy (
  id         INT AUTO_INCREMENT PRIMARY KEY,
  imie       VARCHAR(50),
  stanowisko VARCHAR(50),
  pensja     DECIMAL(8,2)
);
✏️ Notatki (dodatkowe pola: data zatrudnienia, dział):
19 DROP TABLE

Usuń tabelę „pracownicy”

Usuń tabelę pracownicy z bazy danych.

DROP TABLE pracownicy;
✏️ Notatki (DROP vs TRUNCATE, backup przed usunięciem):
20 UNIQUE

Dodaj unikalność do kolumny „email”

Dodaj unikalne ograniczenie do kolumny email w tabeli klienci, aby zapobiec duplikatom.

ALTER TABLE klienci
ADD UNIQUE (email);
✏️ Notatki (obsługa błędów przy duplikatach):
21 INDEX

Dodaj indeks do kolumny „data_zamowienia”

Utwórz indeks idx_data na kolumnie data_zamowienia w tabeli zamowienia, aby przyspieszyć zapytania po dacie.

CREATE INDEX idx_data
ON zamowienia(data_zamowienia);
✏️ Notatki (kiedy indeks pomaga, a kiedy szkodzi):
22 DROP INDEX

Usuń indeks „idx_data”

Usuń indeks idx_data z tabeli zamowienia.

DROP INDEX idx_data
ON zamowienia;
✏️ Notatki (analiza użycia indeksów, EXPLAIN):
23 ALTER · CHANGE

Zmień nazwę kolumny „nazwisko” na „nazwisko_klienta”

Zmień nazwę kolumny nazwisko na nazwisko_klienta w tabeli klienci.

ALTER TABLE klienci
CHANGE nazwisko nazwisko_klienta VARCHAR(80);
✏️ Notatki (konsekwencje dla zapytań, widoków):
24 PROJEKT TABELI

Zadanie końcowe: zaprojektuj tabelę „opinie”

Stwórz tabelę opinie z ocenami klientów dla produktów oraz powiąż ją relacjami z tabelami klienci i produkty.

CREATE TABLE opinie (
  id         INT AUTO_INCREMENT PRIMARY KEY,
  klient_id  INT,
  produkt_id INT,
  ocena      INT,
  komentarz  TEXT,
  FOREIGN KEY (klient_id)  REFERENCES klienci(id),
  FOREIGN KEY (produkt_id) REFERENCES produkty(id)
);
✏️ Notatki (zakres oceny, unikalność jednej opinii klienta na produkt):