# 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);
```