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:

oracle create table

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

SELECT * FROM TABELA;

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

  1. Przedstawić dane dane klienta tak aby w nagłówku pokazały się “Imię” i “Nazwisko”
  2. Wyświetlić wszystkie dane z tabeli ZAMOWIENIA
  3. 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;
  • Jeżeli chcesz znaleźć więcej kursów dla średniozaawansowanych oraz poznać zasady optymalizacji zapytań zapoznaj się z pozostałymi kursami, sprawdź: Kurs Oracle SQL
  • Jeżeli chcesz poznać podstawy baz danych i kurs dla początkujących w SQL odwiedź Kurs SQL

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *