Materiały szkoleniowe. Podstawy języka SQL



Podobne dokumenty
Technologie baz danych

Zadania SELECT do schematu EDS (EMP, DEPT, SALGRADE)

Język SQL. Rozdział 2. Proste zapytania

Przestrzenne bazy danych Podstawy języka SQL

Podstawy języka SQL Co to jest SQL? Możliwości SQL SQL*Plus

Materiały szkoleniowe. Podstawy jzyka SQL. Prowadzcy Anna Pijanowska - Kunierz Paweł ołnierczyk

Systemy GIS Tworzenie zapytań w bazach danych

Marek Rakowski Podstawy zdania SELECT Strona 1 z 12

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

SQL (ang. Structured Query Language)

Autor: Joanna Karwowska

Autor: Joanna Karwowska

Wprowadzenie do języka SQL

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Podstawowe zapytania SELECT (na jednej tabeli)

3. Podzapytania, łączenie tabel i zapytań

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

Lista zadań nr 1. Bazy danych laboratorium. dr inż. Grzegorz Bazydło, dr inż. Jacek Tkacz

Wykład 7 Implementacja języka SQL w systemach baz danych Oracle sortowanie, funkcje agregujące i podzapytania.

Struktura bazy danych

TECHNOLOGIE BAZ DANYCH

Aliasy Select p.first_name, p.salary, j.job_title from employees p, jobs j where p.job_id=j.job_id;

Oracle11g: Wprowadzenie do SQL

Zadania z SQLa (MS SQL Server)

Wyświetl imie i nazwisko ucznia, nazwę przedmiotu z którego otrzymał ocenę niedostateczną. Nazwij tę kwerendę oceny niedostateczne.

Laboratorium Bazy danych SQL 3 1

Autor: Joanna Karwowska

Wykład 5. SQL praca z tabelami 2

Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych

Wprowadzenie do baz danych

SQL praca z tabelami 4. Wykład 7

Relacji między tabelami klucze obce. Schemat bazy danych, wczytanej z pliku create_tables.sql. Klucz obcy jako ograniczenie dla kolumny

PODZAPYTANIE (SUBSELECT)

Podstawy języka SQL cz. 2

BAZY DANYCH wprowadzenie do języka SQL. Opracował: dr inż. Piotr Suchomski

Lista zadań nr Wyświetlić imię i nazwisko dla każdego pracownika z departamentu DEP T NO o numerze 000.

Ćwiczenie zapytań języka bazy danych PostgreSQL

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Model relacyjny. Wykład II

Relacyjne bazy danych. Podstawy SQL

Wybór EUROPEAN będzie rozpoznawał dzień przed miesiącem, natomiast US miesiąc przed dniem.

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING

Kwerendy (zapytania) wybierające

Laboratorium Bazy danych SQL 2

Bazy danych 2. Wykład 4 Structured Query Language (SQL)

Projekt jest finansowany ze środków Unii Europejskiej, Europejskiego Funduszu Społecznego i budŝetu państwa. Studia Podyplomowe dla Nauczycieli

Funkcje analityczne SQL CUBE (1)

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

SQL - Structured Query Language. strukturalny język zapytań

Język SQL. Rozdział 5. Połączenia i operatory zbiorowe

Podstawy SQL. 1. Wyświetl całość informacji z relacji ZESPOLY. 2. Wyświetl całość informacji z relacji PRACOWNICY

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

Hurtownie danych - przegląd technologii

Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup

Relacyjne bazy danych. Podstawy SQL

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

Paweł Rajba

Technologie baz danych

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Bazy danych. Plan wykładu. Zależności funkcyjne. Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL.

Model relacyjny. Wykład II

Widok Connections po utworzeniu połączenia. Obszar roboczy

SQL Structured Query Language

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Grupowanie i funkcje agregacji

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Standard SQL/XML. Wprowadzenie do XQuery

Wprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

SQL w 24 godziny / Ryan Stephens, Arie D. Jones, Ron Plew. Warszawa, cop Spis treści

Wykład 6. SQL praca z tabelami 3

MS Excel 2007 Kurs zaawansowany Obsługa baz danych. prowadzi: Dr inż. Tomasz Bartuś. Kraków:

Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

Microsoft SQL Server Podstawy T-SQL

BAZY DANYCH algebra relacyjna. Opracował: dr inż. Piotr Suchomski

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Wymagania: Konstrukcja prostych zapytań w języku SQL, umiejętność wykorzystania funkcji wierszowych i agregujących.

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Bazy danych Access KWERENDY

Bazy danych. Polecenia SQL

Marek Rakowski Zdanie SELECT wybieranie danych z wielu tabel Strona 1 z 6

Projektowanie systemów baz danych

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Bazy danych. Plan wykáadu. Powtórzenie BCNF i 3NF. Nowa forma redundancji. Wykáad 6: Postaci normalne. SQL - zapytania záo*one.

sqlplus [ użytkownik [ / hasło ] ]

SQL DDL DML TECHNOLOGIE BAZ DANYCH. Wykład 5: Język DDL i DML. Małgorzata Krętowska

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Komunikacja z bazą danych psql

1 Wstęp do modelu relacyjnego

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Symfonia Produkcja. Kreator raportów. Wersja 2013

Transkrypt:

Materiały szkoleniowe Podstawy języka SQL

Spis treści Zawartość tabel wykorzystywanych na kursie... 4 Zawartość tabeli DEPT...5 Zawartość tabeli EMP...5 Zawartość tabeli SALGRADE...5 Budowa tabel wykorzystywanych na kursie...6 Relacyjny model danych... 8 Operatory relacyjne...9 Własności relacyjnej bazy danych...9 Przegląd języka SQL... 11 Zasady SQL...12 Ćwiczenia...25 Funkcje grupowe... 28 Stosowanie funkcji grupowych...29 Klauzula GROUP BY...30 Wybierane wyrażenia a funkcje grupowe...31 Klauzula HAVING...32 Kolejność występowania klauzul...33 Ćwiczenia...34 Wybieranie danych z wielu tabel... 36 Złączenie równościowe...37 Złączenia nierównościowe...38 Ćwiczenia...40 Inne metody łączenia tabel... 43 Złączenia zewnętrzne...44 Połączenie tabeli samej ze sobą...44 Operatory zbiorowe...45 Strona 2

Ćwiczenia... 48 Podzapytania... 50 Podzapytania zagnieżdżone... 51 Podzapytania zwracające jeden wiersz... 51 Podzapytania zwracające wiele wierszy... 52 Ćwiczenia... 57 Język definiowania danych... 58 Struktury danych ORACLE... 59 Tworzenie tabel... 59 Warunki integralności... 60 Tworzenie tabeli przez zapytanie... 65 Zmiana definicji tabeli... 66 Język manipulowania danymi... 69 Wstawianie wierszy... 70 Modyfikacja wierszy... 71 Usuwanie wierszy... 71 Transakcje... 72 Perspektywy... 75 Perspektywy... 76 Tworzenie perspektyw... 76 Usuwanie perspektywy... 77 Użytkownicy i uprawnienia... 78 Zarządzanie użytkownikami... 79 Uprawnienia w bazie Oracle... 80 Role... 83 Strona 3

Zawartość tabel wykorzystywanych na kursie Strona 4

Zawartość tabeli DEPT DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Zawartość tabeli EMP EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO --------- ---------- --------- --------- -------- --------- --------- --------- 7839 KING PRESIDENT 81/11/17 5000 10 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7900 JAMES CLERK 7698 81/12/03 950 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7369 SMITH CLERK 7902 80/12/17 800 20 7788 SCOTT ANALYST 7566 82/12/09 3000 20 7876 ADAMS CLERK 7788 83/01/12 1100 20 7934 MILLER CLERK 7782 82/01/23 1300 10 Zawartość tabeli SALGRADE GRADE LOSAL HISAL --------- --------- --------- 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 Strona 5

Budowa tabel wykorzystywanych na kursie Podczas kursu będziemy korzystać z uprzednio utworzonych tabel opisujących zatrudnionych w pewnej firmie, ich wynagrodzenia i miejsca pracy. Firma dzieli się na departamenty. Każdy pracownik należy do pewnej grupy zaszeregowania, w zależności od wysokości pensji, którą otrzymuje. Tabela DEPT tabela zawierająca wszystkie departamenty Kolumna DEPTNO DNAME LOC Opis Departament number unikalny numer departamentu Nazwa departamentu przechowywana w zapisie dużymi literami Lokalizacja departamentu (miasto w którym znajduje się departament) Tabela EMP wykaz wszystkich pracowników Kolumna EMPNO ENAME JOB MGR HIREDATE Opis Employee number unikalny numer pracownika Nazwisko pracownika przechowywane w zapisie dużymi literami Etat, stanowisko pracy Identyfikator szefa (czyli EMPNO we wierszu szefa) Data zatrudnienia SAL Pensja COMM Prowizja naliczona od początku roku, dotyczy pracowników zatrudnionych na stanowisku SALESMAN DEPTNO Numer departamentu w którym zatrudniony jest pracownik. Wartość w tym polu musi odpowiadać jednemu i tylko jednemu wierszowi w tabeli DEPT Strona 6

Tabela SALGRADE tabela widełek zaszeregowania Kolumna GRADE LOSAL HISAL Opis Numer grupy zaszeregowania LOW SALARY dolna granica widełek płacowych dla stawki zaszeregowania GRADE HIGH SALARY górna granica widełek Strona 7

Relacyjny model danych Strona 8

Relacyjna baza danych jest to zbiór dwuwymiarowych tabel. Z modelem relacyjnym powiązane są następujące pojęcia: tabela, kolumna, wiersz, pole. Model relacyjny opiera się na pojęciach zaczerpniętych z algebry. Pojęcia te to: relacja, operator działający na relacjach i dający w wyniku relacje. Relacje przedstawiane są w postaci tabel, zaś wybieranie danych z tabel to wynik działania operatorów relacyjnych na tych tabelach. Operatory relacyjne Wyróżniamy następujące operatory relacyjne: SELEKCJA PROJEKCJA ILOCZYN KARTEZJAŃSKI ZŁĄCZENIE SUMA ZBIOROWA CZĘŚĆ WSPÓLNA RÓŻNICA ZBIOROWA pobieranie danych z relacji, w wyniku otrzymujemy wszystkie wiersze, które spełniają zadany warunek operacja pobrania wszystkich wierszy, ale tylko wskazanych kolumn z tych wierszy wynik połączenia każdy z każdym wierszy z dwóch relacji połączenie dwóch relacji poprzez pewne kryterium łączace niektóre wiersze z obu relacji wszystkie wiersze z obu relacji wiersze wspólne dla obu relacji wiersze, które występują w jednej, a nie występują w drugiej relacji Własności relacyjnej bazy danych Relacyjna baza danych ma następujące własności: baza jest widziana przez użytkownika jako zbiór tabel, nazwy tabel w bazie muszą być unikalne, tabele składają się wierszy i kolumn, językiem służącym do operowania na bazie danych jest język nieproceduralny oparty na algebrze relacji. Obecnie standardem jest SQL. Strona 9

Tabele w relacyjnej bazie danych mają następujące własności: wiersze w tabeli muszą być różne, w tabeli nie ma kolumn o tej samej nazwie, kolejność wierszy jest nieokreślona, kolejność kolumn jest nieokreślona, wartości pól powinny być elementarne. Strona 10

Przegląd języka SQL Przegląd języka SQL Strona 11

SQL jest oparty na wyrażeniach języka angielskiego. Jest językiem deklaratywnym podajemy tylko, co należy wykonać, ale nie specyfikujemy w jaki sposób. Język SQL służy do następujących celów: specyfikowania zapytań, operowania danymi DML (Data Modification Language) wstawiania, modyfikowania i usuwania danych z bazy danych, definiowania danych DDL (Data Definition Language) dodawania do bazy nowych obiektów, sterowania danymi DCL (Data Control Language) określania praw dostępu do danych. Zasady SQL Zapisywanie poleceń SQL Polecenia SQL mogą być rozmieszczone w kilku liniach. Koniec polecenia SQL zaznacza się średnikiem. Zaleca się umieszczanie klauzul od nowej linii. Można używać tabulacji. Nie wolno dzielić słowa pomiędzy linie. Obojętne, czy używamy małych czy wielkich liter, chyba że sprawdzamy zawartość pola. Podstawowy blok zapytań SQL Za pomocą polecenia SELECT uzyskujemy informacje z bazy. Polecenie SELECT składa się co najmniej z klauzuli SELECT i klauzuli FROM. W klauzuli SELECT wymieniamy interesujące nas kolumny. W klauzuli FROM wskazujemy, skąd pobrać dane. Aby pobrać nazwiska pracowników oraz ich zawód, napiszemy: SELECT ENAME, JOB ; ENAME JOB ---------- --------- KING PRESIDENT BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN Strona 12

TURNER JAMES WARD FORD SMITH SCOTT ADAMS MILLER SALESMAN CLERK SALESMAN ANALYST CLERK ANALYST CLERK CLERK Nazwy kolumn oddzielamy przecinkami. Aby wybrać wszystko z danej tabeli wpisujemy * (gwiazdkę) zamiast listy kolumn. SELECT * ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---- ---------- --------- ---------- --------- ---------- ---------- ---------- 7839 KING PRESIDENT 81/11/17 5000 10 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7900 JAMES CLERK 7698 81/12/03 950 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7369 SMITH CLERK 7902 80/12/17 800 20 7788 SCOTT ANALYST 7566 82/12/09 3000 20 7876 ADAMS CLERK 7788 83/01/12 1100 20 7934 MILLER CLERK 7782 82/01/23 1300 10 W klauzuli SELECT mogę też być użyte: wyrażenia arytmetyczne, aliasy (nazwy zastępcze) kolumn, konkatenacja, literały. Wyrażenia arytmetyczne W wyrażeniu arytmetycznym mogą występować nazwy kolumn, stałe wartości liczbowe oraz operatory arytmetyczne: + dodawanie - odejmowanie * mnożenie / dzielenie Przykład SELECT ENAME, SAL*12 ; ENAME SAL*12 ---------- ---------- KING 60000 BLAKE 34200 Strona 13

CLARK 29400 JONES 35700 MARTIN 15000 ALLEN 19200 TURNER 18000 JAMES 11400 WARD 15000 FORD 36000 SMITH 9600 SCOTT 36000 ADAMS 13200 MILLER 15600 W wyrażeniach zachowywany jest następujący priorytet działań: mnożenie, dzielenie, dodawanie, odejmowanie. Np. w wyrażeniu arytmetycznym 250 +12*34 najpierw zostanie obliczona wartość wyrażenia 12*24, a do wyniku zostanie dodana wartość 250. Kolejność wykonywania działań można zmienić przy pomocy nawiasów. Na przykład w wyrażeniu arytmetycznym (250 +12)*34 najpierw zostanie obliczona wartość wyrażenia 250+12, a wynik zostanie pomnożony przez 34. Aliasy kolumn Domyślne nagłówki kolumn możemy zastąpić innymi nazwami, które będą bardziej znaczące. Można używać polskich liter. Alias podaje się bezpośrednio po nazwie kolumny, której nazwę chcemy zmienić. Spacje w aliasie nie są dopuszczane, można natomiast utworzyć alias ze spacją biorąc całość w podwójne apostrofy. Przykład SELECT ENAME NAZWISKO, SAL*12 WYNAGR, COMM PROWIZJA ; NAZWISKO WYNAGR PROWIZJA ---------- ---------- ---------- KING 60000 BLAKE 34200 CLARK 29400 JONES 35700 MARTIN 15000 1400 ALLEN 19200 300 TURNER 18000 0 JAMES 11400 WARD 15000 500 FORD 36000 SMITH 9600 SCOTT 36000 ADAMS 13200 MILLER 15600 Strona 14

Operator konkatenacji Operator konkatenacji ( ) pozwala na łączenie kolumny z kolumną, literałem, wyrażeniem arytmetycznym lub wartością stałą. Argumenty są łączone i tworzą jedna kolumnę wynikową. Aby połączyć kolumny EMPNO i ENAME i opatrzyć je tytułem PRACOWNIK, napiszemy: SELECT EMPNO ENAME PRACOWNIK ; PRACOWNIK -------------------------------------------------- 7839KING 7698BLAKE 7782CLARK 7566JONES 7654MARTIN 7499ALLEN 7844TURNER 7900JAMES 7521WARD 7902FORD 7369SMITH 7788SCOTT 7876ADAMS 7934MILLER Literały Oprócz kolumn na liście SELECT mogą znajdować się literały (ciągi znaków lub liczby). Wtedy dla każdego wiersza zostanie wypisana ta sama wartość literału: SELECT ENAME PRACOWNIK, ' PRACUJE W DEPARTAMENCIE', DEPTNO DEPARTAMENT ; PRACOWNIK 'PRACUJE W DEPARTAMENCIE' DEPARTAMENT ----------- ------------------------- ----------- KING 'PRACUJE W DEPARTAMENCIE' 10 BLAKE 'PRACUJE W DEPARTAMENCIE' 30 CLARK 'PRACUJE W DEPARTAMENCIE' 10 JONES 'PRACUJE W DEPARTAMENCIE' 20 MARTIN 'PRACUJE W DEPARTAMENCIE' 30 ALLEN 'PRACUJE W DEPARTAMENCIE' 30 TURNER 'PRACUJE W DEPARTAMENCIE' 30 JAMES 'PRACUJE W DEPARTAMENCIE' 30 WARD 'PRACUJE W DEPARTAMENCIE' 30 FORD 'PRACUJE W DEPARTAMENCIE' 20 SMITH 'PRACUJE W DEPARTAMENCIE' 20 SCOTT 'PRACUJE W DEPARTAMENCIE' 20 ADAMS 'PRACUJE W DEPARTAMENCIE' 20 MILLER 'PRACUJE W DEPARTAMENCIE' 10 Strona 15

Obsługa wartości NULL Jeśli wartość wiersza w kolumnie jest nieokreślona, to mówimy, że na ona wartość NULL. Nie jest to tożsame z wartością 0. Wartość wyrażenia w którym będzie występować wartość NULL również będzie NULL. Dlatego też wyrażenie SAL*12+COMM zwróci NULL tam, gdzie COMM było równe NULL. SELECT ENAME, SAL*12+COMM ; ENAME SAL*12+COM ---------- ---------- KING BLAKE CLARK JONES MARTIN 16400 ALLEN 19500 TURNER 18000 JAMES WARD 15500 FORD SMITH SCOTT ADAMS MILLER Aby w wyrażeniu potraktować wartość NULL jako wartość różną od NULL, trzeba użyć funkcji NVL. SELECT ENAME, SAL*12+NVL(COMM,0) ROCZNE_WYN ; ENAME ROCZNE_WYN ---------- ---------- KING 60000 BLAKE 34200 CLARK 29400 JONES 35700 MARTIN 16400 ALLEN 19500 TURNER 18000 JAMES 11400 WARD 15500 FORD 36000 SMITH 9600 SCOTT 36000 ADAMS 13200 MILLER 15600 W powyższym przykładzie wartości różne od NULL zachowują swoją wartość, zaś wartości NULL zostaną potraktowane jak 0. Drugi parametr funkcji NVL określa, na jaką wartość należy zamienić wartość NULL: NVL(DATA,'85/09/01') NVL(NUMBER, 10) NVL(MIASTO,'KRAKÓW') Strona 16

Eliminacja duplikatów Domyślnie wyświetlane są wyniki zapytania bez eliminowania powtarzających się wartości, np.: SELECT DEPTNO ; DEPTNO ---------- 10 30 10 20 30 30 30 30 30 20 20 20 20 10 Słowo kluczowe DISTINCT Eliminację powtarzających się wartości uzyskujemy stosując słowo kluczowe DISTINCT w klauzuli SELECT. SELECT DISTINCT DEPTNO ; DEPTNO ---------- 10 20 30 Można też zażądać wyspecyfikowania wzajemnie różnych list wartości poprzez podanie w klauzuli SELECT wielu nazw kolumn. Słowo kluczowe DISTINCT odnosi się do wszystkich nazw kolumn występujących w klauzuli SELECT. SELECT DISTINCT JOB, DEPTNO ; JOB DEPTNO --------- ---------- ANALYST 20 CLERK 10 CLERK 20 CLERK 30 MANAGER 10 Strona 17

MANAGER 20 MANAGER 30 PRESIDENT 10 SALESMAN 30 Klauzula ORDER BY Aby określić kolejność, w jakiej będą zwracane wyniki, należy użyć klauzuli ORDER BY (uporządkuj wg). Klauzula ORDER BY musi być ostatnią klauzulą polecenia SELECT. SELECT ENAME, JOB ORDER BY ENAME; ENAME JOB ---------- --------- ADAMS CLERK ALLEN SALESMAN BLAKE MANAGER CLARK MANAGER FORD ANALYST JAMES CLERK JONES MANAGER KING PRESIDENT MARTIN SALESMAN MILLER CLERK SCOTT ANALYST SMITH CLERK TURNER SALESMAN WARD SALESMAN Domyślnie dane są sortowane w porządku rosnącym (ASCENDING) od najmniejszych do największych liczb, od wcześniejszych do późniejszych dat, zaś ciągi znakowe są sortowane wg ustawień NLS (określanych przy tworzeniu bazy danych). Aby odwrócić kolejność sortowania należy użyć słowa DESC (DESCENDING) użytego bezpośrednio po nazwie kolumny wyspecyfikowanej w klauzuli ORDER BY. SELECT ENAME, JOB, HIREDATE ORDER BY HIREDATE DESC; ENAME JOB HIREDATE ---------- --------- --------- ADAMS CLERK 83/01/12 SCOTT ANALYST 82/12/09 MILLER CLERK 82/01/23 JAMES CLERK 81/12/03 FORD ANALYST 81/12/03 KING PRESIDENT 81/11/17 MARTIN SALESMAN 81/09/28 TURNER SALESMAN 81/09/08 CLARK MANAGER 81/06/09 BLAKE MANAGER 81/05/01 JONES MANAGER 81/04/02 WARD SALESMAN 81/02/22 ALLEN SALESMAN 81/02/20 SMITH CLERK 80/12/17 Strona 18

Można sortować według kilku kolumn, wtedy po słowie kluczowym ORDER BY należy podać nazwy kolumn, po których chcemy sortować. SELECT ENAME, JOB, DEPTNO ORDER BY DEPTNO, ENAME; ENAME JOB DEPTNO ---------- --------- ---------- CLARK MANAGER 10 KING PRESIDENT 10 MILLER CLERK 10 ADAMS CLERK 20 FORD ANALYST 20 JONES MANAGER 20 SCOTT ANALYST 20 SMITH CLERK 20 ALLEN SALESMAN 30 BLAKE MANAGER 30 JAMES CLERK 30 MARTIN SALESMAN 30 TURNER SALESMAN 30 WARD SALESMAN 30 Nazwy kolumn, po których sortujemy, muszą być wyspecyfikowane w klauzuli SELECT. Sortowanie dotyczy tylko wyniku zapytania wyświetlanego na ekranie. Dane w tabelach nie są sortowane. Klauzula WHERE Klauzula WHERE odpowiada operacji selekcji. Klauzula ta specyfikuje kryteria doboru wierszy. Klauzula WHERE, o ile jest, musi występować bezpośrednio po klauzuli FROM. Operatory w klauzuli WHERE mogą być dwojakiego rodzaju: operatory logiczne, operatory SQL. Operatory logiczne Dane znakowe i ciągi znaków w klauzuli WHERE muszą być ujęte w pojedyncze apostrofy. Przy porównywaniu znaków Oracle rozróżnia małe i wielkie litery. Strona 19

Aby wybrać nazwiska, zawód i numer departamentu dla wszystkich zatrudnionych na stanowisku CLERK, napiszemy: SELECT ENAME, JOB, DEPTNO WHERE JOB='CLERK'; ENAME JOB DEPTNO ---------- --------- ---------- JAMES CLERK 30 SMITH CLERK 20 ADAMS CLERK 20 MILLER CLERK 10 Aby wybrać wszystkich zatrudnionych po 01.01.1982r., napiszemy: SELECT ENAME, JOB, DEPTNO WHERE HIREDATE>'82/01/01' ENAME JOB DEPTNO ---------- --------- ---------- SCOTT ANALYST 20 ADAMS CLERK 20 MILLER CLERK 10 Można w klauzuli WHERE porównywać dla każdego wiersza wartości dwóch kolumn. Np. żeby wybrać wszystkich, którzy otrzymują wyższą prowizję niż pensję, napiszemy: SELECT ENAME, JOB, DEPTNO WHERE COMM>SAL; ENAME JOB DEPTNO ---------- --------- ---------- MARTIN SALESMAN 30 Operatory SQL Wyróżniamy 4 operatory SQL, działające na wszystkich typach danych: BETWEEN... AND, IN (lista), LIKE, IS NULL. Operator BETWEEN...AND Operator BETWEEN...AND służy do sprawdzenia, czy wartość znajduje się w podanym przedziale (wliczając w to krańce przedziału). Górna granica musi następować po dolnej. Strona 20

Aby wybrać wszystkich, którzy zarabiają od 1000 do 1500, wliczając w to tych, którzy zarabiają 1000 i 1500, napiszemy: SELECT ENAME, JOB, DEPTNO WHERE SAL BETWEEN 1000 AND 1500; ENAME JOB DEPTNO ---------- --------- ---------- MARTIN SALESMAN 30 TURNER SALESMAN 30 WARD SALESMAN 30 ADAMS CLERK 20 MILLER CLERK 10 Operator IN Operator IN służy do sprawdzania, czy dana wartość znajduje się na wyspecyfikowanej liście. Aby wybrać podwładnych osób o identyfikatorach 7839 i 7902, napiszemy: SELECT ENAME, JOB, DEPTNO WHERE MGR IN (7839,7902); ENAME JOB DEPTNO ---------- --------- ---------- BLAKE MANAGER 30 CLARK MANAGER 10 JONES MANAGER 20 SMITH CLERK 20 Dane znakowe występujące na liście należy ująć w pojedyncze apostrofy. Operator LIKE Operator LIKE służy do wybierania wartości odpowiadających podanemu wzorcowi. Wzorzec tworzą dwa specjalne symbole: % (znak procent) odpowiada dowolnemu ciągowi znaków, _ (znak podkreślenia) odpowiada dokładnie jednemu dowolnemu znakowi. Aby wybrać osoby, które jako drugą literę w nazwisku mają literę "A", napiszemy: SELECT ENAME, JOB, DEPTNO WHERE ENAME LIKE '_A%'; ENAME JOB DEPTNO ---------- --------- ---------- MARTIN SALESMAN 30 JAMES CLERK 30 WARD SALESMAN 30 Strona 21

Aby wybrać osoby, których nazwisko składa się z pięciu liter, napiszemy: SELECT ENAME, JOB, DEPTNO WHERE ENAME LIKE ' '; ENAME JOB DEPTNO ---------- --------- ---------- BLAKE MANAGER 30 CLARK MANAGER 10 JONES MANAGER 20 ALLEN SALESMAN 30 JAMES CLERK 30 SMITH CLERK 20 SCOTT ANALYST 20 ADAMS CLERK 20 Operator IS NULL Operator IS NULL służy do wyszukiwania wartości NULL. Aby wybrać dane o osobach, które nie posiadają szefa, napiszemy: SELECT ENAME, JOB, DEPTNO WHERE MGR IS NULL; ENAME JOB DEPTNO ---------- --------- ---------- KING PRESIDENT 10 Nie można napisać w klauzuli WHERE warunku MGR=NULL, gdyż wtedy Oracle nie wyszuka żadnych wartości. Operatory negacji Operatory negacji służą do zaprzeczania warunkom w klauzuli WHERE.!= nie jest równy (VAX, UNIX, PC) ^=, _= nie jest równy (IBM) <> nie jest równy (wszystkie systemy operacyjne) NOT kolumna= nie jest równy NOT kolumna> nie jest większy NOT BETWEEN nie jest w podanym przedziale NOT IN nie jest w zbiorze NOT LIKE nie jest zgodny z maską IS NOT NULL nie jest NULL Strona 22

Aby wybrać wszystkie osoby, które nie zarabiają więcej niż 2000, napiszemy: SELECT ENAME, SAL WHERE NOT SAL>2000; ENAME SAL ---------- ---------- MARTIN 1250 ALLEN 1600 TURNER 1500 JAMES 950 WARD 1250 SMITH 800 ADAMS 1100 MILLER 1300 Aby wybrać osoby, które nie otrzymują prowizji, napiszemy: SELECT ENAME, JOB, COMM WHERE COMM IS NOT NULL ENAME JOB COMM ---------- --------- ---------- MARTIN SALESMAN 1400 ALLEN SALESMAN 300 TURNER SALESMAN 0 WARD SALESMAN 500 Tworzenie złożonych kryteriów Do budowania warunków złożonych służą operatory AND (i) oraz OR (lub). Warunek (X AND Y) jest prawdziwy wtedy i tylko wtedy, gdy X jest prawdziwy i Y jest prawdziwy. Warunek (X OR Y) jest prawdziwy wtedy i tylko wtedy, gdy X jest prawdziwy lub Y jest prawdziwy. Operator AND ma większy priorytet niż operator OR. Aby wybrać wszystkich pracowników zatrudnionych na stanowisku 'MANAGER' i zarabiających więcej niż 2000, napiszemy: SELECT ENAME, JOB, SAL WHERE SAL>2000 AND JOB='MANAGER' NAME JOB SAL ---------- --------- ---------- BLAKE MANAGER 2850 CLARK MANAGER 2450 JONES MANAGER 2975 Ponieważ operator AND ma wyższy priorytet niż operator OR, to poniższy przykład znajdzie nam wszystkie osoby zatrudnione na stanowisku 'CLERK' oraz te osoby zatrudnione na stanowisku 'MANAGER', których zarobki przekraczają 1000. Strona 23

SELECT ENAME, JOB, SAL WHERE SAL>1000 AND JOB='MANAGER' OR JOB='CLERK'; ENAME JOB SAL ---------- --------- ---------- BLAKE MANAGER 2850 CLARK MANAGER 2450 JONES MANAGER 2975 JAMES CLERK 950 SMITH CLERK 800 ADAMS CLERK 1100 MILLER CLERK 1300 Poniższy przykład, w którym zastosowano nawiasy zmieniające kolejność wykonywania działań wybierze tylko osoby zatrudnione na stanowisku 'CLERK' lub na stanowisku 'MANAGER', które przy tym zarabiają więcej niż 1000. SELECT ENAME, JOB, SAL WHERE SAL>1000 AND (JOB='MANAGER' OR JOB='CLERK'); ENAME JOB SAL ---------- --------- ---------- BLAKE MANAGER 2850 CLARK MANAGER 2450 JONES MANAGER 2975 ADAMS CLERK 1100 MILLER CLERK 1300 Hierarchia operatorów W każdym wyrażeniu, o ile nawiasy nie wskazują inaczej, operacje są wykonywane począwszy od operatorów o najwyższym priorytecie. Jeśli dwa operatory o tym samym priorytecie występują obok siebie, to są one wykonywane od lewej do prawej. 1. =, <>, <=, >=, >,<, BETWEEN AND, IN, LIKE, IS NULL 2. NOT 3. AND 4. OR Aby zapis był bardziej przejrzysty i w celu uniknięcia błędów, zaleca się stosowanie nawiasów. Krótki opis poleceń właściwych dla SQL*Plus Pod SQL*Plus najczęściej uruchamiamy skrypty SQL-owe. Strona 24

Najczęściej używane polecenia: SPOOL plik; @plik ed plik SPOOL OFF DESC CONNECT EXIT wszystkie polecenia SQL do czasu wydania rozkazu SPOOL OFF będą zapisywane do pliku plik uruchomienie skryptu plik edycja pliku plik w domyślnym edytorze kończy wysyłanie danych do pliku wyświetla opis struktury tabeli zmiana podłączenia do bazy wyjście z programu Strona 25

Ćwiczenia 1.Wybierz wszystkie dane z tablicy SALGRADE. GRADE LOSAL HISAL --------- --------- --------- 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 2. Wybierz wszystkie dane z tablicy EMP. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO --------- ---------- --------- --------- -------- --------- --------- --------- 7839 KING PRESIDENT 81/11/17 5000 10 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7900 JAMES CLERK 7698 81/12/03 950 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7369 SMITH CLERK 7902 80/12/17 800 20 7788 SCOTT ANALYST 7566 82/12/09 3000 20 7876 ADAMS CLERK 7788 83/01/12 1100 20 7934 MILLER CLERK 7782 82/01/23 1300 10 3. Wybierz wszystkie dane o pracownikach, których zarobki mieszczą się w przedziale <1000,2000>. ENAME DEPTNO SAL ---------- --------- --------- MARTIN 30 1250 ALLEN 30 1600 TURNER 30 1500 WARD 30 1250 ADAMS 20 1100 MILLER 10 1300 4. Wybierz numery i nazwy departamentów, sortując według nazw departamentów. DEPTNO DNAME --------- -------------- 10 ACCOUNTING 40 OPERATIONS 20 RESEARCH 30 SALES Strona 26

5. Wybierz wszystkie, wzajemnie różne stanowiska pracy. JOB --------- ANALYST CLERK MANAGER PRESIDENT SALESMAN 6. Wybierz dane o pracownikach zatrudnionych w departamentach 10 i 20 w kolejności alfabetycznej ich nazwisk. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO --------- ---------- --------- --------- -------- --------- --------- --------- 7876 ADAMS CLERK 7788 83/01/12 1100 20 7782 CLARK MANAGER 7839 81/06/09 2450 10 7902 FORD ANALYST 7566 81/12/03 3000 20 7566 JONES MANAGER 7839 81/04/02 2975 20 7839 KING PRESIDENT 81/11/17 5000 10 7934 MILLER CLERK 7782 82/01/23 1300 10 7788 SCOTT ANALYST 7566 82/12/09 3000 20 7369 SMITH CLERK 7902 80/12/17 800 20 7. Wybierz nazwiska i stanowiska pracy wszystkich pracowników z departamentu 20 zatrudnionych na stanowisku CLERK. ENAME JOB ---------- --------- SMITH CLERK ADAMS CLERK 8. Wybierz następujące informacje o wszystkich pracownikach, którzy posiadają szefa. ENAME JOB SAL ---------- --------- --------- BLAKE MANAGER 2850 CLARK MANAGER 2450 JONES MANAGER 2975 MARTIN SALESMAN 1250 ALLEN SALESMAN 1600 TURNER SALESMAN 1500 JAMES CLERK 950 WARD SALESMAN 1250 FORD ANALYST 3000 SMITH CLERK 800 SCOTT ANALYST 3000 ADAMS CLERK 1100 MILLER CLERK 1300 9. Wybierz nazwiska i całkowite, roczne zarobki wszystkich pracowników. ENAME RENUMERATION ---------- ------------ KING 60000 BLAKE 34200 CLARK 29400 JONES 35700 MARTIN 16400 Strona 27

ALLEN 19500 TURNER 18000 JAMES 11400 WARD 15500 FORD 36000 SMITH 9600 SCOTT 36000 ADAMS 13200 MILLER 15600 10. Wybierz następujące dane o tych pracownikach, którzy zostali zatrudnieni w 1982 roku. ENAME DEPTNO HIREDATE ---------- --------- --------- SCOTT 20 09-DEC-82 MILLER 10 23-JAN-82 11. Wybierz nazwiska, roczną pensję oraz prowizję tych wszystkich pracowników, których miesięczna pensja przekracza prowizję. Wyniki posortuj według malejących zarobków. Jeśli dwóch lub więcej pracowników ma taką samą pensję, uporządkuj dane o nich według nazwisk zgodnie z alfabetem. ENAME ANNUAL_SAL COMM ---------- ---------- --------- ALLEN 19200 300 TURNER 18000 0 WARD 15000 500 12. Spowoduj wyświetlenie następujących wyników. Kto, gdzie, kiedy? ------------------------------------------------------------------------------- KING pracuje na stanowisku PRESIDENT w zespole 10 od 17-NOV-81 BLAKE pracuje na stanowisku MANAGER w zespole 30 od 01-MAY-81 CLARK pracuje na stanowisku MANAGER w zespole 10 od 09-JUN-81 JONES pracuje na stanowisku MANAGER w zespole 20 od 02-APR-81 MARTIN pracuje na stanowisku SALESMAN w zespole 30 od 28-SEP-81 ALLEN pracuje na stanowisku SALESMAN w zespole 30 od 20-FEB-81 TURNER pracuje na stanowisku SALESMAN w zespole 30 od 08-SEP-81 JAMES pracuje na stanowisku CLERK w zespole 30 od 03-DEC-81 WARD pracuje na stanowisku SALESMAN w zespole 30 od 22-FEB-81 FORD pracuje na stanowisku ANALYST w zespole 20 od 03-DEC-81 SMITH pracuje na stanowisku CLERK w zespole 20 od 17-DEC-80 SCOTT pracuje na stanowisku ANALYST w zespole 20 od 09-DEC-82 ADAMS pracuje na stanowisku CLERK w zespole 20 od 12-JAN-83 MILLER pracuje na stanowisku CLERK w zespole 10 od 23-JAN-82 Strona 28

Funkcje grupowe Strona 29

Funkcje grupowe służą do działania na grupach wierszy. Wynikiem funkcji grupowej jest pojedyncza wartość dla całej grupy. Jeśli nie wyspecyfikujemy inaczej, wszystkie wiersze tabeli są traktowane jako jedna grupa. Funkcja AVG ([DISTINCT ALL] wyrażenie) COUNT ([DISTINCT ALL] wyrażenie) MAX ([DISTINCT ALL] wyrażenie) MIN ([DISTINCT ALL] wyrażenie) STDDEV ([DISTINCT ALL] wyrażenie) SUM ([DISTINCT ALL] wyrażenie) VARIANCE ([DISTINCT ALL] wyrażenie) Wynik funkcji wartość średnia wyrażeń, NULL nie jest uwzględniane ilość wystąpień wartości wyrażeń różnych od NULL, gwiazdka (*) użyta w miejscu wyrażenia powoduje obliczenia ilości wszystkich wierszy łącznie z duplikatami i wartościami NULL maksymalna wartość wyrażenia minimalna wartość wyrażenia odchylenie standardowe wyrażeń, bez uwzględniania wartości NULL suma wartości wyrażeń, bez uwzględniania wartości NULL wariancja wyrażeń, bez uwzględniania wartości NULL Kwalifikator DISTINCT ogranicza działanie funkcji grupowych do różnych wartości argumentów. Kwalifikator ALL jest domyślny funkcje grupowe nie eliminują duplikatów. Argumentami funkcji grupowych są liczby, a w przypadku funkcji MAX, MIN i COUNT także daty, znaki i ciągi znaków. Wszystkie funkcje grupowe, za wyjątkiem COUNT(*) ignorują wartości NULL. Stosowanie funkcji grupowych Aby obliczyć średni zarobek w firmie, napiszemy: SELECT AVG(SAL) ; AVG(SAL) ---------- 2073,21429 Zwróćmy uwagę, że została zwrócona jedna wartość dla wszystkich wierszy. Cała firma jest tu traktowana jako jedna grupa. Strona 30

Można nałożyć na to polecenie warunek w klauzuli WHERE, np. aby znaleźć minimalny zarobek na stanowisku 'MANAGER', napiszemy: SELECT MIN(SAL) WHERE JOB='MANAGER'; MIN(SAL) ---------- 2450 Aby znaleźć, ilu pracowników pracuje w departamencie 10, napiszemy: SELECT COUNT(*) WHERE DEPTNO=10; COUNT(*) ---------- 3 Klauzula GROUP BY Do podzielenia wierszy tablicy na grupy używamy klauzuli GROUP BY. Pojedynczą grupę stanowią wszystkie wiersze, dla których wartości podane w klauzuli GROUP BY są identyczne. Aby obliczyć średnie zarobki w każdym departamencie, napiszemy: SELECT DEPTNO, AVG(SAL) GROUP BY DEPTNO; DEPTNO AVG(SAL) ---------- ---------- 10 2916,66667 20 2175 30 1566,66667 Przed grupowaniem możemy wyeliminować pewne wiersze za pomocą klauzuli WHERE: SELECT JOB, MAX(SAL) WHERE JOB<>'CLERK' GROUP BY JOB; JOB MAX(SAL) --------- ---------- ANALYST 3000 MANAGER 2975 PRESIDENT 5000 SALESMAN 1600 W klauzuli GROUP BY można podać kilka wyrażeń, wtedy wiersze będą grupowane w mniejszych grupach. Strona 31

Aby obliczyć minimalny zarobek w każdym departamencie w podziałem na stanowiska, napiszemy: SELECT DEPTNO, JOB, MIN(SAL) GROUP BY DEPTNO, JOB; DEPTNO JOB MIN(SAL) ---------- --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 3000 20 CLERK 800 20 MANAGER 2975 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 1250 Wybierane wyrażenia a funkcje grupowe Poniższe polecenie spowoduje obliczenie średnich zarobków w departamentach. Nie będzie jednak zbyt użyteczne, bo nie będzie widoczne, która średnia odpowiada któremu departamentowi. SELECT AVG(SAL) GROUP BY DEPTNO; AVG(SAL) ---------- 2916,66667 2175 1566,66667 Aby poprawić to polecenie, umieśćmy na liście wyboru klauzuli SELECT także numer departamentu: SELECT DEPTNO, AVG(SAL) GROUP BY DEPTNO; DEPTNO AVG(SAL) ---------- ---------- 10 2916,66667 20 2175 30 1566,66667 Na liście wyboru klauzuli SELECT mogą występować tylko i wyłącznie nazwy kolumn, które są przedmiotem działania klauzuli GROUP BY, chyba, że występują one jako argument funkcji grupującej. Strona 32

Klauzula HAVING Do wybierania interesujących nas grup służy klauzula HAVING. W klauzuli HAVING umieszczamy warunek wyrażony za pomocą funkcji grupowej. Aby wybrać średnie zarobki dla grup zawodowych, gdzie maksymalne zarobki są wyższe niż 2000, napiszemy: SELECT JOB, AVG(SAL) GROUP BY JOB HAVING MAX(SAL)>2000; JOB AVG(SAL) --------- ---------- ANALYST 3000 MANAGER 2758,33333 PRESIDENT 5000 Klauzula HAVING może poprzedzać klauzulę GROUP BY lub odwrotnie. Czasami to samo kryterium można wyrazić zarówno za pomocą klauzuli HAVING jak i klauzuli WHERE. SELECT JOB, AVG(SAL) HAVING JOB<>'CLERK' GROUP BY JOB; JOB AVG(SAL) --------- ---------- ANALYST 3000 MANAGER 2758,33333 PRESIDENT 5000 SALESMAN 1400 lub SELECT JOB, AVG(SAL) WHERE JOB<>'CLERK' GROUP BY JOB; JOB AVG(SAL) --------- ---------- ANALYST 3000 MANAGER 2758,33333 PRESIDENT 5000 SALESMAN 1400 W takiej sytuacji bardziej efektywne jest umieszczenie warunku w klauzuli WHERE. Strona 33

Kolejność występowania klauzul Wymagany porządek klauzul jest następujący: 1. SELECT lista wyrażeń 2. FROM tabela 3. WHERE warunek selekcji wierszy 4. HAVING warunek selekcji grup 5. ORDER BY wyrażenia 6. ; Strona 34

1. Znajdź minimalną pensje w firmie. MINIMUM --------- 800 Ćwiczenia 2. Znajdź minimalną, maksymalną i średnią pensję w firmie. MIN(SAL) MAX(SAL) AVG(SAL) --------- --------- --------- 800 5000 2073,2143 3. Oblicz minimalną, maksymalną pensje dla każdego stanowiska pracy. JOB MINIMALNA_PENSJA MAKSYMALNA_PENSJA --------- ---------------- ----------------- ANALYST 3000 3000 CLERK 800 1300 MANAGER 2450 2975 PRESIDENT 5000 5000 SALESMAN 1250 1600 4. Oblicz, ilu pracowników jest kierownikami (MANAGER). MANAGERS --------- 3 5. Znajdź średnie miesięczne pensje oraz średnie roczne zarobki dla każdego stanowiska. Uwzględnij prowizje. JOB AVSAL AVCOMP --------- --------- --------- ANALYST 3000 36000 CLERK 1037,5 12450 MANAGER 2758,3333 33100 PRESIDENT 5000 60000 SALESMAN 1400 17350 6. Znajdź różnice między najwyższą i najniższą pensją. DIFFERENCE ---------- 4200 7. Znajdź departamenty zatrudniające powyżej trzech pracowników. DEPTNO COUNT(*) --------- --------- 20 5 30 6 Strona 35

8. Sprawdź, czy wszystkie numery pracowników są rzeczywiście różne (używając grupowania). 9. Podaj najniższe pensje wypłacane podwładnym swoich kierowników. Wyeliminuj grupy o minimalnych zarobkach niższych niż 1000. Uporządkuj według pensji. MGR MIN(SAL) --------- --------- 7788 1100 7782 1300 7839 2450 7566 3000 5000 Strona 36

Wybieranie danych z wielu tabel Strona 37

Złączenie równościowe Chcemy uzyskać następującą informację: dla każdego pracownika znaleźć jego nazwisko, zawód (tabela EMP) i nazwę departamentu, w którym pracuje (tabela DEPT). W obu tych tabelach występuje kolumna DEPTNO, określająca numer departamentu i zawierająca takie same wartości, mówiące o związku pomiędzy tymi tabelami. Związek oparty o relację równości nazywamy związkiem równościowym (equi-join). Warunek równości zapisuje się jak zwykły warunek, z tym, że wartości do porównania są pobierane z różnych tabel. Aby powiązać ze sobą logicznie tabele EMP i DEPT, napiszemy: SELECT ENAME, JOB, DNAME, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO; ENAME JOB DNAME ---------- --------- -------------- KING PRESIDENT ACCOUNTING BLAKE MANAGER SALES CLARK MANAGER ACCOUNTING JONES MANAGER RESEARCH MARTIN SALESMAN SALES ALLEN SALESMAN SALES TURNER SALESMAN SALES JAMES CLERK SALES WARD SALESMAN SALES FORD ANALYST RESEARCH SMITH CLERK RESEARCH SCOTT ANALYST RESEARCH ADAMS CLERK RESEARCH MILLER CLERK ACCOUNTING Razem z informacjami pobranymi z tablicy EMP otrzymujemy nazwy departamentów pobrane z tablicy DEPT. Wiersze tabeli EMP są łączone z takimi wierszami tabeli DEPT, dla których wartość EMP.DEPTNO pokrywa się z DEPT.DEPTNO. Poprzedzenie nazwy kolumny nazwą tabeli jest wymagane tylko wtedy, gdy w tabelach wymienionych w klauzuli FROM występuje kolumna o tej samej nazwie (DEPTNO). Podanie samej nazwy kolumny byłoby niejednoznaczne. Chociaż wartość tego pola dla obu tabeli jest taka sama, to ze względów składniowych wymagane jest wskazanie tabeli z której będzie pobrana wartość. W poniższym przykładzie w klauzuli SELECT jest wymagane odwołanie do tablicy DEPT: SELECT DEPT.DEPTNO, ENAME, JOB, DNAME, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO ORDER BY DEPT.DEPTNO; DEPTNO ENAME JOB DNAME ---------- ---------- --------- -------------- 10 KING PRESIDENT ACCOUNTING 10 CLARK MANAGER ACCOUNTING Strona 38

10 MILLER CLERK ACCOUNTING 20 JONES MANAGER RESEARCH 20 SCOTT ANALYST RESEARCH 20 ADAMS CLERK RESEARCH 20 SMITH CLERK RESEARCH 20 FORD ANALYST RESEARCH 30 BLAKE MANAGER SALES 30 MARTIN SALESMAN SALES 30 ALLEN SALESMAN SALES 30 TURNER SALESMAN SALES 30 JAMES CLERK SALES 30 WARD SALESMAN SALES Aliasy tabel Aliasy, czyli nazwy zastępcze, ułatwiają pisanie zapytań. Aliasy definiuje się w klauzuli FROM. Obowiązują one jedynie w zapytaniu, w którym są zdefiniowane. Należy używać aliasów także w klauzuli SELECT, mimo iż tekstowo występuje ona wcześniej niż klauzula FROM. Przykład użycia aliasów: SELECT D.DEPTNO, ENAME, DNAME E, DEPT D WHERE E.DEPTNO=D.DEPTNO ORDER BY D.DEPTNO; Jeśli alias zostanie zdefiniowany dla tabeli, to oryginalnej nazwy tabeli nie wolno już używać w tym zapytaniu. Złączenia nierównościowe Złączenia nierównościowe (non-equi-join) nie są oparte o relację równości. Związek pomiędzy wierszami dwóch tabel określa się poprzez zastosowanie innego operatora niż równość. Na przykład związek pomiędzy tabelami EMP i SALGRADE jest oparty na następujących zasadach: określenie stawki zaszeregowania pracownika polega na wskazaniu do jakiego przedziału (LOSAL, HISAL) należą jego zarobki. Do utworzenia tego warunku zastosujemy operator BETWEEN AND. SELECT ENAME, SAL, S.GRADE E, SALGRADE S WHERE SAL BETWEEN LOSAL AND HISAL; ENAME SAL GRADE ---------- ---------- ---------- JAMES 950 1 SMITH 800 1 ADAMS 1100 1 MARTIN 1250 2 WARD 1250 2 MILLER 1300 2 ALLEN 1600 3 Strona 39

TURNER 1500 3 BLAKE 2850 4 CLARK 2450 4 JONES 2975 4 FORD 3000 4 SCOTT 3000 4 KING 5000 5 Reguły łączenia tabel Ogólna zasada łączenia tabel: Minimalna liczba warunków łączących = liczba tabel 1 Strona 40

Ćwiczenia 1. Wybierz nazwiska oraz nazwy departamentów wszystkich pracowników, w kolejności alfabetycznej nazw departamentów. ENAME DNAME ---------- -------------- KING ACCOUNTING CLARK ACCOUNTING MILLER ACCOUNTING JONES RESEARCH SCOTT RESEARCH ADAMS RESEARCH SMITH RESEARCH FORD RESEARCH BLAKE SALES MARTIN SALES ALLEN SALES TURNER SALES JAMES SALES WARD SALES 2. Wybierz nazwiska wszystkich pracowników wraz z numerami i nazwami departamentów, w których są zatrudnieni. ENAME DEPTNO DNAME ---------- --------- -------------- KING 10 ACCOUNTING BLAKE 30 SALES CLARK 10 ACCOUNTING JONES 20 RESEARCH MARTIN 30 SALES ALLEN 30 SALES TURNER 30 SALES JAMES 30 SALES WARD 30 SALES FORD 20 RESEARCH SMITH 20 RESEARCH SCOTT 20 RESEARCH ADAMS 20 RESEARCH MILLER 10 ACCOUNTING 3. Dla pracowników o miesięcznej pensji 1500 podaj ich nazwiska, miejsca usytuowania ich departamentów oraz nazwy tych departamentów. ENAME LOCATION DNAME ---------- ------------- -------------- KING NEW YORK ACCOUNTING BLAKE CHICAGO SALES CLARK NEW YORK ACCOUNTING JONES DALLAS RESEARCH ALLEN CHICAGO SALES FORD DALLAS RESEARCH SCOTT DALLAS RESEARCH Strona 41

4. Utwórz następującą listę pracowników z zaszeregowaniem ich do klas zarobkowych. ENAME JOB SAL GRADE ---------- --------- --------- --------- JAMES CLERK 950 1 SMITH CLERK 800 1 ADAMS CLERK 1100 1 MARTIN SALESMAN 1250 2 WARD SALESMAN 1250 2 MILLER CLERK 1300 2 ALLEN SALESMAN 1600 3 TURNER SALESMAN 1500 3 BLAKE MANAGER 2850 4 CLARK MANAGER 2450 4 JONES MANAGER 2975 4 FORD ANALYST 3000 4 SCOTT ANALYST 3000 4 KING PRESIDENT 5000 5 5. Wybierz informację o pracownikach, których zarobki odpowiadają klasie 3. ENAME JOB SAL GRADE ---------- --------- --------- --------- ALLEN SALESMAN 1600 3 TURNER SALESMAN 1500 3 6. Wybierz pracowników zatrudnionych w Dallas. ENAME SAL LOCATION ---------- --------- ------------- JONES 2975 DALLAS FORD 3000 DALLAS SMITH 800 DALLAS SCOTT 3000 DALLAS ADAMS 1100 DALLAS 7.Podaj następujące dane o wszystkich pracownikach, z wyjątkiem tych, którzy pracują na stanowisku CLERK. Uporządkuj je według malejących zarobków. ENAME JOB SAL GRADE DNAME ---------- --------- --------- --------- -------------- JAMES CLERK 950 1 SALES SMITH CLERK 800 1 RESEARCH ADAMS CLERK 1100 1 RESEARCH MARTIN SALESMAN 1250 2 SALES WARD SALESMAN 1250 2 SALES MILLER CLERK 1300 2 ACCOUNTING ALLEN SALESMAN 1600 3 SALES TURNER SALESMAN 1500 3 SALES BLAKE MANAGER 2850 4 SALES CLARK MANAGER 2450 4 ACCOUNTING JONES MANAGER 2975 4 RESEARCH FORD ANALYST 3000 4 RESEARCH SCOTT ANALYST 3000 4 RESEARCH KING PRESIDENT 5000 5 ACCOUNTING Strona 42

8. Przygotuj następujące dane o wszystkich pracownikach osiągających dochody do $36000 (włącznie) oraz tych, którzy pracują na stanowisku CLERK. ENAME JOB ANNUAL_SAL DEPTNO DNAME GRADE ---------- --------- ---------- --------- -------------- --------- JAMES CLERK 11400 30 SALES 1 SMITH CLERK 9600 20 RESEARCH 1 ADAMS CLERK 13200 20 RESEARCH 1 MILLER CLERK 15600 10 ACCOUNTING 2 FORD ANALYST 36000 20 RESEARCH 4 SCOTT ANALYST 36000 20 RESEARCH 4 KING PRESIDENT 60000 10 ACCOUNTING 5 Strona 43

Inne metody łączenia tabel Inne metody łączenia tabel Strona 44

Złączenia zewnętrzne Podczas łączenia tabel wiersz w tabeli nie mający swojego odpowiednika w drugiej tabeli nie zostanie wybrany. Np. w przykładzie łączenia tabeli EMP i DEPT poprzez kolumnę DEPNO nie został wybrany wiersz tabeli DEPT, gdzie DEPTNO=40 (departament OPERATIONS), ponieważ nikt nie pracuje w tym departamencie. Spróbujmy poprawić to złączenie tak, aby został również wybrany departament 40. Uczynimy to za pomocą złączenia zewnętrznego (outer-join), gdzie wiersz w tabeli DEPT, który nie ma swojego odpowiednika w tabeli EMP zostanie połączony z wierszem tabeli EMP zawierającym same wartości NULL (mimo, że wiersz taki w rzeczywistości nie istnieje). Złączenie zewnętrzne oznaczamy znakiem (+) po tej stronie równości, która dotyczy tabeli z niepełną informacją. SELECT ENAME, D.DEPTNO, DNAME E, DEPT D WHERE E.DEPTNO(+)=D.DEPTNO; ENAME DEPTNO DNAME ---------- ---------- -------------- KING 10 ACCOUNTING CLARK 10 ACCOUNTING MILLER 10 ACCOUNTING JONES 20 RESEARCH SCOTT 20 RESEARCH ADAMS 20 RESEARCH SMITH 20 RESEARCH FORD 20 RESEARCH BLAKE 30 SALES MARTIN 30 SALES ALLEN 30 SALES TURNER 30 SALES JAMES 30 SALES WARD 30 SALES 40 OPERATIONS Operator złączenia zewnętrznego może występować tylko po jednej stronie równości. Połączenie tabeli samej ze sobą Dzięki aliasom możemy połączyć tabelę samą ze sobą. Rozpatrzmy następujący przykład chcemy wybrać pracowników, którzy zarabiają mniej od swoich kierowników: SELECT E.ENAME NAZW_PR, E.SAL PENS_PR, M.ENAME NAZW_SZ, M.SAL PENS_SZ E, EMP M WHERE E.MGR=M.EMPNO AND E.SAL<M.SAL; Strona 45

NAZW_PR PENS_PR NAZW_SZ PENS_SZ ---------- ---------- ---------- ---------- BLAKE 2850 KING 5000 CLARK 2450 KING 5000 JONES 2975 KING 5000 MARTIN 1250 BLAKE 2850 ALLEN 1600 BLAKE 2850 TURNER 1500 BLAKE 2850 JAMES 950 BLAKE 2850 WARD 1250 BLAKE 2850 SMITH 800 FORD 3000 ADAMS 1100 SCOTT 3000 MILLER 1300 CLARK 2450 Jak widać w klauzuli FROM, odwołaliśmy się dwukrotnie do tej samej tabeli za pomocą dwóch aliasów E i M. Operatory zbiorowe Operatory zbiorowe używane są do działań na wynikach dwóch lub więcej zapytań SELECT. Ważne jest, aby wszystkie zapytania, na których będziemy używać operatorów zbiorowych zwracały te samy typy wierszy, np.: (liczba, ciąg znaków, ciąg znaków, data). Operator UNION Operator zbiorowy UNION jest używany do tworzenia sumy dwóch zbiorów wierszy (wyników zapytania SELECT). Aby otrzymać wszystkie, wzajemnie różne wiersze zwracane w wyniku dwóch poleceń SELECT, napiszemy: SELECT JOB WHERE DEPTNO=30 UNION SELECT JOB WHERE DEPTNO=10 JOB --------- CLERK MANAGER PRESIDENT SALESMAN Operacja UNION (podobnie jak inne operatory zbiorowe) powoduje automatyczną eliminację duplikatów. Aby otrzymać w wyniku wszystkie wiersze z obu tabel należy użyć operatora UNION ALL. Strona 46

Operator INTERSECT Operator zbiorowy INTERSECT (przecięcie zbiorów) powoduje wybranie wierszy wspólnych dla wyników obu zapytań SELECT. SELECT JOB WHERE DEPTNO=30 INTERSECT SELECT JOB WHERE DEPTNO=20 JOB --------- CLERK MANAGER Operator MINUS Operator zbiorowy MINUS (różnica zbiorów) powoduje wybranie wierszy zwracanych przez pierwszy rozkaz, nie zwracanych przez rozkaz drugi. SELECT JOB WHERE DEPTNO=30 MINUS SELECT JOB WHERE DEPTNO=20 JOB --------- SALESMAN Zapytanie może się składać z więcej niż dwóch zapytań SELECT połączonych operatorami zbiorowymi. W takim przepadku najwyższy priorytet ma operator INTERSECT, potem operatory UNION i MINUS (równe priorytety). W przypadkach wątpliwych najlepiej stosować nawiasy. Klauzula ORDER BY w zapytaniach z operatorami zbiorowymi W zapytaniach z operatorami zbiorowymi można użyć klauzuli ORDER BY. Odnosi się ona zawsze do wyniku zapytania i może być użyta tylko raz. Umieszcza się ją zawsze na końcu zapytania. Ponieważ na listach wyboru poleceń SELECT nazwy mogą być różne, w klauzuli ORDER BY specyfikuje się nie nazwę kolumny, tylko jej pozycję. Strona 47

SELECT EMPNO, ENAME, SAL UNION SELECT ID, NAME, SALARY _HISTORY ORDER BY 2; Wyniki powyższego zapytania zostaną posortowane wg kolumny drugiej, czyli wg nazwisk pracowników. Strona 48

Ćwiczenia 1. Znajdź departament w którym nikt nie jest zatrudniony. DEPTNO DNAME --------- -------------- 40 OPERATIONS 2. Obok numeru i nazwiska pracownika podaj numer i nazwisko jego kierownika. EMPNO ENAME MGRNO MGR_NAME --------- ---------- --------- ---------- 7698 BLAKE 7839 KING 7782 CLARK 7839 KING 7566 JONES 7839 KING 7654 MARTIN 7698 BLAKE 7499 ALLEN 7698 BLAKE 7844 TURNER 7698 BLAKE 7900 JAMES 7698 BLAKE 7521 WARD 7698 BLAKE 7902 FORD 7566 JONES 7369 SMITH 7902 FORD 7788 SCOTT 7566 JONES 7876 ADAMS 7788 SCOTT 7934 MILLER 7782 CLARK 3. Zmodyfikuj rozwiązanie poprzedniego zadania w ten sposób, aby wyświetlić także informacje o pracowniku KING, który nie posiada szefa. EMPNO ENAME MGRNO MGR_NAME --------- ---------- --------- ---------- 7839 KING 7698 BLAKE 7839 KING 7782 CLARK 7839 KING 7566 JONES 7839 KING 7654 MARTIN 7698 BLAKE 7499 ALLEN 7698 BLAKE 7844 TURNER 7698 BLAKE 7900 JAMES 7698 BLAKE 7521 WARD 7698 BLAKE 7902 FORD 7566 JONES 7369 SMITH 7902 FORD 7788 SCOTT 7566 JONES 7876 ADAMS 7788 SCOTT 7934 MILLER 7782 CLARK 4. Znajdź takie stanowisko pracy (JOB), które było obsadzone zarówno w pierwszej połowie 1982 roku jak i w pierwszej połowie 1983 roku. JOB --------- CLERK Strona 49

5. Znajdź tych pracowników, którzy zostali zatrudnieniu przed przyjęciem do pracy ich kierowników. EMPLOYEE HIREDATE MANAGER HIREDATE ---------- --------- ---------- --------- BLAKE 01-MAY-81 KING 17-NOV-81 CLARK 09-JUN-81 KING 17-NOV-81 JONES 02-APR-81 KING 17-NOV-81 ALLEN 20-FEB-81 BLAKE 01-MAY-81 WARD 22-FEB-81 BLAKE 01-MAY-81 SMITH 17-DEC-80 FORD 03-DEC-81 6. Podaj inny sposób rozwiązania zadania 1. DEPTNO DNAME --------- -------------- 40 OPERATIONS Strona 50

Podzapytania Podzapytania Strona 51

Podzapytania zagnieżdżone Podzapytanie to polecenie SELECT zagnieżdżone w innym poleceniu SELECT. SELECT kolumna_1, kolumna_2, FROM tabela WHERE kolumna = (SELECT kolumna FROM tabela WHERE warunek); Podzapytanie to wewnętrzny SELECT wykonywany w pierwszej kolejności, po to, aby jego wynik został użyty do wykonania zapytania zewnętrznego. Podzapytania zwracające jeden wiersz Podzapytania zwracające pojedynczą wartość można traktować jak zwykłe wyrażenie. Aby znaleźć pracowników zarabiających powyżej średniej, możemy postąpić następująco: 1. znaleźć średnią pensję: SELECT AVG(SAL) ; AVG(SAL) ---------- 2073,21429 2. znaleźć pracowników, których pensja jest wyższa niż obliczona w poprzednim zapytaniu pensja średnia. SELECT ENAME, JOB, SAL WHERE SAL>(wynik zapytania z punktu 1) Powyższe dwa rozkazy można połączyć w jeden: SELECT ENAME, JOB, SAL WHERE SAL>(SELECT AVG(SAL) ); ENAME JOB SAL ---------- --------- ---------- KING PRESIDENT 5000 BLAKE MANAGER 2850 CLARK MANAGER 2450 JONES MANAGER 2975 Strona 52

FORD ANALYST 3000 SCOTT ANALYST 3000 Aby znaleźć wszystkich zatrudnionych na tym samym stanowisku co SMITH, napiszemy: SELECT ENAME, JOB WHERE JOB=(SELECT JOB WHERE ENAME='SMITH'); ENAME JOB ---------- --------- JAMES CLERK SMITH CLERK ADAMS CLERK MILLER CLERK Podzapytania zwracające wiele wierszy Jeśli w firmie pracowałoby więcej osób o nazwisku SMITH, to poprzednie podzapytanie nie miałoby sensu. Co więcej zapytanie wewnętrzne zamiast pojedynczej wartości zwróciłoby kolumnę wartości, co prowadziłoby do błędu w zewnętrznym zapytaniu. Przekształćmy to zapytanie tak, aby wyszukiwało wszystkie osoby zatrudnione na stanowiskach, na których pracuje jakikolwiek SMITH. SELECT ENAME, JOB WHERE JOB IN (SELECT JOB WHERE ENAME='SMITH'); Spróbujmy teraz znaleźć pracowników, których pensja jest na liście najwyższych zarobków w departamentach. SELECT ENAME, SAL, DEPTNO WHERE SAL IN (SELECT MAX(SAL) GROUP BY DEPTNO); ENAME SAL DEPTNO ---------- ---------- ---------- BLAKE 2850 30 FORD 3000 20 SCOTT 3000 20 KING 5000 10 Rozważmy teraz sytuację, że w firmie pracuje osoba, której zarobki pokrywają się z największym zarobkiem w danym departamencie, ona jednak pracuje w innym departamencie. Powyższe zapytanie wypisze taką osobę, jako że nie został nałożony warunek, aby osoba pracowała w departamencie, z którego pochodzi najwyższa pensja. Strona 53

Warunek, w którym porównujemy wiele wartości Spróbujmy przerobić powyższe zapytanie: SELECT ENAME, SAL, DEPTNO WHERE (SAL,DEPTNO) IN (SELECT MAX(SAL), DEPTNO GROUP BY DEPTNO); ENAME SAL DEPTNO ---------- ---------- ---------- BLAKE 2850 30 FORD 3000 20 SCOTT 3000 20 KING 5000 10 Powyższe zapytanie wybierze nam osoby, które zarabiają najwięcej w swoich działach został nałożony także warunek, aby osoba wybierana pracowała w dziale, do którego należy najwyższa pensja. Kolumny na liście wyboru wewnętrznego (w klauzuli WHERE lub HAVING) muszą występować w kolejności i typach zgodnych z kolejnością i typami występującymi w klauzuli SELECT zewnętrznego polecenia. Operatory ALL i ANY Operatory ALL i ANY można stosować w podzapytaniach zwracających więcej niż jeden wiersz. Podaje się je w klauzulach WHERE i HAVING razem z operatorami porównywania. Operator ANY wiersz zostanie wybrany, jeśli wyrażenie jest zgodne co najmniej z jedną wartością wybraną w podzapytaniu. SELECT ENAME, SAL, DEPTNO WHERE SAL > ANY (SELECT DISTINCT SAL WHERE DEPTNO=10); ENAME SAL DEPTNO ---------- ---------- ---------- KING 5000 10 BLAKE 2850 30 CLARK 2450 10 JONES 2975 20 ALLEN 1600 30 TURNER 1500 30 FORD 3000 20 SCOTT 3000 20 Najniższy zarobek w departamencie 10 wynosi 1300. Zapytanie wybierze wszystkich, którzy zarabiają więcej niż 1300. Strona 54

Aby nie były wybierane wielokrotnie te same zarobki (3000 jest większe i od 1300 i od 2450 zostałoby wybrane dwukrotnie), często stosuje się razem z operatorami ALL i ANY słowo kluczowe DISTINCT. SELECT ENAME, SAL, DEPTNO WHERE DEPTNO=10; ENAME SAL DEPTNO ---------- ---------- ---------- KING 5000 10 CLARK 2450 10 MILLER 1300 10 Operator ALL warunek musi być spełniony przez wszystkie wartości wybrane w podzapytaniu. Wybierzmy wszystkich pracowników, którzy zarabiają więcej niż ktokolwiek w departamencie 30: SELECT ENAME, SAL, DEPTNO WHERE SAL > ALL (SELECT DISTINCT SAL WHERE DEPTNO=30) ORDER BY SAL; ENAME SAL DEPTNO ---------- ---------- ---------- JONES 2975 20 FORD 3000 20 SCOTT 3000 20 KING 5000 10 Najwyższy zarobek w departamencie 30 wynosi 2850. Zapytanie wybierze wszystkich, którzy zarabiają więcej niż 2850. Klauzula HAVING z zagnieżdżonymi zapytaniami Podzapytania mogą występować również w klauzuli HAVING (przypominamy klauzula HAVING odnosi się do grup wierszy). Nie istnieje limit na liczbę poziomów zagnieżdżania podzapytań. Aby wybrać zawody, w których średnia płaca jest wyższa niż średnia płaca w zawodzie 'MANAGER', napiszemy: SELECT JOB, AVG(SAL) HAVING AVG(SAL) > (SELECT AVG(SAL) WHERE JOB='MANAGER') GROUP BY JOB; JOB AVG(SAL) --------- ---------- ANALYST 3000 PRESIDENT 5000 Strona 55

Aby wybrać stanowisko, na którym są najniższe średnie zarobki, napiszemy: SELECT JOB, AVG(SAL) HAVING AVG(SAL) = (SELECT MIN(AVG(SAL)) GROUP BY JOB) GROUP BY JOB; JOB AVG(SAL) --------- ---------- CLERK 1037,5 Sortowanie danych w podzapytaniu W podzapytaniu nie może występować klauzula ORDER BY. Klauzula ORDER BY może wystąpić tylko raz dla całego zapytania i wtedy musi pojawić się jako ostatnia. Zapytania skorelowane Blok skorelowany jest szczególnym przypadkiem zagnieżdżonego zapytania. Zwykłe podzapytanie jest wykonywane raz, na samym początku, a do jego wyników odwołuje się zapytanie zewnętrzne. W przypadku zapytania skorelowanego podzapytanie jest wykonywane dla każdego wiersza z zapytania zewnętrznego. Aby znaleźć osoby, które zarabiają mniej niż wynosi średnia w ich zawodach, napiszemy: SELECT ENAME, SAL, DEPTNO, AVG(SAL) E WHERE SAL < (SELECT AVG(SAL) WHERE JOB=E.JOB) ORDER BY JOB; ENAME SAL DEPTNO ---------- ---------- ---------- JAMES 950 30 SMITH 800 20 CLARK 2450 10 MARTIN 1250 30 WARD 1250 30 Operator EXIST W przypadku zapytań skorelowanych czasami interesuje nas tylko, czy wiersz spełniający podane warunki istnieje. Wtedy stosujemy operator EXIST. Strona 56