Bazy danych

Witryna zawiera podstawowe informacje odnośnie funkcji w bazach danych takich jak MySQL i Oracle oraz podstawowe informacje dotyczące zapytań.

czwartek, 26 kwietnia 2012

INSERT

INSERT - polecenie to służy do dodawania rekordów do tabeli.

Postać instrukcji INSERT jest następująca:

INSERT INTO tabela
VALUES (wartosc1, wartosc2, wartosc3,...)

lub

INSERT INTO tabela (nazwa_kolumny_1, nazwa_kolumny_2, nazwa_kolumny_3,...)
VALUES (wartosc1, wartosc2, wartosc3,...)



UWAGA!
Jeżeli chcemy wprowadzić wartość pustą (null) musimy użyć operacji INSERT określając nazwy kolumy (kolumn).
W poleceniu

INSERT INTO tabela VALUES(wartosci....);
musimy podać wszystkie wartości. W przeciwnym wypadku otrzymamy błąd. (przykład 2, przykład 3)



Przykład 1.

Wyświetlamy zawartość tabeli DEPT, następnie dodajemy rekord pierwszym sposobem.
W dalszej kolejności ponownie wyświetlamy zawartość tabeli, aby sprawdzić efekt działania polecenia INSERT.
Czynność tą powtarzamy dodając rekord drugim sposobem (uwzględniając nazwy kolumn w  poleceniu INSERT).


SELECT * FROM DEPT;

DEPTNO                 DNAME                     LOC                      
---------------------- ------------------------- -------------------------
10                     ACCOUNTING                NEW YORK                 
20                     RESEARCH                  DALLAS                   
30                     SALES                     CHICAGO                  
40                     OPERATIONS                DENVER                   

4 rows selected



INSERT INTO DEPT VALUES('50', 'NOWY WPIS 1', 'LOKALIZACJA 1');
1 rows inserted



SELECT * FROM DEPT;
DEPTNO                 DNAME                     LOC                      
---------------------- ------------------------- -------------------------
10                     ACCOUNTING                NEW YORK                 
20                     RESEARCH                  DALLAS                   
30                     SALES                     CHICAGO                  
40                     OPERATIONS                DENVER                   
50                     NOWY WPIS 1               LOKALIZACJA 1            

5 rows selected




INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES('60', 'NOWY WPIS 2', 'LOKALIZACJA 2');
1 rows inserted




SELECT * FROM DEPT;

DEPTNO                 DNAME                     LOC                      
---------------------- ------------------------- -------------------------
10                     ACCOUNTING                NEW YORK                 
20                     RESEARCH                  DALLAS                   
30                     SALES                     CHICAGO                  
40                     OPERATIONS                DENVER                   
50                     NOWY WPIS 1               LOKALIZACJA 1            
60                     NOWY WPIS 2               LOKALIZACJA 2            

6 rows selected



Przykład 2.


INSERT INTO DEPT (DEPTNO)  VALUES('90');

DEPTNO                 DNAME                     LOC                      
---------------------- ------------------------- -------------------------
10                     ACCOUNTING                NEW YORK                 
20                     RESEARCH                  DALLAS                   
30                     SALES                     CHICAGO                  
40                     OPERATIONS                DENVER                           
90                     (null)                    (null)                               

7 rows selected



Przykład 3.

INSERT INTO DEPT VALUES('100');

Error starting at line 1 in command:
INSERT INTO DEPT  VALUES('100')
Error at Command Line:1 Column:12
Error report:
SQL Error: ORA-00947: not enough values
00947. 00000 -  "not enough values"
*Cause:   
*Action:

Otrzymujemy błąd - not enough values!!!


Błąd jest spowodowany tym, iż struktura tabeli DEPT zawiera 3 kolumny (DEPTNO, DNAME, LOC), a w naszym INSERT została określona tylko jedna wartość.

AND i OR

AND i OR - operatory używane do wyświetlania danych, w zależności od wartości logicznych operatorów.

AND
Wyświetla dane, jeżeli warunki zawarte w AND są poprawne (zwracają true).

OR
Wyświetla dane, jeżeli przynajmniej jeden z warunków zawarty w OR jest poprawny (zwraca true).


Postać instrukcji zawierającej AND i OR może wyglądać następująca:

SELECT kolumna FROM TABELA WHERE kolumna1='wartosc' AND kolumna2='wartosc';

SELECT kolumna FROM TABELA WHERE kolumna1='wartosc' OR kolumna2='wartosc';

Można łączyć warunki w jeden większy warunek:

SELECT kolumna FROM TABELA WHERE (kolumna1='wartosc' AND kolumna2='wartosc') OR kolumna3='wartosc';




Wartości logiczne AND:

PRAWDA AND PRAWDA = PRAWDA (TRUE)
PRAWDA AND FAŁSZ = FAŁSZ (FALSE)
FAŁSZ AND PRAWDA = FAŁSZ (FALSE)
FAŁSZ AND FAŁSZ = FAŁSZ (FALSE)


Wartości logiczne OR:

PRAWDA OR PRAWDA = PRAWDA (TRUE)
PRAWDA OR FAŁSZ = PRAWDA (TRUE)
FAŁSZ OR PRAWDA = PRAWDA (TRUE)
FAŁSZ OR FAŁSZ = FAŁSZ (FALSE)


Najlepiej zobrazują to praktyczne przykłady.


Przykład 1.
Wyświetlamy imię oraz stanowisko osoby, której zarobki wynoszą 5000 ORAZ (!!!) stanowiskiem, które obejmuje dana osoba jest PRESIDENT.

SELECT ENAME, JOB FROM EMP WHERE SAL='5000' AND JOB='PRESIDENT';

ENAME           JOB            
--------------- ---------------
KING            PRESIDENT      

1 rows selected

Zapytanie zwróciło rekord, gdyż istnieje osoba, której zarobki wynoszą 5000 (SAL='5000' - zwróciło TRUE) oraz stanowiskiem jest PRESIDENT (JOB='PRESIDENT' - zwróciło TRUE).



Spróbujmy teraz wykonać następujące polecenie:

SELECT ENAME, JOB FROM EMP WHERE SAL='4000' AND JOB='PRESIDENT';

ENAME           JOB            
--------------- ---------------

0 rows selected

Zapytanie nie zwróciło rekordów, gdyż warunki zawarte pomiędzy AND nie zwróciły wartości TRUE (brak jest osób, które zarabiają 4000 - zwróciło FALSE). Mimo tego, iż istnieje osoba na stanowisku PRESIDENT wartość logiczna TRUE AND FALSE zwraca FALSE.




Przykład 2.

Wyświetlamy imię oraz stanowisko osoby, której zarobki wynoszą 3000 LUB (!!!) stanowiskiem, które obejmuje dana osoba jest SALESMAN.

SELECT SAL, JOB FROM EMP WHERE SAL='3000' OR JOB='SALESMAN';

SAL                    JOB            
---------------------- ---------------
2400                   SALESMAN       
1875                   SALESMAN       
1875                   SALESMAN       
3000                   ANALYST        
3000                   ANALYST        

5 rows selected


Pierwsze trzy rekordy zostają wyświetlone dla warunku JOB='SALESMAN' (zauważmy, że zarobki są inne niż 3000), zaś ostatnie dwa rekordy zawierają inną nazwę stanowiska, jednakże zarobki wynoszą 3000.



Przykład 3.


Wyświetlamy zarobki oraz nazwę stanowiska na podstawie dwóch warunków:
- zarobki równe 5000 ORAZ nazwa stanowiska - PRESIDENT,
- zarobki mniejsze niż 1000.

SELECT SAL, JOB FROM EMP WHERE (SAL='5000' AND JOB='PRESIDENT') OR SAL < 1000;

SAL                    JOB            
---------------------- ---------------
800                    CLERK          
5000                   PRESIDENT      
950                    CLERK          

3 rows selected

WHERE

WHERE - klauzula używana do wybierania rekordów, które pasują do zadanych przez nas kryteriów.

W poleceniu tym możemy wybierać rekordy na różne sposoby określając konkretne warunki, które muszą spełniać nasze dane.

Składnia instrukcji WHERE jest następująca:

SELECT kolumna FROM tabela WHERE kolumna operator wartość.


Możliwe operatory to:
=      równe (Przykład 1)
<> (lub) !=     różne (Przykład 2)
>     większe niż  (Przykład 3)
<     mniejsze niż (Przykład 4)
>=     większe lub równe niż (Przykład 5)
<=     mniejsze lub równe niż (Przykład 6)
BETWEEN     pomiędzy (Przykład 7)
LIKE     jest "podobne" do (Przykład 8)
IN     równe jednej lub kilku wartości (Przykład 9)
NOT IN  różne od jednej lub kilku wartości (Przykład 10)



Uwaga!

Operator <> lub != może być obsługiwany w zależności od wersji SQL.

W klauzuli BEETWEEN będziemy określali zakres dolny (podawany jako pierwszy) oraz górny (podawany jako drugi).


W przykładach zwróćmy uwagę na pojedyncze cudzysłowy ('').


Zachęcham do dokładnego przeczytania przykładów, gdyż są one opatrzone dodatkowymi uwagami.




Przykład 1.

Wyświetlamy nazwę zawodu osoby, której numer identyfikacyjny (EMPNO) jest równy 7788.

SELECT JOB FROM EMP WHERE EMPNO = '7788';

JOB           
---------------
ANALYST       

1 rows selected




Przykład 2.

wyświetlamy nazwę (nazwy) zawodu (zawodów) różną od SALESMAN.

SELECT JOB FROM EMP WHERE JOB <> 'SALESMAN';

lub

SELECT JOB FROM EMP WHERE JOB != 'SALESMAN';

JOB           
---------------
CLERK         
MANAGER       
MANAGER       
MANAGER       
ANALYST       
PRESIDENT     
CLERK         
CLERK         
ANALYST       
CLERK         

10 rows selected




Przykład 3.

Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają więcej niż 2500.

SELECT ENAME, SAL FROM EMP WHERE SAL > 2500;

lub

SELECT ENAME, SAL FROM EMP WHERE SAL > '2500';


ENAME           SAL                  
--------------- ----------------------
JONES           2975                 
BLAKE           2850                 
SCOTT           3000                 
KING            5000                 
FORD            3000                 

5 rows selected




Przykład 4.

Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają mniej niż 1000.

SELECT ENAME, SAL FROM EMP WHERE SAL < 1000;

lub

SELECT ENAME, SAL FROM EMP WHERE SAL < '1000';

ENAME           SAL                  
--------------- ----------------------
SMITH           800                  
JAMES           950                  

2 rows selected




Przykład 5.

Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają kwotę równą bądź większą niż 3000.

SELECT ENAME, SAL FROM EMP WHERE SAL >= 3000;

lub

SELECT ENAME, SAL FROM EMP WHERE SAL >= '3000';

ENAME           SAL                  
--------------- ----------------------
SCOTT           3000                 
KING            5000                 
FORD            3000                 

3 rows selected




Przykład 6.

Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają kwotę równą bądź mniejszą niż 1100.

SELECT ENAME, SAL FROM EMP WHERE SAL <= 1100;

lub

SELECT ENAME, SAL FROM EMP WHERE SAL <= '1100';

ENAME           SAL                  
--------------- ----------------------
SMITH           800                  
ADAMS           1100                 
JAMES           950                  

3 rows selected





Przykład 7.

Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają kwotę z przedziału 2500-6000.


SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 2500 and 6000;

lub

SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN '2500' and '6000';

ENAME           SAL                  
--------------- ----------------------
JONES           2975                 
BLAKE           2850                 
SCOTT           3000                 
KING            5000                 
FORD            3000                 

5 rows selected


UWAGA!

Polecenie
SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 6000 and 2500;
wyświetli 0 rekordów, gdyż zakres górny i dolny został niepoprawnie sformułowany.


KLAUZULA BETWEEN w naszym przykładzie zastępuje polecenie,

SELECT ENAME, SAL FROM EMP WHERE SAL > 2500 AND SAL < 6000;

które wyświetli taki sam wynik jak

SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 2500 and 6000;




Przykład 8.

Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają kwotę 2400.

SELECT ENAME, SAL FROM EMP WHERE SAL LIKE '2400';

ENAME           SAL                  
--------------- ----------------------
ALLEN           2400                 

1 rows selected



Klauzula LIKE ma jednak szersze zastosowanie. Używając znaku % możemy zastępować dowolny ciąg znaków.
Polecenie
SELECT ENAME, SAL FROM EMP WHERE SAL LIKE '24%';

wyświetli nam rekordy, gdzie zarobki będą równe 24, 240, 2400, 2411, 2432, 2423123, 24131231 itp.


ENAME           SAL                  
--------------- ----------------------
ALLEN           2400                 
CLARK           2450                 

2 rows selected


Znaku % można używać zarówno na początku jak i na końcu naszego warunku.

SELECT ENAME, SAL FROM EMP WHERE SAL LIKE '0';

ENAME           SAL                  
--------------- ----------------------
SCOTT           3000                 
KING            5000                 
FORD            3000                 

3 rows selected



Przykład 9.
Wyświetlamy imię oraz wynagrodzenie pracowników, którzy zarabiają kwotę 2400.

SELECT ENAME, SAL FROM EMP WHERE SAL IN '2400';

ENAME           SAL                  
--------------- ----------------------
ALLEN           2400                 

1 rows selected



W klauzuli IN możemy jednak wprowadzić więcej warunków, według których przeszukujemy nasze dane. W tym celu w nawiasie wprowadzamy warunki (po przecinku).

SELECT ENAME, SAL FROM EMP WHERE SAL IN ('2400', '2450', '5000');

ENAME           SAL                  
--------------- ----------------------
ALLEN           2400                 
CLARK           2450                 
KING            5000                 

3 rows selected

UWAGA!
W klauzuli IN musimy dokładnie określić dane, według których przeszukujemy nasze tabele, gdyż znak % nie jest obsługiwany w tego typu zapytaniach i użyty zwróci błąd.



SELECT ENAME, SAL FROM EMP WHERE SAL IN ('%', '2400');

Oto błąd:
Error starting at line 1 in command:
SELECT ENAME, SAL FROM EMP WHERE SAL IN ('%', '2400')
Error report:
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:  
*Action:



Przykład 10.
Wyświetlamy imię oraz nazwy zawodów pracowników, których stanowisko jest inne niż SALESMAN.


SELECT ENAME, JOB FROM EMP WHERE JOB NOT IN ('SALESMAN');

ENAME           JOB           
--------------- ---------------
SMITH           CLERK         
JONES           MANAGER       
BLAKE           MANAGER       
CLARK           MANAGER       
SCOTT           ANALYST       
KING            PRESIDENT     
ADAMS           CLERK         
JAMES           CLERK         
FORD            ANALYST       
MILLER          CLERK         

10 rows selected

środa, 4 kwietnia 2012

ORACLE - SOUNDEX()

SOUNDEX()


SOUNDEX(string)




Opis algorytmu SOUNDEX:
Soundex używany jest do porównywania słów w języku angielskim. Słowa podobnie brzmiące (np. Robert i Rupert) będą miały ten sam 4-znakowy kod Soundex (w tym przypadku R163). Jest wykorzystywany m.in. przy poszukiwaniach genealogicznych różnych wariantów tego samego nazwiska, a obliczenie kodu Soundex umożliwiają niektóre programy genealogiczne.

Dokładny opis algorytmu:

1. Pierwsza litera wyrazu staje się pierwszym znakiem kodu.
2. Spośród pozostałych liter usuwane są a, e, h, i, o, u, w i y.
3. Pozostałym literom przypisuje się następujące liczby:
1. b, f, p, v
2. c, g, j, k, q, s, x, z
3. d, t,
4. l
5. m, n
6. r
4. Spośród kolejnych wystąpień tego samego kodu w kolejnych literach wyrazu po usunięciu h lub w usuwane są wszystkie poza pierwszym.
5. Jeżeli pozostaje więcej, niż trzy cyfry to następne są usuwane. Jeżeli jest ich mniej niż trzy, to dodawane są zera.
6. Kodem Soundex wyrazu jest jego pierwsza litera i trzy uzyskane powyżej cyfry.

(wikipedia.pl)


Przykład 1:
SELECT SOUNDEX('SMITH') FROM DUAL;

SOUNDEX('SMITH')
----------------
S530


Przykład 2:
SELECT SOUNDEX('SMYTH') FROM DUAL;

SOUNDEX('SMYTH')
----------------
S530


Zgodnie z działaniem algorytmu KOD SOUNDEX jest taki sam.


Działanie algorytmu krok po kroku:
1. Pierwsza litera - pierwszy znak kodu (S).
2. Usuwamy litery z kroku drugiego - SMT
3. Przypisujemy dla M - 5, dla T - 3.
4. Cyfr jest mniej niż 3 - dodawane jest 0.
5. Ostateczny kod to S530.

ORACLE - RTRIM()

RTRIM()


RTRIM(string, znaki)

Funkcja RTRIM usuwa wszystkie "znaki" ze "string" zaczynając od PRAWEJ strony.

UWAGA!!!
Funkcja usuwa znaki do czasu wystąpienia innego znaku w "string", niż te zdefiniowane w "znaki". (PATRZ PRZYKŁADY!!!)

Jeżeli parametr "znaki" zostanie pominięty standardowo usuwane będą spacje.


Przykład 1:
Drugi parametr nie został okreslony, dlatego z tekstu 'Jakis tekst ' zostały usunięte wszystkie spacje z pewej strony.

SELECT rtrim('Jakis tekst ') FROM DUAL;

RTRIM('JAKISTEKST')
-------------------
Jakis tekst

Nasz tekst włącznie ze spacjami ma długość 16 znaków.
Po użyciu funkcji rtrim (usuwamy wszystkie spacje z prawej) nasz tekst ma długość 11 znaków.

SELECT LENGTH(rtrim('Jakis tekst ')) FROM DUAL;

LENGTH(RTRIM('JAKISTEKST'))
---------------------------
11


Przykład 2:
Funkcja usunie wszystkie znaki 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 z prawej strony stringu, do czasu wystąpienia innego znaku niż te zdefioniowane w drugim parametrze.
Funkcja napotyka na literę "A", która nie jest przez nas zdefiniowana, zatem usuwanie znaków jest przerywane. (patrz również przykład nastepny.

SELECT rtrim('123AAAAA123', '1234567890') FROM DUAL;

RTRIM('123AAAAA123','1234567890')
---------------------------------
123AAAAA


Przykład 3:

SELECT rtrim('123BAAAA123', '1234567890A') FROM DUAL;

RTRIM('123BAAAA123','1234567890A')
----------------------------------
123B

ORACLE - RPAD()

RPAD()


RPAD(string, dlugosc, string1)

Funkcja stosowana głównie do formatowania wyświetlanych wyników.


string - string do przetworzenia,

dlugosc - liczba znaków, które zwracamy. Jeżeli "dlugosc" jest mniejsza, niż długość "string", to "string" będzie obcięty do liczby znaków "dlugosc".

string1 - string którym zastąpimy znaki z prawej strony, w przypadku, gdy nasz string jest krótszy niż "dlugosc". Parametr ten jest opcjonalny. Jeżeli nie zostanie podany, zostaną wstawione spacje.

Działanie funkcji najlepiej zobrazują poniższe przykłady:


Przykład 1:
Wyświetlamy tylko dwa pierwsze znaki z tekstu, stąd wynikiem będzie "12".

SELECT rpad('1234', 2,'0') FROM DUAL;

RPAD('1234',2,'0')
------------------
12


Przykład 2:
Tekst "1234" zajmuje tylko 4 pola. Chcemy wyświetlić ten tekst w 5 polach, zatem jedno pole z lewej strony zostanie puste. W naszym przypadku puste pole zastępujemy znakiem "x", więc otrzymanym wynikiem jest "x1234".

SELECT rpad ( '1234', 5, 'x') FROM DUAL;

RPAD('1234',5,'X')
------------------
1234x

ORACLE - REPLACE()

REPLACE()


REPLACE(string, szukany_string, string_zamiana)

Funkcja zamienia w stringu "string" dany ciąg znaków (pojedynczy znak) na inny.

string - string, w którym poszukujemy ciągu "szukany_string",
szukany_string - string, pod kątem przeszukujemy "string", aby dokonać zamiany,
string_zamiana - string, na który zamieniamy wszystkie wystąpienia "szukany_string".\


UWAGA!!!
Funkcja rozróżnia duże i małe litery.


Przykład 1:
SELECT REPLACE('Zamieniamy wszystkie litery a na 1','a','1') FROM DUAL;

REPLACE('ZAMIENIAMYWSZYSTKIELITERYANA1','A','1')
------------------------------------------------
Z1mieni1my wszystkie litery 1 n1 1

ORACLE - NLS_SORT

NLS_SORT

nlsparam może przyjąć formę (parametr ten jest opcjonalny):
NLS_SORT = sort

gdzie sort określa formę sortowania w zależności od wartości podanej jako "sort".

Dostępne formy sortowania możemy wyświetlić za pomocą:

SELECT * FROM v$nls_valid_values;


Zmianę NLS_SORT wykonujemy poleceniem:

ALTER SESSION SET NLS_SORT=sortowanie;



Na przykład dla różnych wartości NLS_SORT znaki zostaną posortowane w różny sposób:

nls_sort=binary
E
Z
e
é
e


nls_sort=binary_ci
e
é
e
E
Z


nls_sort=binary_ai
é
e
e
E
Z

ORACLE - NLS_LOWER()

NLS_LOWER()

NLS_LOWER(string, nlsparam)

Funkcja zwraca string pisany małymi literami.


Przykład 1:
SELECT NLS_LOWER('TeKSt') FROM DUAL;

NLS_LOWER('TEKST')
------------------
tekst


Przykład 2:
SELECT NLS_LOWER('abc') FROM DUAL;

NLS_LOWER('ABC')
----------------
abc

ORACLE - NLS_INITCAP()

NLS_INITCAP()


NLS_INITCAP(string, nlsparam)

Funkcja NLS_INITCAP() zwraca string, w którym pierwszy znak jest pisany wielką literą, kolejne małymi literami.

(nlsparam - patrz NLSSORT)


Przykład 1:
SELECT NLS_INITCAP ('Tekst') FROM DUAL;

NLS_INITCAP('TEKST')
--------------------
Tekst

ORACLE - LTRIM()

LTRIM()


LTRIM(string, znaki)

Funkcja LTRIM usuwa wszystkie "znaki" ze "string" zaczynając od lewej strony.

UWAGA!!!
Funkcja usuwa znaki do czasu wystąpienia innego znaku w "string", niż te zdefiniowane w "znaki". (PATRZ PRZYKŁADY!!!)

Jeżeli parametr "znaki" zostanie pominięty standardowo usuwane będą spacje.


Przykład 1:
Drugi parametr nie został okreslony, dlatego z tekstu ' Jakis tekst' zostały usunięte wszystkie spacje z lewej strony.

SELECT ltrim(' Jakis tekst') FROM DUAL;

LTRIM('JAKISTEKST')
-------------------
Jakis tekst


Przykład 2:
Funkcja usunie wszystkie znaki 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 z lewej strony stringu, do czasu wystąpienia innego znaku niż te zdefioniowane w drugim parametrze.
Funkcja napotyka na literę "T", która nie jest przez nas zdefiniowana, zatem usuwanie znaków jest przerywane. (patrz również przykład nastepny.

SELECT ltrim('123Tekst', '1234567890') FROM DUAL;

LTRIM('123TEKST','1234567890')
------------------------------
Tekst


Przykład 3:

SELECT ltrim('123Tekst', '1234567890T') FROM DUAL;

LTRIM('123TEKST','1234567890T')
-------------------------------
ekst