---
title: PBD_lab3
tags: studia
---
Mateusz Stankiewicz - Podstawy Baz Danych - lab 3
## Złączenia
### INNER JOIN
W celu przetestowania złączenia inner join, użyłem następującego zapytania:
```sql=
select *
from Dostawcy inner join Produkty
on Dostawcy.DOS_NAZWA_FIRMY = Produkty.PRO_PRODUCENT;
```
Otrzymałem następujący wynik



Dodatkowo przetestowałem złączenie z użyciem `where`, wpisując zapytanie:
```sql=
select *
from Klienci inner join Zamowienia
on Klienci.KLI_ID = Zamowienia.KLI_ID
where Zamowienia.ZAM_CALK_CENA > 200
order by Klienci.KLI_ID;
```
i otrzymałem wynik



### OUTER JOIN
#### LEFT OUTER JOIN
Użyłem złącza `left outer join` do uzyskania imienia i nazwiska wraz z ID produktu osób składających zamówienia. Poniżej otrzymałem również dane klientów, którzy niczego nie zamówili.
```sql=
select Klienci.KLI_IMIE, Klienci.KLI_NAZWISKO, Zamowienia.PRO_ID
from Klienci left outer join Zamowienia
on Klienci.KLI_ID = Zamowienia.KLI_ID;
```

#### RIGHT OUTER JOIN
Podobnie użyłem złącza `right outer join`, by uzyskać nazwę i cenę oraz ilość produktu według zamówienia. Poniżej znalazły się dane produktów, których nikt nie zamówił.
```sql=
select PRO_NAZWA, PRO_CENA, ZAM_ILOSC
from Zamowienia right outer join Produkty
on Zamowienia.PRO_ID = Produkty.PRO_ID;
```

### Dodatkowe zapytania
```sql=
select KLI_IMIE, KLI_NAZWISKO, PRO_ID, ZAM_ILOSC, ZAM_CALK_CENA
from Klienci inner join Zamowienia
on Klienci.KLI_ID = Zamowienia.KLI_ID
where ZAM_CALK_CENA > 100 and ZAM_CALK_CENA < 220
order by KLI_NAZWISKO;
```

```sql=
select KLI_IMIE, KLI_NAZWISKO, PRO_NAZWA, PRO_CENA, ZAM_ILOSC
from Klienci inner join Produkty inner join Zamowienia
on Klienci.KLI_ID = Zamowienia.KLI_ID and Produkty.PRO_ID = Zamowienia.PRO_ID
order by KLI_NAZWISKO;
```

```sql=
select KLI_IMIE, KLI_NAZWISKO, PRO_NAZWA,
ZAM_ILOSC, WYS_KURIER, WYS_DATA_NADANIA
from Klienci inner join Zamowienia
inner join Produkty
inner join Wysylki
on Wysylki.ZAM_ID = Zamowienia.ZAM_ID
and Zamowienia.KLI_ID = Klienci.KLI_ID
and Zamowienia.PRO_ID = Produkty.PRO_ID
order by KLI_NAZWISKO;
```

## Widoki
```sql=
create view v_produkty as
select PRO_NAZWA, PRO_CENA
from Produkty
where PRO_CENA > 5;
```

```sql=
create view v_wysylka as
select KLI_IMIE, KLI_NAZWISKO, PRO_NAZWA,
ZAM_ILOSC, WYS_KURIER, WYS_DATA_NADANIA
from Klienci inner join Zamowienia
inner join Produkty inner join Wysylki
on Wysylki.ZAM_ID = Zamowienia.ZAM_ID
and Zamowienia.KLI_ID = Klienci.KLI_ID
and Zamowienia.PRO_ID = Produkty.PRO_ID
order by KLI_NAZWISKO;
```

Następnie usuwam widoki:
```sql=
drop view v_produkty;
drop view v_wysylka;
```
## Indeksy
Tworzę indeks w tabeli Produkty dla kolumny PRO_NAZWA:
```sql=
create index produkty_idx on Produkty(PRO_NAZWA);
```
a następnie wyświetlam indeksy tabeli:
```sql=
show index from Produkty;
```


Tworzę unikalny indeks w tabeli Klienci dla kolumn KLI_IMIE, KLI_NAZWISKO:
```sql=
create unique index klienci_idx on Klienci(KLI_IMIE, KLI_NAZWISKO);
```
i wyświetlam:
```sql=
show index from Klienci;
```


#
Powyższe tabele są małe, dlatego indeksy nie są w nich potrzebne. Usuwam je w następujący sposób:
```sql=
alter table Klienci drop index klienci_idx;
alter table Produkty drop index produkty_idx;
```
dzięki czemu po wyświetleniu indeksów tabel Klienci i Produkty otrzymujemy


## Podzapytania
```sql=
select KLI_IMIE, KLI_NAZWISKO
from (select * from Klienci) as tabelka;
```

```sql=
select *
from Klienci
where KLI_ID = (select min(KLI_ID) from Klienci);
```


```sql=
select tel KLI_NR_TEL
from (select KLI_NAZWISKO, KLI_NR_TEL tel
from (select * from Klienci) T) T2;
```

### ALL()
```sql=
select *
from Klienci
where KLI_ID <> ALL (select KLI_ID from Zamowienia);
```


### EXISTS()
```sql=
select EXISTS(SELECT
* from Zamowienia
where Zamowienia.KLI_ID = Klienci.KLI_ID)
as zakup,
KLI_IMIE, KLI_NAZWISKO, KLI_NR_TEL
from Klienci;
```

### IN()
```sql=
select *
from Zamowienia
where ZAM_ID IN (select ZAM_ID
from Wysylki
where year(WYS_DATA_NADANIA) = ' 2021 ');
```

### Dodatkowe podzapytania
```sql=
select *
from (select KLI_IMIE, KLI_NAZWISKO,
PRO_NAZWA, PRO_CENA, ZAM_ILOSC
from Klienci inner join Zamowienia
inner join Produkty
on Zamowienia.KLI_ID = Klienci.KLI_ID
and Zamowienia.PRO_ID = Produkty.PRO_ID)
as tabela having ZAM_ILOSC > 5
order by KLI_NAZWISKO limit 3;
```
