Rozdział 1: Podstawy SQL
#1
Identyfikatory bohaterów powinny być unikalne. Zmodyfikuj identyfikator (adventurer_id) postaci Brass Comtel na wartość, która zagwarantuje unikalność danych w tej kolumnie.
#2
Dodaj kilka dodatkowych postaci do tabeli adventurers. Upewnij się, że identyfikatory nowych postaci będą unikalne.
#bonus
Możesz spróbować dodać tych kilka postaci używając jednego zaptyania INSERT INTO.
Do tabeli adventures chcemy dodać kolumnę birthdate. Jaki typ danych będzie pasował najlepiej?
<....> - ew. zamiast Rozwiązania np Wskazówki, a rozwiązanie na kolejnym slajdzie
Korzystaj z narzędzi kontroli wersji
Dokumentację i inspiracje trzymaj w chmurze
Zorganizuj pliki PSD oraz korzystaj z kontroli wersji
Proces cięcia stron WWW ewoluował
Pokazuj, nie tłumacz! Rozmawiaj, współpracuj
Statyczne obrazki są martwe
Baw się tym! Droga może być lepsza od celu
CID (Identyfikacja wizualna)
Bannery
Layout strony WWW
Aplikacja mobilna
Plakat
Ilustracja
Ile to kosztuje?
Opłaty dodatkowe – licencje
Po co mi pliki edycyjne?
.psd
.ai
.indd
.cdr
.fla
.swf
.pdf
.png
Tworzenie repozytoriów treści oraz wytycznych do wybranych Milestone'ów z pomocą rozwiązań chmurowych ułatwia współpracę i synchronizację plików.
Zrób tą beleczkę na górze bardziej fioletową
i powiększ kapkę font
Zmień kolor .header > span na #631cb2 i ustaw font-size na 1.2em
Wstęp
Structured Query Language -
strukturalny język zapytań używany do tworzenia i modyfikowania baz danych, jak również do wprowadzania i pobierania do nich samych danych
Wstęp
Wstęp
Wszędzie gdzie wykorzystywane są relacyjne bazy danych
Wstęp
Prototyp SEQUEL (IBM)
Pierwsze komercyjne wdrożenie (ORACLE)
1973
1979
1986
Pierwszy standard
ANSI SQL:86
1970
E.T.Codd wymyśla relacyjny model zarządzania danymi
2016
2003
1999
ANSI SQL:99
ANSI SQL:2003
ANSI SQL:2016
Wstęp
Oparty na konkretnym projekcie - stworzenie bazy danych do gry przygodowej
Każda lekcja będzie zawierać zadanie do pracy samodzielnej
Zadania z kursu można ćwiczyć na dowolnym środowisku bazodanowym
Dodatkowe informacje o zapytaniach SQL można zdobyć w dokumentacji dla wybranego środowiska
Struktura bazy danych
Struktura bazy danych
heroes
equipment
teams
Struktura bazy danych
Struktura bazy danych
Struktura bazy danych
Usuń stworzoną bazę danych i spróbuj ją odtworzyć.
Spróbuj napisać zapytanie usuwające, bez zaglądania do jakiegokolwiek samouczka czy dokumentacji SQL'a
DROP DATABASE sqland;
CREATE DATABASE sqland;
Struktura bazy danych - tworzenie tabel
Struktura bazy danych - tworzenie tabel
Struktura bazy danych - tworzenie tabel
Do tabeli heroes dodaj kolumnę birthdate.
Jaki typ danych będzie pasował najlepiej?
Kiedy będziesz miał gotowe swoje rozwiązania, porównaj je z zaproponowanymi na początku następnej lekcji.
Zadbaj o to, aby nowa postać tworzyła się z zapasem zdrowia.
Zmień wartość domyślną kolumny health na 200.
Wprowadzanie danych do bazy
Wprowadzanie danych do bazy
Podstawowe zapytanie INSERT:
Zapisanie pojedynczego rekordu:
INSERT INTO <nazwa_tabeli> (<kol2>, <kol1>, <kol3>)
VALUES (<val1>, <val2>, <val3>) ;
Wartości zostaną zapisane w kolumnach według kolejności zadeklarowanej w zapytaniu
| val1 | kol2 | |
| val2 | kol1 | |
| val3 | kol3 |
Wprowadzanie danych do bazy
Podstawowe zapytanie INSERT:
INSERT INTO <nazwa_tabeli>
VALUES (<val1>, <val2>, <val3>) ;
Zapisanie pojedynczego rekordu:
Wartości zostaną zapisane w kolumnach według kolejności, w której kolumny były dodawane do tabeli
Dla kolumn dodawanych w kolejności: kol1, kol2, kol3
| val1 | kol1 | |
| val2 | kol2 | |
| val3 | kol3 |
Wprowadzanie danych do bazy
Wprowadzanie danych do bazy
(export / import)
Wprowadzanie danych do bazy
Dodaj klika dodatkowych postaci do tabeli heroes.
Pamiętaj o odpowiednich wartościach identyfikatora hero_id.
Po dodaniu nowych postaci zwiększ identyfikatory (hero_id) wszystkich istniejących postaci o 10.
Przy dodawaniu kilku nowych bohaterów, spróbuj zrobić to jednym poleceniem INSERT INTO.
Kiedy będziesz miał gotowe swoje rozwiązania, porównaj je z zaproponowanymi na początku następnej lekcji.
Wprowadzanie danych do bazy
(z filtrowaniem)
Odczyt danych z bazy
Odczyt danych z bazy
Odczyt danych z bazy
Dane bazy sqland - do rozdziału 2.sql
Podstawowe typy danych:
| nazwa | alias | |
|---|---|---|
| character varying(n) | varchar(n) | |
| integer | int | |
| character(n) | char(n) | |
| boolean | boolean | |
| date | date | |
| timestamp | timestamp | |
| numeric | decimal |
character varying(n) varchar(n)
integer int
character(n) char(n)
boolean boolean
date date
timestamp timestamp
numeric decimal
Więcej o typach danych
Więcej o typach danych
Więcej o typach danych
Zmień typ kolumny gold na taki, który umożliwiłby zapisywanie wartości z groszami - 2 miejsca po przecinku.
Przypisz paru bohaterów jako team leader'ów, a następnie napisz zapytanie SELECT, które ich wybierze.
Tym razem rozwiązania znajdziesz na początku następnej lekcji.
Autoinkrementacja i sekwencje
Autoinkrementacja i sekwencje
Korzystając z zapytań INSERT w pliku
Dane do lekcji 2 rozdziału 2 - pod zadania.sql
dopisz kilka nowych postaci do tabeli heroes.
Następnie tak zmodyfikuj sekwencję przypisaną do kolumny hero_id abyś mógł dodać jeszcze jednego nowego bohatera.
Omówienie rozwiązania znajdziesz w następnej lekcji.
Będzie zaraz po wprowadzeniu do tematu ograniczeń.
Autoinkrementacja i sekwencje
Ograniczenia danych
Ograniczenia danych
CHECK
NOT NULL
UNIQUE
PRIMARY KEY
Rodzaje ograniczeń (constraints):
Ograniczenia danych
Podstawy odczytywania danych
Podstawy odczytywania danych
Podstawowa składnia SELECT-a:
SELECT * FROM <nazwa_tabeli>;
SELECT <kolumna1>, <kolumna2> FROM <nazwa_tabeli>;
Wybranie wszystkich danych:
Wybranie danych z niektórych kolumn (pól):
SELECT <kolumna1> AS <alias> FROM <nazwa_tabeli>;
Wykorzystanie aliasów kolumn:
SELECT DISTINCT <kolumna1> FROM <nazwa_tabeli>;
Wybranie unikalnych wartości z kolumny:
Podstawy odczytywania danych
SELECT dla średnio-zaawansowanych:
SELECT CASE WHEN <warunek> THEN <resultat>
Warunkowe wybieranie / wyświetlanie danych:
[WHEN <warunek2> THEN <resultat2>]
...
[ELSE <resultat_domyślny>]
END
FROM <nazwa_tabeli>;
Podstawy odczytywania danych
Filtrowanie danych
Filtrowanie danych
WHERE <wyrażenie> = <wartość> AND <wyrażenie> >= <wartość2>
Wykorzystując operatory porównania i logiczne:
WHERE <wyrażenie> IN (<wartość>, <wartość2>, etc.)
Wykorzystując operator zawierania:
WHERE <wyrażenie> LIKE <tekst_szukany>%
Wykorzystując operator częściowego zawierania tekstu:
Filtrowanie danych
WHERE <wyrażenie> BETWEEN <wartość>
AND <wartość2>
Wykorzystując predykat porównania:
WHERE <wyrażenie> NOT BETWEEN <wartość>
AND <wartość2>
Dostępny jest też operator negacji:
Podstawy odczytywania danych
Typy relacji łączących tabele
Film
Aktor
Producent
Dane producenta
1
∞
∞
∞
1
1
Typy relacji łączących tabele
Podstawy grupowania
Grupowanie danych w pigułce:
SELECT student, AVG(ocena) AS srednia
FROM <nazwa_tabeli>
GROUP BY student;
Wybranie średnich ocen dla każdego studenta:
| student | przedmiot | ocena |
|---|---|---|
| Jola | bazy danych | 4 |
| Franek | SQL | 3 |
| Jola | SQL | 5 |
| Witek | Python | 3 |
| Jola | PL/SQL | 3 |
| Witek | SQL | 4 |
| Witek | PL/SQL | 5 |
| student | srednia |
|---|---|
| Jola | 4 |
| Franek | 3 |
| Witek | 4 |
| student | ocena |
|---|---|
| Jola | 4 |
| Franek | 3 |
| Jola | 5 |
| Witek | 3 |
| Jola | 3 |
| Witek | 4 |
| Witek | 5 |
Bazując na przykładowej tabeli ocen z przedmiotów przedstawionej w czasie lekcji:
Kiedy będziesz miał gotowe swoje rozwiązania, porównaj je z zaproponowanymi na początku następnej lekcji.
Stwórz zapytanie, które zwróci dwie kolumny.
W jednej będą przedmioty, a w drugiej średnia ocen dla każdego z nich.
Podstawy grupowania
Agregacja danych i filtrowanie grup
Agregacja danych i filtrowanie grup
Funkcje agregujące
SELECT count(student) AS student_count
FROM <nazwa_tabeli>;
Najczęściej używane funkcje:
SUM(kolumna)
AVG(kolumna)
COUNT(kolumna)
MAX(kolumna) / MIN(kolumna)
Można tych funkcji używać bez klauzuli GROUP BY:
Agregacja danych i filtrowanie grup
Zlicz ile elementów zbroi znajduje się w tabeli ekwipunku bohaterów.
Kiedy będziesz miał gotowe swoje rozwiązania, porównaj je z zaproponowanymi na początku następnej lekcji.
Jak można by zagregować kolumnę przedmiot z tabeli przedmiotów i ocen omawianej na pierwszej lekcji?
Agregacja danych i filtrowanie grup
Agregacja danych i filtrowanie grup
Filtrowanie grup - użycie HAVING
SELECT student, AVG(ocena) AS srednia
FROM <nazwa_tabeli>
GROUP BY student
HAVING AVG(ocena) > 3
Wybranie średnich ocen dla każdego studenta:
WHERE przedmiot <> 'SQL';
;
Agregacja danych i filtrowanie grup
Sprawdź czy są zdublowane elementy ekwipunku.
Napisz zapytanie, które wyciągnie z bazy te pozycje, które występują więcej niż raz.
Kiedy będziesz miał gotowe swoje rozwiązania, porównaj je z zaproponowanymi na początku następnej lekcji.
Agregacja danych i filtrowanie grup
Grupowanie między tabelami
Grupowanie między tabelami
Podstawy widoków
Czym są widoki?
Zapytanie wybierające elfich bohaterów:
SELECT hero_id,
first_name,
last_name,
health
FROM heroes
WHERE health > 200;
| hero_id | first_name | last_name | health |
|---|---|---|---|
| 13 | .... | .... | 250 |
| 14 | .... | .... | 320 |
| 15 | .... | .... | 290 |
SELECT * FROM tank_heroes;
Podstawy widoków
Stwórz nowy widok, który będzie rozszerzał widok tank_heroes.
Powinien on zwracać dla każdego bohatera informację, czy posiada jakikolwiek ekwipunek ('equipped'), czy nie ('unequipped'), tak jak w poniższym przykładzie:
Masz gotowe rozwiązanie i chcesz je sprawdzić? Nie jesteś pewien czy w dobrą stronę idziesz? Zajrzyj na początek następnej lekcji.
Podstawy widoków
| hero_id | first_name | last_name | health | is_equipped |
|---|---|---|---|---|
| 123 | ... | ... | 340 | equipped |
| 321 | .... | .... | 220 | unequipped |
Zapisywanie do widoków
Tylko jedna tabela w klauzuli FROM
Zwracane dane nie mogą być zagregowane
Dane nie mogą być ograniczone LIMIT-em
W zapytaniu widoku nie może pojawić się łączenie danych poprzez UNION, INTERSECT czy EXCEPT.
Zapisywanie do widoków
Zapisywanie do widoków
Widok gotowy? Chcesz się upewnić że o to chodziło?
Rozwiązanie znajdziesz za dwie lekcje.
Zapisywanie do widoków
Stwórz następujący widok:
CREATE VIEW armor_equipment AS
SELECT eq.* FROM equipment eq
JOIN heroes h ON h.hero_id = eq.hero_id
WHERE armor IS NOT NULL;
A następnie zmodyfikuj go tak, żeby można było zapisać przez niego nowy element ekwipunku.
Uwaga: informacja o bohaterach nie jest tu potrzebna.
Generowanie danych testowych
Widoki zmaterializowane
Widoki zmaterializowane
Dane bazy sqland - do rozdziału 7.sql
Wprowadzenie do transakcji
Wprowadzenie do transakcji
Wprowadzenie do transakcji
Wprowadzenie do transakcji
Operacje na transakcjach
Jeśli chcesz się upewnić, że dobrze odpowiedziałeś - rozwiązanie znajdziesz na początku następnej lekcji.
Załóżmy, że masz aplikację w której użytkownicy mogą zapisywać swoje profile, które zawierają tylko imię, nazwisko, adres email i płeć.
Jaki poziom izolacji jest wystarczający dla operacji zapisu tych danych do bazy?
Operacje na transakcjach
Blokady danych
Do zapisywania prostych danych, nawet wprowadzanych przez wielu użytkowników wystarczy poziom izolacji
READ COMMITTED
Tutaj dane od siebie nie zależą i wprowadzane są najprawdopodobniej wiersz po wierszu.
Blokady danych
ALTER TABLE..., TRUNCATE, ...
SELECT
UPDATE, CREATE INDEX, ...
Blokady danych
SELECT ... FOR UPDATE
SELECT ... FOR SHARE
Blokady danych
Dane bazy sqland - do rozdziału 7.sql
Indeksy - wprowadzenie
Indeksy - wprowadzenie
Operacje na indeksach
Zapytanie już hula? Chcesz się upewnić że o to chodziło?
Rozwiązanie znajdziesz na początku następnej lekcji.
Mając poniższe zapytanie:
SELECT * FROM big_data
WHERE big_number BETWEEN 100000 AND 140000;
Stwórz indeks, który je przyspieszy.
Operacje na indeksach
Analiza zapytań
Analiza zapytań
Inne metody przyspieszania zapytań