Oracle - podstawy


Odrobina wiedzy ogólnej

Poniżej zamieszczam odrobinę wiedzy ogólnej z baz danych. Za punkt wyjściowy obiorę bazy danych Oracla, choć wiedza zawarta w tym artykuje jest bardziej ogólna.


Baza danych - co to takiego?

Bazą danych możemy nazwać uporządkowany zbiór danych. Jest to chyba najprostrze możliwe wytłumaczenie. Dostęp do takich danych na komputerze odbywa się z kolei przez system zarządzania bazą danych (ang. database management system, DBMS). Dokładniej rzecz biorąc DBMS jest oprogramowaniem komputerowym, które umożliwia nam interakcje pomiędzy użytkownikiem, innymi apikacjami i danymi w bazie danych.
Bazy danych dzielą się na rózne rodzaje. Nie będę zanudzał Was opisywaniem każdego rodzaju z osobna. To co napewno musisz wiedzieć na ten temat to to, że wśród tych wszystkich rodzajów baz danych mamy relacyjne bazy danych (SQL) i nierelacyjne bazy danych (NoSQL). W bazach relacyjnym mamy doczynienia z relacjami (powiązaniami) pomiędzy strukturami bazy danych (tabelami). W bazach NoSQL nacisk jest kładziony specyficzne zastosowania, np. na szybkość odczytu i zapisu dancyh. Mamy tutaj doczynienia z prostymi strukturami, np. klucz - wartość.


SQL

W relacyjnych bazach danych głównym sposobem operacji na danych jest język zapytań SQL (ang. Structured Query Language). Jak nazwa wskazuje jest to język operujący na zapytaniach. W jego skład wchodzą:
- DML - język manipulowania danymi (Data Manipulation Language) - SELECT, INSERT, UPDATE, DELETE, MERGE
- DDL - język definicji danych (Data Definition Language) - CREATE, ALTER, DROP, RENAME, TRUNCATE, COMMENT
- DCL - język kontroli danych (Data Control Language) - GRANT, REVOKE
Idąc w drugą stronę, poza składowymi SQL'a można także wyróżnić jego rozszerzenia takie jak np. PL/SQL, PL/pgSQL. Jest ich oczywiście o wiele więcej. Są to proceduralne języki programowania umożliwiające m.in. stosowanie zaawansowanych struktur sterujących.


Typy danych

Skoro wspomniałem o proceduralnych językach programowania w bazach danych, to tak samo jak w przypadku innych języków programowania warto wspomnieć o typach danych. Poniżej kilka z wielu typów występujących w Oracle.
- VARCHAR2(size) - dane znakowe o zmiennej długości "size" (musi być określony maksymalny rozmiar nie przekraczający 4000 znaków, rozmiar minimalny to 1 znak.
- CHAR[(size)] - dane znakowe o ustalonej długości "size" (rozmiar maksymalny nie może przekraczać 2000 znaków, rozmiar minimalny i domyślny to 1 znak.
- NUMBER[(p,s)] - liczba o precyzji "p" i skali "s" (zakres precyzji wynosi od 1 do 38, zakres skali od -84 do 127).
- DATE - wartość daty i godziny z dokładnością do sekundy, miedzy 1 stycznia 4712 r p.n.e. a 31 grudnia 9999 r n.e.
- CLOB, BLOB - duże obiekty znakowe i binarne (do 4 GB).
- BFILE - dane binarne przechowywane w pliku zewnętrznym.
W Oracle mamy brak typu BOOL. Możemy zastąpić go char'em, np:

CREATE TABLE "table_name" ("column_name" CHAR CHECK ("column_name" IN ('N','Y'));
ALTER TABLE "table_name" modify "column_name" CHECK ("column_name" IN ('N', 'Y'));


Więzy integralności

Więzy integralność to system reguł(warunków) gwarantujących, że relacje między wierszami w tabelach pokrewnych są prawidłowe, a użytkownik nie może przypadkowo usunąć lub zmienić danych pokrewnych. Więzy integralności wymuszają spójność danych w tabelach.
NOT NULL - określa, że kolumna nie może zawierać wartości NULL.
UNIQUE - określa kolumnę, której wartości muszą być unikatowe dla wszystkich wierszy w tabeli.
PRIMARY KEY - klucz główny danej tabeli wymusza na wierszach unikatowość (tak jak ma to miejsce w przypadku UNIQUE).
FOREIGN KEY - klucz obcy, ustanawia i wymusza związek klucza obcego miedzy dana kolumną, a kolumną tabeli, do której następuje odwołanie.
CHECK - określa warunek, który musi być prawdziwy.


Funkcje wbodowane

Funkcją możemy nazwac jakiś podprogram, który uruchamiamy z parametrami wejściowymi, a po zakończeniu działania funkcji dostajemy wynik. W bazach danych jak i w ogólnopojętym programowaniu mamy do czynienia z funkcjami wbudowanymi i funkcjami napisanymi przez nas. Poniżej kilka częsciej używanych funkcji wbudowanych.
Funkcje operujące wielkością liter:
LOWER(string) - konwertuje litery na małe litery.
UPPER(string) - konwertuje litery na wielkie litery.
INITCAP(string) - konwersja liter, pierwsza na dużą, pozostałe na małe.
FUNKCJE OPERUJĄCE ZNAKAMI:
CONCAT(string1, string2) - inaczej "||", łączy dwa stringi w jeden ciąg. Można łaczyć różne typy danych: CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB.
SUBSTR(n, m [, length]) - zwraca określonych n znaków z wart. znakowej począwszy od pozycji m. Opcjonalnie można podać liczbę znaków do zwrócenia. Domyślnie funkcja SUBSTR zwraca cały string.
LENGHT(string) - zwraca długość stringa (ilość znaków).
LPAD(string , length [, pad-string]) - uzupełnia wartość danym stringiem z lewej.

LPAD('Page 1',15,'*.')
Result: '*.*.*.*.*Page 1'

RPAD(string , length [, pad-string]) - uzupełnia wartość danym stringiem z lewej.

RPAD('tech', 8, '0')
Result: 'tech0000'

FUNKCJE LICZBOWE:
ROUND(date|number [, decimal_places]) - zaokrąglenie danel liczby/daty.

ROUND(125.315)
Result: 125

TRUNC(date|number [, format]) - ucięcie końcówki liczbowej/daty.

TRUNC(TO_DATE('22-AUG-03'), 'YEAR') 
Result: '01-JAN-03'
SELECT TRUNC(15.79,1) "Truncate" FROM DUAL;

  Truncate
----------
      15.7

FUNKCJE GRUPUJĄCE:
AVG(col|expr) - średnia.
COUNT(*|DISTINCT col) - liczba wierszy wraz z NULL, DISTINCT - liczba różnych wartości col.
MAX(col|expr) - maksymalna wartość w "col|expr".
MIN(col|expr) - minimalna wartość w "col|expr".
SUM(col|expr) - suma wartości w "col|expr".


FUNKCJE OPERUJĄCE NA DATACH:
SYSDATE - zwraca bieżącą datę i czas.
MONTHS_BETWEEN(date1, date2) - liczba miesięcy między dwiema datami
ADD_MONTHS(date, n) - dodanie "n" miesięcy do daty.
NEXT_DAY(date, char) - nastęny dzień tygodnia po dacie, char może przyjmować wartości liczbowe określające dzień tygodnia.

SELECT NEXT_DAY('02-FEB-2001','TUESDAY') "NEXT DAY"
     FROM DUAL;

NEXT DAY
-----------
06-FEB-2001

LAST_DAY(date) - ostatni dzień miesiąca.

SELECT SYSDATE,
   LAST_DAY(SYSDATE) "Last",
   LAST_DAY(SYSDATE) - SYSDATE "Days Left"
   FROM DUAL;
 
SYSDATE   Last       Days Left
--------- --------- ----------
30-MAY-01 31-MAY-01          1

FUNKCJE KONWERTUJĄCE:
TO_CHAR(number|date [, fmt] [, nlsparams]) - konwertuje liczbe/date na napis.
TO_NUMBER(string [, fmt] [, nlsparams]) - konwertuje napis zawierający cyfry na liczbę.
TO_DATE(string [, fmt] [, nlsparams]) - konwertuje napis reprezentujący datę na wartość daty.
NVL(number|date|char, expr2) - konwersja wartośći NULL na rzeczywistą wartość takie samego typu.
NVL2(expr1, expr2, expr3) - jeżeli expr1 nie jest NULL, funkcja zwraca expr2. W przeciwnym wypadku zwraca expr3.
NULLIF(expr1, expr2) - porównuje dwa wyrażenia i zwraca NULL, jeżeli są równe. W przeciwnym wypadku zwraca expr1.
COALESCE(expr1, expr2,..., exprn) - zwraca pierwsze wyrażenie z listy, które nie jest NULL.