Poniżej masz cały gotowy artykuł + 60 pytań kontrolnych do wykorzystania np. na lekcji 👇
1. Czym jest język SQL?
SQL (ang. Structured Query Language) to standardowy język, w którym rozmawiamy z relacyjną bazą danych.
Relacyjna baza danych przechowuje informacje w tabelach – podobnych do arkusza kalkulacyjnego: mamy wiersze (rekordy) i kolumny (pola).
Przykładowe systemy baz danych, które używają SQL:
- MySQL / MariaDB
- PostgreSQL
- Microsoft SQL Server
- Oracle Database
- SQLite
Wszystkie te systemy mają drobne różnice (dialekty SQL), ale podstawowe komendy są bardzo podobne.
Do czego służy SQL?
Najczęściej, w codziennej pracy z bazą danych, używamy SQL do:
- pobierania danych –
SELECT, - dodawania danych –
INSERT, - modyfikowania danych –
UPDATE, - usuwania danych –
DELETE.
W tym artykule skupimy się tylko na SELECT, czyli pobieraniu danych, oraz na tym, jak:
- pobrać dane z tabeli zawierającej datę urodzenia i płeć,
- policzyć wiek na podstawie
data_urodzenia, - określić osoby dorosłe (np. 18+),
- zliczyć ilu jest dorosłych mężczyzn i kobiet,
- posortować wyniki według wieku.
SQL jest językiem deklaratywnym – mówisz co chcesz dostać, a nie jak to policzyć krok po kroku.
Przykład:
SELECT imie, nazwisko
FROM osoby
WHERE wiek >= 18;
Nie piszesz pętli ani instrukcji „idź po każdym wierszu” – to robi za Ciebie silnik bazy danych.
2. Założenia – jakie dane mamy w bazie MySQL?
Załóżmy, że w bazie MySQL mamy tabelę osoby z kolumnami:
id– numer osoby (id),imie– imię,data_urodzenia– data urodzenia (typDATE),plec– płeć zapisana jako:'m'– mężczyzna,'k'– kobieta.
Nic nie tworzymy, używamy tylko SELECT do odczytu danych.
3. Podstawowe pobieranie danych – SELECT
3.1. Wszystkie kolumny i wszystkie osoby
SELECT *
FROM osoby;
To zapytanie zwraca wszystkie kolumny i wszystkie rekordy z tabeli osoby.
3.2. Tylko wybrane kolumny
Jeśli interesują nas tylko imię, data urodzenia i płeć:
SELECT
imie,
data_urodzenia,
plec
FROM osoby;
Wynik będzie zawierał tylko te trzy kolumny.
4. Filtrowanie danych według płci (WHERE)
4.1. Tylko mężczyźni
SELECT
imie,
data_urodzenia,
plec
FROM osoby
WHERE plec = 'm';
4.2. Tylko kobiety
SELECT
imie,
data_urodzenia,
plec
FROM osoby
WHERE plec = 'k';
4.3. Czytelny opis płci (CASE)
Czasem zamiast skrótów m / k chcemy ładny opis tekstowy:
SELECT
imie,
data_urodzenia,
CASE
WHEN plec = 'm' THEN 'Mężczyzna'
WHEN plec = 'k' THEN 'Kobieta'
ELSE 'Nieznana'
END AS plec_opis
FROM osoby;
Wynik ma dodatkową kolumnę plec_opis z pełnym opisem.
5. Obliczanie wieku na podstawie daty urodzenia
W MySQL możemy policzyć wiek przy pomocy funkcji:
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE())
YEAR– chcemy różnicę w latach,data_urodzenia– kolumna z datą urodzenia,CURDATE()– dzisiejsza data (data serwera).
5.1. Wyświetlenie wieku każdej osoby
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek
FROM osoby;
Wynik ma dodatkową kolumnę wiek, policzoną na podstawie daty urodzenia.
6. Określenie, kto jest osobą dorosłą (18+)
Przyjmijmy, że osoba dorosła to taka, która ma co najmniej 18 lat.
6.1. Lista tylko osób dorosłych
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek
FROM osoby
WHERE TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18;
To zapytanie zwróci tylko osoby pełnoletnie.
6.2. Oznaczenie dorosłości w osobnej kolumnie
Zamiast filtrować, możemy dodać kolumnę, która mówi, czy ktoś jest dorosły:
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek,
CASE
WHEN TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18
THEN 'Dorosły'
ELSE 'Niepełnoletni'
END AS status_doroslosci
FROM osoby;
Wynik zawiera wszystkich ludzi, ale z dodatkową informacją status_doroslosci.
7. Dorośli według płci
7.1. Dorośli mężczyźni
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek
FROM osoby
WHERE plec = 'm'
AND TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18;
7.2. Dorosłe kobiety
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek
FROM osoby
WHERE plec = 'k'
AND TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18;
Zwracane będą tylko pełnoletni mężczyźni / pełnoletnie kobiety.
8. Zliczanie dorosłych – COUNT() i GROUP BY
8.1. Ile jest wszystkich dorosłych?
SELECT
COUNT(*) AS liczba_doroslych
FROM osoby
WHERE TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18;
Zwróci jedną liczbę – liczbę dorosłych osób.
8.2. Liczba dorosłych według płci
SELECT
plec,
COUNT(*) AS liczba_doroslych
FROM osoby
WHERE TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18
GROUP BY plec;
Wynik: jeden wiersz dla m, jeden dla k.
8.3. Liczba dorosłych według płci z opisem
SELECT
CASE
WHEN plec = 'm' THEN 'Mężczyzna'
WHEN plec = 'k' THEN 'Kobieta'
ELSE 'Nieznana'
END AS plec_opis,
COUNT(*) AS liczba_doroslych
FROM osoby
WHERE TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18
GROUP BY plec;
Teraz wynik jest bardziej czytelny dla użytkownika.
9. Sortowanie wyników według wieku – ORDER BY
9.1. Od najstarszej do najmłodszej osoby
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek
FROM osoby
ORDER BY wiek DESC;
9.2. Od najmłodszej do najstarszej osoby
SELECT
imie,
data_urodzenia,
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) AS wiek
FROM osoby
ORDER BY wiek ASC;
Możesz też łączyć sortowanie z filtrowaniem (np. tylko dorośli, posortowani od najstarszego).
10. Podsumowanie
- SQL to język, którym komunikujemy się z relacyjną bazą danych.
- W codziennej pracy z danymi najczęściej używamy komendy
SELECT. - W tabeli
osobymamy m.in.data_urodzeniaiplec. - Wiek liczymy przy pomocy funkcji:
TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()). - Osoby dorosłe wybieramy warunkiem:
WHERE TIMESTAMPDIFF(YEAR, data_urodzenia, CURDATE()) >= 18. - Możemy:
- filtrować osoby według płci,
- oznaczać je jako „Dorosły” / „Niepełnoletni”,
- zliczać dorosłych mężczyzn i kobiety (
COUNT,GROUP BY), - sortować wyniki według wieku (
ORDER BY).
To wszystko robimy bez zmiany struktury bazy – wyłącznie za pomocą zapytań SELECT.
Pytania kontrolne (60)
- Do czego służy polecenie
SELECTw SQL? - Co oznacza gwiazdka (
*) w poleceniuSELECT * FROM osoby;? - Jak pobrać tylko kolumny
imieidata_urodzeniaz tabeliosoby? - Jak ograniczyć wyniki tylko do osób o płci
'm'? - Jak ograniczyć wyniki tylko do osób o płci
'k'? - Do czego służy klauzula
WHEREw zapytaniuSELECT? - Jak pobrać wszystkich mężczyzn z tabeli
osoby, wyświetlając tylkoimieiplec? - Jak pobrać wszystkie kobiety z tabeli
osoby, wyświetlającimie,data_urodzeniaiplec? - Co to jest alias kolumny i jak go nadać w
SELECT(np.AS wiek)? - Do czego służy funkcja
CURDATE()w MySQL? - Do czego służy funkcja
TIMESTAMPDIFF()w MySQL? - Jak policzyć wiek osoby w latach na podstawie
data_urodzenia? - Napisz zapytanie, które wyświetli
imiei wiek wszystkich osób z tabeliosoby. - Jak nazwać obliczoną kolumnę z wiekiem aliasem
wiek? - Jak pobrać tylko osoby, które mają co najmniej 18 lat?
- Jak pobrać tylko osoby, które mają mniej niż 18 lat?
- Napisz zapytanie, które wyświetli
imie,wieki tylko osoby pełnoletnie (wiek ≥ 18). - Jak połączyć w jednym
WHEREwarunek na płeć i na wiek (np. kobiety dorosłe)? - Napisz zapytanie zwracające dorosłych mężczyzn (wiek ≥ 18,
plec = 'm'). - Napisz zapytanie zwracające dorosłe kobiety (wiek ≥ 18,
plec = 'k'). - Do czego służy instrukcja
CASEw zapytaniuSELECT? - Jak przy pomocy
CASEzamienićplec = 'm'na tekst'Mężczyzna'? - Jak przy pomocy
CASEzamienićplec = 'k'na tekst'Kobieta'? - Napisz zapytanie, które wyświetli
imie,data_urodzeniaoraz kolumnęplec_opisz opisem „Mężczyzna” lub „Kobieta”. - Jak przy pomocy
CASEutworzyć nową kolumnęstatus_doroslosciz wartościami „Dorosły” i „Niepełnoletni”? - Napisz zapytanie, które pokazuje
imie,wiekistatus_dorosloscidla wszystkich osób. - Czym różni się filtr w
WHEREod użyciaCASEwSELECT? - Do czego służy funkcja
COUNT(*)w MySQL? - Jak policzyć, ile jest wszystkich osób w tabeli
osoby? - Jak policzyć, ilu jest dorosłych (wiek ≥ 18) w tabeli
osoby? - Napisz zapytanie, które zliczy liczbę dorosłych osób i nazwie tę kolumnę
liczba_doroslych. - Jak policzyć, ilu jest dorosłych mężczyzn (wiek ≥ 18,
plec = 'm')? - Jak policzyć, ile jest dorosłych kobiet (wiek ≥ 18,
plec = 'k')? - Do czego służy klauzula
GROUP BY? - Napisz zapytanie, które policzy liczbę dorosłych osób w podziale na płeć (
plec). - Jak w wyniku grupowania po płci podmienić skróty płci na opisy (Mężczyzna/Kobieta) za pomocą
CASE? - Napisz zapytanie, które dla każdej płci wyświetli liczbę dorosłych osób w kolumnie
liczba_doroslych. - Do czego służy klauzula
ORDER BY? - Jak posortować wyniki według wieku rosnąco (od najmłodszej osoby)?
- Jak posortować wyniki według wieku malejąco (od najstarszej osoby)?
- Napisz zapytanie, które wyświetli
imie,wiekwszystkich osób, posortowane od najstarszej do najmłodszej. - Napisz zapytanie, które wyświetli tylko 10 najstarszych osób (użyj
ORDER BYiLIMIT). - Jak pobrać tylko imię i status dorosłości (Dorosły/Niepełnoletni) bez pokazywania daty urodzenia?
- Napisz zapytanie, które pokaże wyłącznie niepełnoletnich chłopców (
plec = 'm', wiek < 18). - Napisz zapytanie, które pokaże wyłącznie niepełnoletnie dziewczyny (
plec = 'k', wiek < 18). - Jak połączyć w jednym
SELECTobliczanie wieku, opis płci (CASE) i status dorosłości? - Jak nazwać kolumnę będącą wynikiem
CASEaliasem, aby miała nazwęopis_statusu? - Czym różni się
COUNT(*)odCOUNT(nazwa_kolumny)? - Czy można użyć funkcji
TIMESTAMPDIFFbezpośrednio w klauzuliWHERE? Podaj przykład. - Dlaczego lepiej jest używać
CURDATE()niż wpisywać datę „na sztywno” przy liczeniu wieku? - Napisz zapytanie, które wyświetli tylko osoby pełnoletnie i posortuje je malejąco według wieku.
- Napisz zapytanie, które wyświetli tylko osoby niepełnoletnie i posortuje je rosnąco według daty urodzenia.
- Jak wyświetlić w jednym wyniku: imię, płeć jako tekst (Mężczyzna/Kobieta) i wiek?
- Jak ograniczyć wyniki do tych, którzy mają wiek między 18 a 25 lat (włącznie)?
- Napisz zapytanie, które policzy, ilu jest niepełnoletnich w tabeli
osoby. - Napisz zapytanie, które policzy, ile jest osób w każdym „statusie dorosłości” (Dorosły vs Niepełnoletni) z użyciem
CASEiGROUP BY. - Jak wyświetlić tylko te osoby, dla których status dorosłości to „Niepełnoletni”, używając warunku na wiek?
- Napisz zapytanie, które dla każdej płci poda średni wiek (użyj
AVG()iTIMESTAMPDIFF). - Napisz zapytanie, które pokaże imię i wiek tylko tych osób, które mają dokładnie 18 lat.
- Wyjaśnij, jak w jednym zapytaniu
SELECTmożna jednocześnie:- policzyć wiek,
- oznaczyć osoby jako dorosłe/niepełnoletnie,
- przefiltrować tylko dorosłych,
- posortować ich według wieku
