MySQL - twoja baza danych

Samo potrzebne mięso do egzaminu, nic więcej.​

Naucz się skutecznie przechowywać i odpytywać dane: projektuj tabele, twórz relacje i pisz zapytania, które pozwolą Ci zarządzać informacjami w Twojej aplikacji.

Dorzucamy do naszego arsenału wiedzy o MySQL ostatni, ale niezwykle ważny element – zarządzanie fortecą. Skoro mamy już magazyn (bazę danych) i towar (dane), musimy teraz zatrudnić pracowników (użytkowników) i dać im odpowiednie klucze (uprawnienia), żeby nie każdy mógł wejść do skarbca.

Ciekawostka

Zastanawiałeś się kiedyś, dlaczego weterani IT i profesorowie na uczelniach czasem wymawiają "SQL" jako "Sequel", podczas gdy inni literują "Es-Ku-El"? To nie błąd ani regionalny akcent – to historyczna pamiątka! Kiedy język SQL powstawał w laboratoriach IBM w latach 70., jego oryginalna nazwa brzmiała SEQUEL, co było skrótem od "Structured English Query Language" (Strukturalny Język Zapytań oparty na Angielskim). Nazwa była genialna, bo idealnie opisywała cel języka – miał być prosty i czytelny jak zwykły angielski. Niestety, okazało się, że nazwa "SEQUEL" była już znakiem towarowym zarejestrowanym przez... brytyjską firmę lotniczą. Aby uniknąć prawnej batalii, twórcy oficjalnie skrócili nazwę do SQL. Mimo to, wymowa "Sequel" pozostała w sercach i na ustach wielu programistów jako hołd dla jego korzeni i dowód na to, jak długą historię ma technologia, której wciąż używamy na co dzień.

1. Czym jest Baza Danych i Język SQL?

Wyobraź sobie, że baza danych to gigantyczny, perfekcyjnie zorganizowany magazyn. Każdy towar ma swoje miejsce, etykietę i unikalny kod kreskowy. Nie ma mowy o bałaganie. MySQL to nazwa jednego z najpopularniejszych systemów zarządzania takim magazynem.

A SQL (Structured Query Language)? To uniwersalny język, którym posługują się wszyscy pracownicy tego magazynu. To zbiór prostych komend w języku angielskim, które pozwalają na zadawanie pytañ („pokaż mi wszystkie czerwone koszulki”) i wydawanie poleceñ („dodaj nową parę butów na półkę nr 3”).

SQL dzielimy na dwie główne kategorie poleceñ, które musisz znać:

  • DDL (Data Definition Language): Język definicji danych. Służy do budowania i modyfikowania szkieletu magazynu. Komendy: CREATE, ALTER, DROP.
  • DML (Data Manipulation Language): Język manipulacji danymi. Służy do zarządzania towarem w magazynie. Komendy: SELECT, INSERT, UPDATE, DELETE.

2. Anatomia Bazy Danych – Klocki Twojego Magazynu

Zanim zaczniesz budować, musisz poznać elementy składowe.

2.1. Tabele, Kolumny i Wiersze

  • Tabela (Table): To jak regał w magazynie przeznaczony na jeden typ towaru, np. tabela produkty lub uzytkownicy.
  • Kolumna (Column): To jak szuflada w regale z konkretną etykietą, która opisuje jedną cechę towaru, np. nazwa, cena, kolor. Każda kolumna ma ściśle określony typ danych.
  • Wiersz (Row): To jeden, konkretny towar na półce ze wszystkimi jego cechami. Np. jeden wiersz w tabeli produkty to „Czerwona Koszulka, 49.99 zł, Czerwony”.

2.2 Typy Danych – Jakie Etykiety na Szuflady?

Nie możesz wrzucić butów do szuflady na śrubki. W SQL jest tak samo. Każda kolumna musi mieć zadeklarowany typ danych. Najważniejsze na egzaminie:

    • INT lub INTEGER: Do liczb całkowitych (np. id, ilosc_sztuk).
    • VARCHAR(n): Do tekstów o zmiennej długości, gdzie n to maksymalna liczba znaków (np. VARCHAR(100) dla nazwy produktu). Najpopularniejszy typ tekstowy.
    • TEXT: Do długich tekstów, jak opisy produktów czy treść artykułów.
    • DECIMAL(p, s): Do precyzyjnych wartości pieniężnych, gdzie p to łączna liczba cyfr, a s to liczba cyfr po przecinku (np. DECIMAL(10, 2) dla ceny).
    • DATE: Do przechowywania daty (RRRR-MM-DD).
    • TIMESTAMP lub DATETIME: Do przechowywania daty i godziny. TIMESTAMP jest często używany do automatycznego zapisywania czasu ostatniej modyfikacji.
    • BOOLEAN (lub TINYINT(1)): Do przechowywania wartości prawda/fałsz (1 lub 0).

2.3 Klucze – Super-glue i Kody Kreskowe

To najważniejszy koncept w relacyjnych bazach danych!

KLUCZ PODSTAWOWY (PRIMARY KEY): To unikalny identyfikator każdego wiersza w tabeli. Pomyśl o nim jak o numerze PESEL dla człowieka lub kodzie kreskowym dla produktu. Nie mogą istnieć dwa identyczne klucze podstawowe w jednej tabeli. Najczęściej jest to kolumna id typu INT z dodatkową opcją AUTO_INCREMENT, która sprawia, że baza sama nadaje kolejny numer każdemu nowemu wierszowi.

KLUCZ OBCY (FOREIGN KEY): To „magiczne połączenie” między tabelami. To kolumna w jednej tabeli, która odnosi się do klucza podstawowego w innej tabeli.

  • Przykład: Masz tabelę produkty i tabelę kategorie. Zamiast w tabeli produkty za każdym razem wpisywać „Elektronika”, dodajesz kolumnę kategoria_id, która jest kluczem obcym i przechowuje id odpowiedniej kategorii z tabeli kategorie. To pozwala na tworzenie relacji i jest podstawą działania komendy JOIN.

3. CREATE – Budowa Szkieletu Magazynu (DDL)

Czas założyć kask i zacząć budowę! Te komendy najczęściej wykonuje się raz, na początku projektu, w phpMyAdmin.

3.1 Tworzenie Bazy Danych

To pierwszy krok. Prosta komenda, która tworzy kontener na wszystkie Twoje tabele.

CREATE DATABASE sklep_inf03 CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci;

Dopiski o utf8mb4 zapewniają poprawne obsługiwanie polskich znaków.

3.2 Tworzenie Tabeli 

CREATE TABLE To najważniejsza komenda DDL. Tutaj definiujesz wszystkie kolumny, ich typy i klucze. NA EGZAMINIE MUSISZ TO WIEDZIEĆ: Potrafić napisać prostą kwerendę CREATE TABLE to podstawa.

CREATE TABLE produkty (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(150) NOT NULL,
    opis TEXT,
    cena DECIMAL(10, 2) NOT NULL,
    kategoria_id INT,
    data_dodania TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (kategoria_id) REFERENCES kategorie(id)
);
    • AUTO_INCREMENT PRIMARY KEY: Mówi bazie, żeby kolumna id była unikalnym identyfikatorem i żeby sama go nadawała.
    • NOT NULL: Oznacza, że ta kolumna nie może być pusta przy dodawaniu nowego wiersza.
    • DEFAULT ...: Ustawia domyślną wartość, jeśli nie podamy jej przy wstawianiu.
    • FOREIGN KEY (...) REFERENCES ...: Tworzy relację z tabelą kategorie.

4. INSERT, UPDATE, DELETE – Zarządzamy Towarem (DML)

Znasz już te komendy z kursu PHP, ale teraz zobaczysz je w czystej postaci SQL.

4.1 INSERT INTO – Nowa dostawa

Dodaje nowy wiersz (lub wiersze) do tabeli.
INSERT INTO produkty (nazwa, cena, kategoria_id)
VALUES ('Super Smartfon Pro', 2999.99, 1);

4.2 UPDATE – Zmiana etykiety

Modyfikuje istniejące wiersze.

PUŁAPKA EGZAMINACYJNA: NIGDY nie zapominaj o WHERE! Bez tego zaktualizujesz WSZYSTKIE wiersze w tabeli.

UPDATE produkty
SET cena = 3199.99, opis = 'Nowa, niższa cena promocyjna!'
WHERE id = 1;

4.3 DELETE FROM – Wyrzucamy na śmietnik

Usuwa wiersze. Zasada jest ta sama co przy UPDATE: WHERE to Twój najlepszy przyjaciel!

DELETE FROM produkty
WHERE id = 5;

5. SELECT – Twoje Oczy i Uszy w Bazie Danych

To najpotężniejsza i najczęściej używana komenda SQL. Jej opanowanie to 90% sukcesu. Pozwala na zadawanie bazie skomplikowanych pytañ.

5.1 Podstawy: „Pokaż mi…”

-- Pokaż tylko nazwę i cenę wszystkich produktów
SELECT nazwa, cena FROM produkty;

-- Pokaż WSZYSTKIE kolumny dla wszystkich produktów (gwiazdka * to "wszystko")
SELECT * FROM produkty;

5.2 Filtrowanie WHERE – „…ale tylko te, które mnie interesują”

-- Produkty droższe niż 1000 zł
SELECT * FROM produkty WHERE cena > 1000;

-- Produkty z kategorii 1 ORAZ droższe niż 1000 zł
SELECT * FROM produkty WHERE kategoria_id = 1 AND cena > 1000;

-- Produkty z kategorii 1 LUB 2
SELECT * FROM produkty WHERE kategoria_id = 1 OR kategoria_id = 2;
-- Lepszy sposób na to samo:
SELECT * FROM produkty WHERE kategoria_id IN (1, 2);

5.3 Sortowanie ORDER BY i Ograniczanie LIMIT

-- Pokaż wszystkie produkty, posortowane od najdroższego do najtańszego
SELECT * FROM produkty ORDER BY cena DESC;

-- Pokaż 3 najnowsze produkty
SELECT * FROM produkty ORDER BY data_dodania DESC LIMIT 3;

5.4 Funkcje Agregujące – „Policz mi to wszystko!”

Te funkcje wykonują obliczenia na grupie wierszy i zwracają jedną wartość.

    • COUNT(): Zlicza liczbę wierszy. SELECT COUNT(id) FROM produkty; (ile mamy produktów?)
    • SUM(): Sumuje wartości. SELECT SUM(cena) FROM produkty; (jaka jest łączna wartość wszystkich produktów?)
    • AVG(): Oblicza średnią. SELECT AVG(cena) FROM produkty; (jaka jest średnia cena produktu?)
    • MAX() i MIN(): Znajdują największą i najmniejszą wartość.

5.5 Grupowanie GROUP BY – „Pogrupuj mi to!”

GROUP BY jest używane razem z funkcjami agregującymi, aby podzielić wiersze na grupy i wykonać obliczenia dla każdej grupy osobno. NA EGZAMINIE MUSISZ TO WIEDZIEĆ: Potrafić zliczyć elementy w grupach to bardzo częste zadanie.

-- Policz, ile produktów znajduje się w każdej kategorii
SELECT kategoria_id, COUNT(id) AS liczba_produktow
FROM produkty
GROUP BY kategoria_id;

5.6 JOIN – Łączenie Tabel, czyli Największa Supermoc SQL

JOIN pozwala na łączenie wierszy z dwóch lub więcej tabel na podstawie powiązanych kolumn (kluczy obcych). To dzięki niemu możesz w jednym zapytaniu pobrać nazwę produktu i nazwę jego kategorii, mimo że są one w osobnych tabelach.

-- Pokaż nazwę produktu oraz nazwę jego kategorii
SELECT
    produkty.nazwa,
    kategorie.nazwa_kategorii
FROM
    produkty
INNER JOIN
    kategorie ON produkty.kategoria_id = kategorie.id;

Powyższe zapytanie mówi: „Weź tabelę produkty, dołącz do niej tabelę kategorie, dopasowując wiersze tam, gdzie kategoria_id z produktów jest równe id z kategorii, a następnie wyświetl mi nazwy produktów i dopasowane do nich nazwy kategorii.”


6. Użytkownicy i Uprawnienia – Kto ma Klucze do Królestwa?

Masz już potężny magazyn. Ostatnią rzeczą, jakiej chcesz, to dać klucz do całego obiektu każdemu pracownikowi. Czas nauczyć się tworzyć użytkowników i przydzielać im tylko te uprawnienia, których naprawdę potrzebują.

6.1 Po co to wszystko?

Zasada Najmniejszego Przywileju Złota zasada bezpieczeństwa: Każdy program i każdy użytkownik powinien mieć najmniejszy możliwy zakres uprawnień, który jest mu niezbędny do wykonania swojej pracy. Dlaczego? Używanie konta root (superadministratora) w pliku connect.php Twojej aplikacji to proszenie się o katastrofę. Jeśli ktoś włamie się na Twoją stronę, zdobędzie władzę absolutną nad wszystkimi bazami danych na Twoim serwerze. Tworząc dedykowanego użytkownika dla aplikacji z ograniczonymi prawami, minimalizujesz szkody.

6.2 Tworzenie Użytkownika CREATE USER

Zatrudniamy nowego pracownika. Musimy nadać mu login, hasło i określić, z jakiego komputera (hosta) może się logować.

CREATE USER 'user_aplikacji'@'localhost' IDENTIFIED BY 'SuperTrudneHaslo123!';
    • 'user_aplikacji': Login naszego nowego pracownika.
    • 'localhost': Niezwykle ważne! Oznacza, że ten użytkownik może połączyć się z bazą danych tylko z tej samej maszyny, na której działa serwer MySQL. To najbezpieczniejsza opcja dla aplikacji webowych. Użycie '%' pozwoliłoby na logowanie z dowolnego miejsca w internecie – nie rób tego, jeśli nie musisz.
    • IDENTIFIED BY ...: Hasło naszego pracownika.

6.3 Nadawanie Uprawnień – GRANT

Nasz nowy pracownik na razie nic nie może. Czas dać mu klucze do odpowiednich pomieszczeń.

NA EGZAMINIE MUSISZ TO WIEDZIEĆ: Twoja aplikacja webowa najczęściej potrzebuje tylko czterech podstawowych uprawnień: SELECT, INSERT, UPDATE, DELETE.

-- Dajemy nowemu użytkownikowi uprawnienia do CZYTANIA, DODAWANIA, AKTUALIZOWANIA i USUWANIA
-- na WSZYSTKICH (*) tabelach w bazie 'sklep_inf03'.
GRANT SELECT, INSERT, UPDATE, DELETE ON sklep_inf03.* TO 'user_aplikacji'@'localhost';
  • GRANT ... ON ... TO ...: „DAJ [te uprawnienia] NA [tej bazie.tej tabeli] DLA [tego użytkownika]”.
  • sklep_inf03.*: Gwiazdka oznacza „wszystkie tabele”.

Po wykonaniu tej komendy, warto odświeżyć system uprawnień:

FLUSH PRIVILEGES;

6.4 Odbieranie i Sprawdzanie Uprawnień – REVOKE i SHOW GRANTS

Pracownik zmienił dział? Odbieramy mu niepotrzebne klucze.

-- Odbieramy użytkownikowi prawo do usuwania danych.
REVOKE DELETE ON sklep_inf03.* FROM 'user_aplikacji'@'localhost';

Chcesz sprawdzić, jakie klucze ma dany pracownik?

SHOW GRANTS FOR 'user_aplikacji'@'localhost';

6.5 Usuwanie Użytkownika – DROP USER

Pracownik został zwolniony. Czas zabrać mu identyfikator i wyrzucić jego dane z systemu.

DROP USER 'user_aplikacji'@'localhost';

Podsumowując, proces dla nowej aplikacji zawsze wygląda tak:

  1. Zaloguj się do phpMyAdmin jako root.
  2. Stwórz nową bazę danych (CREATE DATABASE).
  3. Stwórz nowego użytkownika (CREATE USER ...).
  4. Nadaj temu użytkownikowi tylko niezbędne uprawnienia do tej nowej bazy (GRANT ...).
  5. W pliku connect.php Twojej aplikacji używaj danych logowania nowo utworzonego użytkownika, a nie root!