W SQL polecenie SELECT FROM jest jednym z najważniejszych ponieważ pozwala podejrzeć dane zgromadzone w bazie danych. Polecenie SELECT FROM służy do pobrania i pokazania danyh z takich obiektów jak tabele, widoki czy widoki zmaterializowane. W poniższym kursie dotyczącym SELECT:
- Przygotuję bazę
- Opiszę podstawową składnię SELECT FROM w tym
- Pokażę jak wybrać kolumny i tabele
- Pokażę jak manipulować nagłówkami kolumn
- Przedstawię * w składni
- Pokażę czym są i jak wykorzystać aliasy tabel
- Poznasz operację SQL DISTINCT
- Podsumuję cały kurs
- Przedstawię ćwiczenie + jego rozwiązanie
Ten kurs jest częścią cyklu Kurs SQL
Zapisz się na autorskie Szkolenie SQL
Przygotowanie bazy danych
We wszystkich kursach korzystam z tej samej bazy danych którą w trakcie kursów sukcesywnie rozszerzam. Schemat testowej bazy danych został opracowany w kursie dotyczącym normalizacji baz danych i wygląda jak poniżej:
Aby utworzyć powyższy schemat bazy danych należy wykonać skrypt z ćwiczenia z kursu SQL DROP | CREATE TABLE (Dodawanie i usuwanie tabel):
CREATE TABLE CENNIK (
ROZMIAR VARCHAR2(3 CHAR)
, CENA NUMBER
, CONSTRAINT CENNIK_PK PRIMARY KEY (ROZMIAR)
);
CREATE TABLE MENU (
ID NUMBER GENERATED ALWAYS AS IDENTITY
, NAZWA VARCHAR2(20 CHAR)
, ROZMIAR VARCHAR2(3 CHAR)
, CONSTRAINT MENU_PK PRIMARY KEY (ID)
, CONSTRAINT MENU_CENNIK_FK FOREIGN KEY (ROZMIAR) REFERENCES CENNIK(ROZMIAR)
);
CREATE TABLE KLIENT (
ID NUMBER GENERATED ALWAYS AS IDENTITY
, IMIE VARCHAR2(20 CHAR)
, NAZWISKO VARCHAR2(20 CHAR)
, CONSTRAINT KLIENT_PK PRIMARY KEY (ID)
);
CREATE TABLE ADRES (
ID_ADRESU NUMBER GENERATED ALWAYS AS IDENTITY
, ULICA VARCHAR2(20 CHAR)
, NR_BLOKU VARCHAR2(10 CHAR)
, NR_MIESZKANIA VARCHAR2(10 CHAR)
, MIASTO VARCHAR2(20 CHAR)
, CONSTRAINT ADRES_PK PRIMARY KEY (ID_ADRESU)
);
CREATE TABLE ZAMOWIENIA (
ID_PIZZA NUMBER
, ID_KLIENTA NUMBER
, ID_ADRESU NUMBER
, DATA_ZAMOWIENIA DATE
, CONSTRAINT ZAM_PIZZA_FK FOREIGN KEY (ID_PIZZA) REFERENCES MENU(ID)
, CONSTRAINT ZAM_KLIENT_FK FOREIGN KEY (ID_KLIENTA) REFERENCES KLIENT(ID)
, CONSTRAINT ZAM_ADRES_FK FOREIGN KEY (ID_ADRESU) REFERENCES ADRES(ID_ADRESU)
);
Natomiast do wypełnienia danych posłuży skrypt z ćwiczenia z kursu SQL INSERT | DELTE | UPDATE (Modyfikacja danych tabel):
INSERT INTO CENNIK (ROZMIAR, CENA) VALUES ('L', 15);
INSERT INTO CENNIK (ROZMIAR, CENA) VALUES ('XL', 20);
INSERT INTO CENNIK (ROZMIAR, CENA) VALUES ('XXL', 25);
INSERT INTO MENU (NAZWA, ROZMIAR) VALUES ('Margherita', 'XXL');
INSERT INTO MENU (NAZWA, ROZMIAR) VALUES ('Margherita', 'L');
INSERT INTO MENU (NAZWA, ROZMIAR) VALUES ('Pepperonia', 'L');
INSERT INTO MENU (NAZWA, ROZMIAR) VALUES ('Hawajska', 'L');
INSERT INTO MENU (NAZWA, ROZMIAR) VALUES ('Margherita', 'XL');
INSERT INTO MENU (NAZWA, ROZMIAR) VALUES ('Wiejska', 'XXL');
INSERT INTO KLIENT (IMIE, NAZWISKO) VALUES ('Jan', 'Kowalski');
INSERT INTO KLIENT (IMIE, NAZWISKO) VALUES ('Piotr', 'Nowak');
INSERT INTO KLIENT (IMIE, NAZWISKO) VALUES ('Anna', 'Zaradna');
INSERT INTO KLIENT (IMIE, NAZWISKO) VALUES ('Kamila', 'Zaradna');
INSERT INTO ADRES (ULICA, NR_BLOKU, NR_MIESZKANIA, MIASTO) VALUES ('Hery', 5, null, 'Warszawa');
INSERT INTO ADRES (ULICA, NR_BLOKU, MIASTO) VALUES ('Domaniewska', 2, 'Poznań');
INSERT INTO ADRES (ULICA, MIASTO) VALUES ('JP2', 'Warszawa');
INSERT INTO ADRES (ULICA, MIASTO) VALUES ('JP2', 'Wrocław');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, ID_ADRESU, DATA_ZAMOWIENIA) VALUES (1, 1, 1, '2019-01-01');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, ID_ADRESU, DATA_ZAMOWIENIA) VALUES (2, 2, 2, '2019-01-02');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, ID_ADRESU, DATA_ZAMOWIENIA) VALUES (3, 2, 2, '2019-01-02');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, DATA_ZAMOWIENIA) VALUES (4, 3, '2019-01-03');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, DATA_ZAMOWIENIA) VALUES (5, 3, '2019-01-03');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, DATA_ZAMOWIENIA) VALUES (6, 3, '2019-01-03');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, ID_ADRESU, DATA_ZAMOWIENIA) VALUES (2, 3, 3, '2019-01-05');
INSERT INTO ZAMOWIENIA (ID_PIZZA, ID_KLIENTA, ID_ADRESU, DATA_ZAMOWIENIA) VALUES (3, 4, 4, '2019-01-06');
COMMIT;
Skoro mamy przygotowaną bazę danych wraz z danymi możemy przejść do poznania polecenia select.
Składnia SELECT FROM
Znając już strukturę bazy danych i przechowywanych w niej danych należy podać bazie oracle które kolumny z której tabeli chcemy zobaczyć. Dlatego też podstawowa struktura zapytania SELECT FROM możemy pokazać następująco:
SELECT kolumna_1 , kolumna_2 ... , kolumna_n FROM nazwa_tabeli;
Struktura polecenia rozpoczyna się od słowa kluczowego SELECT następnie podajemy to co chcemy wyświetlić (w najprostszej wersji są to kolumn), następnie występuje słowo kluczowe FROM i za nim źródło danych (w tym przypadku tabela).
Przykładowe zapytanie pokazujące klientów może wyglądać jak poniżej:
SELECT
ID
, IMIE
, NAZWISKO
FROM
KLIENT;
Oraz wynik powyższego zapytania:
Jak widzimy, baza danych zwróciła nam dane z kolumn id, imie i nazwisko z tabeli klient.
Zobaczmy inny przykład, gdzie pokażemy z tabeli adres tylko kolumny ulica i miasto. Przykładowe zapytanie SELECT może wyglądać jak poniżej:
SELECT
ULICA
, MIASTO
FROM
ADRES;
oraz wynik zapytania:
Jak widać po wyniku zapytania baza danych pokazała wszystkie ulice i miasta znajdujące się w tabeli adres. Istnieje możliwość graniczenia wyników jednak temat ten poruszę w kolejnym kursie.
Manipulacja nagłówkami kolumn czyli alias kolumny
W powyższych przykładach zobaczyć można, że baza danych zwraca wybrane kolumny oraz ich nazwy takie jak zostały zadeklarowane w tabeli. W poleceniu SELECT istnieje możliwość zmiany nagłówka, w tym celu składnia musi zostać nieco rozszerzona o klauzulę AS na zgodną z poniższą:
SELECT kolumna_1 AS "nagłówek kolumny 1" , kolumna_2 AS "nagłówek kolumny 2" ... , kolumna_n AS "nagłówek kolumny n" FROM nazwa_tabeli;
Napiszmy więc zapytanie z tabeli MIASTO w której zmienimy nagłówki i zamiast NR_BLOKU pokażemy “Numer bloku” a zamiast MIASTO pokażemy napis “Miasto”. Zapytanie takie może wyglądać następująco:
SELECT
MIASTO as "Miasto"
, NR_BLOKU as "Numer bloku"
FROM
ADRES;
oraz wynik zapytania:
W powyższym przykładzie widzimy zmianę nazwy nagłówków zgodnie z podaną w zapytaniu po klauzuli AS.
Tu mała uwaga: przy używaniu polecenia SELECT do zmiany nazwy nagłówka tak naprawdę nie trzeba używać słowa kluczowego AS. Zamiast niego wystarczy dodać spację a baza danych sama doda “AS”. Z tego względu powyższe zapytanie może wyglądać również jak poniżej:
Jestem jednak zdania, że warto dodawać AS aby pokazać w kodzie intencjonalnie, że modyfikujemy nazwę nagłówka. Działanie takie znacznie zwiększa czytelność kodu, szczególnie gdy piszemy długie i skomplikowane zapytania.
Użycie SELECT * FROM
Przy wykorzystaniu w SQL polecenia SELECT * FROM istnieje możliwość aby pominąć wypisywania wszystkich kolumn. Zamiast wypisywać wszystkie kolumny po kolei można użyć skrótowej * “gwiazdki” która zastąpi wszystkie dostępne kolumny. Aby więc pobrać dane z wszystkich kolumn tabeli KLIENT używając * można napisać zapytanie:
SELECT
*
FROM
KLIENT;
Oraz wynik zapytania
Jak widzimy powyższe dane są identyczne z tymi z pierwszego przykładu gdzie wypisaliśmy wszystkie kolumny z tabeli klient.
Przy wykorzystaniu SELECT * FROM nie ma możliwości manipulacji nazwami kolumn.
Aliasy tabeli
Alias tabeli służy do zmiany nazwy wykorzystywanej tabeli w zapytaniu. Zobaczmy jak wygląda składania rozszerzona o alias tabeli:
SELECT alias_tabeli.kolumna_1 AS "nagłówek kolumny 1" , alias_tabeli.kolumna_2 AS "nagłówek kolumny 2" ... , alias_tabeli.kolumna_n AS "nagłówek kolumny n" FROM nazwa_tabeli alias_tabeli;
Oraz przykładowe zapytanie z wykorzystaniem aliasu tabeli:
SELECT
ADR.MIASTO AS "Miasto"
, ADR.NR_BLOKU AS "Numer bloku"
FROM
ADRES ADR;
Oraz wynik powyższego zapytania:
Jak widzimy, w sekcji SELECT możemy dokładnie określić z której tabeli pobierana ma być kolumna.
W tym kursie dotyczącym SELECT FROM pokazuję jak pobrać dane z jednej tabeli. Generalnie w SQL gdy używamy SELECT w części źródła danych FROM może występować bardzo skomplikowana struktura tabel, widoków czy podzapytań. Zdarza się nieraz, że korzystamy z tej samej tabeli kilka razy w różnych kontekstach. Wtedy szczególnie przydają się aliasy ponieważ pozwalają jasno określić z której tabeli w danym momencie należy pobierać dane. Inne bardzo częste wykorzystanie aliasów tabel to łączenie JOIN między tabelami. O wszystkich wykorzystaniach aliasów tabel przekonasz się w kolejnych kursach SQL.
SQL SELECT DISTINCT FROM
Wykorzystując SELECT mamy możliwość odfiltrowania powtarzających się danych. Do tego celu służy polecenie DISTINCT. Polecenie to zapewnia nas, że w wyniku pokażą się tylko unikalne dane. Zobaczmy więc jak wygląda rozszerzona składnia SELECT o DISTINCT:
SELECT DISTINCT alias_tabeli.kolumna_1 AS "nagłówek kolumny 1" , alias_tabeli.kolumna_2 AS "nagłówek kolumny 2" ... , alias_tabeli.kolumna_n AS "nagłówek kolumny n" FROM nazwa_tabeli alias_tabeli;
Zobaczmy więc przy pomocy DISTINCT z jakich miast są nasi klienci używając poniższego zapytania:
SELECT DISTINCT
MIASTO
FROM
ADRES;
oraz wynik:
Jak widzimy w powyższym wyniku pokazały się tylko 3 rekordy pomimo, że w tabeli ADRES występują 4 rekordy. Dzieje się tak ponieważ użyliśmy klauzuli DISTINCT która to pokazuje tylko unikalne wartości a wartość “Warszawa” wstępuje w tabeli dwa razy.
Zobaczmy co się, więc stanie gdy dodamy jeszcze jedną kolumnę do zapytania:
Jak widzimy, powyższe zapytanie zwróciło już 4 rekordy. Stało się tak, ponieważ DISTINCT dotyczy całego wyniku a nie jednej kolumny. Tak więc w powyższym przykładzie baza danych sprawdza unikalność pary kolumn MIASTO ULICA. Dodając kolejne kolumny unikalność będzie się zmieniać.
Podsumowanie
Polecenie SELECT FOM jest jednym z najczęściej wykonywanych poleceń na bazie danych. Zdecydowana większość kolejnych kursów opierać się będzie właśnie o tą klauzulę i ją rozszerzać. Powyższy kurs jest jedynie wstępem do funkcjonalności jakie daje wykorzystanie SELECT.
W dzisiejszym kursie dowiedziałeś się, że:
- Polecenie SQL SELECT FROM służy do pobierania danych z bazy danych
- Po SELECT podajemy kolumny
- Po FROM podajemy źródło danych, w naszym przypadku tabele
- Alias na kolumnie pozwala zmienić nagłówek, a stosuje się go używając polecenie AS
- Alias tabeli nie wymaga AS i pozwala określić dokładnie tabelę
- * zastępuje wszystkie kolumny np. SELECT * FROM TABELA
- Polecenie SQL DISTINCT służy do zwracania unikalnych zestawów danych
Ćwiczenia
- Przedstawić dane dane klienta tak aby w nagłówku pokazały się “Imię” i “Nazwisko”
- Wyświetlić wszystkie dane z tabeli ZAMOWIENIA
- Pokazać jakie rozmiary pizzy oferuje pizzeria
Odpowiedzi:
- Przedstawić dane dane klienta tak aby w nagłówku pokazały się “Imię” i “Nazwisko”
SELECT
IMIE AS "Imię"
, NAZWISKO AS "Nazwisko"
FROM
KLIENT;
- Wyświetlić wszystkie dane z tabeli ZAMOWIENIA
SELECT
*
FROM
ZAMOWIENIA;
- Pokazać jakie rozmiary pizzy oferuje pizzeria
SELECT DISTINCT
ROZMIAR
FROM
MENU;