# Bazy danych SQL spr0/1 ## Spr0 (jednak to później ... za dużo roboty z tym ...) **Zadanie 4.** Dodaj krotkę do tabeli *lineitem* z wartościa *l_orderkey* odwołującą się do nieistniejącego numeru zamówienia w tabeli *orders*. ## Spr1 **Zadanie 1.** Wypisz numery zamówień (*orderkey*) wraz z datą złożenia zamówienia (*orderdate*) oraz jego priorytetem (*orderpriority*), dla których któraś pozycja (lineitem) była zrealizowana (shipdate) później niż 120 dni po złożeniu zamówienia. Uwzględnij wyłącznie zamówienia złożone w sierpniu dowolnego roku mające priorytet '2-HIGH' lub '1-URGENT'. Wyniki posortuj wg priorytetu (najpierw '1-URGENT'), w drugiej kolejności malejąco wg daty złożenia zamówienia, a w trzeciej rosnąco wg numeru zamówienia. ``` SELECT DISTINCT orders.o_orderkey, orders.o_orderdate, orders.o_orderpriority FROM lineitem LEFT JOIN orders ON lineitem.l_orderkey = orders.o_orderkey WHERE DATE_PART('day', l_shipdate::timestamp - o_orderdate::timestamp) > 120 AND extract(MONTH FROM orders.o_orderdate) = 8 AND orders.o_orderpriority IN ('2-HIGH', '1-URGENT') ORDER BY orders.o_orderpriority, orders.o_orderdate DESC, orders.o_orderkey; ``` **Zadanie 2.** Wypisz numery zamówień (*orderkey*) składające się z więcej niż 1 pozycji (*lineitem*), których wszystkie pozycje były dostarczane w ten sam sposób (*shipmode*). Wyniki posortuj rosnąco. ``` ( SELECT DISTINCT l1.l_orderkey FROM lineitem l1 JOIN lineitem l2 ON l1.l_orderkey = l2.l_orderkey WHERE l1.l_linenumber <> l2.l_linenumber ) EXCEPT ( SELECT l1.l_orderkey FROM lineitem l1 JOIN lineitem l2 ON l1.l_orderkey = l2.l_orderkey WHERE l1.l_shipmode <> l2.l_shipmode) ORDER BY 1; ``` **Zadanie 3.** 1. Dodaj więz klucza obcego dla kolumny *regionkey* tabeli nation odwołujący się do kolumny regionkey w tabeli *region*, przy czym ustaw **ON DELETE** w taki sposób, aby usunięcie kontynentu powodowało usunięcie wszystkich jego krajów. ``` ALTER TABLE nation ADD CONSTRAINT fk_regionkey FOREIGN KEY (n_regionkey) REFERENCES region(r_regionkey) ON DELETE CASCADE; ``` 2. Do obu powyższych tabel dodaj po jednej krotce reprezentującej Australię dpowiednio jako kraj oraz jako kontynent. ``` INSERT INTO region VALUES (10, 'Australia', 'coment'); INSERT INTO nation VALUES (300, 'Australia', 10, 'coment'); ``` 3. Usuń nowo dodany kontynent z tabeli *region*. Sprawdź zapytaniem **SELECT**, czy zniknęła odpowiednia krotka z tabeli *nation*. ``` DELETE FROM region WHERE region.r_name = 'Australia'; SELECT * FROM nation WHERE nation.n_regionkey = 10; ``` **Zadanie 4.** Wypisz numery wszystkich klientów (custkey) z tabeli customer, którzy nie złożyli żadnego zamówienia (orders). Wyniki posortuj rosnąco. ``` (SELECT customer.c_custkey FROM customer) EXCEPT (SELECT DISTINCT orders.o_custkey FROM orders) ORDER BY 1; ``` **Zadanie 5.** Dopisz do salda kont (acctbal) wszystkich europejskich klientów z tabeli customer bonus w wysokości 10 procent obecnego salda. ``` UPDATE customer SET c_acctbal = c_acctbal * 1.1 WHERE c_custkey IN (SELECT customer.c_custkey FROM (customer JOIN nation ON c_nationkey = n_nationkey) JOIN region ON n_regionkey = r_regionkey WHERE r_regionkey = 3); ```