--- 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)