DDL + INSERT dla TABEL używanych w pytaniach
PRODUCTS
SALES
CONTACTS
UWAGA: Ta tabela celowo zawiera pewne błędy strukturalne (np. dotyczące normalizacji) ... sprawdź pytania.
Możesz użyć SQL Fiddle w przeglądarce do wykonywania zapytań online - TUTAJ
Kliknij na Pytanie, aby poznać odpowiedź.
Co oznacza SQL? Jakie są elementy języka zapytań do bazy danych? #podstawy #teoria
SQL (Structured Query Language) to język zapytań do bazy danych.
Język SQL można podzielić na kilka części:
- DDL - Data Definition Language - część języka SQL, odpowiedzialna za tworzenie, modyfikowanie lub usuwanie obiektów bazy danych, operacje takie jak CREATE, ALTER, DROP.
- DML - Data Manipluation Language - zestaw instrukcji SQL umożliwiający wykonywanie operacji INSERT, UPDATE, DELETE (dodawanie, aktualizowanie, usuwanie wierszy).
- DQL - Data Query Language - podstawa pobierania danych, czyli SELECT.
- DCL - Data Control Language - element umożliwiający dodawanie lub usuwanie uprawnień, GRANT / REVOKE.
- DTL / TCL - Data Transaction Language / Transaction Control Language - część odpowiedzialna za obsługę transakcji: COMMIT, ROLLBACK, SAVEPOINT.
Czym jest system zarządzania bazą danych (DBMS)? #podstawy #teoria
DBMS - Database Management System - to zbiór reguł (system) opisanych przez programy komputerowe, który umożliwia manipulowanie (zarządzanie) wartościami atrybutów kilku różnych typów encji, uporządkowanych w sensowny sposób (baza danych).
Czym jest DDL w kontekście SQL? #podstawy #teoria
DDL - Data Definition Language, jest elementem języka zapytań baz danych, którego celem jest tworzenie, modyfikowanie i usuwanie elementów struktury bazy danych - tabel, schematów, indeksów itp.
Kluczowe elementy składni obejmują operacje: CREATE, ALTER i DELETE.
Chociaż powyższe operacje są częścią standardu, ich dodatkowe elementy są implementowane w różny sposób przez różnych dostawców rozwiązań baz danych. Poniżej znajdują się przykładowe definicje instrukcji CREATE TABLE od różnych dostawców
CREATE TABLE:
Podaj jeden przykład użycia składni dla każdego elementu DDL. #podstawy #teoria
Czym jest DCL w kontekście SQL. #podstawy #teoria
DCL (Data Control Language) to element języka zapytań baz danych, którego celem jest udzielanie i cofanie dostępu do obiektów bazy danych.
Kluczowe elementy składni obejmują następujące operacje: GRANT / REVOKE (DENY)
- GRANT - udziela dostępu do obiektów bazy danych
- REVOKE (DENY) - odmawia dostępu do obiektów bazy danych
Czym jest TCL w kontekście SQL. #podstawy #teoria
TCL (Transaction Control Language) - jest elementem języka zapytań baz danych, którego celem jest zarządzanie transakcjami w bazie danych.
Kluczowe elementy składni obejmują następujące operacje: COMMIT, ROLLBACK, SAVEPOINT.
- COMMIT - potwierdza transakcję i wszystkie wykonane w niej akcje.
- ROLLBACK - wycofuje transakcję i wszystkie wykonane w niej akcje, które wpływają na strukturę bazy danych i same dane.
- SAVEPOINT - zapisuje stan, do którego można się odwołać w ramach transakcji.
Jakie elementy struktury bazy danych możemy wyróżnić (elementy jako warstwy bazy danych, np. tabele, indeksy itp.)? #podstawy #teoria
Typowe elementy struktury bazy danych obejmują:
- schemat bazy danych
- tabele
- kolumny (atrybuty/pola)
- wiersze (rekord)
- klucze/ograniczenia
- widoki
- indeksy
- procedury/funkcje
Jakie są standardowe typy danych, które znasz - typy ogólne plus ich przybliżony podział - na podstawie bazy danych, z którą masz największe doświadczenie. #podstawy #teoria
Typy danych można podzielić na:
- alfanumeryczne
- numeryczne
- data i godzina
- prawda/fałsz (boolean)
- tablice
- binarne
- json/bson
- xml
Jakie są typowe ograniczenia atrybutów tabeli (kolumn)? #podstawy #teoria
- KLUCZ PODSTAWOWY - klucz podstawowy tabeli (relacja) - jeśli jest prosty, tj. jednoelementowy, jest ograniczeniem atrybutu. W przypadku złożonego klucza podstawowego będzie to ograniczenie relacji.
- NOT NULL / NULL - wartość nie może / nie może być niezdefiniowana
- UNIQUE - wartość musi być unikatowa w całej relacji
- SERIAL / AUTO_INCREMENT - atrybut jest typu numerycznego z automatycznym zwiększeniem wartości w polu, gdy wykonywana jest operacja INSERT
- DEFAULT wartość - domyślna wartość atrybutu
- CHECK warunek - ograniczenie domeny atrybutu, np. kolumna AGE z ograniczeniem CHECK > 14, tj. wartość atrybutu AGE musi być wyższa niż 14 w momencie wykonywania operacji INSERT
Czym jest transakcja bazy danych? #podstawy #teoria
To nic innego jak metoda używana przez aplikację do grupowania, odczytu i zapisu operacji w jedną jednostkę logiczną. Wynikiem transakcji jest jeden z dwóch stanów: Sukces (transakcja jest zatwierdzona) lub Niepowodzenie (transakcja jest anulowana lub wycofana).
Przyjrzyjmy się klasycznemu przykładowi transakcji: transakcji bankowej polegającej na wymianie środków między dwoma rachunkami, Rachunkiem A i Rachunkiem B. Właściciel Rachunku A chce przelać 100 zł na Rachunek B. Generalnie w tym przykładzie mamy dwa podejścia.
Podejście 1:
Operacja 1: Saldo Rachunku A = Saldo Rachunku A - 100 zł;
Operacja 2: saldo konta B = saldo konta B + 100 zł;
Podejście 2:
Operacja 1: saldo konta B = saldo konta B + 100 zł;
Operacja 2: saldo konta A = saldo konta A - 100 zł;
W rzeczywistości cała operacja jest nieco bardziej skomplikowana (są kontrole, zasady biznesowe i prawne banku itp.), ale idea jest ta sama. Jeśli wystąpi awaria podczas wykonywania operacji, mamy problem. Albo 100 zł wyparuje z konta A i nie pojawi się na koncie B, albo pojawi się na koncie B, ale saldo konta A nie zostanie zmienione. Z pomocą przychodzi transakcja, która obejmuje wykonanie operacji w jednym z podejść i gwarantuje: pomyślne wykonanie obu operacji (COMMIT) lub brak zmian w stanach obu kont (rollback/ROLLBACK)
Czym jest ACID w relacyjnych bazach danych? #podstawy #teoria
A.C.I.D. gwarantuje bezpieczeństwo w relacyjnych bazach danych.
Jest to zbiór mechanizmów, które mają na celu zapewnienie pewnej odporności na błędy i problemy relacyjnych baz danych.
A.C.I.D. to akronim 4 takich gwarantów:
- A (Atomicity) - atomowość
- C (Consistency) - spójność
- I (Isolation) - izolacja
- D (Durability) - trwałość
Czym jest kontrola współbieżności w bazach danych? Jakie znasz problemy związane z kontrolą współbieżności? #podstawy #teoria
Kontrola współbieżności — zestaw funkcji udostępnianych przez bazę danych, umożliwiający wielu użytkownikom równoczesny dostęp do danych i wykonywanie operacji na niczym.
Problemy z kontrolą współbieżności:
- Dirty Read — odczyt „zaktualizowanych” (UPDATE) danych przed ich zaakceptowaniem (COMMIT) przez inną transakcję.
- Phantom Read — pojawienie się nowych rekordów / lub zniknięcie istniejących, podczas gdy to samo zapytanie zostanie uruchomione po wykonaniu 1 równoważnego zapytania.
- Non-Repeatable Read — powoduje, że rekordy z poprzedniego zapytania pojawiają się w zmienionej formie, gdy zapytanie jest ponownie wykonywane.
- Non-Repeatable Read — powoduje, że oczekująca transakcja zostaje nadpisana inną transakcją, wcześniej zainicjowaną przez inną transakcję.
Czym jest LOCK w bazie danych? #podstawy #teoria
LOCK występuje, gdy dwie transakcje czekają na siebie nawzajem, aby zwolnić zasoby, a przynajmniej jedna z nich nie może kontynuować swojej operacji.
Te same wiersze „Product1” i „Product2” są modyfikowane w różnych transakcjach za pomocą COMMIT.
Czym jest izolacja w relacyjnych bazach danych? #podstawy #teoria
Izolacja oznacza, że jednocześnie wykonywane transakcje są od siebie odizolowane — nie mogą na siebie wpływać. Jest to szczególnie ważne w przypadku dostępu do tego samego zasobu (tej samej tabeli), w przypadku dostępu do różnych obiektów konflikt nie wystąpi.
Inna definicja to taka, w której izolacja jest gwarancją, że równoległe wykonanie transakcji pozostawi bazę danych w stanie, jakby operacje zostały wykonane w sposób sekwencyjny.
Warto pamiętać, że izolacja jest wymianą integralności bazy danych kosztem wydajności.
Przykład:
Czym są poziomy izolacji transakcji i co o nich wiesz? #podstawy #teoria
Poziomy izolacji transakcji to standardy/podejścia do radzenia sobie z problemami współbieżności transakcji.
- Read Uncommited< — najmniej restrykcyjny, zezwala na 3 typy odczytów (Dirty, Phantom i Non-Repeatable Reads). Prawdopodobnie nieużywany w komercyjnych bazach danych.
- Read Commited — umożliwia zapytaniu dostęp do danych, które zostały zaakceptowane (COMMIT). Brak odczytów brudnych, zezwala na odczyty fantomowe i niepowtarzalne. Najczęściej używany poziom izolacji.
- Repeatable Read — gwarantuje spójność odczytów. Umożliwia tylko odczyt fantomowy.
- Serializable - najbardziej restrykcyjny poziom izolacji (nie zezwala na Dirty, Non-Repeatable i Phantom Reads). Każda transakcja jest traktowana tak, jakby była jedyną transakcją mającą miejsce w bazie danych w danym momencie.
Jaka jest różnica między poziomami izolacji Read Committed i Serializable? #podstawy #teoria
- Read Committed — dobre rozdzielenie spójności i współbieżności. Dobre dla standardowych aplikacji OLTP (OnLine Transaction Processing), w których występuje wiele równoczesnych, krótkotrwałych transakcji, z których rzadko występują konflikty. Lepsza wydajność.
- Serializable — dobre dla baz danych z wieloma spójnymi transakcjami. Niższa wydajność z powodu wyższego blokowania. Używane głównie w bazach danych z transakcjami tylko do odczytu, które działają przez długi czas (zapytania analityczne, patrz OLAP — OnLine Analytical Processing).
Czym jest normalizacja bazy danych? #podstawy #teoria
Normalizacja bazy danych to technika organizacji danych w bazie danych, jest to systematyczne, metodyczne podejście polegające na „rozbijaniu” tabel w celu wyeliminowania powtórzeń i niepożądanych cech dodawania, usuwania i aktualizowania wierszy.
Dwa główne cele standaryzacji:
- Przedstawianie faktów ze świata rzeczywistego w sposób zrozumiały;
- Zmniejszanie nadmiarowego przechowywania faktów i zapobieganie nieprawidłowym lub niespójnym danym;
INSERT — problemy z brakiem normalizacji
Kolumna miasta (CITY) w tabeli CONTACTS jest dobrym przykładem do rozważenia problemów nienormalizacyjnych w kontekście operacji INSERT.
Dodając 100 kontaktów z Poznania przypisujemy wszystkim rekordom te same informacje tekstowe. Z drugiej strony, jeśli kontakt nie podał informacji o mieście (nie jest to wymagane), będziemy musieli wpisać w tym polu niezdefiniowaną wartość NULL.
UPDATE - problemy z brakiem normalizacji
Kolumna COMPANY w tabeli CONTACTS jest dobrym przykładem do rozważenia problemów braku normalizacji w kontekście operacji UPDATE.
Jeśli wiele kontaktów pracuje dla tej samej firmy - ACME - i ta firma zmienia nazwę lub znika z rynku. Wszystkie rekordy będą musiały mieć zaktualizowaną wartość, pominięcie kontaktu i pozostawienie go z wartością ACME spowoduje niespójność danych.
DELETE - problemy z brakiem normalizacji
Załóżmy, że tabela CONTACTS jest jedynym miejscem, w którym przechowujemy informacje o mieście (CITY). Jeśli z jakiegoś powodu usuniemy wszystkie kontakty z Poznania, nie będziemy mogli odwołać się do tej wartości w przypadku innych zapytań.
Jakie formy normalne znasz? Wymień je i podaj krótki opis. #podstawy #teoria
- 1 Postać normalna (1NF) - Tabela musi być relacją i nie może zawierać żadnych powtarzających się grup.
- 2 Postać normalna (2NF) - Tabela jest w 1. postaci normalnej i ma dokładnie jeden klucz kandydujący (klucz kandydujący, który jest tym samym kluczem podstawowym) i nie jest kluczem złożonym (składa się z 1 kolumny).
- 3 Postać normalna (3NF) - W 3. postaci normalnej wszystkie atrybuty niekluczowe muszą zależeć od klucza danej tabeli.
- 3.5 / BCNF Postać normalna Boyce'a-Codda (BCNF) - W postaci normalnej Boyce'a-Codda wszystkie atrybuty, w tym te należące do klucza, muszą zależeć od klucza danej tabeli.
- 4 Postać normalna (4NF) - Każda tabela, która jest mający na celu reprezentowanie wielu relacji wiele-do-wielu narusza zasady czwartej postaci normalnej.
- 5 Postać normalna (5NF) — każda tabela spełniająca kryteria postaci normalnej Boyce'a-Codda i niezawierająca złożonego klucza podstawowego znajduje się w 5. postaci normalnej.
- 5.5 Postać normalna klucza domeny (DKNF) — każde ograniczenie tabeli musi być logiczną konsekwencją ograniczeń domeny tabeli i ograniczeń klucza.
- 6 Postać normalna (6NF) — tabela znajduje się w 6. postaci normalnej, jeśli oprócz atrybutu, który jest również kluczem podstawowym, ma maksymalnie 1 dodatkowy atrybut.
Jak mogłaby wyglądać normalizacja tabeli CONTACTS? #podstawy #teoria
Czym jest widok (view) w SQL? #podstawy #teoria
Widok to trwała definicja tabeli pochodnej (wynik zapytania SELECT), która jest przechowywana w bazie danych.
W SQL tabela utworzona za pomocą zapytania CREATE TABLE jest nazywana tabelą bazową. Formalnie wynik każdego zapytania SELECT nazywamy tabelą pochodną. Tabele używane do definiowania widoku są nazywane tabelami bazowymi.
Właściwości widoku:
- nie przechowuje danych — definicja widoku jest zapisywana w bazie danych. Sam widok jest tylko interfejsem odczytu danych;
- zawsze wyświetla bieżące dane — baza danych zawsze odtwarza bieżące dane z tabel źródłowych użytych do zbudowania widoku;
Widoki są używane do:
- tworzenia dodatkowego poziomu zabezpieczeń tabeli poprzez ograniczenie dostępu do określonych kolumn lub wierszy tabeli bazowej;
- ukrywania złożoności danych — gdy definicja widoku jest złożonym zapytaniem SELECT, samo zapytanie widoku jest widoczne jako proste zapytanie;
- pokazywania danych z innej perspektywy — na przykład widok może być użyty do zmiany nazwy kolumny bez zmiany rzeczywistych danych przechowywanych w tabeli;
Jaka jest różnica między widokiem a widokiem zmaterializowanym (VIEW vs MATERIALIZED VIEW)? #podstawy #teoria
Widok zmaterializowany, w przeciwieństwie do widoku, jest definicją zapytania SELECT, która po utworzeniu (i z określoną częstotliwością) zapisuje wyniki zapytania do obiektu bazy danych, tabeli.
Dane z definicji widoku zmaterializowanego są odświeżane zgodnie z ustalonym harmonogramem (ustawionym w definicji widoku zmaterializowanego).
Z reguły w przypadku złożonych zapytań, gdy zapytanie dotyczy zwykłego widoku, należy wykonać całe złożone zapytanie. W przypadku widoku zmaterializowanego dane są natychmiast dostępne z aktualizacją równą ostatniemu odświeżeniu widoku zgodnie z harmonogramem.
Czym są systemy transakcyjne OLTP? #podstawy #teoria
OLTP - OnLine Transaction Processing - to system skoncentrowany na krótkoterminowych, szybkich transakcjach.
- źródło danych: dane operacyjne; Systemy OLTP są pierwotnym źródłem danych;
- cel danych: obsługa i kontrola podstawowych procesów biznesowych;
- co jest w danych: aktualny stan procesów biznesowych;
- Operacje wstawiania/aktualizowania: krótkie i szybkie operacje wstawiania/aktualizowania inicjowane przez użytkowników końcowych;
- zapytania: stosunkowo proste i standardowe zapytania, zwykle zwracające kilka rekordów;
- czas przetwarzania: zwykle bardzo szybki;
- potrzebne miejsce: dane mogą zajmować stosunkowo mało miejsca, jeśli dane historyczne są archiwizowane;
- struktura bazy danych: wysoce standaryzowana z dużą liczbą tabel;
- kopiowanie i odzyskiwanie danych: obowiązkowe kopiowanie danych; dane operacyjne są krytyczne dla prowadzenia działalności gospodarczej, utrata danych zwykle skutkuje dużymi stratami finansowymi i odpowiedzialnością prawną;
Typowymi przykładami są zasadniczo większość systemów wsparcia produkcji przedsiębiorstwa - systemy ERP/CRM (z wyjątkiem modułów analitycznych).
Inne przykłady: system bankowy, który obsługuje odczytywanie i modyfikowanie sald rachunków klientów; systemy finansowe i księgowe.
Czym są systemy analityczne OLAP? #podstawy #teoria
OLAP - Online Analytical Processing - to systemy skoncentrowane na dostarczaniu modelu analitycznego, tj. przygotowywaniu danych i optymalizowaniu modelu tak, aby procesy analityczne były priorytetem.
- źródło danych: dane skonsolidowane; dane źródłowe systemów OLAP pochodzą z różnych baz danych/źródeł danych;
- cel danych: pomoc w planowaniu, rozwiązywaniu problemów i podejmowaniu decyzji strategicznych;
- co zawierają dane: wielowymiarowe spojrzenie na różne rodzaje działalności biznesowej, stan obecny i historię;
- Operacje wstawiania/aktualizowania: cykliczne, długotrwałe odświeżanie danych, zwykle przy użyciu plików wsadowych;
- zapytania: zapytania, które są często bardzo złożone i wymagają agregacji;
- czas przetwarzania: zależy od ilości przetwarzanych danych;
- potrzebna przestrzeń: duża ilość miejsca potrzebna ze względu na istnienie zagregowanych i historycznych danych;
- struktura bazy danych: zwykle zdenormalizowana z niewielką liczbą tabel; stosowane schematy gwiazd i/lub płatków śniegu;
- kopia zapasowa i odzyskiwanie danych: oprócz kopii zapasowych, ponowne ładowanie danych z systemów źródłowych może być uważane za metodę odzyskiwania danych;
Typowym przykładem są magazyny danych lub ogólnie systemy tworzone i optymalizowane pod kątem procesów analitycznych.
OLTP vs OLAP, jaka jest różnica między systemami? #podstawy #teoria
OLTP:
- duża liczba prostych zapytań (transakcji)
- systemy zoptymalizowane pod kątem szybkiego dodawania, usuwania i modyfikowania pojedynczych rekordów
- zwykle utożsamiane z tradycyjnymi relacyjnymi bazami danych
- niewielka liczba zapytań, często dotyczących wielu elementów biznesowych
- systemy zoptymalizowane pod kątem szybkiego odczytu informacji analitycznych (z zagregowanych danych)
- zwykle powiązane z magazynami danych, wspierającymi decyzje biznesowe firmy (systemy Business Intelligence) i „bardzo duże” ilości danych
- przetwarzanie danych (do najnowszych informacji) może trwać minuty lub godziny — nie zakładamy, że dane są aktualne
Czym są i jakie typy funkcji agregujących znasz w SQL? #podstawy #teoria
Funkcje agregujące w SQL to grupa funkcji, które, jak sama nazwa wskazuje, służą do uzyskania wyniku operacji dla grupy rekordów, zgodnie z wybranymi kluczami grupy.
Przykładem może być wartość sprzedaży podzielona na kategorie produktów.
Najczęściej używane funkcje agregujące:
- SUM() - sumowanie
- AVG() - średnia
- COUNT() - zliczanie wystąpień
- MIN() / MAX() - minimum / maksimum
- STDEV() - odchylenie standardowe
Co to są i jakie rodzaje funkcji analitycznych znasz w SQL? #podstawy #teoria
Funkcje analityczne to określone rodzaje funkcji SQL, które dostarczają wynik dla danego wiersza w kontekście wierszy sąsiadujących (poprzedzających/następujących) po wierszu. Używamy tego typu funkcji, na przykład, do „rankingu” danych lub obliczania stanów (bilansowania).
Najczęściej używane funkcje analityczne:
- ROW_NUMBER() OVER()
- DENSE_RANK() / RANK() OVER()
- SUM() OVER()
- LEAD() / LAG() OVER()
Jaka jest różnica między składnią WHERE i HAVING? #podstawy #teoria
Gdy nie są używane w kontekście GROUP BY, są zasadniczo równoważne.
Jednak ich rzeczywiste zastosowanie ma miejsce, gdy dane są grupowane.
- Warunek WHERE filtruje rekordy z wyniku przed wykonaniem grupowania.
- Warunek HAVING filtruje rekordy z wyniku po wykonaniu grupowania
Co robią polecenia DELETE i TRUNCATE? Jakie są między nimi różnice? #podstawy #teoria
Oba polecenia służą do usuwania wierszy z tabeli, ale istnieją między nimi pewne subtelne różnice.
DELETE to operacja DML (Data Manipulation Language), która działa na poziomie wiersza tabeli. Za jej pomocą możemy usunąć wszystkie wiersze lub jeden konkretny wiersz (dodając WHERE). TRUNCATE to operacja DDL (Data Definition Language), która działa na poziomie całej tabeli. Jeśli chcesz usunąć wszystkie wiersze z tabeli (a Twoja tabela nie ma kluczy obcych), prawdopodobnie będzie to polecenie, którego szukasz. Kilka szczegółów na temat obu poleceń.
Transakcyjne
- DELETE, podobnie jak INSERT lub UPDATE, może zostać zaakceptowane (COMMIT) lub wycofane (ROLLBACK).
- TRUNCATE w niektórych systemach baz danych ma tzw. „niejawne COMMIT”. Oznacza to, że operacja COMMIT jest wykonywana przed i po operacji TRUNCATE bez potrzeby dodatkowego wykonania COMMIT.
Uwaga: Powyższe dotyczy np. Oracle, w przypadku SQL Server lub PostgreSQL operację TRUNCATE można wycofać (ROLLBACK).
Odzyskiwanie miejsca
- DELETE nie odzyskuje miejsca po usunięciu wierszy. Potrzebna jest dodatkowa operacja VACUUM.
- TRUNCATE odzyskuje miejsce po usunięciu wierszy.
- DELETE blokuje określone wiersze tabeli, które są usuwane.
- TRUNCATE blokuje całą tabelę.
- DELETE wykonuje operacje wyzwalacza (trigger) AFTER/BEFORE DELETE.
- TRUNCATE nie wykonuje wyzwalaczy (trigger).
Są to jednak dość specyficzne kwestie, jeśli chcesz zagłębić się w temat, zapoznaj się ze szczegółową dokumentacją systemów, w których pracujesz.
Jaki jest cel opcji CASCADE podczas operacji DELETE w SQL? #podstawy #teoria
Gdy relacja klucza obcego jest zdefiniowana między tabelami i istnieją rekordy powiązane z tą relacją, nie będzie możliwe wykonanie operacji DELETE na danych tabeli, do której utworzono relację.
Baza danych poinformuje nas, że w relacji między tabelami A i B są rekordy, które chcemy usunąć. Aby wykonać tę operację, musimy najpierw usunąć rekordy powiązane z tabelą B lub użyć opcji CASCADE.
Opcja CASCADE usuwa wszystkie wiersze z tabeli A i wszystkie powiązane wiersze z tabeli B, które mają relację klucza obcego między tabelami.
Jaki jest cel opcji CASCADE podczas operacji DROP w SQL? #podstawy #teoria
Gdy istnieje relacja między obiektami bazy danych, tj. obiekt B zależy od obiektu A, np. widok B w tabeli A, wykonanie operacji DROP na obiekcie A nie będzie możliwe.
Baza danych poinformuje nas, że istnieje połączenie w relacji między obiektem A i B. Jeśli chcemy usunąć obiekt A, musimy najpierw usunąć obiekt B lub użyć opcji CASCADE.
Opcja CASCADE usuwa obiekt zdefiniowany do usunięcia i wszystkie obiekty, które używają / są tworzone z obiektu A.
Co to jest operator IN w SQL i do czego służy? #podstawy #teoria
IN to operator logiczny używany w części WHERE zapytania. Pozwala sprawdzić, czy wartość z danej kolumny/funkcji istnieje/jest równa dowolnej wartości z listy.
Porównywanie wartości z listą jest bardzo wygodne, przykładem może być użycie takiej listy na warstwie prezentacji (stronie internetowej), a następnie wysłanie żądania do bazy danych, aby wyświetlić tylko te wyniki, które użytkownik wybrał.
Operator IN jest zasadniczo równoważny zapisaniu wielu warunków OR dla tej samej kolumny i różnych wartości. Dlatego warto go użyć w takim przypadku, choćby ze względu na czytelność.
Jednym z pytań, które powinno ci przyjść do głowy jest: "ile wartości mogę użyć w IN?".
Odpowiedź nie jest jasna i będzie zależeć od bazy danych.
W SQL Server „dużo” — WIĘCEJ TUTAJ
W przypadku bazy danych Oracle będzie to „bardzo mało” (1000 według tego artykułu WIĘCEJ TUTAJ)
Pamiętaj, że to, że możemy używać wielu wartości w operatorze IN, nie oznacza, że powinniśmy. W tym przypadku stosujemy dużo operacji OR, a nie jest to najbardziej efektywne podejście do wykonywania zapytań.
Do czego służą funkcje CEIL i FLOOR? Wyjaśnij zasadę działania obu funkcji na przykładzie. #podstawy #teoria
Funkcje CEIL i FLOOR pozwalają zaokrąglić daną liczbę do liczby całkowitej.
Prawdopodobnie pamiętasz zagadnienia zaokrąglania z matematyki. Jeśli mamy liczbę 254 i chcemy ją zaokrąglić do najbliższej dziesiątki, otrzymamy liczbę 250. Jeśli mamy na przykład 255, otrzymamy 260.
CEIL (lub CEILING) i FLOOR. W „wolnym” tłumaczeniu: ceiling i floor, i już możesz zgadnąć, co to jest. Funkcja CEIL (CEILING) zwraca najmniejszą liczbę całkowitą większą lub równą wartości podanej na wejściu. Funkcja FLOOR zwraca największą liczbę całkowitą mniejszą lub równą wartości podanej na wejściu.
Czym jest funkcja ROUND? Jaka jest różnica między wynikiem ROUND a CEIL/FLOOR. #podstawy #teoria
Funkcja ROUND, podobnie jak CEIL i FLOOR, umożliwia zaokrąglanie wartości. Jednak zaokrąglanie jest bardziej „matematyczne” (tj. jeśli jest to 5, jest to zaokrąglenie w górę, a jeśli jest to mniej niż 5, jest to zaokrąglenie w dół).
Ponadto za pomocą tej funkcji można określić, do ilu miejsc po przecinku ma zostać zaokrąglona wartość wyjściowa. UWAGA: Jaki typ wartości zwracanej ma dana funkcja (CEIL / FLOOR / ROUND)?
Zależy to od używanego silnika bazy danych.
W przypadku PostgreSQL typy zwracane dla funkcji to:
- CEIL — taki sam typ jak typ wejściowy
- FLOOR — taki sam typ jak typ wejściowy
- ROUND — typ numeryczny
Czym jest operator ANY? Opisz zasadę działania na przykładzie. #podstawy #teoria
Operator ANY służy do sprawdzania, czy przeszukiwany podzbiór danych (podzapytanie) zawiera przynajmniej jedną wartość spełniającą użyty operator.
Można go używać w sekcji WHERE i/lub w sekcji HAVING.
Składnia: Przykład: Wyświetlanie diet, których jednym ze składników jest pomarańcza. Uwaga: Operator ANY jest również powiązany z operatorem SOME, który jest tym samym operatorem co ANY.
Zasadniczo działania operatorów są takie same. Pierwszy standard SQL wszedł w życie w 1986 r., a sam SQL pochodzi z lat 1970+, stąd 2 operatory, być może jakaś wsteczna kompatybilność?
Czym jest operator ALL? Opisz zasadę działania na przykładzie. #podstawy #teoria
Operator ALL służy do sprawdzania, czy wszystkie wiersze przeszukanego podzbioru danych (podzapytania) spełniają użyty operator. Możesz go użyć w sekcji WHERE i/lub w sekcji HAVING.
Składnia: Przykład: wyświetlanie diet, w których jednym ze składników posiłków nie jest arbuz. Uwaga: Operator ALL jest również powiązany z operatorem SOME, który jest tym samym operatorem co ANY.
W zasadzie działania operatorów są takie same. Pierwszy standard SQL wszedł w życie w 1986 r., a sam SQL pochodzi z lat 1970+, stąd 2 operatory, być może jakaś wsteczna kompatybilność?
Czym jest operator EXISTS? Opisz zasadę działania na przykładzie. Czy składnie EXISTS i =ANY są równoważne? #podstawy #teoria
Operator EXISTS służy do wyszukiwania wierszy, które spełniają warunek użyty w podzapytaniu. Opis enigmatyczny, ale sprowadza się do faktu, że wynikiem będą rekordy, które istnieją w podzapytaniu użytym do zbudowania EXIST. Operator EXISTS zwraca TRUE, gdy podzapytanie zwróci 1 lub więcej rekordów.
Składnia: Dlaczego nie JOIN?
JOIN, zgodnie z definicją, służy do łączenia tabel i wyświetlania kolumn z różnych obiektów (tabel). EXISTS jest zaprojektowane do „filtrowania” końcowego wyniku na podstawie pewnego podzapytania.
Przykład: Wyświetl wszystkie produkty (tabela PRODUCTS), które brały udział w transakcji sprzedaży (tabela SALES). Co EXISTS ma wspólnego z ANY/SOME.
Załóżmy, że chcemy wyświetlić tylko produkty, dla których istnieje transakcja sprzedaży. Możemy to zrobić z EXIST, ale także z ANY. Jaka jest różnica?
Plan zapytania jest identyczny w obu przypadkach. Jeśli warunek logiczny jest taki sam, ANY / SOME i EXISTS są zamienne.
Jak ograniczyć liczbę wierszy wyników, na przykład do 10 elementów. Podaj przykłady oparte na systemach baz danych, które znasz, a także składnię SQL zgodną ze standardem ISO. #podstawy #teoria
Prawdopodobnie znasz składnię z relacyjnej bazy danych, z którą pracujesz na co dzień:
- LIMIT (w tym MySQL, PostgreSQL, SQLite, H2)
- TOP (w tym MS SQL Server)
- ROWNUM (Oracle) — pseudokolumna w bazie danych Oracle, tworzona podczas generowania wyników, określająca kolejność pobranych wierszy
W pewnym sensie zostali zmuszeni do tego. Ta funkcjonalność została wprowadzona do standardu po raz pierwszy w wersji SQL:2008.
FETCH FIRST n ROWS ONLY pozwala pobrać tylko n (gdzie n jest liczbą lub wynikiem operacji, np. (2+2)) wierszy z całego zestawu wyników.
Przykłady:
Jaki jest odpowiednik instrukcji warunkowej IF w SQL? Podaj przykład i wyjaśnij zasadę działania. Rozwiązanie powinno opierać się na standardzie, a nie na implementacji dla danej bazy danych. #podstawy #teoria
Instrukcja warunkowa (IF) to popularna struktura w językach programowania, która umożliwia sprawdzenie warunku i wykonanie odpowiedniej akcji w zależności od tego, czy warunek jest spełniony, czy nie.
Składnia (podstawowa - w językach programowania - jako pseudokod) Warunek logiczny może być dowolną funkcją/operatorem zwracającym TRUE lub FALSE.
Konstrukcja taka jak powyżej nie istnieje w standardowym SQL. Istnieje jednak w proceduralnym SQL, tj. w procedurach składowanych i funkcjach wykonywanych w bazie danych.
IF istnieje w SQL i jest ukryte pod operatorem CASE W operatorze CASE warunki są sprawdzane sekwencyjnie, gdy spełniony jest pierwszy warunek, wykonywana jest akcja, pozostałe warunki są ignorowane. Jeśli żaden z warunków nie jest spełniony, wykonywana jest akcja z sekcji ELSE.
Jeśli ELSE nie zostało zadeklarowane, zostanie zwrócona niezdefiniowana wartość - NULL.
Operatora CASE można używać w samej składni SELECT, w WHERE, w ORDER BY, GROUP BY itd. Jednak taki operator zawsze tworzy dodatkowy narzut w momencie wykonania (na wykonanie instrukcji check + wykonanie akcji), co wpłynie na wydajność. W niektórych przypadkach warto rozważyć wcześniejsze wyliczenie kolumn za pomocą operatora CASE (jako element w procesie przed użyciem), dodanie odpowiedniego indeksowania, a następnie użycie obliczonej kolumny w SELECT.
Uwaga: W niektórych bazach danych istnieje IF, np. MySQL, lub jako IIF - Firebird / SQL Server. Nie jest to jednak standard SQL, ale nakładka na konkretną bazę danych.
Do czego służy składnia ORDER BY? Jakie dodatkowe opcje wykonania może zawierać (obsługa NULL/kierunku)? #podstawy #teoria
Operacja ORDER BY służy do sortowania wynikowych danych.
Czy wyniki mają jakiekolwiek sortowanie bez ORDER BY.
NIE. Jeśli klauzula ORDER BY nie jest podana, wyniki zapytania zostaną zwrócone w niezdefiniowanej formie. Może się zdarzyć, że pojawią się w tej samej kolejności, w jakiej zostały dodane do tabeli źródłowej, ale zachowaj ostrożność i nie traktuj tego jako pewnika.
Jeśli chcesz uzyskać wiersze w żądanej kolejności, użyj ORDER BY.
Składnia
- COLUMN/FUNCTION_NAME — nazwa/nazwy kolumn lub funkcji, według których ma zostać wykonane sortowanie
- DESC — sortowanie w kolejności malejącej
- ASC — sortowanie w kolejności rosnącej
- NULLS FIRST — wyświetlanie niezdefiniowanych wartości na początku zestawu wyników
- NULLS LAST — wyświetlanie niezdefiniowanych wartości na końcu zestawu wyników
Elementy używane w składni ORDER BY nie muszą znajdować się w części SELECT.
ORDER BY jest jednym z ostatnich logicznych elementów, które zostaną wykonane. Dlatego podczas sortowania możemy używać aliasów - zamiast rzeczywistych nazw kolumn lub kolejności pól zamiast ich nazw (np. ORDER BY 1, 2, 3, gdzie 1, 2, 3 to kolejne kolumny po składni SELECT)
Co to jest JOIN w języku zapytań baz danych SQL? Jakie znasz typy połączeń? #podstawy #teoria #join
JOIN to połączenie tabel (lub tabela) oparte na pewnym warunku (takie same kolumny, operatory logiczne >, < itd.).
W najprostszym przypadku używamy połączeń, aby mapować relacje między tabelami, gdy chcemy uzyskać określony wynik.
Typy połączeń:
- (INNER) JOIN
- LEFT (OUTER) JOIN
- RIGHT (OUTER) JOIN
- FULL (OUTER) JOIN
Co to jest łączenie zestawów za pomocą operacji UNION i UNION ALL? Jaka jest różnica między tymi operacjami (UNION vs UNION ALL)? #podstawy #teoria #union #unionall
UNION - to operacja łączenia zestawów danych. Możesz jej użyć do połączenia rekordów z różnych tabel w jeden zestaw rekordów.
Do czego? Zwykle, gdy musisz utworzyć listę wartości z różnych zestawów (tabel).
Ograniczenia
- liczba kolumn w obu zapytaniach musi być identyczna
- typy danych muszą być zgodne w odpowiadających sobie kolumnach - (w powyższym przykładzie car_manufacturer nie może być wartością liczbową i wartością tekstową)
- aby uzyskać posortowane wyniki, użyj ORDER BY - możesz jej użyć tylko w ostatnim SELECT. ORDER BY będzie działać na całym zestawie wyników. Jeśli chcesz uzyskać posortowane wyniki tylko z pierwszego zapytania, użyj podzapytania dla 1 SELECT
- UNION - połączy wyniki, usuwając jednocześnie zduplikowane wiersze (takie jak DISTINCT)
- UNION ALL - połączy wyniki bez usuwania zduplikowanych wierszy
Uwaga: W niektórych bazach danych UNION, oprócz usuwania duplikatów, sortuje również wynikowy zestaw danych (np. SQL Server).
Jaka jest różnica między INNER JOIN i NATURAL JOIN? #podstawy #teoria #join
INNER JOIN to typ połączenia, w którym z dwóch zestawów (tabel lub podzapytań) bierzemy wartości (wiersze), dla których spełniony jest zdefiniowany klucz połączenia. Oznacza to, że wartości w kolumnach z zestawów użytych w połączeniu mają takie same wartości (przy użyciu kolumn „=” w JOIN).
NATURAL JOIN to rodzaj połączenia, w którym bierzemy tylko wspólną część dwóch zestawów (tabel lub podzapytań), ale tylko wtedy, gdy w obu zestawach znajduje się kolumna o tej samej nazwie (lub więcej kolumn o tej samej nazwie).
Jaka jest różnica między LEFT JOIN i RIGHT JOIN? #podstawy #teoria #join
RIGHT OUTER JOIN to typ łączenia, w którym z dwóch zestawów (tabel lub podzapytań) bierzemy wszystkie elementy z drugiego zestawu i pasujące elementy (zgodnie z użytym kluczem łączenia) z pierwszego zestawu. Stąd nazwa RIGHT (odnosząca się do kierunku łączenia) i OUTER odnosząca się do typu łączenia zewnętrznego (a nie tylko części wspólnej).
LEFT OUTER JOIN to typ połączenia, w którym z dwóch zestawów (tabel lub podzapytań) bierzemy wszystkie elementy z jednego zestawu i pasujące elementy (zgodnie z użytymi kluczami połączenia) z drugiego zestawu. Stąd nazwa LEFT (odnosząca się do kierunku połączenia) i OUTER odnosząca się do typu połączenia zewnętrznego (a nie tylko do części wspólnej).
Co to jest CROSS JOIN? #podstawy #teoria #join
Używając CROSS JOIN, wynikiem będzie iloczyn kartezjański zbiorów (tabel). Każdy wiersz z tabeli A będzie „połączony” z każdym wierszem z tabeli B.
Będzie dobrze działać w sytuacjach - świadomego łączenia wszystkich wierszy ze sobą, np. wyświetlania każdego produktu w każdym regionie.
Co oznaczają EQUI / NON-EQUI i SELF JOIN? #podstawy #teoria #join
EQUI JOIN - dowolny typ połączenia, w którym używamy znaku = w kluczu połączenia.
NON-EQUI JOIN - dowolny typ połączenia, w którym nie używamy znaku = w kluczu połączenia (ale np. <. >, >=, =<, !=).
SELF JOIN - typ połączenia, w którym łączymy ten sam zestaw danych/tabele.
Jakie wewnętrzne algorytmy połączeń znasz podczas wykonywania zapytania SQL. Patrząc z perspektywy planu wykonania zapytania? #podstawy #teoria #połączenie
Wewnętrzne lub czasami nazywane fizycznymi typami połączeń, lub bardziej ogólnie algorytmami połączeń. Są to połączenia, których silnik bazy danych używa do faktycznego łączenia danych (oprócz tego, czego użytkownik użył w zapytaniu LEFT/INNER JOIN).
Trzy podstawowe typy:
- NESTED LOOP
- MERGE JOIN
- HASH JOIN
Jaki jest typ łączenia danych NESTED LOOP? #podstawy #teoria #dołącz
Biorąc pod uwagę dwa zbiory N i M do połączenia, w najprostszym (najgorszym) scenariuszu każdy rekord w zbiorze N musi zostać sprawdzony względem rekordów w zbiorze M.
Stąd nazwa "pętla zagnieżdżona (NESTED LOOP)", przechodzimy przez elementy zbioru M, iterując elementy zbioru N.
W zależności od sytuacji złożoność tego algorytmu może wynosić:
- O(N*M), gdy nie ma indeksu na kluczu dołączenia zbioru
- O(M*logN), gdy mamy indeks B-Tree na jednym z kluczy dołączenia
- O(M), gdy mamy indeks haszujący na jednym z kluczy dołączenia.
Przykład oparty na tabelach PRODUKTY i SPRZEDAŻ:
Jaki jest typ łączenia danych MERGE JOIN? #podstawy #teoria #join
Jeśli chcesz połączyć dwa zbiory N i M. Algorytm MERGE JOIN zostanie użyty, gdy zbiory użyte w połączeniu zostaną posortowane według klucza łączenia, a operator równości zostanie użyty w kluczu łączenia.
Co to oznacza w praktyce? Gdy mamy dwa posortowane zbiory, sprawdzanie równości jest bardzo uproszczone.
Patrząc na zbiór N i mając wartość 1, szukamy tej wartości w posortowanym zbiorze M. Bierzemy pierwszy element, czy jest równy 1, nie, czy jest większy, tak - nie sprawdzamy kolejnych elementów. Następnie bierzemy kolejny rekord ze zbioru N. Ta operacja jest powtarzana, aż wszystkie elementy z jednego ze zbiorów zostaną sprawdzone (Dlaczego z jednego? Ponieważ zbiory są posortowane i przeszukaliśmy wszystko ze zbioru, np. N jest zbiorem M, nic nowego nas już nie zaskoczy, ponieważ niezaznaczone wartości i tak nie spełnią warunków łączenia).
Złożoność tego algorytmu wynosi O(N+M).
Świetne do łączenia w „dużych” tabelach, gdy oba zbiory są posortowane według klucza łączenia, a warunek łączenia używa operatora równości „=”.
Przykład oparty na tabelach PRODUKTY i SPRZEDAŻ:
Jaki jest typ łączenia danych HASH JOIN? #podstawy #teoria #łączenie
Jeśli chcesz połączyć dwa zbiory N i M, zostanie użyty algorytm HASH JOIN.
Baza danych dla mniejszego zbioru określi skróty dla kluczy łączenia i zbuduje tablicę skrótów (łącząc wyznaczony skrót z rzeczywistym rekordem tabeli N).
Następnie, w pętli, dla każdego rekordu z tabeli M, zostanie ustalony skrót dla klucza łączenia i porównany z utworzoną tablicą skrótów.
Tablica skrótów jest zwykle przechowywana w pamięci, ale gdy zbiór danych jest bardzo duży, ilość miejsca w pamięci może być niewystarczająca, więc część tablicy skrótów zostanie zrzucona na dysk i odczytana z niego (co znacznie spowolni odczyt/łączenie).
Złożoność obliczeniowa tego algorytmu, zakładając, że tablica skrótów zmieści się w pamięci i nie zostaną wykorzystane żadne dodatkowe zasoby, wynosi: O(N+M).
Przykład oparty na tabelach PRODUCTS i SALES:
Co może determinować wybór metody łączenia (NESTED LOOP, MERGE JOIN, HASH JOIN) przez optymalizator w bazie danych? #podstawy #teoria #łączenie
Z magii bazy danych, której używasz... ale poważnie, możemy uwzględnić następujące elementy:
- rozmiar zestawów danych używanych w połączeniu
- operator klucza łączenia (czy jest to operator równości "=" czy inny)
- w zależności od tego, czy na kluczach łączenia znajdują się indeksy
- czy statystyki tabel używanych w połączeniu są aktualne (obliczone)
Warto przeanalizować plan wykonania zapytania (EXPLAIN / EXPLAIN ANALYZE) i czasami zakwestionować metodę łączenia zestawów przedstawioną przez optymalizator bazy danych.
Co to jest duplikat w danych? #podstawy #teoria
Co najmniej 2 wiersze wyników, dla których wszystkie kolumny mają takie same wartości, nazywane są duplikatem w danych.
Przykład:
Co to jest NULL w bazach danych relacyjnych? Jakie znasz sposoby radzenia sobie z wartością NULL przy ograniczaniu danych wynikowych (WHERE)? #podstawy #teoria
NULL to rodzaj znacznika w bazach danych SQL i relacyjnych, który wskazuje, że dana wartość jest niezdefiniowana (w danych źródłowych nie ma żadnej wartości).
Uwaga: NULL nie jest 0 dla liczb ani pustym tekstem dla wartości tekstowych.
Sposoby radzenia sobie z wartością NULL obejmują:
- porównania warunkowe IS NULL / IS NOT NULL
- COALESCE() — funkcja, która w przypadku wystąpienia wartości NULL zastąpi ją podaną wartością, np. COALESCE(product_name, 'unknown_product');
- CASE — składnia umożliwiająca zbudowanie warunkowego podejścia do wartości kolumny/funkcji CASE WHEN product_name IS NULL THEN 'unknown_product' ELSE product_name END
Istnieją również inne alternatywy, np. NULLIF(), IFNULL(), ISNULL(), NVL() — których zadaniem jest wykonywanie tej samej lub podobnej funkcji, tj. radzenie sobie z niezdefiniowaną wartością.
Co można wykorzystać, gdy nie chcemy, aby wartości w kolumnie były niezdefiniowane w tabeli, a jednocześnie nie chcemy otrzymać błędu podczas próby WSTAWIENIA wartości NULL? #podstawy #teoria
Dodanie OGRANICZENIA (CONSTRAINT) typu NOT NULL z dodatkową wartością domyślną DEFAULT ''.
Uwaga: To nie zawsze może być pożądane rozwiązanie. Czasami wartości NULL są całkowicie OK i takie ograniczenie pozwoli nam sobie z nimi poradzić w tabeli, ale podczas budowania SELECT z połączeniami możemy nadal otrzymywać niezdefiniowane wartości.
Co to jest operator LIKE? W jakich sytuacjach go używamy i jakie są podstawowe znaki specjalne używane przez ten operator? #podstawy #teoria
Używamy operatora LIKE w sekcji WHERE zapytania, aby znaleźć/przefiltrować wiersze wyników zgodnie z wybranym wzorcem w danych tekstowych.
Wynik operatora w danym wierszu jest PRAWDA lub FAŁSZ w zależności od tego, czy dany wzorzec pasuje do wyniku (PRAWDA) czy nie pasuje (FAŁSZ). W odwrotnej sytuacji, gdy chcemy znaleźć dane, które nie pasują do wzorca, użyjemy operatora NOT LIKE.
Operator LIKE może używać 2 znaków specjalnych:
- % - znak procentu oznacza wystąpienie 0,1 lub więcej znaków (dowolny) w wyszukiwanym wzorcu
- _ - podkreślenie (dolny wiersz), oznacza wystąpienie 1 znaku (dowolny)
- [] - nawiasy kwadratowe - dowolny ze znaków zawartych w nawiasach kwadratowych (SQL Server)
- ^ - „daszek” oznacza negację, np. [^cb] wszystkie znaki poza c lub b w słowie
- - - myślnik oznacza zakres znaków, np. [a - e]
Na podstawie danych sprzedaży (tabela SALES) znajdź listę unikalnych istniejących nazw produktów (tabela PRODUCTS, kolumna PRODUCT_NAME) #practice #syntax
Na podstawie danych sprzedaży (tabela SALES) znajdź liczbę unikalnych istniejących nazw produktów (tabela PRODUCTS, kolumna PRODUCT_NAME) #practice #syntax #antipartterns
Typowy błąd: DISTINCT poza COUNT nie bierze pod uwagę zduplikowanych wierszy wyników, pokazując tylko product_name, nie widzimy całego wiersza. COUNT jest wykonywane na całym zestawie wyników.
Bez użycia klauzuli DISTINCT, znajdź listę unikalnych produktów (kolumna PRODUCT_NAME) na podstawie danych sprzedaży (tabela SALES) #practice #syntax
Używając funkcji okna (WINDOW FUNCTION - OVER()) + iterator wiersza row_number().
DISTINCT vs ROW_NUMBER() OVER(), które rozwiązanie będzie szybsze na podstawie dostępnych danych? Sprawdź wyniki, korzystając z planu zapytania. #praktyka #wydajność
Na podstawie danych sprzedaży (tabela SALES) znajdź listę produktów, które nie zostały zakupione, używając składni IS NULL. #praktyka #składnia
Na podstawie danych sprzedaży (tabela SALES) znajdź listę produktów, które nie zostały zakupione, nie używając składni IS NULL. #praktyka #składnia
Or using the EXCEPT syntax (MINUS in some databases).
IS NULL vs NOT IN vs EXCEPT, sprawdź na podstawie dostępnych danych, korzystając z planu zapytania, które rozwiązanie będzie szybsze. Cel we wszystkich przypadkach jest taki sam: znalezienie listy produktów (tabela PRODUCTS), które nie zostały zakupione (tabela SALES) #praktyka #wydajność
Wyświetl listę wszystkich produktów (tabela PRODUCTS) wraz z datą ich sprzedaży (tabela SALES). Jeśli nie ma sprzedaży danego produktu, podaj datę jako 1900-01-01. #praktyka #składnia
Lub z użyciem CASE WHEN THEN:
Znajdź wszystkie produkty (z tabeli PRODUCTS), których nazwa produktu (kolumna PRODUCT_NAME) kończy się na 1. #praktyka #składnia
Znajdź wszystkie produkty (z tabeli PRODUCTS), których opis (kolumna RANDOM_DESC) zaczyna się od a51. #praktyka #składnia
Znajdź wszystkie produkty (z tabeli PRODUCTS), których nazwa produktu (kolumna PRODUCT_NAME) zawiera dokładnie 1 znak na końcu (dla przejrzystości nazwa produktu składa się z części „Produkt” i cyfry lub liczby oznaczającej numer produktu, np. Produkt 1). #praktyka #składnia
Znajdź wszystkie identyfikatory produktów (kolumna PRODUCT_ID) i nazwy produktów (kolumna PRODUCT_NAME), zarówno dla istniejących, jak i nieistniejących produktów w tabeli słownika (PRODUCTS). W przypadku nieistniejących produktów ustaw wartość nazwy produktu na 'unknown'. #praktyka #składnia #join
Na podstawie danych sprzedaży (tabela SALES) znajdź wszystkie unikalne identyfikatory produktów (kolumna PRODUCT_ID) i nazwy produktów (kolumna PRODUCT_NAME) wyłącznie dla produktów znajdujących się w tabeli słownika PRODUCTS. #praktyka #składnia #join
Pokaż dowolne 10 wierszy na podstawie danych sprzedaży (tabela SALES), dodając informacje o opisie produktu dla każdego wiersza na podstawie 1 produktu wybranego z tabeli słownika PRODUCTS. Dodatkowo wyświetl opis faktycznego produktu, który został sprzedany. Nazwij kolumnę opisem wybranego produktu, selected_product_description. Nazwij kolumnę faktycznym opisem sprzedanego produktu, valid_product_description. #praktyka #składnia #join
Na podstawie danych sprzedaży (tabela SALES) wyświetl listę nazw produktów (kolumna PRODUCT_NAME) i liczbę ich sprzedaży. W przypadku produktów, które nie są dostępne w danych sprzedaży, wyświetl nazwę produktu i wartość 0. Posortuj wyniki alfabetycznie według nazwy produktu. #praktyka #składnia #join
Wyświetl dane sprzedażowe (tabla SALES), datę sprzedaży (kolumna SALES_DATE), wartość sprzedaży (kolumna SALES_AMOUNT) i informacje o produkcie, nazwę produktu (kolumna PRODUCT_NAME), kategorię produktu (kolumna PRODUCT_CATEGORY), opis produktu (kolumna RANDOM_DESC) dla wszystkich dostępnych danych. Posortuj wyniki malejąco według wartości sprzedaży. #praktyka #składnia #join
Wyświetl wszystkie produkty (tabela PRODUCTS) wraz z informacjami o dacie sprzedaży. Posortuj uzyskane dane według daty sprzedaży (kolumna SALES_DATE) od ostatniej (najbliższej dzisiejszej) do pierwszej sprzedaży. Wartości nieokreślone dla daty sprzedaży (kolumna SALES_DATE) powinny zostać uwzględnione na końcu zestawu wyników. #praktyka #składnia #join
Na podstawie danych sprzedaży (tabela SALES) wyświetl wszystkie unikalne nazwy produktów (kolumna PRODUCT_NAME), które były zaangażowane w transakcję sprzedaży przynajmniej raz. Otrzymane dane zostaną posortowane alfabetycznie według nazwy produktu (kolumna PRODUCT_NAME). #praktyka #składnia #join
Wyświetl wszystkie dane sprzedażowe (tabela SALES). Posortuj uzyskane dane według miesiąca sprzedaży na podstawie daty sprzedaży (kolumna SALES_DATE). Aby sprawdzić, czy wyniki są poprawne, dodaj kolumnę month_of_sales do zestawu wyników, która będzie miesiącem sprzedaży na podstawie daty sprzedaży. #praktyka #składnia
Na podstawie danych sprzedażowych (tabela SALES) oblicz całkowitą sumę sprzedaży (kolumna SALES_AMOUNT) dla produktu o nazwie (kolumna PRODUCT_NAME) „Product 1”. Zaokrągl wynik do jednego miejsca po przecinku. #praktyka #składnia #join
Na podstawie danych sprzedażowych (tabela SALES) oblicz całkowitą liczbę sprzedanych artykułów (kolumna SALES_QTY) dla produktu o nazwie (kolumna PRODUCT_NAME) „Product 2”. W wyniku przedstaw wartość zaokrągloną do najmniejszej liczby całkowitej większej lub równej wartości wyjściowej - total_sales_qty_plus, i wartość zaokrągloną do największej liczby całkowitej mniejszej lub równej wartości wyjściowej - total_sales_qty_minus. #praktyka #składnia #join #rounding
Na podstawie danych sprzedażowych (tabela SALES) pobierz 10 wierszy, dla których wartość sprzedaży (kolumny SALES_AMOUNT) jest większa niż 5. #praktyka #składnia
Wyświetl wszystkie dane sprzedażowe (tabela SALES), dodając kolumnę sales_meets_expectations do wyniku, który w zależności od wartości sprzedaży (kolumna SALES_AMOUNT) będzie miał wartość 'Y' - dla wartości sprzedaży większych niż 5, 'N' - dla wartości sprzedaży mniejszych lub równych 5 i 'N/A' w pozostałych przypadkach. #praktyka #składnia
Na podstawie danych sprzedażowych (tabela SALES) wyświetl liczbę sprzedanych produktów (kolumna SALES_QTY) dla produktu o nazwie 'Product 1', podzieloną na miesiące w 2020 r. (miesiąc w kolumnie SALES_DATE). W kolumnach wyników dodaj kolumnę exceeded_expected_needs z wartością „Y” dla wierszy, w których łączna liczba sprzedanych produktów jest większa niż 1500, w przeciwnym razie wartości dla tej kolumny powinny wynosić „N”. #praktyka #składnia #join
Używając operatora EXISTS, określ liczbę unikalnych identyfikatorów produktów (tabele PRODUCTS, kolumny PRODUCT_ID), które nie były zaangażowane w transakcję sprzedaży (tabela SALES). #praktyka #składnia
Używając operatora EXISTS, wyświetl wszystkie produkty (tabela PRODUCTS), które wzięły udział w transakcji sprzedaży (tabela SALES). #praktyka #składnia
Używając polecenia DELETE, usuń z tabeli produktów (tabela PRODUCTS) wszystkie produkty, które do tej pory nie brały udziału w transakcji sprzedaży (tabela SALES). #praktyka #składnia
Używając polecenia DELETE, usuń wszystkie dane z tabeli produktów (tabela PRODUCTS), w której opis produktu (kolumny RANDOM_DESC) rozpoczyna się od „c4c”. #praktyka #składnia
Na podstawie danych sprzedażowych (tabela SALES) utwórz dwa zestawy danych (2x SELECT) dla produktów, które zostały sprzedane w miesiącu A i miesiącu B tego samego roku (wybierz miesiące według własnego uznania na podstawie kolumny SALES_DATE). Wynik musi zawierać tylko wiersze o unikalnych nazwach produktów (kolumna PRODUCT_NAME). Następnie, używając operacji UNION, połącz oba zestawy i wyświetl nazwy produktów (kolumna PRODUCT_NAME), które brały udział w transakcjach sprzedaży. #praktyka #składnia
Usuń wszystkie dane sprzedażowe (tabele SALES), zakładając, że operacja ma być nieodwracalna.
Utwórz nową tabelę PRODUCTS_OLD_WAREHOUSE z tymi samymi kolumnami, co istniejąca tabela produktów (tabela PRODUCTS). Wstaw kilka wierszy do nowej tabeli — dowolne wiersze. Używając operacji UNION i UNION ALL, połącz tabelę PRODUCTS_OLD_WAREHOUSE z dowolnymi 10 produktami z tabeli PRODUCTS, a wynik wyświetli tylko nazwę produktu (kolumna PRODUCT_NAME) i kategorię produktu (kolumna PRODUCT_CATEGORY). Czy pominięto jakieś wiersze podczas używania UNION? #praktyka #składnia
Utwórz widok sales_with_amount_more_then_10 (CREATE VIEW) na podstawie tabeli z danymi sprzedaży, gdzie sprzedaż jest większa niż 10 (tabela SALES). Następnie spróbuj usunąć tabelę SALES za pomocą zwykłej operacji DROP i opcji CASCADE?. #praktyka #składnia
Utwórz widok products_sold na podstawie tabel produktów PRODUCTS i tabel danych sprzedaży SALES. Widok powinien mieć 4 kolumny: sales_date, sales_amount, product_name i product_category. #praktyka #składnia
Utwórz widok zmaterializowany products_sold na podstawie tabel produktów PRODUCTS i tabel danych sprzedaży SALES. Widok powinien mieć 4 kolumny: sales_date, sales_amount, product_name i product_category. #praktyka #składnia
Na podstawie wszystkich produktów (tabela PRODUCTS) utwórz listę nazw produktów (kolumna PRODUCT_NAME) i tablicę unikalnych kategorii (kolumna PRODUCT_CATEGORY). Do której kategorii należą te produkty? #praktyka #składnia
Na podstawie danych sprzedażowych (tabela SALES) wyświetl wszystkie transakcje sprzedaży z następnego miesiąca (dane testowe utworzone jako INTERVAL, stąd kolejny miesiąc), tak aby uzyskane dane pokazywały całkowitą wartość sprzedaży (kolumny SALES_AMOUNT), całkowitą liczbę sprzedanych jednostek (kolumna SALES_QTY), dla nazw produktów (kolumna PRODUCT_NAME) wraz z tablicą unikalnych kategorii, do których należą te produkty. #ćwiczenie #składnia
Jakiego polecenia można użyć, aby przyznać użytkownikowi user_limited_access uprawnienia do odczytu danych z tabeli SALES? #praktyka #składnia
Jakiego polecenia można użyć, aby przyznać użytkownikowi user_limited_access wszystkie uprawnienia do tabeli SALES? #praktyka #składnia
Jakiego polecenia można użyć, aby przyznać użytkownikowi user_limited_access uprawnienia do odczytu kolumny sales_date i aktualizowania danych w kolumnie discount w tabeli SALES. #praktyka #składnia
Jakiego polecenia można użyć, aby odwołać user_limited_access w celu odczytu danych z tabeli SALES. #praktyka #składnia
Jakiego polecenia można użyć, aby odwołać uprawnienia user_limited_access do wszystkich tabel w schemacie PUBLIC_SALES (zakładając, że taki schemat istnieje w bazie danych). #praktyka #składnia
Jeśli masz rolę (zestaw uprawnień) w bazie danych o nazwie limited_access (umożliwiającą ograniczony dostęp do bazy danych), nadaj użytkownikowi user_limited_access tę rolę. #praktyka #składnia
Użytkownikowi user_limited_access przypisano rolę limited_access (udzielającą ograniczonego dostępu do bazy danych), odwołaj dostęp użytkownika do tej roli. #praktyka #składnia
Zakładając, że pracujesz w sesji bazy danych bez aktywnego COMMIT (bez opcji AUTOCOMMIT), utwórz dwa zapytania. Pierwsze z nich usunie wszystkie rekordy z tabeli PRODUCTS, tak aby nazwa produktu (kolumna PRODUCT_NAME) była równa Product 1. Drugie z nich wycofa zmiany wprowadzone przez pierwsze zapytanie. #praktyka #składnia
Posiadanie tabeli z historycznymi produktami, PRODUCTS_HISTORY, o tej samej strukturze (te same kolumny i typy danych) co tabela PRODUCTS. Wstaw wszystkie dane z tabeli PRODUCTS_HISTORY do tabeli PRODUCTS w jednym zapytaniu. #praktyka #składnia
Wyświetl wszystkie informacje o produkcie (tabele PRODUCTS) poprzez dodanie kolumny product_name_category do zestawu wyników, która będzie połączeniem nazwy produktu (kolumna PRODUCT_NAME) i kategorii produktu (kolumna PRODUCT_CATEGORY). Oddziel wartości znakiem ' - '. W przypadku niezdefiniowanej wartości dla jednego lub obu atrybutów wstaw pusty tekst ''. #praktyka #składnia
Jaki będzie wynik tego zapytania? SELECT product_name FROM products ORDER BY 2 DESC; #praktyka #składnia
ORDER BY 2 zadziała, gdy w zestawie wyników będą co najmniej 2 kolumny, a następnie zapytanie użyje drugiej kolumny (w SELECT) do wykonania sortowania.
Jednak w powyższym przykładzie baza danych zwróci błąd, ponieważ w zestawie wyników nie ma drugiego elementu (w SELECT jest tylko SELECT product_name).
Bez używania funkcji MIN wyświetl najmniejszy identyfikator produktu (kolumna PRODUCT_ID) w tabeli PRODUCTS. #praktyka #składnia
Bez używania funkcji MAX wyświetl drugi co do wielkości identyfikator produktu (kolumna PRODUCT_ID) w tabeli PRODUCTS. #praktyka #składnia
Na podstawie danych produktu (tabela PRODUCTS) znajdź wszystkie produkty, które powtarzają się w innych atrybutach produktu (produkty, które pojawiają się więcej niż raz). #praktyka #składnia
Wyświetl wszystkie nazwy produktów (kolumna PRODUCT_NAME) wraz z łączną wartością sprzedaży (kolumna SALES_AMOUNT), np. średnia liczba sprzedanych jednostek (kolumna SALES_QTY) jest większa niż 5. #praktyka #składnia
Wyświetl łączną sprzedaż (kolumna SALES_AMOUNT) dla produktu 'Product 1' (kolumna PRODUCT_NAME), z 'Category 1' (kolumna PRODUCT_CATEGORY), grupując dane według nowego atrybutu YEAR_MONTH. Atrybut powinien być połączeniem roku i miesiąca dla daty sprzedaży (kolumna SALES_DATE). #praktyka #składnia
Wyświetl całkowity wzrost sprzedaży (kolumna SALES_AMOUNT) dla „Produktu 1” (kolumna PRODUCT_NAME), z „Kategorii 1” (kolumna PRODUCT_CATEGORY), grupując dane według nowego atrybutu YEAR_MONTH. W taki sposób, aby kolejne wartości sprzedaży wskazywały sumę bieżącej i poprzedniej wartości sumy sprzedaży dla roku i miesiąca. #praktyka #składnia
Czy i jak użyć kolejności kolumn składni SELECT w części ORDER BY zapytania. #praktyka #składnia
Składnia ORDER BY jest ostatnim elementem „logicznego” planu wykonania zapytania. Stąd, gdy używamy aliasów dla kolumn w składni SELECT (ponieważ na przykład są to kolumny zbudowane na funkcjach), możemy użyć tych aliasów w ORDER BY. Innym ciekawym faktem jest to, że kolejność kolumn wymieniona w sekcji SELECT może być również użyta w sekcji ORDER BY. Zamiast używać aliasu lub nazwy drugiej kolumny, możesz użyć miejsca, w którym pojawia się ona w SELECT, czyli numeru 2.
Czy można posortować oddzielnie zestawy używane w składni UNION lub UNION ALL. #praktyka #składnia
Tak i nie 🙂
Domyślnie ORDER BY jest używane do sortowania całego zestawu wyników, więc będzie ostatnim elementem składni SELECT po UNION lub UNION ALL.
Możesz jednak oddzielnie posortować zestawy używane w UNION / UNION ALL, używając podzapytań (tj. traktując oba zestawy jako podzapytania) lub wstawiając sztuczną kolumnę i początkowo sortując według niej. Podczas korzystania z podejścia ze sztuczną kolumną uważaj na wyniki, UNION, które eliminuje wiersze o tych samych wartościach podczas łączenia, nie będzie miało zastosowania, ponieważ sztuczna kolumna zawsze będzie inna w zestawach (tj. na końcu dodatkowe podzapytanie + distinct).