join/natural join/left join/righ join kiedy którego użyć

0

Witam,
Czy mógłby mi ktoś w jakiś prosty sposób opisać, kiedy powinienem użyć join/natural join/left join/right join. Kiedy powinno się używać jakiegoś połączenia z using? Czy dane w tabeli muszą być jakoś powiązane i od tego zależy z którego joina użyć ? Czy może using używamy jak się jakaś kolumna powtarza w obu tabelach ?

W załączniku są zadania i schematy przykładowych baz danych, NIE CHCE ROZWIĄZAŃ. To tylko tak, żeby wyjaśnić bardziej o co mi chodzi. Dopóki nie muszę łączyć tabel zadania są proste, a jak już trzeba z kilku to mam problemy...

0

żeby wiedzieć kiedy który join jest Ci "potrzebny" musisz zrozumieć różnicę między nimi. Jeśli nie wystarczą Ci rysunki z postu @Shalom to nie wiem jak prościej można to wytłumaczyć. BTW jest jeszcze jeden typ złączenia - Right outer join i wygląda dokładnie jak Left outer join tylko, że zamalowana jest część wspólna i prawe koło

0

Dzięki @Shalom za rysunki. Wygląda to dość jasno. Tylko z praktyką idzie, gorzej bo nie mam jak sprawdzić czy dobrze napisałem. Czy mógłby mi ktoś sprawdzić zadanie 3, czy może być tak i czy są jeszcze inne sposoby ? W załączniku schemat bazy danych.

  1. (2pkt) Podaj instrukcję wyświetlającą nazwy i ceny kom. Dane należy posortować malejąco według cen.
select nazwa, cena
from kompozycje
order by cena desc;
  1. (3pkt). Podaj instrukcję wyświetlającą nazwę, opis, cenę tych kompozycji. Które w opisie zawierają ciąg znaków róż i których cena jest z przedziału [40.00;80.00].
select nazwa, opis, cena
from kompozycje
where opis like '%róż%'
and cena between 40 and 80;
  1. (4pkt) Podaj instrukcję wyświetlającą identyfikatory zamówień zrealizowanych lub do zrealizowania w listopadzie i grudniu 2013r. (Weź pod uwagę tabele zamówienia i historia.

Czy może to być tak ?

select idzamowienia
from zamowienia
where  
date_part('month', termin)=11  
and date_part('year', termin)=2013; 
or 
date_part('month', termin)=12  
and date_part('year', termin)=2013; 
union
select idzamowienia
from historia
where 
date_part('month', termin)=11  
and date_part('year', termin)=2013; 
or 
date_part('month', termin)=12  
and da/te_part('year', termin)=2013; 

Czy z joinem ? Wg schematu tabela zamówienia i historia nie są nigdzie ze sobą powiązane.

select idzamowienia
from zamowienia join historia on
date_part('month', termin)=11  
and date_part('year', termin)=2013; 
or 
date_part('month', termin)=12  
and date_part('year', termin)=2013; 
0

Zadanie 3 jednak zrobiłbym z joinem. Fakt że nie ma klucza obcego jest dziwny, ale klucz obcy w zasadzie nie jest konieczny. On tylko sprawia że sie te tabele nie "rozjadą".

0

Zadanie 3 - pomieszane OR i ANDy. UNION (wg mnie jest ble). Nawte jak już masz wynik, to chyba jedna nie wiesz, które idzamowienia z kórej jest tabeli Jeśli nie daj Bóg mogą być takie same, to union jedno ci wykosi...

0

Dzięki, że pomagacie. Hmm, czyli oba rozwiązania są dobre ?

Niestety z tym już nie mogę sobie poradzić...
4. (4pkt) Podaj instrukcję wyświetlającą nazwy klientów(nadawców) z Krakowa, którzy zamówili kompozycję o nazwie Bukiet białych róż. (Interesują nas zamówienia z tabeli zamówienia).

select klienci.nazwa, kompozycje.nazwa
from klienci natural join zamowienia using(idnadawcy)
natural join kompozycje using(idkompozycji)
where miasto like 'Kraków'
and  kompozycje.nazwa='Bukiet białych róż';
0

A co to za baza? NATURAL JOIN i USING razem?? miasto LIKE 'Kraków' ?? Bez maski? To wtedy się = używa.

0

PostgresSQL, schemat w poście wyżej.

0

U mnie na postgreSQL przy zastosowaniu NATURAL JOIN nie podaje się USING. Co więcej - podając otrzymuję

BŁĄD: błąd składni w lub blisko "using"
Stan SQL: 42601

Nadal uważam, że LIKE w tym zastosowaniu jest bezsensowny. Jeśli już to ILIKE - wtedy ma sens. Więc twoje zapytanie powinno wyglądać mniej więcej tak:

SELECT k.nazwa, komp.nazwa
FROM klienci k JOIN zamowienia z USING(idnadawcy)
 JOIN kompozycje komp USING(idkompozycji)
WHERE miasto ILIKE 'kraków'
AND  komp.nazwa='Bukiet białych róż';

1 użytkowników online, w tym zalogowanych: 0, gości: 1