Ćwiczenia z „Podstawy baz danych“

Transkrypt

Ćwiczenia z „Podstawy baz danych“
Ćwiczenia z „Podstawy baz danych“
2005/2006
Spis treści
1. Schemat ERD ( Entity Relationship Diagrammer ) przykładowego schematu ............................................................................... 2
2. Utworzyć relacje do powyższego diagramu.................................................................................................................................... 2
3. Modyfikacja istniejących relacje..................................................................................................................................................... 3
4. Utworzyć sekwencje dla wszystkich relacji s_osoby, s_wydzialy, s_pensje, s_zatrudnienia ......................................................... 3
5. Wprowadzić przykładowe dane do stworzonych relacji. ................................................................................................................ 3
6. Informacje o utworzonych obiektach .............................................................................................................................................. 4
7. Dane są relacje ................................................................................................................................................................................ 4
8. Składnia polecenia SELECT ................................................................................................................................................. 4
9. Funkcje............................................................................................................................................................................................ 5
9.2. Funkcje znakowe ..................................................................................................................................................................... 5
9.3. Funkcje numeryczne................................................................................................................................................................ 6
9.4. Inne funkcje ............................................................................................................................................................................. 6
10. Operatory....................................................................................................................................................................................... 7
10.1. Operatory arytmetyczne ........................................................................................................................................................ 7
10.2. Operatory znakowe................................................................................................................................................................ 7
10.3. Operatory porównania ........................................................................................................................................................... 7
10.4. Operatory logiczne ................................................................................................................................................................ 8
10.5. Operatory mnogościowe........................................................................................................................................................ 8
11. Pseudokolumny ROWNUM i ROWID............................................................................................................................................... 8
12. Inne polecenia SQL ....................................................................................................................................................................... 9
13. Zapytania zagnieżdżone nieskorelowane ...................................................................................................................................... 9
14. Zapytania zagnieżdżone skorelowane ........................................................................................................................................... 9
15. Składnia polecenia WITH … SELECT ….. ............................................................................................................................... 9
16. SELECT z klauzulą START WITH warunek CONNECT BY PRIOR warunek...................................................................... 10
17. Zmienne lokalne i zmienne globalne........................................................................................................................................... 10
18. Tworzenie indeksów w SQL ....................................................................................................................................................... 11
19. Złączenie tabel............................................................................................................................................................................. 11
19.1. Złączenie krzyżowe (CROSS JOIN).................................................................................................................................. 12
19.2. Złączenie naturalne (NATURAL JOIN).............................................................................................................................. 12
19.3. Złączenie wewnętrzne (INNER JOIN).............................................................................................................................. 12
19.4. Złączenie zewnętrzne (OUTER JOIN) ............................................................................................................................... 13
19.5. Złączenie prawostronne/lewostronne .................................................................................................................................. 13
19.6. Złączenie pełne.................................................................................................................................................................... 13
19.7. Samozłączenia ..................................................................................................................................................................... 14
20. Transakcje ................................................................................................................................................................................... 14
21. Materialized views - widoki zmaterializowane ........................................................................................................................... 15
22. Database Link.............................................................................................................................................................................. 16
23. Klastry ......................................................................................................................................................................................... 16
24. Tabele partycjonowane................................................................................................................................................................ 17
24.1. Tabela partycjonowana według BY RANGE … .................................................................................................................. 17
24.2. Tabela partycjonowana według BY HASH …..................................................................................................................... 18
25. Podstawowe wiadomości z PL/SQL - Bloki, procedury i funkcje .............................................................................................. 18
26. Wyzwalacze (trigery) .................................................................................................................................................................. 21
27. Przykładowe pytania z SQL ........................................................................................................................................................ 22
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
-2–
1. Schemat ERD ( Entity Relationship Diagrammer ) przykładowego schematu
lub w postaci
2. Utworzyć relacje do powyższego diagramu.
DROP
DROP
DROP
DROP
TABLE
TABLE
TABLE
TABLE
pensje CASCADE CONSTRAINTS;
zatrudnienia CASCADE CONSTRAINTS;
osoby CASCADE CONSTRAINTS;
wydzialy CASCADE CONSTRAINTS;
CREATE TABLE osoba
(
id NUMBER(2) CONSTRAINT osoba_PK PRIMARY KEY,
nazwisko VARCHAR2(15) NOT NULL,
imie1 VARCHAR2(15) NOT NULL,
imie2 VARCHAR2(15),
d_ur DATE,
plec CHAR(1) NOT NULL CONSTRAINT osoba_plec_CH CHECK(plec='K' OR plec='M')
);
Zmiana nazwy relacji:
RENAME osoba TO osoby;
CREATE TABLE wydzialy
(
id NUMBER(2) PRIMARY KEY,
nazwa VARCHAR2(15) NOT NULL UNIQUE,
szef NUMBER(2) NOT NULL,
CONSTRAINT wydzialy_szef_FK FOREIGN KEY(szef) REFERENCES osoby,
);
CREATE TABLE zatrudnienia
(
id NUMBER(3) NOT NULL,
id_os NUMBER(2) NOT NULL,
od DATE NOT NULL,
do DATE,
id_wydz NUMBER(2) NOT NULL,
CONSTRAINT zatrudnienia_id_PK PRIMARY KEY(id),
CONSTRAINT zatrudnienia_id_os_FK FOREIGN KEY(id_os) REFERENCES osoby,
CONSTRAINT zatrudnienia_id_wydz_FK FOREIGN KEY(id_wydz) REFERENCES wydzialy(id)
);
CREATE TABLE pensje
(
id NUMBER(2) NOT NULL CONSTRAINT pensje_PK PRIMARY KEY,
id_os NUMBER(2) NOT NULL,
pensja NUMBER(6),
od DATE NOT NULL,
do DATE,
CONSTRAINT pensje_id_os_FK FOREIGN KEY(id_os) REFERENCES osoby(id)
);
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
-3–
3. Modyfikacja istniejących relacje
Dodanie kolumny do tabeli:
ALTER TABLE osoby
ADD adres VARCHAR2(25);
Zmodyfikowanie kolumny:
ALTER TABLE osoby
MODIFY adres VARCHAR2(20) NOT NULL;
Usunięcie kolumny z tabeli:
ALTER TABLE osoby
DROP COLUMN adres;
Zmodyfikowanie kolumny:
ALTER TABLE osoby
MODIFY nazwisko VARCHAR2(20);
ALTER TABLE osoby
MODIFY (nazwisko VARCHAR2(20) CONSTRAINT nazwisko_NN NOT NULL);
Usunięcie constrainu z tabeli:
ALTER TABLE osoby
DROP CONSTRAINT nazwisko_NN;
Dodanie constrainu do tabeli:
ALTER TABLE wydzialy
ADD CONSTRAINT wydzialy_nazwa_U UNIQUE(nazwa)
DEFERRABLE
{weryfikacja opóźniona}
INITIALLY DEFERRED;
{INITIALLY IMMEDIATE - weryfikacja natychmiastowa
}}
Ustawienie constrainu w tabeli na natychmiastową weryfikację:
SET CONSTRAINT wydzialy_nazwa_U IMMEDIATE;
Wyłączenie i włączenie constrainu w tabeli:
ALTER TABLE wydzialy DISABLE CONSTRAINT wydzialy_nazwa_U;
ALTER TABLE wydzialy ENABLE CONSTRAINT wydzialy_nazwa_U;
4. Utworzyć sekwencje dla wszystkich relacji s_osoby, s_wydzialy, s_pensje,
s_zatrudnienia
Składnia:
CREATE SEQUENCE [schemat.]nazwa_licznika
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE]
[ORDER | NOORDER];
Przykład.
CREATE SEQUENCE s_osoby
INCREMENT BY 10
START WITH 1000
ORDER;
5. Wprowadzić przykładowe dane do stworzonych relacji.
Składnia:
INSERT INTO nazwa_relacji VALUES ( lista_wartości);
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
-4–
Przykład.
INSERT INTO osoby VALUES
(s_osoby.NEXTVAL,’Kowalski’,’Jan’,NULL,TO_DATE(’02/11/1974’, ’dd/mm/yyyy’),’M’);
INSERT INTO pensja VALUES
(s_pensje.NEXTVAL,s_osoby.CURRVAL ,1500, TO_DATE(’02/11/1998’, ’dd/mm/yyyy’));
6. Informacje o utworzonych obiektach
Informacje o utworzonych obiektach można znaleźć w perspektywach systemowych, których spis można uzyskać
z perspektywy ALL_VIEWS wykonując polecenie
SELECT view_name FROM ALL_VIEWS;
Ogólna zasada nazewnictwa perspektyw systemowych użytecznych w uzyskaniu informacji o utworzonych elementach jest
następująca:
ALL_
USER_
- informacje o obiektach dostępnych dla zalogowanego użytkownika;
- informacje o obiektach, których właścicielem jest zalogowany użytkownik;
Np.
ALL_TABLES
ALL_VIEWS
ALL_SEQUENCES
ALL_PROCEDURES
…..
USER_TABLES
USER_VIEWS
USER_SEQUENCES
USER_PROCEDURES
…….
Ponieważ niektóre perspektywy zawierają wiele atrybutów i wyświetlenie wszystkich pozycji czyni wynik nieczytelnym,
więc najlepszym rozwiązaniem jest sprawdzenie najpierw jakie atrybuty występują w danej perspektywie poleceniem
DESC nazwa_perspektywy
a następnie poleceniem SELECT … wybrać interesujące nas atrybuty
SELECT lista_atrybutów FROM nazwa_perspektywy;
7. Dane są relacje
Osoby
Zatrudnienia
ID NAZWISKO
1 lis
2 kot
3 norek
4 Krawczyk
5 Lis
6 Kowalska
7 Nowak
8 Duda
9 Kula
10 Murek
IMIE1 IMIE2
Jan
Adam
Marek
Tadeusz
Adam
Anna
Ewa
Maria
Anna
Barbara
Katarzyna
Danuta
D_UR
PLEC
21/10/1978
M
21/11/1980
M
23/10/1982
M
02/06/1982
M
23/12/1968
K
11/05/1979
K
12/07/1979
K
20/12/1984
K
12/11/1983
K
17/08/1975
K
IDID_OS
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10 10
OD
01/03/1999
01/03/1999
01/03/1999
01/07/1999
01/10/1999
01/03/1999
01/05/1999
01/08/1999
01/03/2000
01/04/2000
Wydzialy
ID NAZWA
1 prawo
2 matematyka
3 fizyka
SZEF
7
8
4
Pensje
DO
ID_WYDZ
01/06/1999
1
2
3
4
2
01/03/2000
3
1
2
3
3
ID ID_OS PENSJA
OD
DO
1
1
1100 01/03/1999 01/06/1999
2
2
1300 01/03/1999
3
3
1500 01/03/1999 31/05/2000
4
3
1800 01/06/2000
5
4
1400 01/07/1999 30/04/2001
6
4
1700 01/05/2001
7
5
1800 01/10/1999 30/09/2001
8
5
2000 01/10/2001
9
6
1100 01/03/1999 01/03/2000
10
7
2000 01/05/1999
11
8
2100 01/08/1999
13
10
2500 01/04/2000 31/05/2001
14
10
3000 01/06/2001
8. Składnia polecenia SELECT ......
Składnia:
SELECT [ ALL | DISTINCT ]
{* | tabela.* | wyrażenie [a_alias] } [, { tabela.* | wyrażenie [a_alias] } ] ...
FROM [schemat.]tabela [t_alias] [, [schemat.]tabela [t_alias] ]...
[ WHERE warunek_1 ]
[ GROUP BY wyrażenie [,wyrażenie] ...
[ HAVING warunek_2 ] ]
[ { UNION | INTERSECT | MINUS } SELECT ...]
[ ORDER BY {wyrażenie | pozycja} [ASC|DESC] [, {wyrażenie | pozycja} [ASC|DESC] ] ];
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
-5–
9. Funkcje
•
•
•
•
Funkcje agregujące
Funkcje numeryczne
Funkcje znakowe
Inne funkcje
9.1. Funkcje agregujące
Funkcje grupowe zwracają swoje wartości na podstawie grupy wierszy a nie pojedynczych wartości. Domyślnie cały wynik
jest traktowany jako jedna grupa. Klauzula GROUP BY z rozkazu SELECT może jednak podzielić wiersze wynikowe na grupy.
Klauzula DISTINCT wybiera z grupy tylko pojedyncze wartości (drugie i następne są pomijane). Klauzula ALL powoduje
wybranie wszystkich wierszy wynikowych do obliczenia wyniku. Wszystkie wymienione w tym podrozdziale funkcje opuszczają
wartości NULL z wyjątkiem COUNT(*). Wyrażenia będące argumentami funkcji mogą być typu CHAR, NUMBER lub DATE.
Składnia
AVG( [DISTINCT | ALL] num)
Przeznaczenie
Zwraca wartość średnią
ignorując wartości puste
COUNT( [DISTINCT | ALL]
Zwraca liczbę wierszy,
wyrażenie)
w których wyrażenie nie jest
równe NULL
COUNT(*)
Zwraca liczbę wierszy
w tabeli włączając
powtarzające się i równe
NULL
MAX( [DISTINCT | ALL] wyrażenie) Zwraca maksymalną wartość
wyrażenia
MIN( [DISTINCT | ALL] wyrażenie) Zwraca minimalną wartość
wyrażenia
STDDEV( [DISTINCT | ALL] num)
Zwraca odchylenie
standardowe wartości num
ignorując wartości NULL
SUM( [DISTINCT | ALL] num)
Zwraca sumę wartości num.
VARIANCE( [DISTINCT | ALL] num)
Zwraca wariancję wartości
num ignorując wartości
NULL
Przykład
SELECT AVG(placa) srednia
FROM osoby;
SELECT COUNT(nazwisko) ilosc
FROM osoby;
SELECT COUNT(*) wszystko
FROM osoby;
SELECT MAX(pensja) max
FROM pensje;
SELECT MIN(pensja) min
FROM pensje;
SELECT STDDEV(pensja) odchylenie
FROM pensje;
SELECT SUM(pensja) Koszty osobowe
FROM pensja;
SELECT VARIANCE(pensja) wariancja
FROM pensje;
9.2. Funkcje znakowe
Składnia
CHR(n)
INITCAP(tekst)
LOWER(tekst)
LPAD(tekst1,n[,tekst2])
LTRIM(tekst [,zbiór])
REPLACE(tekst,tekst1
[, tekst2])
RPAD(tekst1,n[,tekst2])
RTRIM(tekst [,zbiór])
Przeznaczenie
Zwraca znak o podanym kodzie
Zwraca tekst, w którym każde słowo ma dużą
pierwszą literę, a pozostałe są małe.
Zamienia wszystkie litery w podanym tekst na
małe.
Zwraca tekst1 uzupełniony do długości n
lewostronnie ciągami znaków z tekst2. Jeśli
tekst2 nie jest podany to przyjmowana jest
spacja. Jeśli n jest mniejsze od długości tekst1,
to zwracane jest n pierwszych znaków z tekstu
tekst1.
Usuwa litery z tekstu tekst od lewej strony aż
do napotkania litery nienależącej do tekstu
zbiór. Jeśli zbiór nie jest podany to
przyjmowany jest ciąg pusty.
Zwraca tekst z zamienionym każdym
wystąpieniem tekstu tekst1 na tekst tekst2.
Zwraca tekst1 uzupełniony prawostronnie do
długości n ciągami tekst2. Jeśli tekst2 nie jest
podany, to przyjmuje się spację, Jeśli n jest
mniejsze od długości tekst1, to zwracane jest n
pierwszych znaków z tekstu tekst1.
Zwraca tekst z usuniętymi ostatnimi literami,
które znajdują się w stringu zbiór. Jeśli zbiór
nie jest podany to przyjmowany jest ciąg
pusty.
Przykład
CHR(65)
Wynik: "A"
INITCAP('PAN JAN NOWAK')
Wynik: "Pan Jan Nowak"
LOWER('PAN JAN NOWAK')
Wynik: "pan jan nowak"
LPAD('Ala ma ', kota*, 17)
Wynik: "kota*kota*Ala ma "
LTRIM('xxxXxxOstatnie słowo',
'x')
Wynik: "XxxOstatnie słowo"
REPLACE('Jack&Jue','J', Bl')
Wynik: "Black&Blue"
RPAD('Ala ma ', 17, 'kota*')
Wynik: "Ala ma kota*kota*"
RTRIM('Ostatnie słowoxxXxxx',
'x')
Wynik: "Ostatnie słowoxxX"
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
SUBSTR(tekst, m [,n])
TRANSLATE(tekst,t1,t2)
UPPER(tekst)
ASCII(tekst)
INSTR(tekst1,tekst2
[, n [, m]])
LENGTH(tekst)
…
-6–
Zwraca podciąg z ciągu znaków tekst
zaczynający się na znaku m i o długości n.
Jeśli n nie jest podane, to zwracany jest
podciąg od znaku m do ostatniego w tekst.
Pierwszy znak w ciągu ma numer 1.
Zwraca string powstały po zamianie
wszystkich znaków t1 na znak t2.
Zamienia wszystkie znaki z ciągu tekst na
duże litery.
Zwraca kod ASCII pierwszej litery
w podanym ciągu znaków.
Zwraca pozycję m-tego wystąpienia tekst2
w tekst1, jeśli szukanie rozpoczęto od pozycji
n. Jeżeli m jest pominięte, to przyjmowana jest
wartość 1. Jeśli n jest pominięte, przyjmowana
jest wartość 1.
Zwraca długość podanego ciągu znaków.
...
SUBSTR('ABCDE',2, 3)
Wynik: "BCD"
TRANSLATE( 'HELLO! THERE!',
'!', '-')
Wynik: "HELLO- THERE-"
UPPER('Jan Nowak')
Wynik: "JAN NOWAK"
ASCII('A')
Wynik: 65
INSTR('MISSISSIPPI','S',5,2)
Wynik: 7
LENGTH('Nowak') Wynik: 5
...
9.3. Funkcje numeryczne
Funkcja
ABS(n)
CEIL(n)
FLOOR(n)
MOD(m, n)
POWER(m, n)
Przeznaczenie
Zwraca wartość absolutną liczby n.
Zwraca najmniejszą liczbę całkowitą większą lub równą n.
Zwraca największą liczbę całkowitą mniejszą lub równą n.
Zwraca resztę z dzielenia liczby m przez n
Zwraca liczbę m podniesioną do potęgi n. Liczba n musi być
całkowita; w przeciwnym wypadku wystąpi błąd.
ROUND(n[, m]) Zwraca liczbę n zaokrągloną do m miejsc po przecinku. Jeśli m jest
pominięte, to przyjmuje się 0. Liczba m może być dodatnia lub ujemna
(zaokrąglenie do odpowiedniej liczby cyfr przed przecinkiem)
Przykład
ABS(-15)
CEIL(15.7)
FLOOR(15.7)
MOD(7, 5)
POWER(2, 3)
ROUND(16.167, 1)
Wynik: 16.2,
ROUND(16.167, -1)
Wynik: 20
SIGN(n)
Zwraca 0, jeśli n jest równe 0, -1 jeśli n jest mniejsze od 0, 1 jeśli n SIGN(-15)
jest większe od 0
SQRT(n)
SQRT(25)
Zwraca pierwiastek kwadratowy liczby n. Jeśli n<0 to wystąpi błąd
TRUNC(m[, n]) Zwraca m obcięte do n miejsc po przecinku. Jeśli n nie jest podane, to TRUNC(15.79,1)
przyjmuje się 0. Jeśli n jest ujemne to obcinane są cyfry przed Wynik: 15.7,
TRUNC(15.79, -1)
przecinkiem.
Wynik: 10
......
......
.....
9.4. Inne funkcje
DECODE(wyrażenie,szuk1,wynik1, [szuk2,wynik2,.....,],wynik_domyślny)
- zwraca wynik1 gdy wyrażenie=szuk1 lub wynik2 gdy wyrażenie=szuk2,... lub w przeciwnym wypadku wynik_domyślny
NVL(wartość1,wartość2)
- zwraca wartość2 gdy wartość1 jest NULL
UID
USER
- zwraca unikalny identyfikator użytkownika
- zwraca nazwę użytkownika
TO_DATE(atrybut,'dd/mm/yyyy HH24:MI:SS') TO_CHAR(atrybut,'dd/mm/yyyy HH24:MI:SS') TO_CHAR(sysdate,'dd/mm/yyyy HH24:MI:SS') - zwraca aktualną datę w postaci tekstowej w podanym formacie
TO_CHAR(sysdate,'Q')
TO_CHAR(sysdate,'DDD')
TO_CHAR(sysdate,'D')
TO_CHAR(sysdate,'WW')
TO_CHAR(sysdate,'W')
- kwartał roku
- numer dnia w roku
- zwraca dzień tygodnia
- numer tygodnia w roku
- numer tygodnia w miesiącu
data + liczba
data - liczba
data - data
- zwiększa datę o podaną ilość dni
- zmniejsza datę o podaną ilość dni
- zwraca ilość dni
TO_NUMBER(tekst)
TO_CHAR(liczba)
- przekształca tekst zawierający zapis liczby na liczbę
- przekształca liczba na tekst
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
-7–
10. Operatory
•
•
•
•
•
arytmetyczne
znakowe
porównania
logiczne
mnogościowe
10.1. Operatory arytmetyczne
Operatory arytmetyczne działają zasadniczo na danych typu numerycznego. Jednak niektóre z tych operatorów mogą być
użyte do danych typu DATE. Spis operatorów arytmetycznych podzielonych według priorytetu przedstawia tabela:
Operator
( )
+,-
Opis
Zmienia normalną kolejność wykonywania działań. Wszystkie działania
wewnątrz nawiasów są wykonywane przed działaniami poza nawiasami.
Operatory jednoargumentowe zachowania i zmiany znaku.
*, /
+, -
Mnożenie, dzielenie
Dodawanie, odejmowanie
Przykład
SELECT (x+y)/(y+z) ...
... WHERE nr = -1
... WHERE -kwota < 0
SELECT 2*x+1 WHERE x > y/2
SELECT 2*x+1 WHERE x > y-z
10.2. Operatory znakowe
Jedynym operatorem działającym na ciągach znaków jest operator konkatenacji. Rezultatem działania tego operatora jest ciąg
znaków będący połączeniem operandów. Należy pamiętać, że ciągi znaków typu CHAR nie mogą być dłuższe niż 255 znaków.
Ograniczenie to dotyczy również ciągu znakowego będącego wynikiem działania operatora konkatenacji.
Operator
||
Opis
Konkatenacja ciągów znaków
Przykład
SELECT 'Nazwa: ' || nazwa FROM wydzialy;
10.3. Operatory porównania
Operatory porównania są wykorzystywane w wyrażeniach i warunkach do porównywania dwóch wyrażeń. Wynikiem
działania operatorów porównania jest zawsze wartość logiczna (TRUE lub FALSE).
Operator
( )
=
!=, ^=, <>
>
<
>=
<=
IN
NOT IN
ANY
ALL
[NOT]
BETWEEN x AND y
[NOT] EXISTS
Opis
Zmienia normalną kolejność wykonywania działań
Sprawdza, czy dwa wyrażenia są równe
Sprawdza, czy dwa wyrażenia są różne
Większe niż
Mniejsze niż
Większe lub równe niż
Mniejsze lub równe niż
Równy dowolnemu elementowi. Synonim do
" = ANY"
Przykład
... NOT (A=1 OR B=1)
... WHERE pensja = 1000
... WHERE pensja != 1000
... WHERE pensja > 1000
... WHERE pensja < 1000
... WHERE pensja >= 1000
... WHERE pensja <= 1000
... WHERE nazwisko IN
('Kowalski', 'Lis')
... WHERE pensja IN (SELECT
pensja FROM pensje WHERE id=3
OR id=5)
...
WHERE pensja NOT IN
Różny od każdego z elementów. Wynikiem jest FALSE
(SELECT
pensja FROM pensje
jeśli dowolny element zbioru jest równy NULL.
WHERE id=3 )
Synonim do "!= ALL"
... WHERE pensja = ANY (SELECT
Porównuje wartość z każdą wartością ze zbioru po
pensja FROM pensje WHERE id
prawej stronie. Musi być poprzedzony jednym z
IN (1,2,3))
operatorów: =, !=, >, <, <=, >=. Zwraca TRUE, jeśli
przynajmniej jeden z elementów spełnia podany
warunek.
...WHERE (pensja)>= ALL
Porównuje wartość z każdą wartością ze zbioru po
(14900,3000)
prawej stronie. Musi być poprzedzony jednym z
operatorów: =, !=, >, <, <=, >=. Zwraca TRUE, jeśli
każdy z elementów spełnia podany warunek.
... WHERE id BETWEEN 1 AND 9
większy lub równy x i mniejszy lub równy y.
Zwraca TRUE jeśli zapytanie [nie] zwraca przynajmniej
jeden wiersz.
... WHERE EXISTS
(SELECT pensja FROM pensje
WHERE id>3 )
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
[NOT] LIKE
IS [NOT] NULL
-8–
spełnia podany wzorzec. Litera '%' jest używana do
zapisywania dowolnego ciągu znaków (0 lub więcej),
który nie jest równy NULL. Znak '_' zastępuje dowolną
pojedynczą literę.
jest równe NULL.
... WHERE nazwisko LIKE 'T%'
... WHERE do IS NULL
Operator NOT IN zwróci FALSE (co w przypadku klauzuli WHERE spowoduje, że żadne wiersze nie zostaną zwrócone),
jeśli choć jeden z elementów listy jest równy NULL.
Np. polecenie
SELECT TRUE
FROM osoby
WHERE id NOT IN (5, 15, NULL);
nie zwróci żadnych wierszy, ponieważ
id NOT IN (5, 15, NULL)
zostanie rozwinięty do
id != 5 AND id != 15 AND id != NULL
Wynikiem działania operatorów porównania i logicznych dla wartości NULL jest wartość NULL. Dlatego też wynikiem całego
opisywanego rozkazu będzie wartość NULL.
10.4. Operatory logiczne
Operatory logiczne służą do wykonywania obliczeń na wartościach typu logicznego (w szczególności będących wynikiem
obliczania warunków).
Operator
( )
NOT
Opis
Zmienia normalną kolejność wykonywania działań
Zaprzeczenie wyrażenia logicznego
AND
Przykład
SELECT ...
WHERE x = y AND (a = b OR p = q)
...WHERE NOT (do IS NULL )
...WHERE NOT (id_wydz = 1)
... WHERE id_wydz = 1 AND id = 2
Logiczne 'i'. Wynik jest równy TRUE, jeśli wartości
obu operandów są równe TRUE
OR
Logiczne 'lub'. Wynik jest równy TRUE, jeśli wartość ... WHERE id_wydz = 1 OR id_wydz = 3
przynajmniej jednego operandu jest równa TRUE
Poniższe tabele przedstawiają wynik działania operatora AND i OR dla różnych wartości:
AND
TRUE
FALSE
NULL
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
FALSE
NULL
NULL
FALSE
NULL
OR
TRUE
FALSE
NULL
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
10.5. Operatory mnogościowe
Operatory zbiorowe działają na wynikach zapytań lub listach wartości.
Operator
UNION [ALL]
INTERSECT
MINUS
Opis
Unia dwóch zbiorów. Łączy dwa zbiory, powtarzające się elementy
występują tylko raz.
Część wspólna dwóch zbiorów. Powtarzające się elementy występują tylko
raz.
Oblicza różnicę dwóch zbiorów. w wyniku umieszczane są tylko te
elementy, które występują w pierwszym zbiorze i nie występują w drugim.
Elementy powtarzające się występują tylko raz.
11. Pseudokolumny ROWNUM i ROWID
ROWID
ROWNUM
- jednoznaczny identyfikator wiersza w bazie,
- kolejny numer zwracanego wiersza.
Przykład. Wyświetlić cztery pierwsze wiersze z tabeli osoby.
SELECT os.*, ROWNUM,ROWID
FROM osoby os
WHERE ROWNUM<4;
Identyfikator ROWNUM nadawany jest przed zastosowaniem klauzuli ORDER BY … . Zapytanie
SELECT os.*, ROWNUM
FROM osoby os
WHERE ROWNUM<4
ORDER BY nazwisko;
Przykład
... SELECT ...
UNION SELECT ...
... SELECT ...
INTERSECT SELECT ...
... SELECT ...
MINUS SELECT ...
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
-9–
zwróci trzy pierwsze wiersze przed posortowaniem i te trzy wiersze posortuje.
12. Inne polecenia SQL
Ustawienie formatu daty na czas sesji:
ALTER SESSION
SET NLS_DATE_FORMAT=’dd/mm/yyyy’;
13. Zapytania zagnieżdżone nieskorelowane
Przykłady.
SELECT id, nazwisko, TRUNC(SYSDATE-d_ur)-(SELECT AVG(TRUNC(SYSDATE-d_ur))
FROM osoby;
FROM osoby)
SELECT id, nazwisko
FROM osoby
WHERE TRUNC(SYSDATE-d_ur)>(SELECT AVG(TRUNC(SYSDATE-d_ur)) FROM osoby);
SELECT d.id, nazwisko, p.pensja
FROM pensje p,(SELECT o.id, o.nazwisko
FROM osoby o, zatrudnienia z
WHERE o.id=z.id_os AND z.do IS NULL) d
WHERE d.id=p.id_os(+) AND p.do IS NULL;
14. Zapytania zagnieżdżone skorelowane
Przykład. Wybrać dane osób, które miały zmiany pensji.
SELECT o.*
FROM osoby o
WHERE EXISTS (SELECT id_os, COUNT(*)ilosc
FROM pensje p1
WHERE p1.id_os=o.id
GROUP BY p1.id_os
HAVING COUNT(*)>1);
Przykład. Wybrać dane wydziału, który zatrudnia, co najmniej 4 osoby.
SELECT w.*
FROM wydzialy w
WHERE EXISTS (SELECT COUNT(*)ilosc
FROM zatrudnienia z
WHERE z.id_wydz=w.id
GROUP BY z.id_wydz
HAVING COUNT(*)>3);
15. Składnia polecenia WITH … SELECT …..
WITH
nazwa_1 AS (SELECT ………),
nazwa_2 AS (SELECT ………),
nazwa_3 AS (SELECT ………),
……………………………………
SELECT …………………………………………;
Przykład.
WITH
s_osoby AS (SELECT o.*, pensja
FROM osoby o, pensje p
WHERE o.id=p.id_os AND p.do IS NULL),
S_srednia AS (SELECT AVG(pensja) s_pensja FROM s_osoby)
SELECT * FROM s_osoby
WHERE pensja > (SELECT * FROM s_srednia);
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 10 –
16. SELECT z klauzulą START WITH warunek CONNECT BY PRIOR warunek
CREATE TABLE test
(
id NUMBER(3) PRIMARY KEY,
nazwisko VARCHAR2(20) NOT NULL,
szef NUMBER(3)CONSTRAINT test_FK REFERENCES test(id)
);
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
COMMIT;
test
test
test
test
test
test
test
test
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
(1,'Lis',NULL);
(2,'Kot',1);
(3,'Burek',1);
(4,'Kurek',2);
(5,'Norek',2);
(6,'Krawczyk',3);
(7,'Maniek',3);
(8,'Mruczek',3);
SELECT * FROM test;
Przykłady.
SELECT LEVEL,nazwisko,szef
FROM test
START WITH szef IS NULL
CONNECT BY PRIOR id=szef;
SELECT LPAD(' ',LEVEL*3,'*')||nazwisko dane,szef,LEVEL
FROM test
START WITH szef IS NULL
CONNECT BY PRIOR id=szef;
SELECT LPAD(' ',LEVEL*3,'*')||nazwisko dane,szef,LEVEL
FROM test
START WITH szef=2
CONNECT BY PRIOR id=szef;
SELECT LPAD(' ',LEVEL*3,'*')||nazwisko dane,szef,LEVEL
FROM test
START WITH szef>2
CONNECT BY PRIOR id=szef;
SELECT LPAD(' ',LEVEL*3,'*')||nazwisko dane,szef,LEVEL
FROM test
START WITH szef>1
CONNECT BY PRIOR id=szef;
17. Zmienne lokalne i zmienne globalne
Zapytanie
SELECT o.*,p.*
FROM osoby o, pensje p
WHERE o.id=p.id_os AND p.do IS NULL AND
UPPER(o.nazwisko)=UPPER(’&podaj_nazwisko’);
zażąda podanie wartości zmiennej podaj_nazwisko. Jest to zmienna lokalna działająca tylko podczas wykonywania zapytania.
Zapytanie
SELECT o.*,p.*
FROM osoby o, pensje p
WHERE o.id=p.id_os AND p.do IS NULL AND
UPPER(o.nazwisko)=UPPER(’&&podaj_nazwisko’);
zażąda podanie wartości zmiennej podaj_nazwisko. Jest to zmienna globalna działająca w czasie całej sesji. Przy ponownym
uruchomieniu zapytania nie ma pytania o wartość parametru podaj_nazwisko.
Aby odczytać wszystkie aktualne wartości zmiennych globalnych należy wydać polecenie iSQL*Plusa
DEFINE
Aby wymusić ponowne zapytanie o wartość parametru podaj_nazwisko należy wydać polecenie iSQL*Plusa
UNDEFINE podaj_nazwisko
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 11 –
Można również zdefiniować zmienną globalną przed uruchomieniem zapytania poleceniem
DEFINE podaj_nazwisko=’Lis’
18. Tworzenie indeksów w SQL
Informacje o istniejących indeksach można znaleźć w perspektywach: USER_INDEXES, ALL_INDEXES.
CREATE [BITMAP | UNIQUE] INDEX [schemat.]indeks
ON ( tabela (atrybut [,atrybut[...] ) )
[ PCTFREE n ] [ PCTUSED n ]
[ INITTRANS n ] [ MAXTRANS n ]
[ TABLESPACE tablespace ]
[ STORAGE
(
[INITIAL liczba [K|M]]
[NEXT liczba [K|M]]
[PCTINCREASE liczba]
[MINEXTENTS liczba ]
[MAXEXTENTS liczba ]
)
];
Kasowanie indeksu
DROP INDEX nazwa_indeksu;
Odbudowa indeksu
ALTER INDEX nazwa_indeksu REBUILD;
Modyfikowanie indeksów
ALTER [BITMAP] INDEX [schemat.]indeks
ON ( tabela (atrybut [,atrybut[...] ) )
[ PCTFREE n ] [ PCTUSED n ]
[ INITTRANS n ] [ MAXTRANS n ]
[ STORAGE
(
[INITIAL liczba [K|M]]
[NEXT liczba [K|M]]
[PCTINCREASE liczba]
[MINEXTENTS liczba ]
[MAXEXTENTS liczba ]
)
]
[REVERSE] ;
Przykłady.
CREATE BITMAP INDEX osoby_idx_imie1 ON osoby(imie1);
CREATE INDEX osoby_idx_nazwisko ON osoby(nazwisko);
CREATE INDEX osoby_idx_nazwisko_imie1 ON osoby(nazwisko,imie1);
CREATE UNIQUE INDEX wydzialy_idx_nazwa ON wydzialy(nazwa);
CREATE BITMAP INDEX zatrudnienia_idx_id_wydz ON zatrudnienia(id_wydz);
Zaleca się stosowanie indeksów na atrybutach złączeniowych i atrybutach wykorzystywanych do częstego wyszukiwania.
19. Złączenie tabel
Istnieją dwa podstawowe typy złączeń:
• Złączenia równościowe (ang. equi join) – złączenia oparte na warunku wykorzystującym operator =. Wynikiem
takiego złączenia jest tabela zawierająca tylko te wiersze łączonych tabel, które w kolumnach złączenia posiadają
taką samą wartość.
• Złączenia nie równościowe – złączenia wykorzystujące np. warunek BETWEEN... AND...
Ze względu na sposób traktowania wierszy, które nie spełniają warunków złączenia możemy mówić o:
• Złączeniach wewnętrznych (ang. INNER JOIN)
• Złączeniach zewnętrznych (ang. OUTER JOIN)
Znany nam dotąd sposób generowania złączeń tabel/widoków polegał na podaniu nazw tych obiektów w klauzuli FROM
i podania warunków złączenia w klauzuli WHERE.
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 12 –
Przykład 1.
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o, pensje p
WHERE o.id=p.id_os AND p.pensja BETWEEN 20 AND 3000 AND p.do IS NULL;
Omówimy poniżej nową składnię spełniającą standard ISO/ANSI, (który od dawna jest już używany w pewnych nie
Oraclowych środowiskach). Używanie składni tego standardu sprawia, że w razie potrzeby, łatwiej jest przenieść kod na
platformy nie Oraclowe.
Nowa składnia pozwala na odseparowanie warunków złączenia od warunków wyboru wierszy, co upraszcza i rozjaśnia kod.
Stosując ją zapisujemy kryteria złączenia w klauzuli FROM używając klauzul ON lub USING.
19.1. Złączenie krzyżowe (CROSS JOIN)
Tworzy iloczyn kartezjański dwóch tabel, czyli daje w wyniku tabelę, zawierającą wszystkie możliwe kombinacje wierszy
obu łączonych tabel.
Przykład 2.
SELECT * FROM osoby CROSS JOIN pensje;
Wszystkie tworzone przez nas do tej pory zapytania typu
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o, pensje p
WHERE o.id=p.id_os
to nic innego jak
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o CROSS JOIN pensje p
WHERE o.id=p.id_os
19.2. Złączenie naturalne (NATURAL JOIN)
Złączenie naturalne jest taką formą złączenia równościowego, które automatycznie za warunek złączenia przyjmuje równość
wartości we wszystkich kolumnach mających takie same nazwy (dodatkowe kryteria mogą się znaleźć w klauzuli WHERE).
Przykład 3.
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o NATURAL JOIN pensje p;
(wybierze te wiersze, które mają takie same wartości w kolumnach „id”)
Skoro w obu tabelach mamy kolumnę o tej samej nazwie „id”, to ten sam rezultat otrzymalibyśmy pisząc
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o JOIN pensje p USING(id);
Uwagi
- Gdy stosujemy NATURAL JOIN nie możemy wybierać kolumn zawierających LOB-y
- Gdy używamy klauzuli USING dla wielu kolumn, wypisujemy je oddzielając przecinkami: USING kol1, kol2, kol3
19.3. Złączenie wewnętrzne (INNER JOIN)
Wynikiem tego złączenia są tylko te wiersze, które spełniają warunek złączenia.
W tradycyjnym zapisie mieliśmy:
Przykład 4.
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o, pensje p
WHERE o.id=p.id_os AND p.pensja BETWEEN 20 AND 3000 AND p.do IS NULL;
Zatem warunki złączenia mieszały się z innymi warunkami wyboru wierszy (były, bowiem umieszczone w klauzuli WHERE).
Aby użyć standardu ISO/ANSI wstawiamy wyrażenie INNER JOIN (lub po prostu JOIN) między nazwy tabel w klauzuli
FROM i specyfikujemy warunki złączeń używając klauzuli ON/USING. W klauzuli WHERE mamy wówczas tylko kryteria nie
dotyczące warunków złączenia.
Przykład 5.
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o INNER JOIN pensje p ON o.id=p.id_os
WHERE p.pensja BETWEEN 2000 AND 3000 AND p.do IS NULL;
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 13 –
Uwagi.
- Możemy tak jak dawniej tworzyć aliasy
- Możemy używać składni typu:
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o JOIN pensje p ON (o.id=p.id_os AND p.do IS NULL);
ale jest ona nie zalecana, ze względu na to, że warunki wyboru złączenia mieszają się z pozostałymi warunkami.
Możemy łączyć więcej niż dwie tabele.
Przykład 6.
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o JOIN pensje p ON o.id=p.id_os JOIN zatrudnienia z ON o.id=z.id_os
WHERE p.pensja>3000;
-
nowa składnia pozwala na użycie nawiasów dla kontrolowania kolejności złączeń
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM (osoby o JOIN pensje p ON o.id=p.id_os) JOIN zatrudnienia z ON
o.id=z.id_os
WHERE p.pensja>3000;
19.4. Złączenie zewnętrzne (OUTER JOIN)
Złączenia wewnętrzne zwracają tylko te wiersze, które znajdują odpowiedniki w drugiej tabeli. Złączenie zewnętrzne
rozszerza rezultat złączenia wewnętrznego o te wiersze, dla których w trakcie złączania nie znaleziono odpowiedników w drugiej
tabeli (w związku, z czym zostały one pominięte przez złączenie wewnętrzne). Dla wszystkich wierszy stanowiących to
rozszerzenie Oracle umieszcza NULL w kolumnach pochodzących z tabeli, której żaden wiersz nie mógł być dopasowany.
Złączenia zewnętrzne dzielimy na
• lewostronne (LEFT JOIN)
• prawostronne (RIGHT JOIN)
• pełne (FULL OUTER JOIN lub FULL JOIN)
19.5. Złączenie prawostronne/lewostronne
Wynikiem prawostronnego złączenia tabeli A i B (w podanej kolejności) jest tabela C zawierająca rezultat złączenia
wewnętrznego oraz te wiersze tabeli B, do których nie można było dopasować żadnego wiersza z A. Kolumny tabeli C
pochodzące z A dla tych wierszy zawierają NULL. Złączenie prawostronne tabeli A z B jest równoważne złączeniu
lewostronnemu tabeli B z A.
Do tej pory mogliśmy dokonywać takich złączeń stosując operator (+).
Przykład 7.
lewostronnie:
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o, pensje p
WHERE o.id=p.id_os(+) AND p.do IS NULL;
prawostronnie:
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o, pensje p
WHERE o.id(+)=p.id_os AND p.do IS NULL;
Zgodnie ze standardem ISO/ANSI mamy teraz:
Przykład 8.
lewostronnie:
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o RIGHT JOIN pensje p ON o.id=p.id_os
WHERE p.do IS NULL;
prawostronnie:
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o LEFT JOIN pensje p ON o.id=p.id_os
WHERE p.do IS NULL;
19.6. Złączenie pełne
Pełne złączenie zewnętrzne tabel A i B jest kombinacją złączenia lewostronnego i prawostronnego. W jego wyniku uzyskuje
się zbiór zawierający rezultat złączenia wewnętrznego oraz te wiersze z A, dla których nie znaleziono odpowiedników w B,
a także te wiersze z B, dla których nie znaleziono odpowiedników w A.
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 14 –
Aby je uzyskać do tej pory trzeba było stosować sumę (UNION) złączenia prawostronnego i lewostronnego.
Przykład 9.
SELECT o.nazwisko||' '||o.imie1
FROM osoby o, pensje p
WHERE o.id=p.id_os(+) AND p.do
UNION
SELECT o.nazwisko||' '||o.imie1
FROM osoby o, pensje p
WHERE o.id(+)=p.id_os AND p.do
dane, p.pensja
IS NULL
dane, p.pensja
IS NULL;
Zgodnie z nową składnią mamy:
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o FULL JOIN pensje p ON o.id=p.id_os
WHERE p.do IS NULL;
Uwagi.
• Zapytania używające operatora (+) podlegają pewnym ograniczeniom, (którym nie podlegają zapytania o nowej
składni):
- Jeżeli mamy wiele warunków złączeń operator (+) musi być wyspecyfikowany dla każdego warunku
- Operator (+) nie może być stosowany do wyrażeń
- Operator (+) nie może być połączony z innymi warunkami używającymi OR
- Operator (+) nie może być stosowany z konstrukcją IN
- Operator (+) może być stosowany tylko dla jednej tabelki w zapytaniu
• Mogą być problemy przy próbie połączenia zapisów z (+) i zapisów o nowej składni
• W Oracle wersja 9.0 i 9.2 INNER JOIN zachowuje się inaczej, gdy używamy starej i nowej składni
• W co najmniej paru przypadkach nowa składnia generuje inny plan wykonania i czasami nie jest tak dobra jak
poprzednie metody – trzeba testować obie. W wersji 9.0 i 9.2 złączenia RIGTH - LEFT OUTER JOINS używają
dokładnie tego samego planu zapytania dla obu sposobów. Składnia FULL JOIN w wersji 9.0 generuje ten sam plan
wykonania, co stara składnia, a w wersji 9.1 FULL JOIN zazwyczaj generuje lepszy plan wykonania.
Problemy.
• W wersji 9.0 Oracle występuje bardzo duży błąd – składnia ISO/ANSI dla INNER i OUTER JOIN pozwala na dostanie
się do KAŻDEJ tabeli w bazie. Dla wszystkich platform oprócz WINDOWS są dostępne łatki. W wersji 9.2 ten problem
został usunięty.
Uwaga. Możemy łączyć różne typy złączeń.
Przykład 10.
SELECT o.nazwisko||' '||o.imie1 dane, p.pensja
FROM osoby o INNER JOIN zatrudnienia z ON o.id=z.id_os LEFT JOIN
pensje p ON o.id=p.id_os
WHERE z.do IS NULL AND p.do IS NULL;
19.7. Samozłączenia
Czasami zachodzi potrzeba odwołania się w jednym zapytaniu dwa razy do tej samej tabeli. Stosujemy wówczas aliasy.
Przykład 11.
CREATE VIEW pracownik AS
( SELECT o.id, o.nazwisko||' '||o.imie1 dane, w.szef
FROM osoby o JOIN zatrudnienia z ON o.id=z.id_os JOIN wydzialy w ON
w.id=z.id_wydz
WHERE z.do IS NULL);
SELECT p2.*,p1.id id_szefa,p1.dane Dane_szefa,p1.szef szef_szefa
FROM pracownik p1 JOIN pracownik p2 ON p2.szef=p1.id
ORDER BY p1.dane;
20. Transakcje
W iSQL*Plus możemy ustawić parametr autocommit na automatyczne zatwierdzanie po każdym poleceniu INSERT,
UPDATE i DELETE poleceniem:
SET autocommit ON
Wyłączenie automatycznego zatwierdzania:
SET autocommit OFF
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 15 –
Przykład 1.
SAVEPOINT t1;
UPDATE pensje
SET pensja=pensja*1.2
WHERE pensja<1000;
ROLLBACK;
lub
ROLLBACK t1;
Przykład 2.
SAVEPOINT t1;
UPDATE pensje
SET pensja=pensja*1.2
WHERE pensja<1000;
COMMIT;
21. Materialized views - widoki zmaterializowane
Dla ilustracji omawianych obiektów utwórzmy następującą tabelę:
DROP TABLE test;
CREATE TABLE test (id NUMBER(3) PRIMARY KEY, nazwisko VARCHAR2(15));
INSERT INTO test VALUES(1,'x');
COMMIT;
Usunięcie widoku zmaterializowanego wykonuje się poleceniem:
DROP SNAPSHOT s_test;
Utworzenie logu dla widoku zmaterializowanego wykonuje się poleceniem:
CREATE SNAPSHOT LOG ON test;
Utworzenie widoku zmaterializowanego wykonuje się poleceniem:
CREATE SNAPSHOT s_test
REFRESH FAST
START WITH sysdate
NEXT SYSDATE + 1/(24*60)
WITH PRIMARY KEY
AS SELECT * FROM test;
/* odświeżanie szybkie */
/* czas następnego odświeżania */
/* informacja dla logu */
Sprawdzenie działania widoku zmaterializowanego można dokonać wykonując następujące polecenia:
SELECT * FROM s_test;
INSERT INTO test VALUES(2,’y’);
SELECT * FROM s_test;
INSERT INTO test VALUES(3,’z’);
COMMIT;
SELECT * FROM s_test;
Przykład. Utwórzmy inny widok zmaterializowany i prześledźmy jego działanie.
DROP SNAPSHOT s_test;
DROP SNAPSHOT LOG ON test;
CREATE SNAPSHOT LOG ON test;
CREATE SNAPSHOT s_test
REFRESH FAST
START WITH sysdate
NEXT SYSDATE + 1/(24*60)
WITH PRIMARY KEY
FOR UPDATE
AS SELECT * FROM test;
SELECT * FROM s_test;
INSERT INTO s_test VALUES (4,'w');
/* możliwe jest manipulowanie danymi w widoku */
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 16 –
COMMIT;
SELECT * FROM s_test;
COMMIT;
/* nie widać zmian w tabeli oryginalnej*/
SELECT * FROM test;
W Oracle są mechanizmy (procedury), które umożliwiają zmiany w tabeli oryginalnej, gdy zostały dokonane zmiany
w widoku zmaterializowanym. Jest to bardziej skomplikowane niż odświeżanie w widoku zmaterializowanym.
Przykład. Utwórzmy widok zmaterializowany zawierający dane osobowe osób aktualnie zatrudnionych i prześledźmy jego
działanie.
DROP SNAPSHOT s_osoby;
DROP SNAPSHOT LOG ON osoby;
CREATE SNAPSHOT LOG ON osoby;
CREATE SNAPSHOT s_osoby
REFRESH COMPLETE
/* odświeżanie całkowite */
START WITH sysdate
NEXT SYSDATE + 1/(24*60)
WITH ROWID
/* informacja dla logu */
AS
SELECT o.*
FROM osoby o,zatrudnienia z
WHERE o.id=z.id_os AND z.do IS NULL;
SELECT * FROM s_osoby;
22. Database Link
Usunięcie istniejącego linku do innej instancji wykonuje się poleceniem:
DROP DATABASE LINK x;
Utworzenie nowego linku do innej instancji wykonuje się poleceniem:
CREATE DATABASE LINK x
CONNECT TO kadry IDENTIFIED BY kadry
USING 'bazaxp';
gdzie 'bazaxp' jest nazwą instancji wpisaną w pliku tnsname.ora.
Sposób odwołania do obiektu w instancji, do której stworzony jest link ilustrują następujące przykłady:
SELECT * FROM osoby@x;
CREATE VIEW v_osoby
AS SELECT * FROM osoby@x;
SELECT
* from s_osoby;
Informacje o linkach użytkownika można znaleźć w perspektywie USER_DB_LINKS
23. Klastry
Kasowanie klastra wykonuje się następującym poleceniem:
DROP CLUSTER k_test
INCLUDING TABLES CASCADE CONSTRAINTS;
Tworzenie klastra wykonuje się następującym poleceniem:
CREATE CLUSTER k_test ( m CHAR(2));
Tworzenie indeksu na klastrze wykonuje się następującym poleceniem:
CREATE INDEX idx_k_test ON CLUSTER k_test;
Tworzenie tabeli na klastrze wykonuje się następującym poleceniem:
CREATE TABLE p_test_k
(
id NUMBER(5) PRIMARY KEY,
id_klienta NUMBER(5) NOT NULL,
rok NUMBER(5) NOT NULL,
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 17 –
miesiac CHAR(2) NOT NULL CHECK(miesiac IN
('01','02','03','04','05','06','07','08','09','10','11','12')),
kwota NUMBER(8,2) NOT NULL
)
CLUSTER k_test(miesiac);
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
p_test_k
p_test_k
p_test_k
p_test_k
VALUES(1,3,2000,'01',1000);
VALUES(2,2,2001,'01',1500);
VALUES(3,3,2001,'05',1700);
VALUES(4,5,2004,'02',1900);
SELECT * FROM p_test_k;
24. Tabele partycjonowane
24.1. Tabela partycjonowana według BY RANGE …
Przykładowa tabela partycjonowana:
DROP TABLE p_test;
CREATE TABLE p_test
(
id NUMBER(5) PRIMARY KEY,
id_klienta NUMBER(5) NOT NULL,
rok NUMBER(5) NOT NULL,
miesiac CHAR(2) NOT NULL CHECK(miesiac IN
('01','02','03','04','05','06','07','08','09','10','11','12')),
kwota NUMBER(8,2) NOT NULL
)
PARTITION BY RANGE(rok,miesiac)
(
PARTITION p_2001_01 VALUES LESS THAN (2001,'01') TABLESPACE users,
PARTITION nadmiar VALUES LESS THAN (maxvalue,maxvalue) TABLESPACE users
);
Na tabeli tej tworzymy indeksy:
•
Indeks lokalny bez prefiksu
CREATE INDEX idx_klient
ON p_test (id_klienta)
LOCAL;
•
Indeks lokalny
iesiąc wany
CREATE BITMAP INDEX idx_rok_miesiac
ON p_test (rok,miesiac)
LOCAL;
Wstawianie przykładowych wierszy:
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
p_test
p_test
p_test
p_test
VALUES(1,3,2000,'01',1000);
VALUES(2,2,2001,'01',1500);
VALUES(3,3,2001,'05',1700);
VALUES(4,5,2004,'02',1900);
SELECT z partycji:
SELECT * FROM p_test;
SELECT * FROM p_test PARTITION (p_2001_01);
SELECT * FROM p_test PARTITION (nadmiar);
Podział partycji:
ALTER TABLE p_test
SPLIT PARTITION nadmiar
AT (2001,'07' )
INTO
(
PARTITION p_2001_07,
PARTITION nadmiar
);
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 18 –
SELECT z partycji:
SELECT * FROM p_test PARTITION (p_2001_01);
SELECT * FROM p_test PARTITION (p_2001_07);
SELECT * FROM p_test PARTITION (nadmiar);
Podział partycji:
ALTER TABLE p_test
SPLIT PARTITION p_2001_07
AT (2001,'04' )
INTO
(
PARTITION p_2001_04,
PARTITION p_2001_07
);
SELECT z partycji:
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
p_test
p_test
p_test
p_test
PARTITION
PARTITION
PARTITION
PARTITION
(p_2001_01);
(p_2001_04);
(p_2001_07);
(nadmiar);
Informacje o partycjach:
SELECT * FROM user_part_tables;
24.2. Tabela partycjonowana według BY HASH …
Przykładowa tabela partycjonowana:
DROP TABLE p_marki;
CREATE TABLE p_marki
(
id
NUMBER(5),
marka_samochodu VARCHAR(15)
)
PARTITION BY HASH(id)
(
PARTITION p1,
PARTITION p2,
PARTITION p3 TABLESPACE users,
PARTITION p4 TABLESPACE users
);
Wstawianie przykładowych wierszy:
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
p_marki
p_marki
p_marki
p_marki
p_marki
p_marki
p_marki
p_marki
VALUES(1,'Opel');
VALUES(2,'Ford');
VALUES(3,'Fiat');
VALUES(4,'Skoda');
VALUES(5,'Mercedes');
VALUES(6,'BMW');
VALUES(7,'Subaru');
VALUES(8,'Toyota');
SELECT z partycji:
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
p_marki
p_marki
p_marki
p_marki
PARTITION(p1);
PARTITION(p2);
PARTITION(p3);
PARTITION(p4);
25. Podstawowe wiadomości z PL/SQL - Bloki, procedury i funkcje
SET SERVEROUTPUT ON
PROMPT ==============================================================
BEGIN
UPDATE PENSJE
SET PENSJA=PENSJA*1;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
END;
/
IF SQL%ROWCOUNT>3 THEN DBMS_OUTPUT.PUT_LINE('WIĘCEJ NIŻ 3');
END IF;
PROMPT ==============================================================
DECLARE
TYPE R_PENSJE IS RECORD
(R_ID_OS NUMBER,
R_PENSJA NUMBER);
DANE R_PENSJE;
CURSOR KR IS
SELECT ID_OS,PENSJA FROM PENSJE;
BEGIN
OPEN KR;
LOOP
FETCH KR INTO DANE;
EXIT WHEN KR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(DANE.R_PENSJA);
END LOOP;
END;
/
PROMPT ==============================================================
DECLARE
SUMA NUMBER;
CURSOR KR IS
SELECT * FROM PENSJE WHERE DO IS NULL;
DANE KR%ROWTYPE;
BEGIN
SUMA:=0;
FOR DANE IN KR
LOOP
SUMA:=SUMA+DANE.PENSJA;
END LOOP;
DBMS_OUTPUT.PUT_LINE(SUMA);
END;
/
PROMPT ==============================================================
DECLARE
TYPE R_PENSJE IS RECORD
(R_ID_OS NUMBER,
R_PENSJA NUMBER);
DANE R_PENSJE;
SUMA NUMBER(10,2):=0;
BEGIN
FOR DANE IN (SELECT ID_OS,PENSJA FROM PENSJE WHERE DO IS NULL)
LOOP
SUMA:=SUMA+DANE.PENSJA;
END LOOP;
DBMS_OUTPUT.PUT_LINE('SUMA='||SUMA);
END;
/
PROMPT ==============================================================
DROP FUNCTION F;
PROMPT ==============================================================
CREATE OR REPLACE FUNCTION F(X NUMBER) RETURN NUMBER
IS
Y NUMBER;
BEGIN
Y:=X**X;
RETURN Y;
END;
/
PROMPT ==============================================================
VARIABLE Z NUMBER
EXECUTE :Z:=F(2)
PRINT Z
- 19 –
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 20 –
PROMPT ==============================================================
BEGIN
DBMS_OUTPUT.PUT_LINE(F(4));
END;
/
PROMPT ==============================================================
SELECT * FROM PENSJE WHERE DO IS NULL;
DECLARE
CURSOR C_PENSJE IS SELECT * FROM PENSJE
WHERE DO IS NULL AND PENSJA = (SELECT MIN(PENSJA) FROM PENSJE WHERE DO IS
NULL)
FOR UPDATE OF PENSJA NOWAIT;
N_PENSJE C_PENSJE%ROWTYPE;
BEGIN
FOR N_PENSJE IN C_PENSJE
LOOP
UPDATE PENSJE
SET PENSJA = PENSJA*1 WHERE CURRENT OF C_PENSJE;
END LOOP;
END;
/
PROMPT ==============================================================
VARIABLE Z NUMBER
SET SERVEROUTPUT ON
PROMPT ==============================================================
CREATE OR REPLACE PROCEDURE PR1(PAR1 IN NUMBER DEFAULT 10,PAR2 IN OUT NUMBER)
IS
X NUMBER;
BEGIN
PAR2:=PAR2+PAR1;
END;
/
PROMPT ==============================================================
BEGIN
:Z:=100;
PR1(50,:Z);
END;
/
PRINT Z
PROMPT ==============================================================
CREATE OR REPLACE FUNCTION F1(PAR1 IN NUMBER DEFAULT 1000, PAR2 IN OUT NUMBER)
RETURN NUMBER
IS
X NUMBER;
BEGIN
X:=PAR1*PAR1;
PAR2:=PAR2+PAR1+X;
RETURN PAR2;
END;
/
PROMPT ==============================================================
VARIABLE W NUMBER;
BEGIN
:Z:=1000;
:W:=F1(200,:Z);
END;
/
PRINT Z
PRINT W
PROMPT ==============================================================
EXECUTE :W:=F1(100,:Z)
PRINT W
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
PROMPT ==============================================================
EXECUTE PR1(50,:Z);
PRINT Z
PROMPT ==============================================================
DECLARE
SQL_TEMP VARCHAR2(200);
BEGIN
SQL_TEMP:='DROP TABLE TEST';
EXECUTE IMMEDIATE SQL_TEMP;
SQL_TEMP:='CREATE TABLE TEST (ID NUMBER)';
EXECUTE IMMEDIATE SQL_TEMP;
INSERT INTO TEST VALUES(1);
COMMIT;
END;
/
PROMPT ==============================================================
SELECT * FROM TEST;
26. Wyzwalacze (trigery)
DROP SEQUENCE l_pe;
CREATE SEQUENCE l_pe
INCREMENT BY 1
START WITH 60;
DROP TRIGGER t_i_u_osoby;
CREATE OR REPLACE TRIGGER t_i_u_osoby
BEFORE INSERT OR UPDATE ON osoby
FOR EACH ROW
BEGIN
:NEW.nazwisko:=InitCap(:NEW.nazwisko);
:NEW.imie1:=InitCap(:NEW.imie1);
:NEW.imie2:=InitCap(:NEW.imie2);
:NEW.plec:=InitCap(:NEW.plec);
END;
/
DROP TRIGGER t_i_pensje;
CREATE OR REPLACE TRIGGER t_i_pensje
BEFORE INSERT ON pensje
FOR EACH ROW
BEGIN
SELECT l_pe.NEXTVAL INTO :NEW.id FROM DUAL;
:NEW.od:=SYSDATE;
UPDATE pensje
SET do=SYSDATE-1
WHERE pensje.id_os=:NEW.id_os AND pensje.do IS NULL;
END;
/
INSERT INTO pensje
VALUES (null,3,500,SYSDATE,NULL);
SELECT * FROM pensje;
- 21 –
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 22 –
27. Przykładowe pytania z SQL
1. Wybrać wszystkie dane osób o nazwisku zawierającym wewnątrz literę a.
2. Wyznaczyć dane osobowe osób, które w nazwisku posiadają na drugie pozycji literę o.
3. Wybrać dane osobowe i w miejsce brakującego drugiego imienia wpisać tekst ‘brak’.
4. Wybrać różne nazwiska i wyświetlić je dużymi literami.
5. Wypisać różne nazwiska z tabeli Osoby wyrównane do prawej strony (20 znaków).
6. Wypisać różne drugie litery z nazwiska w tabeli Osoby.
7. Wybrać dane osobowe osób, których nazwiska wpisane są małymi literami.
8. Wybrać id,nazwisko,imie1, pleć tak, aby zamiast ‘K’ wyświetlało ‘kobieta, a zamiast ‘M’ ‘mężczyzna’.
9. Wybrać id,nazwisko,imie1 oraz aktualną pensję.
10. Wyświetlić dane osobowe wszystkich osób zatrudnionych nie posiadających aktualnej pensji.
11. Wybrać wszystkie dane osób zatrudnionych aktualnie pracujące wraz z nazwą wydziału.
12. Wybrać wszystkie dane osób zatrudnionych na wydziale fizyka już niepracujących.
13. Wybrać dane osobowe osób urodzonych po 1/01/1990 roku.
14. Wybrać dane osób posiadających aktualną pensję między 1500 i 2000 zł.
-----------------------------------------------------------------------------------------------------------------------------------------------------------15. Skasować relacje Autorzy i Tytuly bez ważności kolejności kasowania. Utworzyć dwie relacje Autorzy(id, nazwisko,
imie) i Tytuly(id,tytul,id_os) z kluczami głównymi na atrybutach id, kluczem obcym na id_os i wszystkimi atrybutami
wymagalnymi. Dla atrybutu nazwisko musi być ustawiony warunek, aby wprowadzana wartość miała pierwszą literę
dużą a pozostałe małe. Wstawić po jednym rekordzie do każdej relacji.
-----------------------------------------------------------------------------------------------------------------------------------------------------------16. Skasować relacje Aktorzy i Filmy bez ważności kolejności kasowania. Utworzyć dwie relacje Aktorzy(id, nazwisko,
imie) i Filmy(id,tytul,id_ak) z kluczami głównymi na atrybutach id, kluczem obcym na id_ak i wszystkimi atrybutami
wymagalnymi. Dla atrybutu tytul musi być ustawiony warunek, aby wprowadzana wartość miała wszystkie litery duże.
Wstawić po jednym rekordzie do każdej relacji.
-----------------------------------------------------------------------------------------------------------------------------------------------------------17. Wybrać osoby aktualnie pracujące uporządkowane według atrybutów plec i nazwisko oraz wyświetlić w postaci:
DANE
Duda Barbara
...................
PLEĆ
kobieta
...............
------------------------------------------------------------------------------------------------------------------------------------------------------------18. Wyznaczyć średnią ilości dni pracy aktualnych pracowników na poszczególnych wydziałach i wyświetlić w postaci:
NAZWA
fizyka
.......
ŚREDNIA
1152
........
------------------------------------------------------------------------------------------------------------------------------------------------------------19. Wyznaczyć średnią pensję aktualnie pracujących na każdym wydziale i wyświetlić w postaci:
NAZWA
fizyka
........
ŚREDNIA
2400
..............
------------------------------------------------------------------------------------------------------------------------------------------------------------20. Na którym wydziale pracuje aktualnie najwięcej osób i wyświetlić w postaci:
NAZWA
fizyka
matematyka
ILOSC
3
3
------------------------------------------------------------------------------------------------------------------------------------------------------------21. Wybrać najstarszą osobę aktualnie pracującą i wyświetlić w postaci:
DANE
Duda Barbara
------------------------------------------------------------------------------------------------------------------------------------------------------------22. Utworzyć widok(perspektywę) Aktualna_pensja(nazwisko,imie1,pensja)dla osób aktualnie zatrudnionych.
NAZWISKO
kot
........
IMIE1
Adam
.......
PENSJA
1300
.......
------------------------------------------------------------------------------------------------------------------------------------------------------------23. Wybrać osoby, które nie otrzymały jeszcze podwyżki i wyświetlić w postaci:
ID
2
.........
DANE
kot Adam
......
------------------------------------------------------------------------------------------------------------------------------------------------------------24. Wyświetlić wszystkie dane osób, które posiadają nazwisko podane przez zmienną lokalną (bez względu na wielkość
liter).
ID
3
NAZWISKO
norek
IMIE1
Tadeusz
IMIE2
D_UR
1982/10/23
P
M
------------------------------------------------------------------------------------------------------------------------------------------------------------25. Wyświetlić dane wszystkich wydziałów, które wewnątrz nazwy zawierają literę 'a'.
ID
1
...
NAZWA
prawo
.....
SZEF
7
....
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 23 –
26. Wybrać osoby już niepracujące uporządkowane według atrybutów nazwisko i imie1 oraz wyświetlić w postaci:
DANE
Kowalska Ewa
.........
UWAGA
Nie pracuje
............
------------------------------------------------------------------------------------------------------------------------------------------------------------27. Wyznaczyć średnią wieku (w pełnych dniach) aktualnie pracujących pracowników dla każdej płci i wyświetlić w postaci:
P
K
M
ŚREDNIA
8873
7956
------------------------------------------------------------------------------------------------------------------------------------------------------------28. Wyznaczyć średnią pensję aktualnie pracujących według płci i wyświetlić w postaci:
P
K
M
ŚREDNIA
2275
1600
------------------------------------------------------------------------------------------------------------------------------------------------------------29. Na którym wydziale pracuje aktualnie najmniej osób i wyświetlić w postaci:
NAZWA
prawo
ILOSC
2
------------------------------------------------------------------------------------------------------------------------------------------------------------30. Wybrać najmłodszą osobę już niepracującą i wyświetlić w postaci:
DANE
lis Jan
------------------------------------------------------------------------------------------------------------------------------------------------------------31. Utworzyć widok(perspektywę) Aktualny_wydzial(nazwisko,imie1,nazwa)dla osób aktualnie zatrudnionych.
NAZWISKO
kot
....
IMIE1
Adam
....
NAZWA
matematyka
.....
------------------------------------------------------------------------------------------------------------------------------------------------------------32. Wybrać osoby, które miały już podwyżki i wyświetlić w postaci:
ID
3
......
DANE
norek Tadeusz
.........
------------------------------------------------------------------------------------------------------------------------------------------------------------33. Wyświetlić dane wszystkich wydziałów, które posiadają nazwę podaną przez zmienną globalną (bez względu na wielkość
liter).
ID
1
NAZWA
prawo
SZEF
7
------------------------------------------------------------------------------------------------------------------------------------------------------------34. Wyświetlić dane wszystkich osób, które urodziły się po 01.01.1983 roku.
ID
8
9
NAZWISKO
Duda
....
IMIE1
Barbara
....
IMIE2
D_UR
1984/12/20
....
P
K
K
------------------------------------------------------------------------------------------------------------------------------------------------------------35. Wyświetlić dane wszystkich wydziałów, które wewnątrz nazwy zawierają literę 'i'.
ID
1
...
NAZWA
prawo
.....
SZEF
7
....
------------------------------------------------------------------------------------------------------------------------------------------------------------36. Wyznaczyć średnią pensję aktualnie pracujących na każdym wydziale i wyświetlić w postaci:
NAZWA
fizyka
........
ŚREDNIA
2400
..............
------------------------------------------------------------------------------------------------------------------------------------------------------------37. Wybrać najstarszą osobę aktualnie pracującą i wyświetlić w postaci:
DANE
Duda Barbara
------------------------------------------------------------------------------------------------------------------------------------------------------------38. Wybrać osoby aktualnie pracujące uporządkowane według atrybutów plec i nazwisko oraz wyświetlić w postaci:
DANE
Duda Barbara
...................
PLEĆ
kobieta
...............
------------------------------------------------------------------------------------------------------------------------------------------------------------39. Wyznaczyć średnią ilości dni pracy aktualnych pracowników na poszczególnych wydziałach i wyświetlić w postaci:
NAZWA
fizyka
.......
ŚREDNIA
1152
........
------------------------------------------------------------------------------------------------------------------------------------------------------------40. Wyświetlić wszystkie dane osób, które posiadają nazwisko podane przez zmienną lokalną (bez względu na wielkość
liter).
ID
3
NAZWISKO
norek
IMIE1
Tadeusz
IMIE2
D_UR
1982/10/23
P
M
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 24 –
41. Na którym wydziale pracuje aktualnie najwięcej osób i wyświetlić w postaci:
NAZWA
fizyka
matematyka
ILOSC
3
3
------------------------------------------------------------------------------------------------------------------------------------------------------------42. Utworzyć widok(perspektywę) Aktualna_pensja(nazwisko,imie1,pensja)dla osób aktualnie zatrudnionych.
NAZWISKO
kot
........
IMIE1
Adam
.......
PENSJA
1300
.......
------------------------------------------------------------------------------------------------------------------------------------------------------------43. Wybrać osoby, które nie otrzymały jeszcze podwyżki i wyświetlić w postaci:
ID
2
.........
DANE
kot Adam
......
------------------------------------------------------------------------------------------------------------------------------------------------------------44. Wyznaczyć średnią pensję aktualnie pracujących według płci i wyświetlić w postaci:
P
K
M
ŚREDNIA
2275
1600
------------------------------------------------------------------------------------------------------------------------------------------------------------45. Wybrać najmłodszą osobę już niepracującą i wyświetlić w postaci:
DANE
lis Jan
------------------------------------------------------------------------------------------------------------------------------------------------------------46. Wybrać osoby już niepracujące uporządkowane według atrybutów nazwisko i imie1 oraz wyświetlić w postaci:
DANE
Kowalska Ewa
.........
UWAGA
Nie pracuje
............
------------------------------------------------------------------------------------------------------------------------------------------------------------47. Wyświetlić dane wszystkich osób, które urodziły się po 01.01.1983 roku.
ID
8
9
NAZWISKO
Duda
....
IMIE1
Barbara
....
IMIE2
D_UR
1984/12/20
....
P
K
K
------------------------------------------------------------------------------------------------------------------------------------------------------------48. Wyznaczyć średnią wieku (w pełnych dniach) aktualnie pracujących pracowników dla każdej płci i wyświetlić w postaci:
P
K
M
ŚREDNIA
8873
7956
------------------------------------------------------------------------------------------------------------------------------------------------------------49. Na którym wydziale pracuje aktualnie najmniej osób i wyświetlić w postaci:
NAZWA
prawo
ILOSC
2
------------------------------------------------------------------------------------------------------------------------------------------------------------50. Utworzyć widok(perspektywę) Aktualny_wydzial(nazwisko,imie1,nazwa)dla osób aktualnie zatrudnionych.
NAZWISKO
kot
....
IMIE1
Adam
....
NAZWA
matematyka
.....
------------------------------------------------------------------------------------------------------------------------------------------------------------51. Wybrać osoby, które miały już podwyżki i wyświetlić w postaci:
ID
3
......
DANE
norek Tadeusz
.........
------------------------------------------------------------------------------------------------------------------------------------------------------------52. Wyświetlić dane wszystkich wydziałów, które posiadają nazwę podaną przez zmienną globalną (bez względu na wielkość
liter).
ID
1
...
NAZWA
prawo
.....
SZEF
7
....
------------------------------------------------------------------------------------------------------------------------------------------------------------53. Wyznaczyć dane osobowe szefa mającego największą aktualną pensję i wyświetlić w postaci:
DANE
Lis Anna
PENSJA
2275
------------------------------------------------------------------------------------------------------------------------------------------------------------54. Wybrać osoby posiadające aktualną pensję większą od pensji swojego szefa i wyświetlić w postaci:
DANE
Duda Barbara
...................
PENSJA
1234
...............
------------------------------------------------------------------------------------------------------------------------------------------------------------55. Wyznaczyć wydział, na którym suma pensji jest największa i wyświetlić w postaci:
NAZWA
fizyka
.......
SUMA
2450
........
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 25 –
56. Wyznaczyć dane osobowe najstarszej kobiety i najstarszego mężczyzny aktualnie pracujących i wyświetlić w postaci:
DANE
Lis Anna
........
------------------------------------------------------------------------------------------------------------------------------------------------------------57. Na którym wydziale pracuje aktualnie najwięcej kobiet i wyświetlić w postaci:
NAZWA
fizyka
matematyka
ILOSC
2
2
------------------------------------------------------------------------------------------------------------------------------------------------------------58. Wybrać wydział, który ma najstarszego szefa aktualnie pracującego i wyświetlić w postaci:
NAZWA
fizyka
........
------------------------------------------------------------------------------------------------------------------------------------------------------------59. Utworzyć widok(perspektywę) Aktualny_szef(nazwisko,imie1,wydzial).
NAZWISKO
kot
........
IMIE1
Adam
.......
WYDZIAL
fizyka
.......
------------------------------------------------------------------------------------------------------------------------------------------------------------60. Wybrać osoby, które otrzymały podwyżki i wyświetlić w postaci:
ID
2
.........
DANE
kot Adam
......
------------------------------------------------------------------------------------------------------------------------------------------------------------61. Wyświetlić wszystkie dane osób, które posiadają najkrótsze nazwisko .
ID
3
NAZWISKO
norek
IMIE1
Tadeusz
IMIE2
D_UR
1982/10/23
P
M
------------------------------------------------------------------------------------------------------------------------------------------------------------62. Wyświetlić dane wszystkich wydziałów, które zatrudniają najwięcej osób.
ID
1
...
NAZWA
prawo
.....
ILOSC
7
....
------------------------------------------------------------------------------------------------------------------------------------------------------------63. Wyznaczyć wydział, na którym suma pensji jest największa i wyświetlić w postaci:
NAZWA
fizyka
.......
SUMA
2450
........
------------------------------------------------------------------------------------------------------------------------------------------------------------64. Wyznaczyć dane osobowe szefa mającego największą aktualną pensję i wyświetlić w postaci:
DANE
Lis Anna
PENSJA
2275
------------------------------------------------------------------------------------------------------------------------------------------------------------65. Wyznaczyć dane osobowe najstarszej kobiety i najstarszego mężczyzny aktualnie pracujących i wyświetlić w postaci:
DANE
Lis Anna
........
------------------------------------------------------------------------------------------------------------------------------------------------------------66. Wyświetlić wszystkie dane osób, które posiadają najkrótsze nazwisko .
ID
3
NAZWISKO
norek
IMIE1
Tadeusz
IMIE2
D_UR
1982/10/23
P
M
------------------------------------------------------------------------------------------------------------------------------------------------------------67. Na którym wydziale pracuje aktualnie najwięcej kobiet i wyświetlić w postaci:
NAZWA
fizyka
matematyka
ILOSC
2
2
------------------------------------------------------------------------------------------------------------------------------------------------------------68. Wybrać wydział, który ma najstarszego szefa aktualnie pracującego i wyświetlić w postaci:
NAZWA
fizyka
........
------------------------------------------------------------------------------------------------------------------------------------------------------------69. Utworzyć widok(perspektywę) Aktualny_szef(nazwisko,imie1,wydzial).
NAZWISKO
kot
........
IMIE1
Adam
.......
WYDZIAL
fizyka
.......
------------------------------------------------------------------------------------------------------------------------------------------------------------70. Wybrać osoby, które otrzymały podwyżki i wyświetlić w postaci:
ID
2
.........
DANE
kot Adam
......
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2005/2006 – PODSTAWY BAZ DANYCH – ĆWICZENIA 1
- 26 –
71. Wyświetlić dane wszystkich wydziałów, które zatrudniają najwięcej osób.
ID
1
...
NAZWA
prawo
.....
ILOSC
7
....
------------------------------------------------------------------------------------------------------------------------------------------------------------72. Wybrać osoby posiadające aktualną pensję większą od pensji swojego szefa i wyświetlić w postaci:
DANE
Duda Barbara
...................
PENSJA
1234
...............
-------------------------------------------------------------------------------------------------------------------------------------------------------------