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.
Kontynuując temat weryfikacji danych i mechanizmów
bazy na to pozwalających pierwszy z tych mechanizmów o którym będę
chciał ci powiedzieć to typowanie danych jeśli przerabiałeś poprzedni
rozdział to może jeszcze nieświadomie został ten mechanizm
użyte przez ciebie tak tak podczas definiowania kolumn tabeli
bohaterów na której jeszcze będziemy pracować jeśli nie przerabiałeś
poprzedniego rozdziału to nic straconego podczas tej lekcji zostaniesz
wtajemniczony w temat w tabeli każda
kolumna musi mieć określony typ danych jaki będzie przechowywała chcę
ci przedstawić kilka podstawowych typów które warto znać na start
niektóre z tych typów mają skrócone aliasy najczęściej przy
definicji kolumn używa się właśnie aliasów szczególnie że niektóre
systemy baz danych nie akceptują standardowych pełnych nazw w przypadku
postgresa można używać obydwu wersji pełnej i skróconej kolumny typu
character varying przechowują ciągi znaków zmiennej długości stąd
varying o określonym ograniczeniu na liczbę znaków próba zapisu
ciągu znaków o większej niż wartość n długości spowoduje
błąd n jest liczbą całkowitą w niektórych
systemach baz tak jak na przykład w postgresie można pominąć
to ograniczenie co pozwala na zapisanie ciągów znaków o dowolnej
długości ograniczoną jedynie ilością pamięci i miejsca na
dysku w serwerze bazy danych integer odnosi się do wartości całkowitych
najczęściej czterobitowych liczb ze znakiem są jeszcze
dostępne warianty tego typu takie jak big int small int i
tak dalej pozwalający na dostosowanie się do wartości przechowywanych
i przez to optymalnym wykorzystaniu przestrzeni dyskowej i
pamięci są one jednak różne dla różnych systemów
baz danych dlatego przed użyciem warto skonsultować się manualem
lub dokumentacją online typ character użyty
przy definicji kolumny podobnie jak varchar pozwala na przechowywanie ciągów
znaków jednak o stałej długości można przechowywać ciągi
znaków krótsze niż zadeklarowane ograniczenie jednak dopełniane
są wtedy spacjami jeżeli mamy na przykład kolumny character
5 a zapiszemy ciąg znaków 3-litrowy zostaną
dodane 2 spacje dlatego mimo lepszej wydajności używania
tego typu w porównaniu z varchar stosuje się go tylko kiedy
przechowywane ciągi znaków są stałej długości typ boolean
pozwala na przechowywanie wartości logicznych true i false i null
po prostu tak nic tu nie ma bardziej skomplikowanego w niektórych systemach
występuje jako typ bit ale też przechowuje 3 rodzaje wartości
prawda fałsz i wartość pustą date to oczywiście
data natomiast timestamp to już jest i data i czas podstawowy
typy nie zawiera informacje o strefach czasowych natomiast jeśli chcielibyśmy
przechowywać wartości ułamkowe ale dokładne jak
na przykład ceny czy wartości walutowe używa się do tego typu
numeric czasem zwanego decimal określa się w nim precyzje
liczby ilość miejsc po przecinku zapisywanej liczby nie jest to jednak wydajny
typ danych do obliczeń precyzja jest tu wrowadzona kosztem
wydajności będziemy dodawać nowe kolumny
już jedną nową kolumnę dodałeś w ramach w pracy własnej
jest to birthdate typu date ale data urodzin
można by pomyśleć niewiele nam daje lepszy byłby
wiek bohatera tak bo wtedy to byłaby jakaś konkretna informacja
jakby drużyna chciała wejść na film z ograniczeniem
200 plus to wiadomo że ten elf by nie mógł wejść przechowywanie
wieku nie jest to najlepszy pomysł dlatego
że za rok za dwa trzeba by było zaktualizować wartość
w tej kolumnie natomiast data urodzin jest stała a wiek można sobie policzyć
i z tym wiąże się pewna ogólna zasada dobra praktyka że
w bazie nie przechowywuje się wartości które można policzyć głównie
ze względu na to że są one dynamiczne i mogą
się zmieniać w czasie i tak to właśnie jest z wiekiem i datą
urodzin dodamy teraz nową kolumnę typu boolean
załóżmy że nasi bohaterowie mogą tworzyć drużyny i
możemy wyznaczyć jednego z nich na lidera takiego takiej drużyny
w takim razie do naszej tabeli heroes dodamy
nową kolumnę która będzie się nazywa
is teamleader jeżeli chodzi o nazewnictwo kolumn to
podobnie jak w językach programowania powinny one być zrozumiałe
i odpowiadać temu co przechowują w tym wypadku ponieważ to jest wartość logiczna typu boolean
to naturalnym jest nazwa is teamleader chcemy żeby
ta kolumna zawsze przechowywała jakąś wartość albo true albo false
więc będziemy chcieli żeby nie mogło być przechowanej w niej
wartość pusta czyli null no cóż niestety takie zapytanie nie zadziała
dlatego że chcemy stworzyć tabelę zabronić wartości pustych a na dzień dobry
ponieważ już mamy tam dane to ta kolumna by musiała
mieć wartości puste gdyby nasza tabela była pusta to by zadziałało dlatego
że żadne dane z tymi z tym ograniczeniem by nie kolidowało
w tej chwili to jest niemożliwe co można zrobić są dwa scenariusze jedno
z nich to ustawić wartość domyślną w tym
momencie wszystkie nowe rekordy w tej kolumnie będą miały wartość false
i to pięknie zadziała
możemy sobie odświeżyć tutaj zobaczyć że ta kolumna się pojawiła
i możemy też sobie wyświetlić zawartość żaden
żaden bohater nie jest tym itemem natomiast chciałem
też pokazać sytuację w której nie chcemy ustawić jednej
wartości tylko mamy jakiś przepis na ustawienie różnej
wartości zależnie od na przykład od danych albo nie wiem losowej no
i wtedy ustawienie domyślnej wartości jednej nam nie załatwi
sprawy usunę tą kolumnę drugi sposób to
jest dodanie kolumny ale na dzień dobry
nie mającej ograniczenia not null a następnie ustawienia
jakichś wartości i nałożenia tego ograniczenia zróbmy
to w ten sposób tak odtworzymy nową tabelę bez wartości
domyślnej tam są po prostu puste wartości proszę
bardzo nullowe następnym krokiem jest aktualizacja
w tabeli variables a konkretnie kolumnę is teamleader o
wartości jakiejś zróbmy tak że to będą jakieś losowe wartości ponieważ
chcemy żeby to były wartości true i false a
random zwraca nam wartości od 0 do 1
to zaokrąglimy te wartości do 0
albo 1 zależnie od tego czy są powyżej połowy czy poniżej
funkcja random takie round zwracana dane typu
zmiennoprzecinkowego double precision więc musimy to
zrzutować na integer i teraz takie liczby całkowite
typu 01 możemy bezpiecznie zrzutować
na boolean 0 będzie fałszem jedynka
będzie prawdą i zrobimy to dla całej tabeli proszę
bardzo w tej chwili jak to wygląda mamy losowe wartości i w tym momencie możemy
możemy znowu zmodyfikować tą
kolumnę tak a żeby nie można było nowych dodać
pustych wartości czyli przez set not null albo po
prostu not null i już nie da się ustawić
na na wartość pustą jak zrobię takie zapytanie to baza nie pozwoli
na to została
nam jeszcze jedna kolumna do dodania zakładamy że nasi bohaterowie
będą mogli zdobywać jakieś pieniądze i później
je wydawać na ekwipunek o ekwipunku już
za dwa rozdziały więc musimy zapisywać ile tej kaski mają
w takim razie musimy zmodyfikować naszą tabelę i dodać
nową kolumnę która zgodnie z tradycją gier
fantastycznych będzie przechowywała ilość złota i
właściwie to wszystko oczywiście chcemy żeby nie było
wartości pustych a domyślnie wartość 0 jest idealną
wartością i taką kolumnę możemy sobie stworzyć i już
możemy zbierać kasę dla bohaterów albo bohaterami
i zapisywać tutaj ich stan majątkowy a
na koniec zadania do przepracowania już tradycyjnie co
jest do zrobienia do zrobienia jest dodanie moniaków otóż chciałbym
żebyś zmienił typ kolumny gold na taki który umożliwiłby zapisywanie grosz
tak czyli dwa miejsca po przecinku powinny się pojawić powinieneś
już mieć pomysł jaki typ można by jakiego typu można by to
ułożyć to jest przed tobą poza tym dodatkowo wybierz kilku
z bohaterów i przypisz ich jako team leaderów a następnie
w ramach sprawdzenia napisz takie zapytanie select które wybierze
tych bohaterów którzy są liderami drużyn jeśli chodzi
o rozwiązania tym razem nie ma ich tutaj znajdziesz je na początku
następnej lekcji powodzenia z zadaniami i do usłyszenia
na następnej lekcji już za chwilkę
https://space.eduweb.pl/files/various/Kursy/SQL/eduweb_strona_rozwiazan.pdf
Metody dodawania nowej kolumny NOT NULL · 5 min
-- Kolumna mająca ograniczenie NOT NULL nie może mieć pustych pól
-- Dodanie nowej kolumny NOT NULL używając domyślnych wartości (DEFAULT) do wypełnienia jej danymi
ALTER TABLE heroes ADD COLUMN is_teamleader boolean DEFAULT False NOT NULL;
-- Sprawdzenie wstawionych wartości do nowej kolumny
SELECT is_teamleader, hero_id FROM heroes;
-- Usunięcie nowej kolumny
ALTER TABLE heroes DROP COLUMN is teamleader;
-- Dodanie nowej kolumny (bez ograniczenia NOT NULL)
ALTER TABLE heroes ADD COLUMN is_teamleader boolean;
-- Sprawdzenie wartości w nowej kolumnie
SELECT is_teamleader, hero_id FROM heroes;
-- Wypełnienie kolumny losowymi wartościami
-- (Potrzebne rzutowanie żeby z wartości ułamkowej z funkcji RANDOM() otrzymać wartość logiczną)
UPDATE heroes SET is_teamleader = CAST(CAST(ROUND(RANDOM()) AS int) AS boolean);
-- Ustawienie ograniczenia NOT NULL na nowej kolumnie
ALTER TABLE heroes ALTER COLUMN is_teamleader SET NOT NULL;
-- Próba ustawienia wartości pustej (NULL) w nowej kolumnie (powinna się nie powieść i spowodować błąd)
UPDATE heroes SET is_teamleader = NULL;
-- Dodanie nowej kolumny
ALTER TABLE heroes ADD COLUMN gold int DEFAULT 0 NOT NULL;