Zadanie 11. Pokaż wszystkich pracowników których bezpośrednim przełożonym jest Leopold Banko. WHERE JOIN IS NULL

Czego się dowiesz czytając ten wpis:

  • poznasz polecenie JOIN,
  • poznasz wyrażenie IS NULL,
  • powtórzysz wiedzę nt. ALIASÓW i WHERE.

Zadanie 11.

Pokaż wszystkich pracowników których bezpośrednim przełożonym jest Leopold Banko. Wyniki przedstaw w konwencji imię, nazwisko w jednej kolumnie i imię i nazwisko przełożonego w drugiej kolumnie.

Rozwiązanie:

                Jedna z pierwszych czynności jest określenie źródła danych, czyli:

FROM
   Pracownicy

    Zastanówmy się w jaki sposób uzyskać informację na temat kto jest szefem danego pracownika i odpowiednio je przefiltrować. Informacje kto jest szefem kogo znajduje się w kolumnie „ID_przelozonego”. Najszybszą metodą jest przefiltrowanie tabeli pracownicy po identyfikatorze/ID Pana Bańko i z głowy. Ale jak zrobić, żeby skorzystać z jego nazwiska? Tutaj z pomocą przyjdzie nam polecenie JOIN i taka fajna sztuczka. Otóż istnieje możliwość „jakby zdublowania” tabeli „Pracownicy” i połączenie obu tabel.  Dla rozróżnienia obu tabel nadajmy im aliasy. Pierwszej nadajmy alias „P” a drugiej alias „SZEF”. Czyli reasumując mamy teraz dwie tabele „Pracownicy” o różnych nazwach i teraz będziemy chcieli je połączyć ale chcemy je połączyć w taki sposób żeby do każdego pracownia przyporządkować jego szefa. W dalszej części będę się już posługiwać aliasami tabel. W tabeli „P” istnieje kolumna „ID_przelozonego”. Jest to po prostu wartość „ID_pracownika” szefa danej osoby. Żeby uzyskać zadowalający nas efekt musimy połączyć/powiązać odpowiednie „ID_przełozonego” z tabeli „P” z „ID_pracownika” z tabeli „SZEF”. I tutaj skorzystamy z polecenia JOIN, opis poniżej.

Tabela1 JOIN Tabela2 ON (warunek złączenia)

W naszym przypadku będzie to wyglądało tak:

FROM
Pracownicy AS P JOIN Pracownicy AS SZEF ON P.ID_przelozonego = SZEF.ID_pracownika

Żeby lepiej zobrazować co się dzieje podczas złączenia prezentuję poniższy schemat.

kurs sql sql course

Polecenie JOIN znajdzie nam część wspólną obu tabel, czyli znajdzie wszystkie rekordy które po obu stronach (w obu tabelach) będą miały wartości i to wartości odpowiadające warunkowi złączenia. Innymi słowy takie rekordy gdzie dla wartości „ID_przełozonego”, z tabeli „P”, będzie istniała odpowiednia wartość „ID_pracownika”, z tabeli „SZEF”.

Teraz określimy jakie informacje z naszych tabel, z jakich kolumn, będziemy wyświetlać. Po klauzuli SELECT określamy (posługując się aliasami) jakie kolumny z jakich tabel chcemy prezentować. Pamiętajmy, że wyniki mamy prezentować w konwencji imię, nazwisko w jednej kolumnie i imię i nazwisko przełożonego w drugiej kolumnie.

SELECT
       P.imie+' '+P.nazwisko AS [Imię i Nazwisko]
      ,SZEF.imie+' '+SZEF.nazwisko AS [Imię i Nazwisko Przełożonego]

Nasze zapytanie w tym momencie wygląda tak.

SELECT
        P.imie+' '+P.nazwisko AS [Imię i Nazwisko]
       ,SZEF.imie+' '+SZEF.nazwisko AS [Imię i Nazwisk Przełożonego]
FROM
      Pracownicy AS P JOIN Pracownicy AS SZEF
      ON (P.ID_przelozonego = SZEF.ID_pracownika)

Gdybyśmy jednak uruchomili zapytanie w takiej postaci nie uzyskamy jeszcze zadowalającego nas efektu ponieważ w wynikach zobaczymy wszystkich pracowników a my chcemy tylko tych których bezpośrednim przełożonym jest Leopold Banko. Żeby osiągnąć nasz cel w klauzuli WHERE musimy wpisać jeszcze warunek filtrowania, czyli wyświetlić tylko te rekordy gdzie szefem jest Pan Banko.

     WHERE
            SZEF.nazwisko = 'Banko'

W tym momencie nasze zapytanie przybierze formę.

SELECT
        P.imie+' '+P.nazwisko AS [Imię i Nazwisko]
       ,SZEF.imie+' '+SZEF.nazwisko AS [Imię i Nazwisk Przełożonego]
FROM
      Pracownicy AS P JOIN Pracownicy AS SZEF ON P.ID_przelozonego = SZEF.ID_pracownika
WHERE
      SZEF.nazwisko = 'Banko'

Uruchamiamy zapytanie i otrzymujemy 4 rekordy z imieniem i nazwiskiem szefa Leopold Banko. Wydaje się, że wszystko jest już w porządku i otrzymujemy prawidłową liczbę rekordów. Specjalnie wybrałem taką sytuację żeby pokazać jeszcze jedną pułapkę. Przeanalizujmy tabelę „Pracownicy” i kolumnę „dataKoniecZatrudnienia” która przechowuje daty zakończenia stosunku pracy z pracownikiem. Jeżeli przy pracowniku w tej kolumnie znajduje się jakaś data, czyli dany pracownik już nie pracuje w banku, po co nam on w wynikach naszego zapytania. Na poniższym rysunku możecie zobaczyć dwóch pracowników z których jeden już nie pracuje w banku z uwagi na to, że w kolumnie „dataKoniecZatrudnienia” jest wprowadzona wartość w jego rekordzie.

kurs sql sql course Czyli widzimy, że Pan Julian Zdziwiony nie pracuje już w banku od dnia 21 maja 1990 r. Idąc dalej w naszych rozważaniach, czyli żeby uzyskać listę aktualnie pracujących osób w banku musimy szukać pustych wartości (wartości NULL) w kolumnie „dataKoniecZatrudnienia”. Do naszej klauzuli WHERE musimy dopisać jeszcze jeden warunek filtrowania.

WHERE
      SZEF.nazwisko = 'Banko'
      AND P.dataKoniecZatrudnienia IS NULL

Wyrażenie na końcu „IS NULL” znaczy tyle co „jest pusty”. Czyli szukamy tylko tych rekordów które w kolumnie „dataKoniecZatrudnienia” dla konkretnej osoby nie mają wartości lub inaczej mają wartość NULL. Całe gotowe zapytanie poniżej.

SELECT
        P.imie+' '+P.nazwisko AS [Imię i Nazwisko]
       ,SZEF.imie+' '+SZEF.nazwisko AS [Imię i Nazwisk Przełożonego]
FROM
      Pracownicy AS P JOIN Pracownicy AS SZEF ON P.ID_przelozonego = SZEF.ID_pracownika
WHERE
      SZEF.nazwisko = 'Banko'
      AND P.dataKoniecZatrudnienia IS NULL

Efekt uruchomienia naszego zapytania poniżej.

kurs sql sql course

poprzedni