Kurs SQL #02: Pobieranie danych – instrukcja SELECT

Bazy danych pozwalają na wykonywanie na danych w nich zawartych różnorakich operacji. Najczęściej jednak chcemy dane z bazy pobierać, wszak po to je w niej trzymamy 😉 Dlatego też praktycznie każda osoba poznająca język SQL zaczyna od instrukcji SELECT. Jest ona podstawą wymaganą do dalszej nauki, dlatego też od tej właśnie zaczniemy.

Jeżeli nie widziałeś wpisu rozpoczynającego Darmowy Kurs SQL zajrzyj na stronę: Kurs SQL #01: Wprowadzenie i środowisko

10 przydatnych zapytań SQL dla Administratora Baz Danych

Pobieranie danych z pojedynczej tabeli

Odczytywanie konkretnych kolumn

Tak jak już wspominałem SELECT pozwoli nam „wyciągnąć” dane z tabeli. Aby tego dokonać musisz podać tej instrukcji nazwę tabeli i jej kolumny których zawartość chcesz zobaczyć. Wspomniane przed chwilą informacje to minimum które instrukcja SELECT musi otrzymać, aby się wykonać.

select
    prod_id, unit_cost
from sh.costs;
PROD_IDUNIT_COST
13783.03
13783.03
14920.46
14892.72
14892.72

Powyższe zapytanie zawiera po instrukcji SELECT listę kolumn które są Nam potrzebne. Po nich podajemy klauzule FROM i nazwę tabeli z której chcemy pobrać dane. Jej nazwa poprzedzona jest przez nazwę schematu bazodanowego w której się znajduje.

Zauważ że język SQL nie wymaga od Ciebie podania sposobu pobrana danych. Twoim zadaniem jest jedynie „powiedzieć” czego potrzebujesz. Baza danych zajmie się już znalezieniem odpowiedniej metody, aby zadanie wykonać. Zapamiętaj też, że instrukcje SQL zawsze kończymy średnikiem.

Wyniki zapytań będę nieco skracał kiedy nie będą one istotne, dla lepszej czytelności strony 😉

Odczytywanie kompletu kolumn

Załóżmy że tabela ma kilkanaście kolumn. Potrzebujesz zajrzeć do wszystkich z nich. Nie ma potrzeby abyś wypisywał za każdym razem długą listę kolumn. Język SQL pozwala zastosować znak '*’ jako oznaczenie wszystkich dostępnych kolumn.

select
    *
    from sh.costs;
PROD_IDTIME_IDPROMO_IDCHANNEL_IDUNIT_COSTUNIT_PRICE
1310-JAN-989993783.031232.16
1320-JAN-989993783.031232.16
1403-FEB-989992920.461164.05

Tym razem baza zwróciła nam wszystkie kolumny dla tabeli. Możesz to zweryfikować klikając przycisk „Find” w Oracle Live SQL, zaznaczając schemat „Sales History(SH)” i wybierając tabele „COSTS”. W wyświetlonym widoku znajdziesz szczegółowe informacje na temat kolumn tabeli.

kurs sql tabela opis

Wybieranie konkretnych wierszy – klauzula WHERE

Do tej pory skupiliśmy się na wyborze odpowiednich kolumn w naszym zapytaniu. Zwracało ono za każdym razem komplet wierszy znajdujący się w tabeli. Czas nauczyć się wybierać tylko te z nich które są potrzebne. Tutaj pomoże nam klauzula WHERE. Znajduje się ona zawsze po klauzuli FROM i definiuje warunek jaki musi być spełniony, aby dany wiersz był pobrany.

select
    *
from sh.costs
where channel_id=2;    
PROD_IDTIME_IDPROMO_IDCHANNEL_IDUNIT_COSTUNIT_PRICE
1403-FEB-989992920.461164.05
1803-JAN-9899921163.971681.09
2107-FEB-989992813.771075.95
2225-MAR-98999222.9126.34

Wynik zapytania pokazany powyżej standardowo skróciłem, ale wykonując je samodzielnie zobaczysz że wszystkie wiersze wybrane mają wartość „2” w kolumnie CHANNEL_ID. W zapytaniu został użyty operator „=”, pozostałe operatory i metody porównywania wartości omówię w kolejnych częściach kursu.

Działania arytmetyczne w SQL

Bardzo istotną możliwością języka SQL jest wykonywanie działań arytmetycznych bezpośrednio w definicjach kolumn instrukcji SELECT. Na początek jednak spróbujmy użyć SQL jako kalkulatora 😉 Pomoże nam w tym wirtualna tabela dual. Tabela ta jest specyficzną dla baz danych Oracle. Nie zawiera ona żadnych danych, możemy użyć jej kiedy chcemy wyświetlić jakąś wartość, lub coś przeliczyć.

select 
       2+2, 4*8 
from dual;
2+24*8
432

Jak widzisz stworzyłem dwie kolumny w których wykonałem proste obliczenia arytmetyczne. Co istotne dla bardziej zaawansowanych obliczeń obowiązują standardowe zasady kolejności obliczeń. Spróbujmy wykorzystać te wyrażenia na tabelce COSTS.

select 
    prod_id, unit_price - unit_cost "PROFIT"
from sh.costs;
PROD_IDPROFIT
13449.13
13449.13
14243.59
14231.8
14267.27
15124.77
15112.51

Wybrałem z tabeli COSTS kolumnę PROD_ID, dodatkowo utworzyłem kolumnę w której dla każdego z produktów ma znaleźć się wynik odejmowania ceny sprzedaży produktu(UNIT_PRICE) od kosztu jego wyprodukowania(UNIT_COSTS). Zauważyłeś zapewne że nadałem utworzonej kolumnie nazwę „PROFIT”. Jest to tak zwany alias kolumny, w przypadku wykorzystania „” może zawierać on nawet spacje.

Łączenie tekstu – konkatenacja

Umiesz już wykonywać operacje arytmetyczne przy pomocy SQL, zastanawiasz się pewnie co można robić z tekstem. Najczęściej wykorzystywana jest tzw. konkatenacja. Jest to nic innego jak metoda łączenia ciągów znakowych i jeden spójny tekst. Zajrzyjmy sobie tym razem do tabelki CUSTOMERS w schemacie SH.

select 
    cust_first_name, cust_last_name, cust_year_of_birth 
from sh.customers;
CUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
AbigailRuddy1976
AbigailRuddy1964
AbigailRuddy1942
AbigailRuddy1977
AbigailRuddy1949

Załóżmy że chciałbyś połączyć kolumny z imieniem i nazwiskiem w jedną. Możesz wykorzystać do tego celu konkatenacje, czyli „||”. W praktyce wyglądać będzie to w sposób następujący.

select 
    cust_first_name || cust_last_name "Imię i Nazwisko", cust_year_of_birth "Rok urodzenia"
from sh.customers;
Imię i NazwiskoRok urodzenia
AbigailRuddy1976
AbigailRuddy1964
AbigailRuddy1942
AbigailRuddy1977

Jak widać wynik nie jest idealny. Te dwa ciągi znaków zostały po prostu sklejone z sobą. Dobrze by było dodać spacje. Zróbmy to!

select 
    cust_first_name || ' ' || cust_last_name "Imię i Nazwisko", cust_year_of_birth "Rok urodzenia"
from sh.customers;
Imię i NazwiskoRok urodzenia
Abigail Ruddy1976
Abigail Ruddy1964
Abigail Ruddy1942
Abigail Ruddy1977
Abigail Ruddy1949

Jak widzisz dodałem jeszcze jedną konkatenacje i między wartości dwóch kolumn dodałem ciąg znaków zawierający jedynie spacje. Tak przygotowana kolumna wygląda już tak jak powinna 😉 Dodatkowo nadałem kolumnom wynikowym bardziej przyjazne nazwy.

Wiersze unikatowe

Często w tabeli występuje wiele wierszy które dla danej kolumny mają tą samą wartość. Cenną umiejętnością jest wybieranie tylko unikatowych wartości z bazy danych. Aby tego dokonać użyjemy klauzuli DISTINCT. Zobaczmy jak wygląda tabela PRODUCTS.

select prod_name, prod_category from sh.products;
PROD_NAMEPROD_CATEGORY
5MP Telephoto Digital CameraPhoto
17″ LCD w/built-in HDTV TunerPeripherals and Accessories
Envoy 256MB – 40GBHardware
Y BoxElectronics
Mini DV Camcorder with 3.5″ Swivel LCDPhoto
Envoy AmbassadorHardware
Laptop carrying caseSoftware/Other

W tabeli PRODUCTS każdy z wymienionych w niej produktów ma przypisaną kategorie. W sytuacji gdybyśmy chcieli zobaczyć samą listę kategorii zapewne użylibyśmy poniższego zapytania.

select prod_category from sh.products;
PROD_CATEGORY
Electronics
Electronics
Electronics
Electronics
Electronics
Electronics

Jak widzisz pierwsze kilka rekordów z góry wyników zwraca nam wielokrotnie kategorie „Electronics”. Poprawię zatem zapytanie dodając do niego klauzule DISTINCT, wymuszającą wyświetlanie tylko unikalnych wierszy.

select distinct prod_category from sh.products;
PROD_CATEGORY
Electronics
Hardware
Peripherals and Accessories
Photo
Software/Other

Teraz kompletna lista kategorii do których należą produkty zmieściła się w pięciu unikalnych wierszach 🙂


Trzecia część kursu już dostępna! Kurs SQL #03: Operatory SQL w klauzuli WHERE