Ćwiczenia z baz danych – SQL i formularze

Od prostego CRUD po agregacje, podzapytania, funkcje i procedury

Moduł: SQL + PHP formularze · Poziom: średniozaawansowany
Podstawy DDL

1Tworzenie tabeli w bazie danych

Celem tego zadania jest nauczenie się tworzenia tabel w bazach danych. Stwórz tabelę zawierającą dane kontaktowe, np. imię, nazwisko, adres email, numer telefonu. Zdefiniuj odpowiednie typy danych oraz klucz główny.

SQL · DDL
CREATE TABLE kontakty (
    id       INT AUTO_INCREMENT PRIMARY KEY,
    imie     VARCHAR(100)    NOT NULL,
    nazwisko VARCHAR(100)    NOT NULL,
    email    VARCHAR(100)    NOT NULL,
    telefon  VARCHAR(15)
);

Klucz główny id zapewnia unikalność rekordów; oznaczenie NOT NULL wymusza podanie kluczowych danych kontaktowych.

Formularze HTML

2Tworzenie formularza do wprowadzania danych

Stwórz formularz w HTML do wprowadzania danych kontaktowych, takich jak imię, nazwisko, email i telefon. Formularz powinien wysyłać dane do skryptu dodaj_kontakt.php, który zapisze je w tabeli kontakty.

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

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

    Email:
    <input type="email" name="email" required><br>

    Telefon:
    <input type="text" name="telefon"><br>

    <input type="submit" value="Dodaj kontakt">
</form>

Atrybuty name są kluczowe – ich nazwy odpowiadają kluczom w tablicy $_POST po stronie PHP.

Proste SELECT

3Tworzenie zapytania do bazy danych

Użyj zapytania SQL do pobrania wszystkich kontaktów z tabeli kontakty. Wyświetl je na stronie, tworząc prostą tabelę HTML z wynikami zapytania.

SQL · DQL
SELECT *
FROM kontakty;
UPDATE

4Modyfikowanie danych w tabeli

Stwórz formularz do edycji danych kontaktowych, a następnie zapytanie UPDATE, które zmieni dane konkretnego rekordu na podstawie id.

SQL · DML
UPDATE kontakty
SET imie     = 'Nowe Imię',
    nazwisko = 'Nowe Nazwisko',
    email    = 'nowyemail@example.com'
WHERE id = 1;

Zawsze dodawaj warunek WHERE; jego brak spowoduje zmianę wszystkich rekordów w tabeli.

Filtracja danych

5Zapytanie z filtrem po numerze telefonu

Stwórz zapytanie SQL, które pobierze kontakty, których numer telefonu zaczyna się od cyfry 5.

SQL · DQL
SELECT *
FROM kontakty
WHERE telefon LIKE '5%';
Sortowanie

6Raport kontaktów posortowanych po nazwisku

Stwórz zapytanie, które generuje raport kontaktów posortowanych alfabetycznie po nazwisku.

SQL · DQL
SELECT *
FROM kontakty
ORDER BY nazwisko ASC;
ALTER TABLE

7Dodanie kolumny z datą dodania kontaktu

Dodaj do tabeli kontakty kolumnę przechowującą datę dodania kontaktu.

SQL · DDL
ALTER TABLE kontakty
ADD COLUMN data_dodania DATETIME DEFAULT CURRENT_TIMESTAMP;
Modyfikacja struktury

8Usuwanie kolumny z tabeli

Usuń z tabeli kontakty kolumnę telefon, jeśli nie jest już potrzebna.

SQL · DDL
ALTER TABLE kontakty
DROP COLUMN telefon;
Nowa tabela

11Rozbudowa struktury – tabela produktów

Stwórz tabelę produkty dla sklepu internetowego.

SQL · DDL
CREATE TABLE produkty (
    id           INT AUTO_INCREMENT PRIMARY KEY,
    nazwa        VARCHAR(200)    NOT NULL,
    cena         DECIMAL(10,2)   NOT NULL,
    ilosc        INT             NOT NULL,
    data_dodania DATETIME        DEFAULT CURRENT_TIMESTAMP
);
INSERT

12Dodawanie danych do nowej tabeli

Dodaj do tabeli produkty dane o trzech różnych produktach.

SQL · DML
INSERT INTO produkty (nazwa, cena, ilosc)
VALUES
    ('Produkt A', 99.99, 10),
    ('Produkt B', 49.99, 5),
    ('Produkt C', 199.99, 2);
Agregacja

13Zapytanie z agregatami

Stwórz zapytanie, które obliczy średnią cenę produktów w tabeli produkty.

SQL · DQL
SELECT AVG(cena) AS srednia_cena
FROM produkty;
GROUP BY + CASE

14Grupowanie produktów według ceny

Stwórz zapytanie, które zgrupuje produkty według zakresu cen i policzy liczbę produktów w każdej grupie.

SQL · DQL
SELECT 
    CASE 
        WHEN cena < 50 THEN 'Tanie'
        WHEN cena BETWEEN 50 AND 100 THEN 'Średnia cena'
        ELSE 'Drogie'
    END AS kategoria,
    COUNT(*) AS liczba_produktow
FROM produkty
GROUP BY kategoria;
Warunki AND / OR

15Zapytanie z warunkiem AND

Stwórz zapytanie, które zwróci produkty o cenie większej niż 50 i ilości w magazynie większej niż 5.

SQL · DQL
SELECT *
FROM produkty
WHERE cena > 50
  AND ilosc > 5;
UPDATE

16Aktualizacja danych w tabeli

Zaktualizuj cenę produktu o ID 2 na 59.99 oraz ilość w magazynie na 10.

SQL · DML
UPDATE produkty
SET cena = 59.99,
    ilosc = 10
WHERE id = 2;
DELETE

17Usuwanie danych z tabeli

Stwórz zapytanie, które usunie produkt o ID 3 z tabeli produkty.

SQL · DML
DELETE FROM produkty
WHERE id = 3;
JOIN

18Łączenie tabel za pomocą JOIN

Połącz tabelę produkty z tabelą kontakty (zakładając, że ID są powiązane) i wyświetl dane o produktach oraz „właścicielach”.

SQL · DQL
SELECT p.nazwa,
       p.cena,
       k.imie,
       k.nazwisko
FROM produkty p
JOIN kontakty k
  ON p.id = k.id;
Podzapytania

19Zapytanie z podzapytaniem

Stwórz zapytanie, które znajdzie produkty o cenie wyższej niż średnia cena produktów.

SQL · DQL
SELECT *
FROM produkty
WHERE cena > (SELECT AVG(cena) FROM produkty);
LIMIT

20Zapytanie z LIMIT

Stwórz zapytanie, które zwróci tylko pierwsze 5 produktów z tabeli produkty.

SQL · DQL
SELECT *
FROM produkty
LIMIT 5;
DISTINCT

21Zapytanie z DISTINCT

Stwórz zapytanie, które zwróci unikalne ceny produktów z tabeli produkty.

SQL · DQL
SELECT DISTINCT cena
FROM produkty;
IN

22Zapytanie z IN

Stwórz zapytanie, które zwróci produkty, których cena jest równa 50, 100 lub 150.

SQL · DQL
SELECT *
FROM produkty
WHERE cena IN (50, 100, 150);
Procedury

23Tworzenie procedury w SQL

Stwórz prostą procedurę, która zwróci produkty o cenie większej niż wartość przekazana jako parametr.

SQL · PROCEDURE
DELIMITER //

CREATE PROCEDURE get_products_above_price(
    IN min_price DECIMAL(10,2)
)
BEGIN
    SELECT *
    FROM produkty
    WHERE cena > min_price;
END //

DELIMITER ;
Funkcje

24Tworzenie funkcji w SQL

Stwórz funkcję, która obliczy całkowitą wartość sprzedaży, mnożąc cenę przez ilość w magazynie dla wszystkich produktów.

SQL · FUNCTION
DELIMITER //

CREATE FUNCTION calculate_total_sales()
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    DECLARE total_sales DECIMAL(10,2);

    SELECT SUM(cena * ilosc)
    INTO total_sales
    FROM produkty;

    RETURN total_sales;
END //

DELIMITER ;