Ć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 ............... -------------------------------------------------------------------------------------------------------------------------------------------------------------