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.