Język SQL ćwiczenia

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 danychSELECT,
  • dodawania danychINSERT,
  • modyfikowania danychUPDATE,
  • usuwania danychDELETE.

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 (typ DATE),
  • 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 osoby mamy m.in. data_urodzenia i plec.
  • 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)

  1. Do czego służy polecenie SELECT w SQL?
  2. Co oznacza gwiazdka (*) w poleceniu SELECT * FROM osoby;?
  3. Jak pobrać tylko kolumny imie i data_urodzenia z tabeli osoby?
  4. Jak ograniczyć wyniki tylko do osób o płci 'm'?
  5. Jak ograniczyć wyniki tylko do osób o płci 'k'?
  6. Do czego służy klauzula WHERE w zapytaniu SELECT?
  7. Jak pobrać wszystkich mężczyzn z tabeli osoby, wyświetlając tylko imie i plec?
  8. Jak pobrać wszystkie kobiety z tabeli osoby, wyświetlając imie, data_urodzenia i plec?
  9. Co to jest alias kolumny i jak go nadać w SELECT (np. AS wiek)?
  10. Do czego służy funkcja CURDATE() w MySQL?
  11. Do czego służy funkcja TIMESTAMPDIFF() w MySQL?
  12. Jak policzyć wiek osoby w latach na podstawie data_urodzenia?
  13. Napisz zapytanie, które wyświetli imie i wiek wszystkich osób z tabeli osoby.
  14. Jak nazwać obliczoną kolumnę z wiekiem aliasem wiek?
  15. Jak pobrać tylko osoby, które mają co najmniej 18 lat?
  16. Jak pobrać tylko osoby, które mają mniej niż 18 lat?
  17. Napisz zapytanie, które wyświetli imie, wiek i tylko osoby pełnoletnie (wiek ≥ 18).
  18. Jak połączyć w jednym WHERE warunek na płeć i na wiek (np. kobiety dorosłe)?
  19. Napisz zapytanie zwracające dorosłych mężczyzn (wiek ≥ 18, plec = 'm').
  20. Napisz zapytanie zwracające dorosłe kobiety (wiek ≥ 18, plec = 'k').
  21. Do czego służy instrukcja CASE w zapytaniu SELECT?
  22. Jak przy pomocy CASE zamienić plec = 'm' na tekst 'Mężczyzna'?
  23. Jak przy pomocy CASE zamienić plec = 'k' na tekst 'Kobieta'?
  24. Napisz zapytanie, które wyświetli imie, data_urodzenia oraz kolumnę plec_opis z opisem „Mężczyzna” lub „Kobieta”.
  25. Jak przy pomocy CASE utworzyć nową kolumnę status_doroslosci z wartościami „Dorosły” i „Niepełnoletni”?
  26. Napisz zapytanie, które pokazuje imie, wiek i status_doroslosci dla wszystkich osób.
  27. Czym różni się filtr w WHERE od użycia CASE w SELECT?
  28. Do czego służy funkcja COUNT(*) w MySQL?
  29. Jak policzyć, ile jest wszystkich osób w tabeli osoby?
  30. Jak policzyć, ilu jest dorosłych (wiek ≥ 18) w tabeli osoby?
  31. Napisz zapytanie, które zliczy liczbę dorosłych osób i nazwie tę kolumnę liczba_doroslych.
  32. Jak policzyć, ilu jest dorosłych mężczyzn (wiek ≥ 18, plec = 'm')?
  33. Jak policzyć, ile jest dorosłych kobiet (wiek ≥ 18, plec = 'k')?
  34. Do czego służy klauzula GROUP BY?
  35. Napisz zapytanie, które policzy liczbę dorosłych osób w podziale na płeć (plec).
  36. Jak w wyniku grupowania po płci podmienić skróty płci na opisy (Mężczyzna/Kobieta) za pomocą CASE?
  37. Napisz zapytanie, które dla każdej płci wyświetli liczbę dorosłych osób w kolumnie liczba_doroslych.
  38. Do czego służy klauzula ORDER BY?
  39. Jak posortować wyniki według wieku rosnąco (od najmłodszej osoby)?
  40. Jak posortować wyniki według wieku malejąco (od najstarszej osoby)?
  41. Napisz zapytanie, które wyświetli imie, wiek wszystkich osób, posortowane od najstarszej do najmłodszej.
  42. Napisz zapytanie, które wyświetli tylko 10 najstarszych osób (użyj ORDER BY i LIMIT).
  43. Jak pobrać tylko imię i status dorosłości (Dorosły/Niepełnoletni) bez pokazywania daty urodzenia?
  44. Napisz zapytanie, które pokaże wyłącznie niepełnoletnich chłopców (plec = 'm', wiek < 18).
  45. Napisz zapytanie, które pokaże wyłącznie niepełnoletnie dziewczyny (plec = 'k', wiek < 18).
  46. Jak połączyć w jednym SELECT obliczanie wieku, opis płci (CASE) i status dorosłości?
  47. Jak nazwać kolumnę będącą wynikiem CASE aliasem, aby miała nazwę opis_statusu?
  48. Czym różni się COUNT(*) od COUNT(nazwa_kolumny)?
  49. Czy można użyć funkcji TIMESTAMPDIFF bezpośrednio w klauzuli WHERE? Podaj przykład.
  50. Dlaczego lepiej jest używać CURDATE() niż wpisywać datę „na sztywno” przy liczeniu wieku?
  51. Napisz zapytanie, które wyświetli tylko osoby pełnoletnie i posortuje je malejąco według wieku.
  52. Napisz zapytanie, które wyświetli tylko osoby niepełnoletnie i posortuje je rosnąco według daty urodzenia.
  53. Jak wyświetlić w jednym wyniku: imię, płeć jako tekst (Mężczyzna/Kobieta) i wiek?
  54. Jak ograniczyć wyniki do tych, którzy mają wiek między 18 a 25 lat (włącznie)?
  55. Napisz zapytanie, które policzy, ilu jest niepełnoletnich w tabeli osoby.
  56. Napisz zapytanie, które policzy, ile jest osób w każdym „statusie dorosłości” (Dorosły vs Niepełnoletni) z użyciem CASE i GROUP BY.
  57. Jak wyświetlić tylko te osoby, dla których status dorosłości to „Niepełnoletni”, używając warunku na wiek?
  58. Napisz zapytanie, które dla każdej płci poda średni wiek (użyj AVG() i TIMESTAMPDIFF).
  59. Napisz zapytanie, które pokaże imię i wiek tylko tych osób, które mają dokładnie 18 lat.
  60. Wyjaśnij, jak w jednym zapytaniu SELECT można jednocześnie:
    • policzyć wiek,
    • oznaczyć osoby jako dorosłe/niepełnoletnie,
    • przefiltrować tylko dorosłych,
    • posortować ich według wieku
Koszyk