Quest: Wyszukiwanie i filtrowanie w MySQL

Tworzenie tabel

CREATE TABLE produkty (
id INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100) NOT NULL,
waga DECIMAL(6,2),
rozmiar INT,
data DATE,
kolor VARCHAR(30)
);CREATE TABLE stany_magazynowe (
id INT AUTO_INCREMENT PRIMARY KEY,
produkt_id INT,
ilosc INT,
magazyn_nr INT,
regal VARCHAR(10),
FOREIGN KEY (produkt_id) REFERENCES produkty(id)
);

Dane testowe

INSERT INTO produkty (nazwa, waga, rozmiar, data, kolor) VALUES
('Produkt A', 1.25, 38, '2024-01-15', 'czerwony'),
('Produkt B', 0.80, 36, '2024-02-10', 'niebieski'),
('Produkt C', 2.40, 42, '2024-03-05', 'zielony'),
('Produkt D', 1.10, 44, '2024-04-20', 'czarny');INSERT INTO stany_magazynowe (produkt_id, ilosc, magazyn_nr, regal) VALUES
(1, 50, 1, 'A1'),
(1, 20, 2, 'B3'),
(2, 0, 1, 'A2'),
(3, 15, 1, 'C1'),
(4, 100, 3, 'D4');

#10 – filtrowanie (jedna tabela)

SELECT *
FROM produkty
WHERE kolor IN ('czarny', 'zielony')
AND waga > 1;

#11 – filtrowanie po dacie (jedna tabela)

SELECT *
FROM produkty
WHERE data BETWEEN '2024-01-01' AND '2024-03-31';

#12 – JOIN podstawowy

SELECT p.nazwa, s.ilosc, s.magazyn_nr, s.regal
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id;

#13 – filtrowanie po ilości

SELECT p.nazwa, s.ilosc
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
WHERE s.ilosc > 0;

#14 – brak powiązania (LEFT JOIN)

SELECT p.nazwa
FROM produkty p
LEFT JOIN stany_magazynowe s ON p.id = s.produkt_id
WHERE s.id IS NULL;

#15 – suma stanów magazynowych

SELECT p.nazwa, SUM(s.ilosc) AS suma
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
GROUP BY p.nazwa;

#16 – HAVING

SELECT p.nazwa, SUM(s.ilosc) AS suma
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
GROUP BY p.nazwa
HAVING SUM(s.ilosc) > 30;

#17 – wiele warunków

SELECT p.nazwa, s.regal, s.ilosc
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
WHERE s.magazyn_nr = 1
AND s.regal LIKE 'A%';

#18 – sortowanie

SELECT p.nazwa, s.ilosc
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
ORDER BY s.ilosc DESC;

#19 – DISTINCT + GROUP BY

SELECT p.nazwa
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
GROUP BY p.nazwa
HAVING COUNT(DISTINCT s.magazyn_nr) > 1;

#20 – CASE (logika biznesowa)

SELECT 
p.nazwa,
SUM(s.ilosc) AS suma,
CASE
WHEN SUM(s.ilosc) = 0 THEN 'brak'
WHEN SUM(s.ilosc) < 20 THEN 'niski stan'
ELSE 'dostępny'
END AS status
FROM produkty p
JOIN stany_magazynowe s ON p.id = s.produkt_id
GROUP BY p.nazwa;
Tagi: Brak tagów

Twój komentarz

Zapisz moje dane, adres e-mail i witrynę w przeglądarce aby wypełnić dane podczas pisania kolejnych komentarzy.