Naucz się SQL w 60min – kurs SQL krok po kroku

Każdy webdeveloper powinen znać podstawy SQL – języka baz danych. Nie da się stworzyć żadnej, poważnej aplikacji, która nie wymagałaby przechowywania informacji. Nawet w prostych projektach dla początkujących spotkacie się choćby z zapisywaniem danych takich jak np. loginy i hasła użytkowników, zadania w to-do liście czy kontakty w książce telefonicznej. Prawdopodobnie nie ma webdevelopera, back-endowca, full-stacka, który nigdy nie dotknie zapytań SQL. Przygotowałam dla was krótkie, ale szczegółowe wprowadzenie do SQL dla początkujących.

Co to jest SQL?

Język SQL (ang. Structured Query Language) istnieje od lat 70 i wciąż jest najpopularniejszym językiem zapytań (ang. query language), służącym do tworzenia, edycji, zarządzania relacyjnymi bazami danych (istnieją też bazy nierelacyjne, ale o nich będzie innym razem).

Kurs SQL podstawy w 60 min

Znajomość języka SQL jest przydatną umiejętnością. Jeśli chcecie obsługiwać dowolny system zarządzania relacyjnymi bazami danych taki jak mySQL, PostgreSQL, Firebird, Microsoft SQL Server, potrzebujecie znajomości języka zapytań.

Dane w bazie składowane są w tabelach (można sobie to porównać z tabelą w Excelu). Między tabelami mogą występować zależności – czyli relacje (stąd relacyjne bazy danych).

Mam nadzieję, że poniższy schemat przybliży wam działanie SQL i baz danych:

schemat kurs sql podstawy

Programista jest użytkownikiem zaawansowanym. Tworzy bazę oraz aplikację np. aplikację webową dla użytkowników końcowych.
Aplikacja jak i programista kontaktuje się z systemem zarządzania bazą danych (np. mySQL) za pomocą języka SQL – przesyła / pobiera / modyfikuje dane w bazie. To system zarządzania wykonuje zadane operacje. Schemat jest informacją jak składowane są dane w bazie.

Aby wykonywać zapytania SQL potrzebujemy środowiska dla naszej bazy danych. Inaczej potrzebny jest nam serwer – wykupiona usługa hostingowa, albo postawiony lokalnie za pomocą np. xampp’a lub wamp’a (w przypadku mySQL). Żeby uniknąć ustawiania środowiska lokalnego skorzystamy z interpretera online trySQL od w3school.

Teoria za nami 😉

Zaczynamy praktyczną naukę języka SQL. Podstawy, które powinen znać każdy programista. Oto skondensowany, 60 minutowy kurs SQL dla początkujących!

1. Utwórz tabelę

Do tworzenia nowych tabel w SQL wykorzystywana jest instrukcja CREATE TABLE. Jako argumenty podajemy wszystkie nazwy kolumn, które chcemy mieć w tabeli, oraz ich typy danych.

Stworzymy sobie prostą tabelę z postaciami z literackimi (Heroes – dobrze jest nazywać tabele w języku angielskim jako rzeczowniki w liczbie mnogiej). Nasza tabela składa się z 3 kolumn:

  • id – Numer/identyfikatorpostaci (int – liczba całkowita)
  • name – Imię i nazwisko (string – ciąg maksymalnie 25 znaków)
  • siblings – liczba rodzeństwa bohatera (int – liczba całkowita)

Tak wygląda nasze pierwsze polecenie SQL:
CREATE TABLE Heroes (id int, name varchar(25), siblings int);

tworzenie tabeli - podstawy SQL

W waszej bazie zostały dokonane zmiany – pojawiła się nowa tabela, która jest pusta.

sql kurs tworzenie tabeli

Podczas tworzenia tabel zalecane jest dodanie klucza podstawowego do jednej z kolumn (zazwyczaj id) – jest to wartość niepowtarzalna (unikalna). Każdy wiersz może zostać wskazany na podstawie swojego identyfikatora, dodatkowo przyspiesza to wykonywanie zapytania. Dla różnych systemów zarządzania bazami (np. mySQL, PostgreSQL, Firebird, Microsoft SQL Server) klucz podstawowy można dodać na różne sposoby. Stąd nie będziemy ich omawiać, a więcej o kluczach podstawowych przeczytacie tutaj.

2. Wstawianie wierszy

Wypełnimy naszą tabelę danymi. Aby dodać wiersze z postaciami wykorzystamy instrukcję INSERT. Możemy to zrobić na dwa sposoby.

1) Pierwszy sposób to wstawianie bez podawania nazw kolumn. SQL zakłada, że podaliśmy wartości we właściwiej kolejności
INSERT INTO Heroes VALUES (1, 'Harry Potter', 0);

Zapis jest krótszy, ale ma pewną wadę. Jeśli w przyszłości postanowimy dodać do tabeli dodatkową kolumnę np. tytuł powieści, to zapytanie przestanie działać.

2) Drugi sposób rozwiązuje powyższy problem. Poniższe zapytanie uwzględnia nazwę kolumn, więc nawet jeśli zmodyfikujemy tabelę, jak długo będą w niej istnieć kolumny – id, name, sibilings, będzie wykonywać się prawidłowo:
INSERT INTO Heroes (id, name, siblings) VALUES (2, 'Ron Weasley', 6);

Teraz nasza tabela zawiera dwa rekordy:
dodawanie wierszy SQL podstawy

Ćwiczenie: Możesz dodać więcej postaci lub wielokrotnie ten sam wiersz – ponieważ nie mamy ustawionego primary key (klucza podstawowego) takie operacje są możliwe, chociaż jest to działanie niepożądane.

3. Wybieranie / wyświetlanie danych

Zapytania typu SELECT to główni sprzymierzeńcy programistów. Pozwalają wyciągnąć dane z bazy danych. Są używane dosłownie wszędzie, gdzie trzeba dane z bazy wyświetlić.

Najprostrzym zapytaniem SQL jest zapytanie wyświetlające wszystko. Jeśli utworzyliśmy kilka różnych rekordów w bazie, wszystkie możemy wyświetlić za pomocą:
SELECT * FROM Heroes;

Gwiazdka (*) oznacza, że chcemy pobrać wszystkie dostępne kolumny. Dodatkowo, ponieważ bazy danych zwykle składają się z więcej niż jednej tabeli, słowo kluczowe FROM określa, którą tabelę mamy na myśli.

TrySQL zawiera kilka przykładowych tabeli, dlatego możemy wyświetlić:
SELECT * FROM Categories;

kurs SQL zapytanie select

Zazwyczaj jednak nie chcemy na raz mieć wszystkich kolumn z tabeli. Za pomocą SQL możemy wybrać tylko te, które potrzebujemy. Zamiast * użyjemy nazw kolumn.

SELECT name FROM Heroes;

Możemy pobrać kilka kolumn wymieniajac je po przecinku:

SELECT CategoryName, Description FROM Categories;
SQL zapytanie - wybranie wielu kolumn

W wielu przypadkach zależy nam, by dane były posortowane. W tym celu możemy użyć w SQL instrukcji ORDER BY. Domyślnie dane sortowane są rosnąco – ASC, możemy też posortować malejąco – DESC:

SELECT CategoryName, Description FROM Categories ORDER BY CategoryName DESC;

kurs sql polecenia sortujące

Ćwiczenie: Spróbuj napisać zapytanie sortujące rosnąco, ale według drugiej kolumny. Poeksperymentuj z pozostałymi tabelami dostępnymi na TrySQL.

4. Klauzula WHERE

Umiemy wybrać całe kolumny. Teraz zmodyfikujemy nasze zapytania tak, aby wybrać tylko te wiersze, które zawierają w kolumnie odpowinią wartość (wszystkich bohaterów mających 2 rodzeństwa). Tutaj z pomocą przychodzi klauzala WHERE, która pozwala odfiltrować dane w zależności od warunku.

SELECT * FROM Heroes WHERE siblings = 2;

W mojej tabeli akurat nie ma takich postaci. Jednak możemy skorzystać z tabeli Customers z TrySQL:

SELECT * FROM Customers WHERE Country = 'UK';

klauzula where w zapytaniach SQL

W SQL, tak jak w innych językach programowania, możemy użyć operatora modulo – dzielenia z resztą (np. 5 % 2 = 1 – bo reszta z dzielenia 5/2 wynosi 1).

Dzięki czemu szybko znajdziemy wszystkie postacie, których identyfikator jest parzysty.

SELECT * FROM Heroes WHERE (id % 2) = 0;

Ćwiczenie: Znajdź wszystkich klientów z tabeli Customers, którzy pochodzą z Londynu.

5. Operatory AND/OR

Może się zdarzyć, że chcemy, by wiersze spełniały więcej niż jeden warunek. Kilka warunków możemy połączyć za pomocą operatorów logicznych AND i OR.

AND – oznacza logiczne „i/oraz” – oba warunki muszą zostać spełnione
OR – oznacza logiczne „lub” – jeden z dwóch warunków musi być spełniony

Baza danych na TrySQL zawiera tabelę Products. Wybierzmy z niej tylko te produkty, które są słodyczami (kategoria 3) oraz ich cena jest wyższa niż 40.

Na początek stwórzmy dwa zapytania:

SELECT * FROM Products WHERE CategoryID = 3;

zapytanie sql dla kategorii

SELECT * FROM Products WHERE Price > 40;

zapytanie sql dla ceny

Gdy je połączymy otrzymamy trzy wiersze:
SELECT * FROM Products WHERE CategoryID = 3 AND Price > 40;

kurs SQL - operator AND

Ćwiczenie: Znajdź wszystkie napoje, których cena nie przekracza 30. Spróbuj znaleźć wszystkie produkty, które są przyprawą lub słodyczami.

6. Operatory IN / BETWEEN / LIKE

Wyrażenie WHERE pozwala na użycie dodatkowych instrukcji i tworzenie jeszcze lepszych warunków:

  • IN – porównuje kolumnę z wieloma możliwymi wartościami. Zwróci wartość true, jeśli uda się dopasować chociaż jedną wartość.
  • BETWEEN – sprawdza, czy wartość mieści się w zadanym zakresie
  • LIKE – wyszukuje określony wzorzec

Przykładowo chcemy wybrać z tabeli produkty będące przyprawą lub słodyczami. Możemy pominąć użycie operatora OR. Zamiast tego użyć IN (wartość1, wartość2) i otrzymać ten sam wynik:

SELECT * FROM Products WHERE CategoryID IN (2,3);

Gdybyśmy chcieli wybrać produkty, których cena mieści się w naszym budżecie np. 30-50 stworzylibyśmy następujące zapytanie:

SELECT * FROM Products WHERE Price BETWEEN 20 AND 50;

Możemy też wybrać produkty, których nazwa pasuje do pewnego wzoru np. zaczyna się od 3 tych samych liter – „Cha”

SELECT * FROM Products WHERE ProductName LIKE 'Cha%';

I tutaj pojawia się zaskoczenie. O ile w przypadku wartości liczbowych znak % oznacza symbol modulu – dzielenie z resztą, tak w przypadku stringów % pozwala dopasować dowolny ciąg znaków.

Zapytanie wzorzec '%art%' dopasuje wszystkie wyrazy, które w środku zawierają słowo art:

SELECT * FROM Products WHERE ProductName LIKE '%art%';

zapytanie SQL szukanie wzorca

Wszystkie powyższe operacje można odwrócić, umieszczając NOT przed nimi.

Ćwiczenie: Spróbuj użyć NOT BETWEEN dla przykładu wyżej. Znajdź produkty, które zawierają literę A oraz RT w jednej nazwie produktu (podpowiem, że jest takich nazw 6).

7. Funkcje

Język SQL jest wyposażony w funkcje, które wykonują wiele przydatnych czynności. Oto przykłady najczęściej używanych:

  • COUNT() – zlicza liczbę wierszy
  • SUM() – zwraca całkowitą sumę wartości w danej kolumnie liczbowe
  • AVG() – zwraca średnią z wartości
  • MIN() / MAX() – zwraca najmniejszą / największą wartość

Prosto policzymy wszystkie produkty w bazie:
SELECT COUNT(*) FROM Products;

Znajdźmy jaką cenę ma najdroższy produkt:
SELECT MAX(Price) FROM Products;

kurs sql - funkcja max

Ćwiczenie: Użyj SUM oraz klauzurę WHERE, aby z sumować koszt wszystkich produktów, które są napojami.

8. Zagnieżdżenia

Jeżeli w poprzednim punkcie w trakcie eksperymentów przyszło wam do głowy szukanie produktu (wiersza) o najwyższej cenie, to mogło się to okazać trudne/niemożliwe z wykorzystaniem samej klauzuli WHERE. To dlatego, że najpierw musimy wykonać obliczenia np. uzyskać cennę najdroższego produktu, a dopiero później możemy tę wartość wykorzystać w porównaniu.

Załóżmy, że tym razem chcemy mieć nazwę oraz ilość produktu o najniższej cenie.

Wyciągnięcie tych dwóch kolumn nie powinno sprawić nam problemu:
SELECT ProductName, Unit FROM Products;

Podobnie znalezienie najniższej ceny nie jest dla nas czymś nowym:
SELECT MIN(Price) FROM Products;

Teraz te dwa zapytania chcemy połączyć za pomocą klauzyli WHERE:

SELECT ProductName, Unit
FROM Products
WHERE Price = (
    SELECT MIN(Price) FROM Products
);

przykład zapytania SQL zagnieżdżenia

Ćwiczenie: Zmień powyższe zapytanie tak, aby zwróciło nazwę, kategorię oraz cenę napojów, których cena jest wyższa niż średnia z cen wszystkich produktów.

9. Łączenie tabeli

W złożonych bazach danych istnieją połączenia – relacje między tabelami.

Prosty, codzienny przykład z życia. W sklepie internetowym możemy mieć tabelę przechowującą zamówienia, która będzie w relacji z tabelą klienci. Nie dziwi nas, że na podstawie zamówienia możemy znaleźć zamawiającego lub na podstawie informacji o kliencie wylistować wszystkie jego dotychczasowe zakupy.

Jak to wygląda w bazie?
W tabeli zamówienia nie mamy informacji o adresie na jaki paczka została wysłana, ale mamy informację o identyfikatorze klienta. Tabelę Orders z tablą Customers łączy w relację kolumna CustomerID. Stąd możemy stworzyć zapytanie, które wyciagnie dla nas np. identyfikator zamówienia, identyfikator kuriera oraz kraj do jakiego została nada przesyłka.

Jeśli chcemy utworzyć zapytanie, które zwraca wszystko, co musimy wiedzieć o zamówieniu, możemy użyć INNER JOIN do wybrania kolumn z obu tabel.

SELECT Orders.OrderID, Orders.ShipperID, Customers.Country
FROM Orders
INNER JOIN Customers ON
Orders.CustomerID = Customers.CustomerID;

zapytanie SQL join

UżycieJOIN oraz INNER JOIN oznacza dokładnie to samo – słowo inner można pominąć. Jest to najprostszy i najczęstszy typ łączenia tabeli, ale istnieje kilka innych opcji (słowa w nawiasie można pominąć):

  • (INNER) JOIN – zwraca część wspólną dwoch tabel – tylko rekordy, które mają pasujące wartości w obu tabelach
  • LEFT (OUTER) JOIN – zwraca wszystkie rekordy tabeli po lewej stronie operatora JOIN oraz rekordy dopasowane z prawej tabeli
  • RIGHT (OUTER) JOIN – zwraca wszystkie rekordy tabeli po prawej stronie operatora JOIN oraz rekordy dopasowane z lewej tabeli
  • FULL (OUTER) JOIN – zwraca wszystkie rekordy, gdy występuje dopasowanie w lewej lub prawej tabeli

kurs SQL Join typy

MySQL nie obsługuje polecenia full join. Wówczas konieczne jest połączenie tabeli prawej oraz lewej i uwspólnienie danych za pomocą instrukcji UNION.

Ponadto możne także spotkać pojęcie self join – oznacza połączenie lub porównywania tabeli samej ze sobą.

Ćwiczenie: Stwórz zapytanie, które zwróci numer zamówienia, numer klienta oraz nazwę kuriera.

10. Aliasy

Spojrzymy na poprzedni przykład. Mógł się początkowo wydawać bardziej skomplikowany, tylko dlatego, że używamy formatu nazwa_tabeli.nazwa_kolumny. Dzięki aliasom, możemy znacznie skrócić ten zapis:

SELECT o.OrderID, o.ShipperID, c.Country
FROM Orders AS o
INNER JOIN Customers AS c
ON o.CustomerID = c.CustomerID;

Słowo AS jest opcjonalne:

SELECT o.OrderID, o.ShipperID, c.Country
FROM Orders o
INNER JOIN Customers c
ON o.CustomerID = c.CustomerID;

Kod z wykorzystaniem aliasów zadziała dokładnie tak samo, jak kod z pełnymi nazwami, a przy wyciąganiu wielu kolumn z tabeli o dłuższych nazwach będzie bardziej czytelny.

11. Aktualizowanie danych

Często zdarza się, że musimy zmienić dane w bazie. SQL pozwala zaktualziować wiersze za pomocą instrukcji UPDATE.

Aby zaktualizować wiersz w tabeli potrzebujemy:
UPDATE...SET...WHERE

  • Nazwę tabeli, w której dokonujemy zmian
  • Nowe wartości w kolumnach
  • Wiersze, które mają zostać zaktualizowane – wskazane za pomocą klauzuli WHERE

Uwaga: Jeżeli pominiemy ostatni punkt – wskazanie wierszy do aktualizacji, to zmodyfikujemy wszystkie wiersze w tabeli (!)

Jak mogliśmy do tej pory zauważyć klienci z Wielkiej Brytanii mają w kolumnie kraj akronim – UK. Chcemy zamienić go na pełną nazwę:

UPDATE Customers
SET COUNTRY = 'United Kingdom'
WHERE Country = 'UK';

Ćwiczenie: Załóżmy, że użytkownikcza imieniem Elizabeth Lincoln zmieniła nazwisko na Favreau. Nanieś poprawkę w systemie.

12. Usuwanie wierszy

Wreszcie zdarza się tak, że musimy usunąć dane z tabeli. W języku SQL mamy dostępną instrukcję DELETE – wystarczy wybrać odpowiednią tabelę i wiersz, które chcemy usunąć.

Usuńmy z bazy jednego użytkownika:

DELETE FROM Customers
WHERE CustomerID = 2;

Teraz gdy wyświetlimy SELECT * FROM Customers; nie mamy już klienta o identyfikatorze 2.

Uwaga: Przed usunięciem zawsze upewnij się, że klauzulaWHERE znajduje się w zapytaniu. Inaczej zostaną usunięte wszystkie wiersze w tabeli (!)

13. Usuwanie tabeli

Ostatecznie możemy chcieć usunąć całą zawartość – wszystkie wiersze, pozostawiając strukturę tabeli. Prawidłowo zrobimy to poleceniem TRUNCATE TABLE:

TRUNCATE TABLE Heroes;

kurs sql usuwanie tabeli

Po tej komendzie tabela znowu jest pusta.

Jeżeli chcemy usunąć tabelę w całości – tj wszystkie ślady, że taka tabela była w naszym systemie, należy wykonać polecenie DROP TABLE:

DROP TABLE Heroes;

Pamiętajcie jednak zachowywać ostrożność przy poleceniach TRUNCATE oraz DROP – tych operacji nie możecie cofnąć.

Sprawdź swoją wiedzę!

Jeśli chcecie sprawdzić czy opanowaliście podstawy SQL zapraszam was do zrobienia prostego quizu [ sql-quiz ].

Materiały do nauki SQL

Ten krótki kurs pokrył najważniejsze, najczęściej używane zapytania SQL, jednak to oczywiście nie koniec.
Jeżeli chcecie pozać SQL lepiej tutaj garść materiałów godnych polecenia.

W języku polskim:

KhanAcademy: Zarządzanie danymi i tworzenie zapytań – kurs SQL wideo z interaktywnymi zadaniami

Technologie przetwarzania baz danych (Politechnika Poznańska) – wykłady SQL podstawy (mocno rozbudowane) + zadania (w sekcji pozostałe znajduje się skrypt do wygenerowania tabel ćwiczeniowych)

Po angielsku kursy interaktywne:
Try SQL – krótki interaktywny tutorial w formie wideo + zadania

kurs SQL Bolt – interaktywne lekcje krok po kroku – teoria + zadania

SQL Zoo – kurs SQL krok po kroku też w formie interaktywnego quizu

PostgreSQL Exercises – interaktywny quiz z wiedzy o SQL (na przykładzie tabel psql)

Data Bases – kilka mniejszych kursów dotyczących baz danych zrobionych przez Stanford University, ale udostępnionych publicznie za darmo.