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
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_ID | UNIT_COST |
---|---|
13 | 783.03 |
13 | 783.03 |
14 | 920.46 |
14 | 892.72 |
14 | 892.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_ID | TIME_ID | PROMO_ID | CHANNEL_ID | UNIT_COST | UNIT_PRICE |
---|---|---|---|---|---|
13 | 10-JAN-98 | 999 | 3 | 783.03 | 1232.16 |
13 | 20-JAN-98 | 999 | 3 | 783.03 | 1232.16 |
14 | 03-FEB-98 | 999 | 2 | 920.46 | 1164.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.
Jeżeli preferujesz naukę prze oglądanie materiałów video zachęcam Cię do sprawdzenia mojego Kursu online SQL w Praktyce!
Kurs dostępny pod linkiem: Kurs SQL
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_ID | TIME_ID | PROMO_ID | CHANNEL_ID | UNIT_COST | UNIT_PRICE |
---|---|---|---|---|---|
14 | 03-FEB-98 | 999 | 2 | 920.46 | 1164.05 |
18 | 03-JAN-98 | 999 | 2 | 1163.97 | 1681.09 |
21 | 07-FEB-98 | 999 | 2 | 813.77 | 1075.95 |
22 | 25-MAR-98 | 999 | 2 | 22.91 | 26.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+2 | 4*8 |
---|---|
4 | 32 |
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_ID | PROFIT |
---|---|
13 | 449.13 |
13 | 449.13 |
14 | 243.59 |
14 | 231.8 |
14 | 267.27 |
15 | 124.77 |
15 | 112.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_NAME | CUST_LAST_NAME | CUST_YEAR_OF_BIRTH |
---|---|---|
Abigail | Ruddy | 1976 |
Abigail | Ruddy | 1964 |
Abigail | Ruddy | 1942 |
Abigail | Ruddy | 1977 |
Abigail | Ruddy | 1949 |
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 Nazwisko | Rok urodzenia |
---|---|
AbigailRuddy | 1976 |
AbigailRuddy | 1964 |
AbigailRuddy | 1942 |
AbigailRuddy | 1977 |
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 Nazwisko | Rok urodzenia |
---|---|
Abigail Ruddy | 1976 |
Abigail Ruddy | 1964 |
Abigail Ruddy | 1942 |
Abigail Ruddy | 1977 |
Abigail Ruddy | 1949 |
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_NAME | PROD_CATEGORY |
---|---|
5MP Telephoto Digital Camera | Photo |
17″ LCD w/built-in HDTV Tuner | Peripherals and Accessories |
Envoy 256MB – 40GB | Hardware |
Y Box | Electronics |
Mini DV Camcorder with 3.5″ Swivel LCD | Photo |
Envoy Ambassador | Hardware |
Laptop carrying case | Software/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