4_MySQL. Tworzenie zapytania w języku SQL

Zapytania w języku SQL ją esencją zarządzania bazami danych. 

W poprzednim wpisie została przedstawiona idea relacji pomiędzy bazami. Na serwerze natywnych została uruchomiona baza BazaT.  Baza dotyczy spedycji transportowej operującej na terenie Warszawy.

Przytoczyłem przykład złożonego zapytania w języku SQL:

Aby dowiedzieć się jak nazywała się firma, która dokonała konkretnej dostawy należy odwołać się z tabeli trasy do tabeli Samochody po kluczu Id_samochodu. Następnie trzeba z tabeli Samochody po kluczy Id_firmy przejść do tabeli Firmy i dopiero stamtąd odczytać nazwę firmy, która wykonała usługę.

Schemat takiego zapytania przytaczam poniżej:

W tym wpisie zapytanie to zostanie zrealizowane.

 Tworzenie zapytania w języku SQL 

Proszę w oknie poleceń wpisać instrukcję SELECT * FROM Firmy następnie proszę nacisnąć klawisz: Execute.

 Wyrażenie SELECT FROM jest podstawowym związkiem zapytania w języku SQL 

Teraz będę rozbudowywał i jednocześnie zawężał to polecenie. Instrukcja SELECT mówi, co ma zostać wyświetlone. Gwiazdka * oznacza wszystkie kolumny tabeli.  Klauzula FROM mówi skąd mają pochodzić dane. To wyrażenie wyświetla wszystkie dane z tabeli Firmy:

SELECT * FROM Firmy

Zadaniem jest przyporządkować wykonane trasy do nazw firm, do której należały ciężarówki.

Proszę wpisać następującą instrukcję:

SELECT * FROM trasy

Zastała wyświetlona cała tabela trasy. Z pośród wszystkich pól tylko po kolumnie Id_samochodu można dojść do informacji, jakie firmy wykonała kolejne usługi transportowe.

Proszę wyświetlić samą kolumnę Id_samochodu z tabeli trasy:

SELECT Id_samochodu FROM trasy

Program podpowie nazwę kolumny, ponieważ, wie, z której tabeli pobierane są dane.

Teraz zostanie druga tabela bazy: Samochody.

SELECT [Id_samochodu] FROM trasy, Samochody

Została wyświetlona informacja o dwuznaczności kolumny Id_samochodu.  Część odmian języków SQL interpretuje taką sytuację, jako błąd. Mimo, że kolumna Id_samochodu występuje zarówno w tabeli Trasy jak i w tabeli Samochody (obie kolumny są identyczne), SQL nie wie, którą kolumnę ma wyświetlić.

Proszę zadeklarować, że ma zostać wyświetlona kolumna Id_samochodu z tabeli trasy.

SELECT trasy.Id_samochodu FROM trasy, Samochody

Teraz dołączamy kolumnę z tabeli samochody, uwaga na przecinek między nazwami kolumn.

SELECT trasy.Id_samochodu, Id_firmy FROM trasy, Samochody

Zapytanie wyświetliło 198198 rekordów. Jest to przykład iloczynu kartezjańskiego. Z zapytania nie wynikało, że tabele są ze sobą połączone kluczem Id_samochodu. Wynik to wszystkie pozycje tabeli trasy (1573 wiersze) ze wszystkimi pozycjami tabeli Samochody (126 wierszy). Iloczyn kartezjański obu tabel wynosi 198198. Jest to błąd zapytania, należy wskazać, że kolumna Id_samochodu jest kolumną wspólną, że jest kluczem łączącym.

SELECT trasy.Id_samochodu, Id_firmy FROM trasy, Samochody

WHERE trasy.Id_samochodu = Samochody.Id_samochodu

Klauzula WHERE wskazała, że obie kolumny są identyczne. Zostało wyświetlonych 1573 wiersze. Obie tabele zostały połączone.

Niestety w tabeli nie ma informacji o trasach, jakie obsługiwały samochody.

Proszę dopisać do raportu kolumny z tabeli trasy: Id_trasy, km,data_wyjazdu, Wynagrodzenie, Trasy oraz kolumny z tabeli Samochody: Num_rejestr, Marka.

SELECT trasy.Id_samochodu,

Id_trasy,

km,

data_wyjazdu,

Wynagrodzenie,

Trasy,

Num_rejestr,

Marka

Id_firmy FROM trasy, Samochody

WHERE trasy.Id_samochodu = Samochody.Id_samochodu

Zadanie nie jest jeszcze ukończone, ponieważ w poleceniu wskazane było, aby raport zawierał Nazwę firmy a nie jej Id. Konieczne jest włączenie do zapytania trzeciej tabeli o nazwie firmy. Tabelę do klauzuli WHERE dołącza się operatorem logicznym AND.

SELECT trasy.Id_samochodu,

Id_trasy,

km,

data_wyjazdu,

Wynagrodzenie,

Trasy,

Num_rejestr,

Marka,

Nazwa_firmy

Id_firmy FROM trasy, Samochody, Firmy

WHERE trasy.Id_samochodu = Samochody.Id_samochodu AND Firmy.Id_firmy = Samochody.Id_firmy

 

Zapytania w języku SQL wyświetliło raport złożony z trzech tabel połączonych wspólnymi, kluczami relacyjnymi.

W następnym wpisie zostaną przedstawione sposoby porządkowania raportów SQL.