Podstawy instrukcji SELECT
Wprowadzenie
Instrukcje SQL mogą być wysyłane do bazy danych zarówno wielkimi literami jak i małymi. Nie ma wymagania aby słowa kluczowe (DISTINCT, ORDER, TO_DATE) były pisane wielką literą.
Podstawy instrukcji SELECT
Instrukcja SELECT pozwala na wybranie rekordów z tabeli lub perspektywy.
SELECT zapewnia funkcje takie jak:
- Projekcja (kolumny)
- Selekcja (wiersze)
- Złączenia (możliwość połączenia więcej niż jednej tabeli)
Podstawowa składnia instrukcji SELECT.
SELECT koluna1, kolumna2, ...
FROM tabela
Jednym z podstawowych rozszerzeń instrukcji SELECT jest wykorzystanie "" zamiast listy kolumn, które chcemy wybrać. Wykorzystanie "" oznacza, że wybieramy wszystkie kolumny z tabeli.
SELECT *
FROM tabela
Przykład 1.1
Wyświetl całą zawartość tabeli z regionami geograficznymi (nazwa tabeli: REGIONS).
select *
from regions;
Rezultat:
REGION_ID | REGION_NAME |
---|---|
1 | Europe |
2 | Americas |
3 | Asia |
4 | Middle East and Africa |
Instrukcja SELECT pozwala nam rownież wyspecyfikować kolumny, którymi jesteśmy zainteresowani, służy do tego "lista select", czyli lista nazw kolumn, którą podajemy po słowie kluczowym SELECT.
Przykład 1.2
Alternatywnym rozwiązaniem zadania z Przykładu 1.1 jest specyfikacja wszystkich kolumn z tabeli REGIONS.
select region_id, region_name
from regions;
Rezultat:
REGION_ID | REGION_NAME |
---|---|
1 | Europe |
2 | Americas |
3 | Asia |
4 | Middle East and Africa |
Oczywiście często nie będziemy zinteresowani wszystkimi kolumnami w danej tabeli, wtedy wystarczy wyspecyfikować kolumny, które chcemy pobrać z bazy danych na liście select.
Przykład 1.3
Wybierz nazwy regionów geograficznych (nazwa tabeli: REGIONS, nazwa kolumny REGION_NAME).
select region_name
from regions;
Rezultat:
REGION_NAME |
---|
Europe |
Americas |
Asia |
Middle East and Africa |
Zadanie 1.1
Wybierz identyfikator pracownika (kolumna: EMPLOYEE_ID), identyfikator stanowiska (kolumna: JOB_ID), identyfikator departamentu (kolumna: DEPARTMENT_ID) z tabeli JOB_HISTORY.
Zadanie 1.2
Wyświetl całą zawartość tabeli ze stanowiskami (tabela: JOBS)
DISTINCT
Słowo kluczowe DISTINCT pozwala usunąć duplikaty z rezultatu zwracanego przez instrukcję SELECT.
UWAGA: Wykorzystanie DISTINCT na dużej tabeli może mieć negatywny wpływ na wydajność.
Przykład 1.4
Wybierz listę wszystkich stanowisk (kolumna: JOB_ID) z tabeli JOB_HISTORY eliminując duplikaty.
select distinct job_id
from job_history;
Rezultat:
JOB_ID |
---|
AC_ACCOUNT |
AC_MGR |
AD_ASST |
IT_PROG |
MK_REP |
SA_MAN |
SA_REP |
ST_CLERK |
DISTINCT może również zostać wykorzystana jeżeli na liście select znajduje się więcej niż jedna kolumna, wtedy przy usuwaniu duplikatów rozważana jest wartość we wszystkich kolumnach.
Przykład 1.5
select distinct job_id, department_id
from job_history;
Rezultat:
JOB_ID | DEPARTMENT_ID |
---|---|
IT_PROG | 60 |
AC_ACCOUNT | 90 |
SA_REP | 80 |
MK_REP | 20 |
SA_MAN | 80 |
AD_ASST | 90 |
AC_ACCOUNT | 110 |
AC_MGR | 110 |
ST_CLERK | 50 |
Zadanie 1.3
Wypisz unikalne działy, w których pracują teraz pracownicy, korzystając z tabeli DEPARTMENTS.
Zadanie 1.4
Wyświetl unikalne stanowiska (kolumna: JOB_ID) wraz z wysokością pensji (kolumna SALARY z tabeli EMPLOYEES.
Aliasy
Domyślnie instrukcja SELECT tworzy nagłówki, korzystając z nazw kolumn zdefiniowanych w tabeli.
W bazie danych Oracle istnieje kilka możliwości podania aliasów. Jeżeli alias zawiera biały znak np. spację lub tabulator, należy alias umięścić pomiędzy znakami ". Pierwszą z możliwości podania aliasu jest wyspecyfikowanie go po nazwie kolumny w instrukcji SELECT.
Przykład 1.6
Wyświetl nazwiska pracowników (kolumna last_name) z tabeli EMPLOYEES. Nadaj kolumnie last_name alias Nazwisko.
select last_name Nazwisko
from employees;
Rezultat:
NAZWISKO |
---|
Abel |
Ande |
Atkinson |
Austin |
Baer |
... |
Przykład 1.7
Wyświetl nazwiska pracowników (kolumna last_name) z tabeli EMPLOYEES. Nadaj kolumnie last_name alias Nazwisko Pracownika.
select last_name "Nazwisko Pracownika"
from employees;
Rezultat:
Nazwisko Pracownika |
---|
Abel |
Ande |
Atkinson |
Austin |
Baer |
... |
Należy zwrócić uwagę, że jeżeli alias nie jest umieszczony pomiędzy znakami ", Oracle zwraca cały alias pisany wielkimi literami. Jeżeli alias umieścimy pomiędzy znakami ", Oracle zachowa wielkość znaków jaką określił programista.
Drugim sposobem określenia aliasu jest wyspecyfikowanie go po słowie kluczowym AS.
select kolumna as alias
from tabela;
Przykład 1.8
Wyświetl identyfikator działu (kolumna: department_id) oraz nazwę działu (kolumna: department_name) oraz nadaj im aliasy numer oraz nazwa dzialu.
select department_id as "numer", department_name as "nazwa dzialu"
from departments;
Rezultat:
numer | nazwa dzialu |
---|---|
10 | Administration |
20 | Marketing |
30 | Purchasing |
40 | Human Resources |
50 | Shipping |
60 | IT |
70 | Public Relations |
80 | Sales |
90 | Executive |
100 | Finance |
110 | Accounting |
120 | Treasury |
130 | Corporate Tax |
140 | Control And Credit |
150 | Shareholder Services |
160 | Benefits |
170 | Manufacturing |
180 | Construction |
190 | Contracting |
200 | Operations |
210 | IT Support |
220 | NOC |
230 | IT Helpdesk |
240 | Government Sales |
250 | Retail Sales |
260 | Recruiting |
270 | Payroll |
Zadanie 1.5
Wyświetl wszystkie adresy z tabeli LOCATIONS, nadając poniższym kolumną odpowiednie aliasy. Kolumna STREET_ADDRESS jako Ulica, POSTAL_CODE jako Kod Pocztowy, CITY jako Miasto, COUNTRY_ID jako Panstwo.
Zadanie 1.6
Wyświetl kolumnę REGION_NAME, z tabele REGIONS nadajac jej alias NAZWA.
Tabela DUAL
W bazie Oracle znajduje się tabela DUAL, która zawiera tylko jeden wiersz i pozwala nam konstruować zapytania do obiektów, które nie pochodza z bazy danych. Na przykład do obliczeń numerycznych, lub w celu przetestowania działanie jakiejś funkcji.
Przykład 1.9
Oblicz ile sekund jest w dobie.
select 60 * 60 * 24
from dual;
Rezultat:
60 60 24 |
---|
86400 |
Operatory artmetyczne
Waga | Operator | |
---|---|---|
1 | () | Nawiasy |
2 | / | Dzielenie |
3 | * | Mnożenie |
4 | - | Odejmowanie |
5 | + | Dodawanie |
Zadanie 1.7
Oblicz pole koła o średnicy 4.
Zadanie 1.8
Oblicz wartość funkcji y = 2x - 4 dla x = 8. Nadaj wynikowej kolumnie nazwę wynik.
Zadanie 1.9
Oblicz wartość y, korzystając z równania
$$y = (x^2 + z^3)/2$$ dla x = 3 oraz z = 5. Nadaj wynikowej kolumnie nazwę wynik.
Operatory artmetyczne i daty
W Oracle można wykorzystać operatory + oraz - przy pracy z datami. Jeżeli obydwa argumenty operacji dodawnia lub odejmowania są typu DATE, wynik będzie liczbą dni pomiędzy tymi datami. Jeżeli jednym z operandów jest liczba, jest on traktowany jako liczba dni, a rezultatem bedzie data.
Przykład 1.10
Wyświetl ile dni przepracował pracownik (kolumna: EMPLOYEE_ID) na danym stanowsku (kolumna: JOB_ID) korzystając z tabeli JOB_HISTORY, nadając tej kolumnie alias Przepracowanych dni. Data początku pracy znajduje się w kolumnie START_DATE, a zakończenia w kolumnie END_DATE.
select employee_id, job_id,
(end_date - start_date) + 1 "Przepracowanych dni"
from job_history;
Rezultat:
EMPLOYEE_ID | JOB_ID | Przepracowanych dni |
---|---|---|
102 | IT_PROG | 2019 |
101 | AC_ACCOUNT | 1498 |
101 | AC_MGR | 1235 |
201 | MK_REP | 1402 |
114 | ST_CLERK | 648 |
122 | ST_CLERK | 365 |
200 | AD_ASST | 2101 |
176 | SA_REP | 283 |
176 | SA_MAN | 365 |
200 | AC_ACCOUNT | 1645 |
Zadanie 1.10
Oblicz datę przejścia na emeryturę, zakładając, że trzeba mieć 40 letnią wysługę lat. Jako początek pracy przyjmij kolumnę HIRE_DATE z tabeli EMPLOYEES. Dla uproszczenia przyjmij, że rok ma 365 dni. Wynikowej kolumnie nadaj nazwę Data zakończenia.
Konkatenacja
Konkatenacja jest to operacja łączenia ze sobą ciągów znaków aby stworzyć nowy ciąg znakowy. Operatorem konkatencji w Oracle Database jest ||.
Przykład 1.11
Wyświetl poniższe zdanie dla każdej zany regionu (kolumna: REGION_NAME) zdefiniowanego w tabeli REGIONS: "nazwa regionu" jest na tabeli Ziemia. Nadaj wynikowej kolumnie alias ZDANIE.
select region_name || ' jest na planecie Ziemia.' zdanie
from regions;
Rezultat:
ZDANIE |
---|
Europe jest na planecie Ziemia. |
Americas jest na planecie Ziemia. |
Asia jest na planecie Ziemia. |
Middle East and Africa jest na planecie Ziemia. |
Zadanie 1.11
Wypisz swoje imię i nazwisko korzystając z operatora konkatenacji. Nadaj alias nazwa wynikowej kolumnie.
Zadanie 1.12
Sporządź dwukolumnowy raport z tabeli EMPLOYEES, w pierwszej kolumnie umieść imię i nazwisko pracownika (kolumny: FIRST_NAME oraz LAST_NAME), a w drugiej jego pobory (kolumna: SALARY). Nadaj alias pierwszej kolumnie Pracownik, a drugiej Pensja.
Escape'owanie pojedyńczego cudzysłowania
Oracle traktuje wartości umieszczone pomiędzy znakami pojedyńczego cudzysłowia, jako ciągi znakowe. Interesujące jest co się stanie jeżeli ciąg znaków zawiera w sobie pojedyńczy cudzysłów, obrazuje to poniższy przykład.
Przykład 1.12
Wyświetl tekst John's book korzystając z tabeli dual.
select 'John's book'
from dual;
Rezultat:
ORA-00923: FROM keyword not found where expected
00923. 00000 - "FROM keyword not found where expected"
*Cause:
*Action:
Error at Line: 1 Column: 16
Jak widać został zwrócony błąd, gdyż znak ' nie został poprawnie zescape'owany. Jedna z możliwości escape'owania znaku ' w Oracle jest umieszczenie dwóch znaków ' obok siebie.
Przykład 1.13
Wyświetl tekst John's book korzystając z tabeli dual Nadaj kolumnie wynikowej alias WYNIK.
select 'John''s book' wynik
from dual;
Rezultat:
WYNIK |
---|
John's book |
Operator q
Operator q jest alternatywną metodą escape'owania znaków w bazie danych Oracle. Pozwala on określić dwa znaki, najczęściej są to pary nawiasów np. [], {}, które poinformują silnik baz danych o tym, żeby potraktował wszystko co jest pomiędzy nimi jako ciąg znaków. Pełna składnia operator q przedstawiona jest poniżej:
q'[dowolny diag znaków]'
Przy czym [] jest dowolnym ogranicznikiem tekstu (np. [], {}, ##)
Jako ogranicznik tekstu możemy zastosować dowolny jedno bądź wielobajtowy znak za wyjątkiem spacji, tabulatora oraz znaku końca linii. W przypadku wykorzystania nawiaśow stosuje się nawias otwierający i zamykający, w przypadku innych znaków ograniczających powtarza się ten sam znak na końcu i początku tekstu.
Przykład 1.14
Wyświetl tekst John's book korzystając z tabeli dual Nadaj kolumnie wynikowej alias WYNIK. Wykorzystaj operator q.
select q'[John's book]' wynik
from dual;
Rezultat:
WYNIK |
---|
John's book |
Zadanie 1.13
Wygeneruj nagłówki listów korzystając z tabeli EMPLOYEES, oraz kolumn FIRST_NAME oraz LAST_NAME. Powinna zostać zwrócona jedna kolumna z aliasem Naglowek w formacie: Szanowny Pan'Pani Imię Nazwiski. Wykorzystaj operator q, oraz znak jako ogranicznik tekstu.
Wartość NULL
W bazach danych występuje specjalna wartość określana jako NULL. NULL oznacza brak wartości. W tabeli każda kolumna, za wyjątkiem tych zdefiniowanych jako klucz głowny, może być zdefiniowana jako przyjmująca wartości NULL lub nie. Najłatwiejszym sposobem na sprawdzenie, do której kolumny możemy przypisać wartości NULL, a do których nie jest użycie polecenia describe na danej tabeli.
Przykład 1.14
Sprawdź strukturę tabeli REGIONS.
describe regions
Rezultat:
Name | Null | Type |
---|---|---|
REGION_ID | NOT NULL | NUMBER |
REGION_NAME | VARCHAR2(25) |
Projektując relacyjną bazę danych należy zawsze zwrócić uwagę na specyfikacje, które kolumny określimy jako akceptujące wartość NULL. Rozważmy poniższy przykład.
insert into regions(region_id, region_name) values(99, NULL);
Powyższa instrukcja jest poprawna strukturalnie, ale jej wykonanie nie ma większego sensu logicznego, gdyż wstawimy nowy region do tabeli REGIONS. Niestety nowy region nie ma żadnej nazwy, więc jego wykorzystanie w aplikacji jest bardzo wątpliwe.
Przykład 1.15
Wybierz nazwisko (kolumna: LAST_NAME), pensję (kolumna: SALARY) oraz prowizję (kolumna: COMMISSION_PCT) z tabeli EMPLOYEES.
select last_name, salary, commission_pct
from employees;
Rezultat:
LAST_NAME | SALARY | COMMISSION_PCT |
---|---|---|
Davies | 3100 | |
Matos | 2600 | |
Vargas | 2500 | |
Russell | 14000 | 0.4 |
Partners | 13500 | 0.3 |
Errazuriz | 12000 | 0.3 |
Cambrault | 11000 | 0.3 |
Zlotkey | 10500 | 0.2 |
Tucker | 10000 | 0.3 |
Bernstein | 9500 | 0.25 |
.. | .. | .. |
W tym przypadku kolumna COMMISSION_PCT może przyjmować wartości NULL, i ma to sens, gdyż prowizja może być nieokreślona. Alternatywnym rozwiązaniem jest specyfikacja kolumny COMMISSION_PCT jako NOT NULL, wtedy dla wszystkich pracowników, którzy nie mają określonej prowizji, należałoby wstawić wartość 0 w tej kolumnie.
Z wartością NULL związana jest jeszcze jedna istotna właściwość: artmetyczna kalkulacja z wartością NULL, zwraca zawsze NULL.
Przykład 1.16
Oblicz pobory pracownika, czyli pensję powiększoną o prowizję.
select last_name, salary * commission_pct
from employees;
Rezultat:
LAST_NAME | SALARY*COMMISSION_PCT |
---|---|
King | |
Kochhar | |
De Haan | |
Hunold | |
Rajs | |
Davies | |
Matos | |
Vargas | |
Russell | 5600 |
Partners | 4050 |
Errazuriz | 3600 |
Cambrault | 3300 |
Zlotkey | 2100 |
... | ... |