SQL - język relacyjnych i
obiektowo-relacyjnych baz
danych
Podstawy
Wykład 2
Historia baz danych i
języka baz danych SQL
• 1961– Integrated Data Store IDS (Charles
Bachman)
–
pierwszy
SZBD,
początek
sieciowego modelu danych.
• 1965-70 – Information Management System
IMS (IBM) – hierarchiczny model danych.
• 1970 – Edgar Codd – relacyjny model danych.
• 1971 – CODASYL, sieciowy model danych.
• 1976 – Peter Chen – model związków encji
(ERD, ERM).
Historia baz danych i
języka baz danych SQL
• Początek lat siedemdziesiątych
–
w laboratorium
badawczym IBM w San Jose powstał prototyp języka
SQL o nazwie Sequel.
• 1973
–
pierwszy system zarządzania relacyjną
bazą danych (System R w firmie IBM).
• 1979
–
firma Relational Software (później Oracle)
wprowadziła na rynek pierwszą komercyjną wersję
systemu zarządzania relacyjną bazą danych.
• 1987 pierwszy standard języka SQL (ISO),
• Kolejne wersje standardu: 1989, 1992 SQL2, 1999
SQL’1999 – model obiektowo-relacyjny, trwają
prace nad następnymi standardami SQL3 i SQL4.
Historia baz danych i
języka baz danych SQL
•
Lata osiemdziesiąte – badania nad dedukcyjnymi i
obiektowymi bazami danych.
• 1997 – Standard obiektowych baz danych ODMG
2.0.
• 1999 – Nieoficjalna wersja nowego standardu
języka obiektowo-relacyjnych baz danych (SQL’1999)
• Lata dziewięćdziesiąte – rozszerzenie baz danych o
nowe aspekty: architektury wielowarstwowe,
rozproszenie, równoległość, Internet, hurtownie
danych, OLAP, multimedia, GIS (Geographical
Information Systems), ERP (Enterprise Resource
Planning), MRP (Management Resource Planning).
Programowanie w modelach
sieciowym i hierarchicznym
• Modele sieciowy i hierarchiczny opierały się
na pojęciu pliku jako zbioru rekordów przy
czym rekordy były rozszerzone o pola
wskaźnikowe kierujące do rekordów w innych
plikach.
• Nie było potrzeby wprowadzania nowego
języka programowania – wystarczał Cobol i/lub
PL/I.
Programowanie w modelu
relacyjnym - język SQL
• Specjalny język dostępu i manipulowania
danymi w bazie danych – operujący na obiektach
modelu relacyjnego – relacjach czyli tabelach.
• Potrzeba określenia sposobu użycia instrukcji
tego języka w programach konwencjonalnych
języków programowania jak C, C++, Java, Visual
Basic – również objęte Standardem SQL.
• Powszechne użycie narzędzi generowania
aplikacji klienckich jak Oracle Forms, Visual
Basic, MS Access.
SQL: typy napisowe,
Standard
Stałe są zapisywane w pojedynczych apostrofach np.:
'Jan III', 'Kowalski'
• CHARACTER(N), CHAR(N) – napis znakowy stałej
długości N.
• NATIONAL CHARACTER(N), NATIONAL CHAR(N)
–
napis znakowy stałej długości N zapisany w
alfabecie narodowym.
• CHARACTER VARYING(N), VARCHAR(N)
–
napis
znakowy zmiennej długości.
• NATIONAL CHARACTER VARYING(N), NATIONAL
CHAR VARYING(N), NCHAR VARYING(N)
–
napis
znakowy zmiennej długości zapisany w alfabecie.
• BIT(N)
–
ciąg bitów długości N. Ciągi bitów są
głównie używane do reprezentowania danych
graficznych i dźwiękowych.
• BIT VARYING(N)
–
ciąg bitów zmiennej długości.
SQL: typy napisowe,
Oracle
Stałe są zapisywane w pojedynczych apostrofach np.:
'Jan III', 'Kowalski'
• CHAR(N) – napis znakowy stałej długości N
(w Oracle).
• NCHAR(N) – napis znakowy stałej długości N
zapisany w alfabecie narodowym.
• VARCHAR(N) i zalecane (a od 9i jedyne)
VARCHAR2(N) – napis znakowy zmiennej
długości.
• NVARCHAR2(N) – napis znakowy zmiennej
długości zapisany w alfabecie narodowym.
• RAW(n) i LONG RAW – ciąg bitów zmiennej
długości.
Typy numeryczne i typy
dat,
Standard
• NUMERIC, DECIMAL, NUMERIC(P,S) – typ
dziesiętny.
• FLOAT, REAL – typ zmiennopozycyjny.
• INTEGER – typ całkowity.
• DATE – data.
• TIME – godzina.
• TIMESTAMP – data i godzina.
Typy numeryczne,
Oracle
• NUMBER(N), NUMBER(P,S) – typy
numeryczne.
• FLOAT = NUMBER(P,S).
• INTEGER = NUMBER(38).
Typy dat,
Oracle
• DATE – data.
od 9i
•
TIMESTAMP – data i godzina.
• INTERVAL DAY TO SECOND – dzień,
godzina, minuta i sekunda.
• INTERVAL YEAR TO MONTH – rok i miesiąc.
• TIMESTAMP WITH TIME ZONE – data i
godzina z uwzględnieniem strefy czasowej.
• TIMESTAMP WITH LOCAL TIME – to samo
co poprzednio z przeliczeniem strefy na
lokalną dla klienta.
SQL’1999
• Lob – duże obiekty albo binarne albo tekstowe.
• Blob - duże obiekty binarne – podtyp typu Lob.
• Clob – duże obiekty tekstowe – podtyp typu
Lob.
• Boolean – wartości logiczne true, false i
unknown.
Oracle
• Long - dokumenty tekstowe (tylko jedna
kolumna tego typu w tabeli).
• Blob – duże obiekty binarne.
• Bfile - duże obiekty binarne zapisywane w
plikach.
• Clob – duże obiekty tekstowe.
• NClob – duże obiekty tekstowe zapisane w
alfabecie narodowym.
• Rowid - identyfikatory (adresy) wierszy
tabel.
Oracle i SQL’1999
Oprócz typów standardowych (wbudowanych)
istnieje
możliwość
definiowania
przez
użytkowników
własnych
typów
danych
związanych z opcją obiektową.
Przykładowy schemat z
Oracle
Związek Emp.Sal z
wartościami w tabeli
Salgrade:
Zarobki Emp.Sal są
zaliczane do grupy
Salgrade.Grade takiej,
że:
Emp.Sal należy do
przedziału:
[Salgrade.Losal,
Salgrade.Hisal]
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ------- --------- ---- --------- ----- ---- ------
7839 KING PRESIDENT 17-NOV-81 5000 10
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7369 SMITH CLERK 7902 17-DEC-80 800 20
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
Tabela EMP
Tabele DEPT i SALGRADE
DEPT
DEPTNO DNAME LOC
------ ----------- --------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SALGRADE
GRADE LOSAL HISAL
----- ----- -----
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
DDL – Data Definition
Language
Tworzenie tabeli
CREATE TABLE nazwa_tabeli(
nazwa_kolumny
typ_danych
więzy_spójności,...);
Tworzenie tabeli Dept i
Salgrade
CREATE TABLE Dept(
Deptno NUMBER(2) PRIMARY KEY,
Dname VARCHAR2(14),
Loc VARCHAR2(13)
);
CREATE TABLE Salgrade(
Grade NUMBER(2) PRIMARY KEY,
Losal NUMBER(7,2) NOT NULL,
Hisal NUMBER(7,2) NOT NULL,
CONSTRAINT chk_salgrade_1 CHECK (Losal
< Hisal)
);
Tworzenie tabeli Emp
CREATE TABLE Emp(
Empno NUMBER(4) PRIMARY KEY,
Ename VARCHAR2(10),
Job VARCHAR2(9),
Mgr NUMBER(4) REFERENCES Emp,
Hiredate DATE,
Sal NUMBER(7,2),
Comm NUMBER(7,2),
Deptno NUMBER(2) NOT NULL REFERENCES
Dept,
CONSTRAINT chk_Emp_1 CHECK (Comm < Sal)
);
Więzy spójności
• NOT NULL – pseudo-wartość Null nie jest
dozwolona w danej kolumnie,
• PRIMARY KEY – kolumna stanowi klucz główny,
• REFERENCES nazwa_tabeli – kolumna stanowi klucz
obcy odwołujący się do klucza głównego podanej
tabeli,
• UNIQUE – kolumna stanowi klucz jednoznaczny
(wartości w kolumnie nie powtarzają się),
• CHECK – warunek jaki ma być spełniony dla
wartości w wierszu.
Opcjonalne słowo kluczowe CONSTRAINT wprowadza
explicite nazwę dla więzów spójności.
SQL*Plus – interfejs do
bazy danych Oracle
describe
tabela - wyświetl schemat tabeli
SQL>
describe dept
Name Null? Type
------------------ -------------- ---------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
Przedrostek
SQL>
sygnalizuje linię poleceń w
programie SQL*Plus.
Wyświetlenie zawartości
tabeli Dept
SELECT * FROM Dept;
DEPTNO DNAME LOC
------------
--------------------
----------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
DDL – Data Definition
Language
Usuwanie tabeli
DROP TABLE
nazwa_tabeli;
Przy istniejących więzach spójności referencyjnej:
DROP TABLE
nazwa_tabeli
CASCADE
CONSTRAINTS;
(samo
CASCADE
w Standardzie)
Usuwanie tabeli - przykłady
• DROP TABLE Emp;
Gdy inne tabele mają klucze obce odwołujące
się do danej tabeli, jej usunięcie się nie
powiedzie np.
• DROP TABLE Dept;
gdy w tabeli Emp jest klucz obcy Deptno
odwołujący się do klucza głównego tabeli Dept
trzeba użyć:
• DROP TABLE Dept CASCADE CONSTRAINTS;
DDL – Data Definition
Language
Zmiana schematu tabeli
• W Standardzie
ALTER TABLE Emp ADD COLUMN Pesel CHAR(11);
Podobnie
MODIFY COLUMN, DROP COLUMN
.
• W Oracle
ALTER TABLE Emp ADD (Pesel CHAR(11));
ALTER
TABLE
Emp
MODIFY
(Pesel
VARCHAR2(11));
ALTER TABLE Emp DROP (Pesel);
Dodawanie nowych więzów
spójności
• W Standardzie
ALTER TABLE Emp
ADD CONSTRAINT Emp_Sal_comm
CHECK (Sal + Comm <=10000);
• W Oracle (nawiasy są opjonalne)
ALTER TABLE Emp
ADD (CONSTRAINT Emp_Sal_comm
CHECK (Sal + Comm <=10000));
Definiowanie kluczy
obcych
•
Jeśli klucz obcy w tabeli A odwołuje się do klucza
głównego w tabeli B, a klucz obcy w tabeli B
odwołuje się do klucza głównego w tabeli A, to
mamy do czynienia z cyklicznymi powiązaniami
REFERENCES.
• Wykonujemy instrukcje CREATE TABLE nie
definiując kluczy obcych.
• Za pomocą instrukcji ALTER TABLE wprowadzamy
więzy REFERENCES odwołujące się do istniejących
już tabel.
ALTER TABLE Emp
ADD CONSTRAINT fk_Emp_dept
FOREIGN KEY (Deptno) REFERENCES Dept;
Indeksy
• Indeksy stanowią podstawową strukturę
danych w bazach danych umożliwiającą:
– sprawdzanie warunku jednoznaczności
klucza (głównego, jednoznacznego);
– szybkie wyszukiwanie informacji w
tabelach.
Nie ma ich w Standardzie SQL2!
Zakładanie indeksów
(Oracle)
CREATE [UNIQUE] INDEX nazwa_indeksu
ON nazwa_tabeli(kolumna [ASC|DESC] ,...);
•
UNIQUE
–
wartości
pozycji
indeksu
jednoznacznie muszą określać wiersz tabeli;
indeks
taki
nazywa
się
indeksem
jednoznacznym; opcja ta umożliwia realizację
więzów spójności UNIQUE;
• ASC (domyślne) i DESC – w jakiej kolejności
utrzymywać pozycje indeksu: rosnącej czy
malejącej. Może to przyśpieszyć wypisywanie
wierszy tabeli w wymaganym porządku.
Przykłady
• CREATE UNIQUE INDEX Ind_Emp_Num
ON Emp(Empno);
tworzy indeks jednoznaczny na kolumnie Empno tabeli
Emp.
– System będzie zapewniać, że wartości w kolumnie
Empno nie będą się powtarzały.
• CREATE INDEX Ind_Emp_Naz
ON Emp(Ename DESC);
tworzy zwykły indeks na kolumnie Ename tabeli Emp.
– Wartości w kolumnie Ename mogą się powtarzać.
– Pozycje indeksu są trzymane w odwrotnym
porządku leksykograficznym (DESC).
Usuwanie Indeksów
Indeks można usunąć z bazy danych za pomocą
następującej instrukcji:
DROP INDEX
nazwa_indeksu;
System zarządzania bazą danych zwykle sam
zakłada indeksy dla kluczy głównych i
jednoznacznych.
DML - Data Modification
Language
Wstawianie danych
INSERT INTO
nazwa_tabeli
VALUES
(wartość,...);
Przykład:
INSERT INTO
Emp
VALUES
(9901, 'Kowalski', 'SALESMAN', 9345, '23-JAN-
90',300,100,12);
DML - Data Modification
Language
Wstawianie danych
Można też dokonywać wstawienia ograniczając się
do kolumn o podanych nazwach - do nie
wymienionych system sam wstawia pseudo-wartości
Null:
INSERT INTO
nazwa_tabeli(nazwa_kolumny,...)
VALUES
(wartość,...);
Przykład:
INSERT INTO
Emp
(Empno, Ename, Deptno)
VALUES (9901, 'Kowalski', 10);
DML - Data Modification
Language
Modyfikowanie danych
UPDATE
nazwa_tabeli
SET
nazwa_kolumny = wyrażenie,...
[
WHERE
warunek];
Przykład:
np. aby zwiększyć wszystkim sprzedawcom (Job =
'SALESMAN') Sal o 10%:
UPDATE
Emp
SET Sal = Sal*1.1
WHERE Job = 'SALESMAN';
DML - Data Modification
Language
Usuwanie danych
DELETE FROM
nazwa_tabeli
[
WHERE
warunek];
Przykład:
np. aby usunąć wszystkich pracowników, którzy nie
mają określonego stanowiska (Job IS NULL):
DELETE FROM
Emp
WHERE Job IS NULL;
DCL - Data Control
Language
Zatwierdzanie i wycofywanie zmian
w bazie danych
Instrukcje INSERT, DELETE i UPDATE nie dokonują
same trwałych zmian w bazie danych. Aby zmiany
wprowadzone przez nie utrwalić:
COMMIT [WORK];
Można też zrezygnować z wprowadzenia zmian do
bazy danych, wycofując je za pomocą instrukcji:
ROLLBACK [WORK];
Zapytania
wybierające
• Instrukcja SELECT określa:
– z jakich tabel w bazie danych mają być
sprowadzone dane,
– jakie warunki mają spełniać dane i
– w jakiej postaci mają się pojawić przed
użytkownikiem (aplikacją użytkownika).
• Instrukcja SELECT składa się z kilku części
nazywanych klauzulami.
SELECT [DISTINCT]
nazwa_kolumny,...
FROM nazwa_tabeli
[WHERE warunek];
Przykład - klauzule
SELECT i FROM
Aby wypisać nazwiska,
zarobki i stanowiska
pracowników firmy piszemy:
SELECT Ename,
Sal, Job
FROM Emp;
Aby wypisać całą tabelę
piszemy:
SELECT *
FROM Emp;
lub
TABLE Emp;
(Standard,
Oracle nie
)
ENAME SAL JOB
---------- ---------- ---------
SMITH 800 CLERK
ALLEN 1600 SALESMAN
WARD 1250 SALESMAN
JONES 2975 MANAGER
MARTIN 1250 SALESMAN
BLAKE 2850 MANAGER
CLARK 2450 MANAGER
SCOTT 3000 ANALYST
KING 5000 PRESIDENT
TURNER 1500 SALESMAN
ADAMS 1100 CLERK
JAMES 950 CLERK
FORD 3000 ANALYST
MILLER 1300 CLERK
Przykład - klauzula
WHERE
Wypisz dane o nazwiskach, zarobkach i
stanowiskach tych pracowników firmy, którzy
pracują w dziale o numerze 10.
ENAME SAL JOB
---------- ---------- ---------
CLARK 2450 MANAGER
KING 5000 PRESIDENT
MILLER 1300 CLERK
SELECT Ename, Sal,
Job
FROM Emp
WHERE Deptno= 10;
Przykład - klauzula
WHERE
Przy SELECT wypisywane są tylko te wiersze, dla
których warunek WHERE przyjmuje wartość True
(ani False ani Null).
SELECT Ename, Sal, Comm
FROM Emp
WHERE Sal <= Comm;
ENAME SAL COMM
---------- ---------- ----------
MARTIN 1250 1400
Operatory logiczne
• Warunek WHERE może też być koniunkcją (AND),
alternatywą (OR) bądź negacją (NOT) innych warunków
logicznych.
• Priorytety: NOT, AND, OR.
Wypisz wiersze pracowników, których zarobki są
większe lub równe 1100 i którzy pracują na
stanowisku 'CLERK'.
SELECT Empno, Ename, Job, Sal
FROM Emp
WHERE Sal>=1100 AND Job='CLERK';
EMPNO ENAME JOB SAL
---------- ---------- --------- ----------
7876 ADAMS CLERK 1100
7934 MILLER CLERK 1300
DISTINCT
• Powtarzające się wiersze nie są automatycznie
eliminowane z wyników zapytania.
• Słowo DISTINCT oznacza eliminację powtarzających
się wierszy - wymaga posortowania wierszy
wynikowych, aby można było wyznaczyć grupy
powtarzających się wierszy.
Wypisz
identyfikatory
osób,
które
mają
podwładnych.
MGR
----------
7566
7698
7782
7788
7839
7902
SELECT DISTINCT Mgr
FROM Emp;
Aliasy
• W miejscu nazwy kolumny może wystąpić
wyrażenie.
• Wyrażeniom na liście SELECT mogą zostać
nadane nazwy czyli aliasy:
• prosty identyfikator - napis złożony z liter,
cyfr i znaków podkreślenia
• ograniczony identyfikator - dowolny napis
ograniczony podwójnymi cudzysłowami, np.
"Zarobki pracownika:"
W
ograniczonym
identyfikatorze
mogą
występować spacje, które są niedozwolone w
prostym identyfikatorze.
Wyrażenia
Oblicz okres zatrudnienia pracownika od daty jego
zatrudnienia do dnia dzisiejszego – w pełnych
latach:
SELECT Empno, Ename,
Trunc(Months_Between(Sysdate,Hiredate)/1
2) Zatrudnienie
FROM Emp;
EMPNO ENAME ZATRUDNIENIE
---------- ---------- ------------
7369 SMITH 19
7499 ALLEN 19
7521 WARD 19
7698 BLAKE 19
7782 CLARK 19
7566 JONES 19
7654 MARTIN 18
7934 MILLER 18
7902 FORD 18
7839 KING 18
7844 TURNER 18
7900 JAMES 18
7788 SCOTT 17
7876 ADAMS 17
Alias
prosty
ORDER BY
• Wyniki zapytania mogą zostać posortowane
w porządku rosnącym - ASC (domyślnie) lub
malejącym – DESC.
SELECT [DISTINCT] wyrażenie [[AS]
alias],...
FROM nazwa_tabeli
[WHERE warunek]
[ORDER BY wyrażenie [ASC|DESC],...];
• Wartości NULL są ustawiane na końcu przy
ASC oraz na początku przy DESC.
Semantyka prostego
zapytania
1. Weź tabelę podaną w klauzuli FROM.
2. Jeśli występuje klauzula WHERE, do każdego
wiersza danej tabeli zastosuj warunek WHERE.
Pozostaw wiersze dające wartość True (usuwając
wiersze dające False lub Null).
3. Dla każdego pozostającego wiersza oblicz wartości
wyrażeń na liście SELECT.
4. Jeśli po SELECT występuje DISTINCT, usuń
duplikaty wśród wynikowych wierszy.
5. Jeśli występuje klauzula ORDER BY, wykonaj
sortowanie wynikowych wierszy zgodnie ze
specyfikacją.
Operatory
1. Operatory arytmetyczne +, -, *, /
2. Operator konkatenacji (łączenia) napisów ||
np. zestawienie nazwiska pracownika z
zajmowanym przez niego stanowiskiem
'Osoba '|| Ename || ' pracuje na
stanowisku ' || Job
3. Operatory porównań =, <>, <, <=, >, >= W
Oracle argumenty operatorów porównań muszą
być wyrażeniami, w Standardzie mogą być
listami wyrażeń (ale tej samej długości) -
wówczas porównania odbywają się po
składowych.
4. Operator testujący Null
x IS [NOT] NULL
5. Operatory logiczne NOT, AND, OR
Operatory
1. Operator przynależności do listy wartości:
x
[NOT] IN (x1,....)
np.
Kolor IN ('Czarny',
'Biały', 'Czerwony')
Przykład
Wypisz nazwiska pracowników
pracujących na stanowisku CLERK, ANALYST
lub SALESMAN.
SELECT Ename
FROM Emp
WHERE Job IN(
’CLERK’, ’ANALYST’,
’SALESMAN'
);
Operatory
1. Operator zawierania się “między”
x [NOT]
BETWEEN z AND y,
np.
Sal BETWEEN 1000 AND
2000
Przykład
Wypisz dane pracowników, których
pensja mieści się w przedziale między 1000
a 2000.
SELECT *
FROM Emp
WHERE
Sal BETWEEN 1000 AND 2000
;
W Oracle x,y,z,x1,… muszą być wyrażeniami, w
Standardzie mogą być listami wyrażeń tej samej
długości - porównania odbywają się po
składowych.
Operatory
3. Operator wzorca w tekście
x [NOT] LIKE y
gdzie y
zawiera:
•
znak podkreślenia
_
oznaczający dowolny jeden
znak oraz
•
znak
%
oznaczający dowolny ciąg znaków np.
•
Np. gdy Ename = 'Kowalski' to
Ename LIKE 'Kowal
%'
i
Ename LIKE 'Kowalsk_'
są spełnione.
Przykład
Wypisz dane pracowników, których
nazwiska kończą się ma
'
TH '
.
SELECT *
FROM Emp
WHERE
Ename like
'
%
TH '
;
Specjalne funkcje Oracle
Funkcja interpretująca Null:
NVL(V1,V2)
-
wartością jest V2 jeśli V1 jest Null, w przeciwnym
razie V1
• NVL(Sal,0)
i
NVL(Stopień, 'Brak')
umożliwiają zinterpretowanie wartości Null jako
odpowiednio 0 bądź 'Brak'.
Funkcje konwersji:
TO_CHAR, TO_DATE, TO_NUMBER
•
TO_DATE('03-27-01', 'mm-dd-yy')
zmienia typ napisowy na datowy, przy czym
informacja o dacie ma być odczytywana zgodnie z
formatem podanym jako drugi argument: numer
miesiąca, dzień i rok reprezentowany przez dwie
cyfry.
Funkcje bez argumentów:
Sysdate, User
Funkcja NVL (Oracle)
• Wybierz nazwiska i roczne zarobki wszystkich
pracowników
(uwzględnij
prowizję
pracowników, którzy ją mają)
SELECT Empno, 12* Sal + NVL(Comm, 0)
“Roczne zarobki”
FROM Emp
ORDER BY Sal DESC;
EMPNO RoczneZarobki
7839
60000
7902
36000
7788
36000
7566
35700
7698
34200
7782
29400
7499
19500
7844
18000
7934
15600
7654
16400
7521
15050
7876
13200
7900
11400
7369
9600
Funkcja NVL (Oracle)
• Gdybyśmy nie użyli funkcji NVL,
uzyskalibyśmy taką odpowiedź:
SELECT Empno, 12* Sal + Comm “Roczne
zarobki”
FROM Emp
ORDER BY Sal DESC;
EMPNO RoczneZarobki
7839
7902
7788
7566
7698
7782
7499
19500
7844
18000
7934
7654
16400
7521
15050
7876
7900
7369
Tu widać konsekwencje tego,
że wypisywane są tylko te
wiersze, dla których
warunek WHERE przyjmuje
wartość True (ani False ani
Null
).
W Accessie zamiast funkcji
NVL jest funkcja nz.