Zadania z SZBD (SQL / MySQL / XAMPP)

Od struktury bazy i formularzy po JOIN, GROUP BY, HAVING i relacje 1:N

Moduł: SZBD – fundamenty SQL · Poziom: średniozaawansowany

Ten zestaw pracuje na jednej bazie firma. Najpierw uruchom blok startowy (0), a potem wykonuj zadania 1–20, nie niszcząc tabel ani relacji.

  • Środowisko: XAMPP / MySQL (phpMyAdmin → zakładka SQL).
  • Blok startowy uruchamiasz raz, kolejne zadania zakładają jego wykonanie.
Setup · DDL · relacje

0Przygotowanie bazy danych (blok startowy)

Utwórz bazę danych i wszystkie wymagane tabele, aby kolejne zadania wykonywały się na jednym spójnym schemacie.

SQL · DDL
-- 0. Utworzenie bazy danych i wybranie jej
CREATE DATABASE IF NOT EXISTS firma
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_polish_ci;
USE firma;

-- 1. Tabela Pracownicy
CREATE TABLE IF NOT EXISTS Pracownicy (
  ID           INT AUTO_INCREMENT PRIMARY KEY,
  Imie         VARCHAR(50),
  Nazwisko     VARCHAR(50),
  Stanowisko   VARCHAR(50),
  Wynagrodzenie DECIMAL(10,2)
);

-- 2. Dane przykładowe do Pracownicy
INSERT INTO Pracownicy (Imie, Nazwisko, Stanowisko, Wynagrodzenie) VALUES
  ('Jan',  'Kowalski',    'Programista',   6000.00),
  ('Anna', 'Nowak',       'Tester',        5000.00),
  ('Piotr','Wiśniewski',  'Administrator', 5500.00);

-- 3. Tabela Projekty
CREATE TABLE IF NOT EXISTS Projekty (
  ID            INT AUTO_INCREMENT PRIMARY KEY,
  NazwaProjektu VARCHAR(100),
  Status        VARCHAR(20)
);

-- 4. Dane przykładowe do Projekty
INSERT INTO Projekty (NazwaProjektu, Status) VALUES
  ('System ERP',        'Aktywny'),
  ('Aplikacja Mobilna', 'Zawieszony'),
  ('Strona Firmowa',    'Aktywny');

-- 5. Dodanie kolumny ID_Projekt do Pracownicy (jeśli jej nie ma)
ALTER TABLE Pracownicy
  ADD COLUMN IF NOT EXISTS ID_Projekt INT NULL;

-- 6. Dodanie klucza obcego (MySQL 8)
ALTER TABLE Pracownicy
  ADD CONSTRAINT IF NOT EXISTS FK_Projekt
  FOREIGN KEY (ID_Projekt) REFERENCES Projekty(ID);

-- 7. Przypisanie pracowników do projektów
UPDATE Pracownicy SET ID_Projekt = 1 WHERE Nazwisko = 'Kowalski';
UPDATE Pracownicy SET ID_Projekt = 1 WHERE Nazwisko = 'Nowak';
UPDATE Pracownicy SET ID_Projekt = 3 WHERE Nazwisko = 'Wiśniewski';
Ten blok uruchamiasz raz na początku (np. w phpMyAdmin → SQL). Wszystkie kolejne zadania zakładają istnienie bazy firma.
DDL · tworzenie tabeli

1Struktura tabeli Pracownicy

Utwórz tabelę Pracownicy (MySQL, z AUTO_INCREMENT, bez typu CURRENCY).

SQL · DDL
CREATE TABLE Pracownicy (
  ID           INT AUTO_INCREMENT PRIMARY KEY,
  Imie         VARCHAR(50),
  Nazwisko     VARCHAR(50),
  Stanowisko   VARCHAR(50),
  Wynagrodzenie DECIMAL(10,2)
);
INSERT · dane testowe

2Wstawianie danych do Pracownicy

Dodaj co najmniej trzech pracowników do tabeli Pracownicy.

SQL · DML
INSERT INTO Pracownicy (Imie, Nazwisko, Stanowisko, Wynagrodzenie) VALUES
  ('Jan',  'Kowalski',    'Programista',   6000.00),
  ('Anna', 'Nowak',       'Tester',        5000.00),
  ('Piotr','Wiśniewski',  'Administrator', 5500.00);
Formularz HTML → PHP

3Formularz dodawania pracownika

Stwórz formularz HTML przesyłający dane do dodaj_pracownika.php, który zapisze je w tabeli Pracownicy.

HTML · FORM
<form action="dodaj_pracownika.php" method="post">
  Imię:
  <input type="text" name="imie" required><br>

  Nazwisko:
  <input type="text" name="nazwisko" required><br>

  Stanowisko:
  <input type="text" name="stanowisko" required><br>

  Wynagrodzenie:
  <input type="number" step="0.01" name="wynagrodzenie" required><br>

  <input type="submit" value="Dodaj pracownika">
</form>
SELECT · filtracja

4Raport pracowników z wynagrodzeniem > 5000

Wyświetl wszystkich pracowników o wynagrodzeniu większym niż 5000.

SQL · DQL
SELECT *
FROM Pracownicy
WHERE Wynagrodzenie > 5000;
ALTER TABLE · dodanie kolumny

5Dodanie kolumny Email

Dodaj kolumnę Email do tabeli Pracownicy.

SQL · DDL
ALTER TABLE Pracownicy
  ADD COLUMN Email VARCHAR(100);
UPDATE · masowa zmiana

6Aktualizacja wynagrodzeń na 7000

Zmień wynagrodzenie wszystkich pracowników na 7000.

SQL · DML
UPDATE Pracownicy
SET Wynagrodzenie = 7000.00;
DELETE · filtr

7Usunięcie pracowników z niską płacą

Usuń wszystkich pracowników o wynagrodzeniu mniejszym niż 5000.

SQL · DML
DELETE FROM Pracownicy
WHERE Wynagrodzenie < 5000.00;
INDEX · optymalizacja

8Indeks na Nazwisko

Utwórz indeks na kolumnie Nazwisko w tabeli Pracownicy.

SQL · INDEX
CREATE INDEX idx_nazwisko
ON Pracownicy(Nazwisko);
VIEW · raport uproszczony

9Widok z podstawowymi danymi pracowników

Stwórz widok wyświetlający tylko imię, nazwisko i stanowisko pracowników.

SQL · VIEW
CREATE VIEW WidokPracownikow AS
SELECT Imie, Nazwisko, Stanowisko
FROM Pracownicy;
VIEW · sprzątanie

10Usunięcie widoku WidokPracownikow

Usuń widok WidokPracownikow (jeśli istnieje).

SQL · VIEW
DROP VIEW IF EXISTS WidokPracownikow;
INNER JOIN · pracownik + projekt

11Złączenie Pracownicy–Projekty

Wyświetl imię i nazwisko pracownika oraz nazwę projektu, w którym pracuje.

SQL · JOIN
SELECT P.Imie, P.Nazwisko, PR.NazwaProjektu
FROM Pracownicy AS P
INNER JOIN Projekty AS PR
  ON P.ID_Projekt = PR.ID;
SUM · agregacja

12SUMA wynagrodzeń

Oblicz łączną sumę wynagrodzeń wszystkich pracowników.

SQL · AGREGACJA
SELECT SUM(Wynagrodzenie) AS SumaWynagrodzen
FROM Pracownicy;
AVG + GROUP BY

13Średnia wg stanowiska

Wyświetl stanowisko i średnie wynagrodzenie dla każdego stanowiska.

SQL · GROUP BY
SELECT Stanowisko,
       AVG(Wynagrodzenie) AS SrednieWynagrodzenie
FROM Pracownicy
GROUP BY Stanowisko;
HAVING · filtr po AVG

14Stanowiska z wysoką średnią płacą

Wyświetl stanowiska, dla których średnie wynagrodzenie jest większe niż 6000.

SQL · HAVING
SELECT Stanowisko,
       AVG(Wynagrodzenie) AS SrednieWynagrodzenie
FROM Pracownicy
GROUP BY Stanowisko
HAVING AVG(Wynagrodzenie) > 6000;
Podzapytanie · średnia firmy

15Pracownicy powyżej średniej

Wyświetl pracowników, których wynagrodzenie jest wyższe niż średnie wynagrodzenie w firmie.

SQL · SUBQUERY
SELECT Imie, Nazwisko, Wynagrodzenie
FROM Pracownicy
WHERE Wynagrodzenie > (
  SELECT AVG(Wynagrodzenie) FROM Pracownicy
);
LEFT JOIN · projekty bez zespołu

16Projekty z/do pracowników (LEFT JOIN)

Wyświetl nazwę projektu oraz stanowisko pracownika, pokazując wszystkie projekty (nawet te bez przypisanych pracowników).

SQL · JOIN
SELECT PR.NazwaProjektu, P.Stanowisko
FROM Projekty AS PR
LEFT JOIN Pracownicy AS P
  ON PR.ID = P.ID_Projekt;
CASE · etykieta płacy

17Status wynagrodzenia (CASE)

Wyświetl imię, nazwisko i kolumnę StatusWynagrodzenia z wartością „Wysokie” lub „Standardowe”.

SQL · CASE
SELECT Imie,
       Nazwisko,
       Wynagrodzenie,
       CASE
         WHEN Wynagrodzenie > 6500 THEN 'Wysokie'
         ELSE 'Standardowe'
       END AS StatusWynagrodzenia
FROM Pracownicy;
ALTER TABLE · DROP FK

18Usunięcie klucza obcego FK_Projekt

Usuń klucz obcy z kolumny ID_Projekt w tabeli Pracownicy.

SQL · DDL
ALTER TABLE Pracownicy
  DROP FOREIGN KEY FK_Projekt;
Nazwę ograniczenia (FK_Projekt) można sprawdzić w INFORMATION_SCHEMA lub w phpMyAdmin w zakładce „Relacje”.
DISTINCT · unikalne wartości

19Unikalne stanowiska

Wyświetl unikalne nazwy stanowisk, na których pracują pracownicy.

SQL · DQL
SELECT DISTINCT Stanowisko
FROM Pracownicy;
Nowa tabela + relacja 1:N

20Klienci i relacja 1:N z Projektami

Stwórz tabelę Klienci i połącz ją relacją 1:N z tabelą Projekty.

SQL · DDL
-- Tabela Klienci
CREATE TABLE IF NOT EXISTS Klienci (
  ID   INT AUTO_INCREMENT PRIMARY KEY,
  Nazwa VARCHAR(100)
);

-- Dodanie kolumny ID_Klienta do Projektów
ALTER TABLE Projekty
  ADD COLUMN IF NOT EXISTS ID_Klienta INT NULL;

-- Dodanie klucza obcego
ALTER TABLE Projekty
  ADD CONSTRAINT IF NOT EXISTS FK_Klient
  FOREIGN KEY (ID_Klienta) REFERENCES Klienci(ID);