Podstawy
4 godz. 8 min · Bazy Danych · Full-stack i Programowanie
Pierwszy rozdział wprowadza w historię powstania języka. Wspomnimy o standardach, wykorzystywanych wersjach i podzbiorach SQL’a. Zaraz potem wskoczymy w pierwsze poważne operacje, które pozwolą na pełny cykl tworzenia, zasilania bazy danych i wyciągnięcia z niej wybranych informacji. Rozwikłamy też tajemniczy akronim - CRUD.
Skoro potrafimy już tworzyć bazę i tabele, w które możemy wstawić nowe wiersze, dowiemy się więcej o bardzo ważnej funkcji bazy danych: weryfikacji danych. Zostaną zaprezentowane mechanizmy i techniki, które pomogą utrzymać spójność danych.
W kolejnych lekcjach znajduje się opis serca SQL’a, czyli polecenia wybierającego dane i możliwości i opcji z nim związanych. Od przekształcenia bazy danych w prosty kalkulator, aż do warunków filtrowania wybieranych danych (klauzulą WHERE), sortowania ich (klauzulą ORDER BY), czy ograniczania dużych zestawów wynikowych - w tym wsparcia do paginacji.
SQL jest językiem obsługi relacyjnych baz danych. Dlatego najwyższy czas, aby wspomnieć o relacjach i tym w jaki sposób rozszerzają one możliwości wyszukiwania danych oraz pozwalają zobrazować powiązania między danymi w bazie. Dowiesz się o różnych rodzajach połączeń między tabelami i jak te połączenia (zwane JOIN’ami) pozwalają wybrać to, czego potrzebujesz.
Kolejny rozdział dotyczy grupowania danych (wykorzystując klauzulę GROUP BY) i związanych z tym nowymi możliwościami. Dowiesz się tutaj też w jaki sposób agregować pogrupowane dane i jak takie zagregowane dane filtrować.
Przekonasz się, w jaki sposób można zapamiętywać trudne lub często wykonywane zapytania, wykorzystując do tego widoki (VIEWS) i jak można poprawić wydajność pobierania z nich danych. Przykładowo zastosujemy widoki zmaterializowane (MATERIALISED VIEWS). W tym rozdziale przećwiczysz też możliwość zapisywania danych przez widoki.
Z baz danych korzysta zwykle wielu użytkowników. Aby operacje, które wykonują na wspólnej bazie nie spowodowały nieoczekiwanych konsekwencji, wykorzystuje się mechanizm transakcji. W tym rozdziale wytłumaczymy Ci w jaki sposób użytkownicy mogą modyfikować równolegle te same dane. Tutaj też dowiesz się o poziomach izolacji transakcji i jak używać ich w różnych sytuacjach bazodanowych.
Przy pracy z większą ilością danych, bardzo szybko doświadczysz spowolnienia wykonywania zapytań. O tym jak je przyspieszyć dowiesz się właśnie w tym rozdziale. Zwiększanie wydajności zapytań jest tematem rozległym i zaawansowanym. Tutaj będziesz miał szansę poznać podstawy, w tym - po co są i jak używać indeksów, w jaki sposób analizować jak zapytania są wykonywane i jakie jeszcze są metody wydajniejszego odczytywania danych.
Kurs jest dla osób początkujących, rozpoczynających przygodę z bazami danych. Nie wymaga się znajomości SQL'a ani zaawansowanej wiedzy dotyczącej baz danych. Warto wiedzieć co to są relacyjne bazy danych. Dobrze mieć dostęp do ulubionego silnika bazy danych, ale nie jest to wymagane.
Kontynuujemy pracę nad bazą danych do naszej hipotetycznej
aplikacji gry przygodowej to co aplikacje robią
z bazami najczęściej to zgadłeś odczytywanie
z nich danych na swoje potrzeby i dokładnie temu przyjrzymy
się w tym rozdziale przed nami
super ciekawa i chyba najczęściej wykorzystywana funkcjonalność sql
odczytywanie danych z bazy z danymi
jest trochę jak z kodem zapisuje się je raz natomiast odczytuje
tysiące razy może nawet miliony oczywiście aktualizuje
się je na pewno nie tak często jak często następuje odczyt
zobaczmy więc w jaki sposób wyciągnąć z bazy to co chcemy
i jakie możliwości w tym względzie daje nam sql
do odczytywania danych służy zapytanie typu
select i za chwilkę przedstawię kilka formuł na
podstawie których omówi elementy tego zapytania potem
przejdziemy do naszej bazy i wykorzystamy poznane formuły przy tworzeniu zapytań
które mogłaby potrzebować nasza gra jako ciekawostkę
wspomnę że istnieje także w nomenkulaturze sql podzbiór języka
o nazwie dql czyli data query language
nie wspominałem o nim wcześniej gdyż jedynym
jego zapytaniem i właśnie select który jest na tyle znaczący że
o dql właściwie się nie wspomina natomiast o select jak
najbardziej pierwszym przykładowym
zapytaniem jest znane już ci
wcześniej zapytanie wyciągające wszystkie dane z tabeli
select gwiazdka from i tu nazwa tabeli gwiazdka
w tym przypadku oznacza wszystkie kolumny jakie tylko da się zwrócić wszystkie
kolumny z danej tabeli a jeżeli połączymy tabelę o
czym będę mówił w następnym rozdziale to będą to kolumny ze wszystkich
złączonych tabel zamiast gwiazdki można podać
nazwy kolumn których dane chcemy wyciągnąć
z bazy w miejscu nazw kolumn
może się pojawić dowolne wyrażenie które
zwróci jakąś wartość do wyświetlenia o tym jakie to mogą
być wyrażenia będę mówił przy okazji demonstracji
na naszej bazie kolumny można
aliesować to znaczy zmieniać im nazwę
które się wyświetlają taka nazwa aliasu a
kolumny także nie powinna być słowem zastrzeżonym czyli
na przykład jakąś klauzulą sql ostatnim przykładem prostym
przykładem użycia selecta jest zastosowanie wyrażenia distinct
które zwróci unikalne wartości w danej
kolumnie tak jak tutaj w przykładzie jeżeli wyspecyfikujemy
więcej kolumn będzie to zestaw wierszy w którym
każdy wiersz jest unikalny to znaczy dane w
wybranych kolumnach razem stanowią unikalny
zestaw a teraz przejdźmy do naszej
bazy chcę jeszcze wspomnieć
o rzadziej używanym wyrażeniu które jednak bardzo przyda się w naszej
bazie mowa o warunkowym wybieraniu lub wyświetlaniu
danych z użyciem wyrażenia case w widocznym
zapisie warunek jest dowolnym wyrażeniem
zwracającym wartość logiczną true albo false natomiast
rezultat jest dowolnym wyrażeniem takim jak byśmy się spodziewali
w zapytaniu select może być to odnośnik
do do kolumny albo dowolny
tekst cokolwiek co zwróci nam jakieś
dane do wyświetlenia do wybrania takich
warunków z odpowiadającymi im rezultatami może być więcej natomiast
na końcu może się też pojawić słowo kluczowe else po
którym podany jest rezultat domyślny który
zostanie zwrócony jeśli żadne z powyższych warunków nie będzie spełnione
jeśli nie ma else'a i żaden z warunków
nie został spełniony to rezultatem jest wartość null
warunki sprawdzane są w kolejności występowania
w wyrażeniu case i rezultat
jest zwracany dla pierwszego spełnionego warunku żeby
łatwiej było demonstrować różne możliwość wybierania danych wprowadźmy
więcej bohaterów zakładam że masz
stworzoną tabelę i bazę sqland i
tabelę heroes teraz do lekcji dołączony jest
plik ze zrzutem bazy danych z tego pliku tak naprawdę potrzebujemy
serię poleceń insert into wystarczy je skopiować
a następnie uruchomić w bazie jeżeli
pojawi się informacja o błędzie można dodać przed
tymi poleceniami insert wystarczy wprowadzić delete
from heroes co usunie wszystko z tabeli heroes
a następnie wstawi cały ten zestaw danych na którym
będziemy mogli pracować proszę bardzo wszystko
wprowadzone teraz możemy rozpocząć od najprostszego
zapytania select który pokaże nam zawartość
naszej tabeli po uruchomieniu powinniśmy
zobaczyć całą listę dziewięciu bohaterów których
przed chwilą wprowadziliśmy do bazy danych załóżmy
teraz że w naszej grze do ekranu wyboru bohaterów
potrzebujemy ich listę z podstawowymi danymi imię
nazwisko rasa płeć chcemy
w takim razie wybrać tylko te kolumny
które nas interesują zamiast gwiazdki wstawimy
tutaj nazwy kolumn które chcemy żeby zostały pobrane z
bazy danych które będziemy mogli później wyświetlić w aplikacji
uruchamiamy zapytanie i mamy dokładnie ten zestaw który chcemy tak
jak wspomniałem oprócz kolumn w select możemy zamieszczać
dowolne wyrażenie może być to na przykład działanie
matematyczne jak takie zapytanie wykonamy wynik
tego działania zostanie wydrukowany już nie pobrany
ale znajduje się znajdzie się w wynikowym zestawie danych
co ciekawe można pominąć
kompletnie wybieranie danych z
kolumn i skoro nie mamy kolumn
to właściwie nie musimy specyfikować też tabeli z której wybieramy
dane w tym wypadku dostaniemy po prostu wynik
tej operacji w ten sposób mamy z bazy danych bardzo
szybki kalkulator którym możemy w miarę potrzeby dokonywać
różnych operacji także
na liczbach zmiennoprzecinkowych może nam się to przydać jeżeli
nie mamy nigdzie pod ręką kalkulatora chcemy szybko coś policzyć
podczas analizy danych czy podczas operacji na bazie
wracając do naszego oryginalnego zapytania
wyrażeniem może być także wynik
funkcji w naszym przykładzie chcielibyśmy po
prostu pobrać imię i nazwisko razem
jako nazwę bohatera a nie operować dwoma
osobnymi kolumnami do tego idealnie nadaje się funkcja
concat która concatenuje
czyli skleja dwa albo
więcej ciągi znaków w tym przypadku sklei
nam imię i nazwisko tą kolumnę no zabrakło tu nam czegoś
spacji ale
już ją dodajemy oczywiście
no ale zobaczymy kolumna nazywa się concat baza
wzięła nazwę tej kolumny z nazwy funkcji która została
została użyta jeżeli chcemy wyświetlić coś sensowniejszego
możemy użyć tutaj aliasu
o którym wcześniej wspominałem w ten sposób mamy
kolumnę hero gender i race i
do tych kolumn w zbiorze wynikowym możemy
się odwoływać załóżmy teraz że pięknie
to wygląda z tym że płeć oznaczona
literkami może nie jest zbyt czytelna co
można zrobić żeby tam się pojawiło pełne słowo mężczyzna
kobieta zamiast tych literek do tego świetnie
nada się w wyrażenie case o którym wspominałem
wcześniej w tym wypadku kolumna gender nie
może być zwracana bezpośrednio tylko z pomocą właśnie
wyrażenia case kiedy wartość
kolumny gender jest M chcemy zwrócić słowo mężczyzna natomiast
gdy wartość
tego pola będzie K zostanie wyświetlona kobieta i
proszę bardzo zwróć uwagę też w jaki sposób sformatowałem
to zapytanie przy
większych zapytaniach w szczególności takich które mają bardziej
skomplikowane elementy selecta dla
czytelności każdą zwracaną kolumnę wypisuje
się w ramach selekcji na oddzielnej linii
w tym wypadku case.nawet zajmuje dwie linie też
ze względu na czytelność a także
jak widzisz główne klauzule zapytania
w tym wypadku select i from są wyjustowane
do lewej strony tak żeby łatwo było w
ciągu całego zapytania je znaleźć i zobaczyć
jakie są wartości w tym wypadku na przykład z jakiej tabeli dane
są wyciągane w innym miejscu naszej
gry możemy mieć na przykład w momencie kiedy dodajemy nowego
bohatera możemy chcieć przedstawić
użytkownikowi listę ras z których może
wybierać przy tworzeniu nowego bohatera więc spróbujmy w
ten sposób mamy listę ras ale wszystkich
a chcielibyśmy wybrać tylko zestaw
unikalnych wartości z których użytkownik mógłby wybrać
jeden wiersz tak jak wspomniałem wcześniej można
to zrobić dodając słowo distinct co
powoduje że wyświetlone będą tylko unikalne wartości
wygląda na to jakby krasnolud
nie był unikalny no okazuje się że faktycznie
była tam spacja i
mamy unikalną listę ras którą możemy wyświetlić
w aplikacji
Wybieranie danych z bazy · 6 min
-- Wybieranie wszystkich rekordów z tabeli 'heroes'
SELECT * FROM heroes;
-- Wybieranie tylko określonych danych (kolumn) z tabeli 'heroes'
SELECT first_name, last_name, gender, race FROM heroes;
-- Dodatkowa kolumna obliczeniowa w zapytaniu o dane z tabeli 'heroes'
SELECT first_name, last_name, gender, race, 3+7 FROM heroes;
-- Użycie SELECT-a jako kalkulatora, bez odwołania do tabeli
SELECT 3*40 / 5.0;
-- Użycie funkcji w zapytaniu SELECT, do wyświetlenia pełnej nazwy bohatera
SELECT CONCAT(first_name, ' ', last_name), gender, race FROM heroes;
-- Nazwanie kolumny z połączonymi danymi przez użycie aliasu do kolumny
SELECT CONCAT(first_name, ' ', last_name) AS hero, gender, race FROM heroes;
-- Bardziej przyjazne wyświetlenie informacji o płci bohaterów z użyciem wyrażenia CASE
SELECT CONCAT(first_name, ' ', last_name) AS hero,
CASE WHEN gender = 'M' THEN 'Mężczyzna'
WHEN gender = 'K' THEN 'Kobieta' END,
race
FROM heroes;
-- Wyświetlenie listy ras (z kolumny 'race') -> na razie wszystkie rasy zapisane w tabeli z powtórzeniami
SELECT race FROM heroes;
-- Wyświetlenie listy unikalnych ras w tabeli
SELECT DISTINCT race FROM heroes;