---
# System prepended metadata

title: PBD_lab3
tags: [studia]

---

---
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
![](https://i.imgur.com/eBOl07A.png)
![](https://i.imgur.com/fNKGbRF.png)
![](https://i.imgur.com/9P2big2.png)

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
![](https://i.imgur.com/blISk65.png)
![](https://i.imgur.com/lZd3ACV.png)
![](https://i.imgur.com/CjTcJR2.png)

### 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;
```
![](https://i.imgur.com/NOJGIvf.png)

#### 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;
```
![](https://i.imgur.com/1aukvFl.png)

### 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;
```
![](https://i.imgur.com/cyWRKzz.png)

```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;
```
![](https://i.imgur.com/IfLw0Sq.png)

```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;
```
![](https://i.imgur.com/YzEMZ3N.png)

## Widoki

```sql=
create view v_produkty as
select PRO_NAZWA, PRO_CENA
from Produkty
where PRO_CENA > 5;
```
![](https://i.imgur.com/JVtURgC.png)

```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;
```
![](https://i.imgur.com/hlmztaY.png)

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;
```
![](https://i.imgur.com/ZVoM0Ny.png)
![](https://i.imgur.com/IapKjGH.png)


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;
```
![](https://i.imgur.com/f4iqZs0.png)
![](https://i.imgur.com/tcXkbmD.png)

# 

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 
![](https://i.imgur.com/xyUhP4f.png)
![](https://i.imgur.com/W89yAz2.png)

## Podzapytania

```sql=
select KLI_IMIE, KLI_NAZWISKO
from (select * from Klienci) as tabelka;
```
![](https://i.imgur.com/iPqkqqb.png)

```sql=
select *
from Klienci
where KLI_ID = (select min(KLI_ID) from Klienci);
```
![](https://i.imgur.com/WERklie.png)
![](https://i.imgur.com/zAQUlip.png)

```sql=
select tel KLI_NR_TEL
from (select KLI_NAZWISKO, KLI_NR_TEL tel
      from (select * from Klienci) T) T2;
```
![](https://i.imgur.com/jEHaNFl.png)

### ALL()

```sql=
select *
from Klienci
where KLI_ID <> ALL (select KLI_ID from Zamowienia);
```
![](https://i.imgur.com/bJYw8cF.png)
![](https://i.imgur.com/sEHjB0m.png)

### 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;
```
![](https://i.imgur.com/GD7pjkY.png)

### IN()

```sql=
select *
from Zamowienia
where ZAM_ID IN (select ZAM_ID
    from Wysylki
    where year(WYS_DATA_NADANIA) = ' 2021 ');
```
![](https://i.imgur.com/m1pkrG4.png)

### 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;
```
![](https://i.imgur.com/ByyqPXZ.png)
