Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup

Podobne dokumenty
Grupowanie i funkcje agregacji

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

niż zadeklarowana długość, zostaje ucięty z prawej strony. osiągnął długość podaną jako drugi parametr. Jeśli wynik jest dłuższy

3. Podzapytania, łączenie tabel i zapytań

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

Autor: Joanna Karwowska

Wykład 6. SQL praca z tabelami 3

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

PODZAPYTANIE (SUBSELECT)

Podstawy języka SQL cz. 2

Technologie baz danych

SQL praca z tabelami 4. Wykład 7

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

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

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

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

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

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

Przestrzenne bazy danych Podstawy języka SQL

Złączenie CROSS JOIN jest to tzw. złączenie krzyżowe, którego ogólna postać wygląda następująco:

Marek Rakowski Podstawy zdania SELECT Strona 1 z 12

Język SQL. Rozdział 7. Zaawansowane mechanizmy w zapytaniach

SQL (ang. Structured Query Language)

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

Grupowanie i funkcje agregujące

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

Microsoft SQL Server Podstawy T-SQL

Bazy danych - Materiały do laboratoriów IV

Wstęp Wprowadzenie do BD Podstawy SQL. Bazy Danych i Systemy informacyjne Wykład 1. Piotr Syga

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

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

Autor: Joanna Karwowska

Bazy danych. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

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

Złaczenia tablic: FROM, WHERE, JOIN

Systemy GIS Tworzenie zapytań w bazach danych

Podyplomowe Studia Systemy informatyczne w logistyce

Laboratorium Bazy danych SQL 3 1

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

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

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

Relacyjne bazy danych. Podstawy SQL

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

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

Zadania z SQLa (MS SQL Server)

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

Laboratorium Bazy danych SQL 2

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

Model relacyjny. Wykład II

Ćwiczenie zapytań języka bazy danych PostgreSQL

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

SQL do zaawansowanych analiz danych część 1.

Struktura drzewa w MySQL. Michał Tyszczenko

OLAP i hurtownie danych c.d.

Relacyjne bazy danych. Podstawy SQL

NORTHWIND. Anonco.pl. ćwiczenia praktyczne. KiK s Tutorials. NORTHWIND dwiczenia praktyczne. ANONCO.PL/SQL SQLSERVERDLAOPORNYCH.WORDPRESS.

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

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

Autor: Joanna Karwowska

Bazy danych wykład trzeci. Konrad Zdanowski

Agregacja i Grupowanie Danych. Funkcje Agregacji. Opcje GROUP BY oraz HAVING

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

Wprowadzenie do baz danych

Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Ćwiczenie 3 funkcje agregujące

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

Technologie baz danych

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

Podzapytania do tabel W miejscu w którym możemy użyć nazwy tabeli, możemy użyć podzapytania

Paweł Rajba

Bazy Danych II. Ćwiczenia

Kwerendy (zapytania) wybierające

SQL Structured Query Language

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Wykład XII. optymalizacja w relacyjnych bazach danych

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

Grupowanie danych klauzula GROUP BY

Podzapytania. SELECT atrybut_1, atrybut_2,... FROM relacja WHERE atrybut_n operator (SELECT atrybut_1, FROM relacja WHERE warunek

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

Konstruowanie Baz Danych DQL agregacja danych

Oracle11g: Wprowadzenie do SQL

RBD Relacyjne Bazy Danych

Bazy danych Język SQL część 2 Wykład dla studentów matem

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

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Podzapytania. Podzapytania nieskorelowane i skorelowane

Podstawowe zapytania SELECT (na jednej tabeli)

Model relacyjny. Wykład II

Współczesne systemy baz danych

Rozszerzenia grupowania

Bazy Danych. SQL Podstawy języka II: zapytania. Krzysztof Regulski WIMiIP, KISiM, B5, pok. 408

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

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Zarzadzanie transakcjami. Transakcje

Plan. Wyświetlanie n początkowych wartości (TOP n) Użycie funkcji agregujących. Grupowanie danych - klauzula GROUP BY

Wykład 8. SQL praca z tabelami 5

050 SQL ELEMENTY ZAAWANSOWANE. Prof. dr hab. Marek Wisła

Transkrypt:

Grupowanie i funkcje agregacji Grupowanie z użyciem rollup Funkcje agregujące: COUNT([DISTINCT] wyrażenie *), MIN(wyrażenie), MAX(wyrażenie), SUM([DISTINCT] wyrażenie), AVG([DISTINCT] wyrażenie). Klauzula GROUP BY Grupowanie polega na podzieleniu zbioru wierszy na grupy, które mają pewną wspólną cechę. Grupowania dokonuje się w celu zastosowania funkcji agregujących nie w stosunku do całego zbioru wierszy, ale do poszczególnych grup wierszy. W celu zgrupowania rekordów należy dodać klauzulę GROUP BY oraz kolumny lub wyrażenia, według których mają być pogrupowane wiersze. Na liście klauzuli SELECT mogą się znaleźć tylko kolumny i wyrażenia, według których zapytanie jest grupowane, oraz wywołania funkcji agregujących. Dodanie słowa kluczowego rollup do group by spowoduje wyświetlenie podsumowań dla każdej grupy. SELECT department_id,manager_id, SUM(salary) GROUP BY ROLLUP(department_id, manager_id); W tym przykładzie wyświetlamy sumy zarobków pracowników podległych pod każdego managera, ale równocześnie wyświetlamy podsumowanie zarobków pracowników każdego działu, jak również sumę zarobków wszystkich pracowników. Uwaga. W wierszach zawierających podsumowania dla działów w kolumnie manager_id mamy NULL. Podobnie w wierszu zawierającym podsumowanie całej tabeli występuje NULL w kolumnach manager_id i department_id. Grupowanie z użyciem cube Dodanie słowa kluczowego cube do group by spowoduje wyświetlenie podsumowań dla wszystkich możliwych kombinacji wybranych kolumn. SELECT department_id,manager_id, SUM(salary) GROUP BY CUBE(department_id, manager_id); W tym przykładzie wyświetlamy sumy zarobków pracowników podległych pod każdego managera, ale równocześnie wyświetlamy podsumowanie zarobków pracowników każdego działu, pracowników podległych pod każdego managera, jak również sumę zarobków wszystkich pracowników. Użycie klauzuli GROUPING Przy użyciu opcji rollup lub cube w zapytaniu z klauzulą GROUP BY występuje NULL w wierszu podsumowania. Jeżeli dana kolumna także zawiera wartości puste, powstaje problem z identyfikacją, które wiersze zawierają podsumowanie, a które zawierają wartość pustą z danej kolumny. Rozwiązaniem jest użycie klauzuli GROUPING. Rozważmy przykładowe zapytanie: select department_id, manager_id, count(*), round(avg(salary)) from employees group by rollup(department_id,manager_id); W wierszach podsumowania występuje NULL w kolumnie manager_id, ale NULL występuje w tej kolumnie także w innych wierszach, odpowiadających sytuacji, gdy nie manager nie jest określony.

Użycie klauzuli GROUPING Przy użyciu opcji rollup lub cube w zapytaniu z klauzulą GROUP BY występuje NULL w wierszu podsumowania. Jeżeli dana kolumna także zawiera wartości puste, powstaje problem z identyfikacją, które wiersze zawierają podsumowanie, a które zawierają wartość pustą z danej kolumny. Rozwiązaniem jest użycie klauzuli GROUPING. Zapytanie z użyciem GROUPING. select grouping(department_id), grouping(manager_id), department_id, manager_id, count(*), round(avg(salary)) from employees group by rollup(department_id,manager_id); Klauzula GROUPING zwróci nam wartość 1 lub 0 w zależności, czy dany wiersz zawiera podsumowanie, czy nie. Stosujemy do kolumn, wzgl. których grupujemy. Operatory zbiorowe stosują algebrę zbiorów do operacji na wynikach dwóch lub więcej zapytań. Podstawowe zasady działania operatorów: Zapytania muszą zwracać tą samą liczbę kolumn. Kolumny na tych samych pozycjach muszą być tego samego typu. Nazwy kolumn w wyniku pobierane są z pierwszego zapytania. Sortować można tylko wynik całości UNION: wyświetla sumę zbiorów wierszy z dwóch lub więcej zapytań, jeżeli były wiersze, które się powtarzały (w różnych lub w tym samym zapytaniu), to takie wiersze będą uwzględnione tylko raz. UNION domyślnie sortuje wynik rosnąco. UNION: wyświetla sumę zbiorów wierszy z dwóch lub więcej zapytań, jeżeli były wiersze, które się powtarzały (w różnych lub w tym samym zapytaniu), to takie wiersze będą uwzględnione tylko raz. UNION domyślnie sortuje wynik rosnąco. SELECT city, state_province AS "CITY" FROM locations WHERE country_id= US UNION SELECT city FROM locations WHERE country_id<> US ;

UNION: wyświetla sumę zbiorów wierszy z dwóch lub więcej zapytań, jeżeli były wiersze, które się powtarzały (w różnych lub w tym samym zapytaniu), to takie wiersze będą uwzględnione tylko raz. UNION domyślnie sortuje wynik rosnąco. SELECT city, state_province AS "CITY" FROM locations WHERE country_id= US UNION SELECT city FROM locations WHERE country_id<> US ; UNION ALL: zwraca sumę zbiorów wierszy z dwóch lub więcej zapytań, uwzględnia wszystkie powtórzenia wierszy. UNION ALL nie sortuje wierszy. SELECT employee_id AS id, first_name AS imie, last_name AS nazwisko, manager_id AS szef, department_id AS "DZIAŁ" WHERE manager_id=101 UNION ALL SELECT employee_id, first_name, last_name, manager_id, department_id WHERE department_id=100; UNION ALL: zwraca sumę zbiorów wierszy z dwóch lub więcej zapytań, uwzględnia wszystkie powtórzenia wierszy. UNION ALL nie sortuje wierszy. SELECT employee_id AS id, first_name AS imie, last_name AS nazwisko, manager_id AS szef, department_id AS "DZIAŁ" WHERE manager_id=101 UNION ALL SELECT employee_id, first_name, last_name, manager_id, department_id WHERE department_id=100; INTERSECT: zwraca część wspólną zbiorów wierszy z dwóch lub więcej zapytań.

INTERSECT: zwraca część wspólną zbiorów wierszy z dwóch lub więcej zapytań. SELECT employee_id AS id, first_name AS imie, last_name AS nazwisko, manager_id AS szef, department_id AS "DZIAŁ" WHERE manager_id=101 INTERSECT SELECT employee_id, first_name, last_name, manager_id, department_id WHERE department_id=100; INTERSECT: zwraca część wspólną zbiorów wierszy z dwóch lub więcej zapytań. SELECT employee_id AS id, first_name AS imie, last_name AS nazwisko, manager_id AS szef, department_id AS "DZIAŁ" WHERE manager_id=101 INTERSECT SELECT employee_id, first_name, last_name, manager_id, department_id WHERE department_id=100; INTERSECT: zwraca część wspólną zbiorów wierszy z dwóch lub więcej zapytań. SELECT employee_id AS id, first_name AS imie, last_name AS nazwisko, manager_id AS szef, department_id AS "DZIAŁ" WHERE manager_id=101 INTERSECT SELECT employee_id, first_name, last_name, manager_id, department_id WHERE department_id=100; Poprzednie zapytanie można zapisać jako: SELECT employee_id AS id, first_name AS imie, last_name AS nazwisko, manager_id AS szef, department_id AS "DZIAŁ" WHERE manager_id=101 AND department_id=100; MINUS: tworzy różnicę zbiorów wierszy z dwóch zapytań.

MINUS: tworzy różnicę zbiorów wierszy z dwóch zapytań. SELECT * WHERE salary >= 10000 MINUS SELECT * WHERE job_id = SA_MAN MINUS: tworzy różnicę zbiorów wierszy z dwóch zapytań. SELECT * WHERE salary >= 10000 MINUS SELECT * WHERE job_id = SA_MAN Powyższe jest równoważne zapytaniu: SELECT * WHERE salary >= 10000 AND NOT(job_id = SA_MAN ) Podzapytania Podzapytania Podzapytaniem nazywamy dowolną, ujętą w nawiasy, instrukcję SELECT, zagnieżdżoną wewnątrz innej instrukcji. Podzapytanie możemy umieścić w następujących klauzulach instrukcji SELECT: (1) we FROM, w miejsce tabeli: SELECT... FROM (SELECT...) (2) na liście zwracanych wartości: SELECT..., (SELECT...),... FROM... (3) w klauzuli ORDER BY: SELECT... FROM... ORDER BY (SELECT...); (4) w warunkach w klauzulach WHERE lub HAVING. W sytuacji (2) i (3), podzapytanie zawsze musi zwracać pojedyncza wartość, w (4) - zależnie od kontekstu. Podzapytania w klauzuli WHERE (HAVING): SELECT * FROM tabela WHERE kolumna OPERATOR (SELECT kolumna FROM tabela); gdzie operator to: IN, lub operator relacji (>=, <=, =), gdy podzapytanie zwraca dokładnie jeden wiersz, lub operator relacji w połączeniu z ALL/ANY, gdy podzapytanie może zwrócić wiele wierszy. W obu sytuacjach, podzapytanie może zwracać tylko jedną kolumnę. SELECT * FROM tabela WHERE [NOT] EXISTS (SELECT kolumna * FROM tabela); Tutaj nie ma znaczenia, czy wartość będzie jednoelementowa (jedna kolumna) i czy będzie zwracany więcej niż jeden wiersz.

Podzapytania skorelowane Podzapytanie na liście SELECT W tego typu podzapytaniach istnieje związek pomiędzy podzapytaniem a zapytaniem zewnętrznym - podzapytanie odwołuje się do zapytania zewnętrznego. Wynik podzapytania jest uzależniony od wartości w wierszach zapytania zewnętrznego. Podzapytanie skorelowane jest wyliczane dla każdego wiersza zapytania zewnętrznego (w przeciwieństwie do podzapytania prostego, które jest wyliczane tylko raz). W podzapytaniu skorelowanym niezbędne jest korzystanie z aliasów. SELECT * e WHERE e.salary>(select AVG(salary) FROM employees e1 WHERE e1.department_id=e.department_id); Podzapytania skorelowane często wykorzystuje się razem z EXISTS. Podzapytania możemy umieszczać na liście wartości SELECT, ale muszą wtedy zwracać pojedynczą wartość, np. Wybieramy zarobki pracownika i średnie zarobki w jego dziale: SELECT last_name, salary, (SELECT AVG(salary) from employees e1 WHERE e1.department_id=e.department_id) AS srednie e; SELECT z podzapytania SELECT z podzapytania SELECT... FROM (SELECT...)... Ważne: aby możliwe było odwołanie do wartości z podzapytania, trzeba ją nazwać (czyli nadać jej alias w podzapytaniu). O takich podzapytaniach można myśleć jak o perspektywach zapisanych bezpośrednio w zapytaniu, np. Wybieramy różnicę między zarobkami pracownika, a średnią w jego dziale: SELECT last_name, salary-srednia FROM (SELECT Avg(salary) AS srednia, department_id GROUP BY department_id) e1 JOIN employees e2 ON e1.department_id=e2.department_id; SELECT... FROM (SELECT...)... Ważne: aby możliwe było odwołanie do wartości z podzapytania, trzeba ją nazwać (czyli nadać jej alias w podzapytaniu). O takich podzapytaniach można myśleć jak o perspektywach zapisanych bezpośrednio w zapytaniu, Tego typu podzapytania warto stosować, gdy musimy nałożyć funkcję agregacji na funkcję agregacji, np. Wybieramy średnią liczbę pracowników w dziale: SELECT Avg(ile) FROM (SELECT Count(*) AS ile GROUP BY department_id);

Dane, które chcemy uzyskać z bazy danych zazwyczaj znajdują się w więcej niż jednej tabeli bazodanowej. W takim przypadku nasze zapytanie musi się odpowiednio odwołać do więcej niż jednej tabeli. Mechanizm ten nazywa się w SQL złączeniami. Rodzaje złączeń: ZŁACZENIE KARTEZJAŃSKIE ZŁACZENIE WEWNETRZNE ZŁACZENIE ZEWNETRZNE (+) Złączenie wewnętrzne z użyciem JOIN ON NATURAL JOIN Złączenie za pomocą JOIN USING() Złączenia zewnętrzne: LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN ZŁACZENIE KARTEZJAŃSKIE SELECT last_name, department_name FROM employees, departments; Zwraca iloczyn kartezjański wierszy z obu tabel. Złączenia kartezjańskie stosuje się bardzo rzadko, gdyż produkują bardzo dużą ilość wierszy, które nie zawierają logicznie spójnych informacji. W powyższym przykładzie ilość wierszy powstałych w wyniku złączenia kartezjańskiego jest iloczynem ilości wierszy w tabelach employees oraz departments. ZŁACZENIE WEWNETRZNE SELECT last_name, department_name FROM employees e, departments d WHERE e.department_id=d.department_id; Najczęściej, kiedy zadajemy zapytanie do dwu tabel, zależy nam na uzyskaniu tylko takich kombinacji wierszy z obu tabel, które sobie w jakiś sposób odpowiadają. Złączenia zwracające właśnie taki zbiór wierszy z obu tabel nazywamy złączeniami wewnętrznymi. Uwaga: Jeśli nadamy tabeli alias, nie będziemy mogli odnosić się do niej po nazwie.

ZŁACZENIE ZEWNETRZNE (+) SELECT last_name, department_name FROM employees e, departments d WHERE e.department_id(+)=d.department_id; W przypadku złączeń wewnętrznych, jeżeli w jednej z tabel istnieje rekord, który nie ma żadnego odpowiednika w drugiej tabeli, to rekord ten jest pomijany w końcowym wyniku. Jeżeli chcemy uwzględnić takie rekordy, to można wyróżnić jedną z tabel i wykonać złączenie zewnętrzne, aby otrzymać z wyróżnionej tabeli wszystkie rekordy, nawet te, które nie mają swojego odpowiednika w drugiej z tabel. Korzystamy z operatora złączenia zewnętrznego (+). Umieszczamy go w warunku złączenia po nazwie kolumny z tej tabeli, która jest uboższa, czyli tam, gdzie brakuje rekordów i musimy jakieś dodać. Powyższe zapytanie uwzględni wszystkie działy, także te, które nie mają pracowników. Złączenie wewnętrzne z użyciem JOIN ON SELECT last_name, department_name e JOIN departments d ON e.department_id=d.department_id; Złączenie wewnętrzne z użyciem JOIN ON SELECT last_name, department_name e JOIN departments d ON e.department_id=d.department_id; NATURAL JOIN Tabele departments oraz employees posiadają pole o tej samej nazwie, które służy nam do łączenia tych tabel. W takiej sytuacji możemy skorzystać z NATURAL JOIN: SELECT last_name, department_name NATURAL JOIN departments; Złączenie za pomocą JOIN USING() Identyczne zastosowanie jak NATURAL JOIN ma JOIN USING. W tym przypadku musimy podać nazwę kolumny, która ma służyć jako złączenie. Powinno się korzystać z tej formy, a nie z NATURAL JOIN, jeśli w dwóch tabelach, które chcemy połączyć, występuje więcej niż jedna kolumna o identycznej nazwie i typie danych. SELECT last_name, department_name JOIN departments USING(department_id);

Zapytania hierarchiczne Złączenia zewnętrzne: LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN Odpowiednikiem złączenia zewnętrznego za pomocą operatora (+) jest użycie LEFT OUTER JOIN lub RIGHT OUTER JOIN. Konstrukcja: SELECT last_name, department_name FROM departments d LEFT OUTER JOIN employees e ON e.department_id=d.department_id; jest równoważna z konstrukcją: SELECT last_name, department_name FROM departments d, employees e WHERE d.department_id=e.department_id(+) FULL OUTER JOIN jest połączeniem RIGHT OUTER JOIN i LEFT OUTER JOIN. Wyświetla niedopasowane elementy z obu tabel. Przykład: hierarchia zatrudnienia w firmie. każdy pracownik (z wyjątkiem prezesa) podlega pod jakiegoś kierownika (dokładnie jednego); każdy kierownik też jest pracownikiem firmy; prezes jest "najwyższym" przełożonym. Powyższa struktura jest odwzorowana w tabeli employees: numer przełożonego danego pracownika jest zapisany w polu manager_id, jest to numer pracownika będącego przełożonym (czyli wartość polaemployee_id dla kierownika). Hierarchia zatrudnienia odwzorowana w tabeli employees: numer przełożonego danego pracownika jest zapisany w polu manager_id, jest to numer pracownika będącego przełożonym (czyli wartość polaemployee_id dla kierownika). Zapytania hierarchiczne Aby skonstruować drzewo tej hierarchii, używamy polecenia: SELECT (LPad(,5*(LEVEL-1))) last_name first_name START WITH manager_id IS NULL CONNECT BY PRIOR employee_id=manager_id;

Zapytania hierarchiczne Aby skonstruować drzewo tej hierarchii, używamy polecenia: SELECT (LPad(,5*(LEVEL-1))) last_name first_name START WITH manager_id IS NULL CONNECT BY PRIOR employee_id=manager_id; W klauzuliselect zapytania ustawiamy odpowiedni sposób sformatowania wyniku. LEVEL - poziom zagłębienia w strukturze (prezes ma poziom 1). START WITH określa, od którego miejsca mamy budować drzewo. CONNECT BY PRIOR employee_id=manager_id - jak ma być tworzone drzewo, podaje sposób łączenia wierszy. W tym przypadku tak: na kolejnym poziomie będą pracownicy, których manager_id jest równeemployee_id z poprzedniego poziomu. PRIOR określa, która z kolumn jest nadrzędna (tutaj - employee_id). Zapytania hierarchiczne Aby zapytanie hierarchiczne było poprawnie zbudowane, zależność określająca sposób łączenia rekordów musi być jednoznacznie określona, tzn. dla każdego wiersza może być tylko jeden wiersz nadrzędny. W poprzednim przykładzie tak jest - związek manager_id=employee_id w sposób jednoznaczny określa, który wiersz jest nadrzędny dla danego, wynika to z faktu, że pole employee_id jest kluczem głównym tabeli employee. Powyższa reguła jest zgodna z logiką: żaden z pracowników nie ma dwóch bezpośrednich przełożonych. W zapytaniu hierarchicznym nie może pojawić się pętla, tzn. taka sytuacja, gdy jeden z wierszy jest jednocześnie przodkiem i potomkiem dla innego. Dostaniemy wówczas błąd. Zapytanie hierarchiczne - konstrukcja klauzuli hierarchicznej Zapytanie hierarchiczne CONNECT BY warunek1 [AND warunek2...] START WITH warunek START WITH określa wybór wiersza (lub wierszy) będących korzeniami w hierarchi; nie jest wymagany w zapytaniu; Warunek określony w klauzuliconnect BY musi zawierać operator PRIOR, który określa sposób wiązania wierszy potomków z wierszami rodzica. Zazwyczaj warunek ma postać porównania przez równość wartości odpowiednich kolumn, np. CONNECT BY PRIOR employee_id=manager_id employee_id jest kolumną nadrzędną, czyli wskazuje na wiersz rodzica, natomiast manager_id na wiersz potomka. SELECT employee_id, last_name, first_name, manager_id CONNECT BY PRIOR employee_id=manager_id START WITH manager_id IS NULL

Zapytanie hierarchiczne SELECT employee_id, last_name, first_name, manager_id CONNECT BY PRIOR employee_id=manager_id START WITH manager_id IS NULL Zapytanie hierarchiczne SELECT employee_id, last_name, first_name, manager_id WHERE LEVEL IN(2,3) CONNECT BY PRIOR employee_id=manager_id Sposób przetwarzania tego zapytania jest następujący: Korzeniami w hierarchii są w tym przypadku wiersze tych pracowników, którzy nie mają nad sobą żadnego managera. Najpierw dla pierwszego wiersza - korzenia są wybierane jego dzieci, potem dzieci tych dzieci, itp. Powtarzane jest to dla każdego kolejnego wiersza będącego korzeniem: wybierany jest korzeń, potem są wybierane wiersze - dzieci, potem dzieci dla tych wierszy, itd. Zapytanie hierarchiczne SELECT employee_id, last_name, first_name, manager_id WHERE LEVEL IN(2,3) CONNECT BY PRIOR employee_id=manager_id Sposób przetwarzania tego zapytania jest następujący: Korzeniami w hierarchii są w tym przypadku wiersze tych pracowników, którzy nie mają nad sobą żadnego managera. Najpierw dla pierwszego wiersza - korzenia są wybierane jego dzieci, potem dzieci tych dzieci, itp. Powtarzane jest to dla każdego kolejnego wiersza będącego korzeniem. Klauzula WHERE jest przetwarzana jako ostatnia, dla każdego z wybranych wcześniej wierszy osobno. Uwaga. Gdyby zapytanie zawierało złączenie, to złączenie byłoby przetwarzane przed ewaluacją klauzuli CONNECT BY. Zapytania hierarchiczne Sortowanie oraz grupowanie zaburza wyniki zapytania hierarchicznego (czyli nie używamy klauzul GROUP BY ani ORDER BY). Można sortować w obrębie poszczególnych gałęzi (czyli w obrębie wierszy podlegających pod ten sam wiersz nadrzędny): ORDER SIBLINGS BY Dodatkowe wartości (funkcje), z których możemy skorzystać przy zapytaniach do obsługi struktur hierarchicznych: CONNECT_BY_ISLEAF określa, czy dany wiersz (rekord) jest liściem (tzn. nie ma już wierszy podrzędnych); 1 odpowiada liść, 0 przeciwnie; LEVEL podaje poziom zagłębienia danego wiersza w wyświetlanej strukturze hierarchicznej; SYS_CONNECT_BY_PATH(wartość, separator)- buduje pełną ścieżkę dla danego rekordu (od rekordu na najwyższym poziomie) na podstawie danego pola.

Zapytania hierarchiczne SELECT employee_id, last_name, first_name, manager_id, CONNECT_BY_ISLEAF where CONNECT_BY_ISLEAF=1 CONNECT BY PRIOR employee_id=manager_id start with manager_id is null order siblings by last_name; Ćwiczenia 1. Wyświetl ranking pracowników ze względu na wysokość wypłaty w grupach pracowników podzielonych względem przełożonych. 2. Wyświetl w postaci drzewa hierarchię zatrudnienia w firmie, ale nie uwzględniaj podwładnych osoby o nazwisku Greenberg. 3. Wyświetl w postaci drzewa hierarchię zatrudnienia w firmie, ale uwzględnij tylko podwładnych osoby o nazwisku Greenberg. 4. Wyświetl hierarchię pracowników w taki sposób, by id osoby, która ma być "punktem startowym" hierarchii nie było stałą, a pochodziło z zagnieżdżonego zapytania. 5. Wyświetl nazwiska, numer pracownika oraz poziom zagnieżdżenia w hierarchii firmy, ale tylko dla pracowników najniższego szczebla, tzn. tych, którzy nie mają żadnych podwładnych. 6. Wyświetl nazwisko i datę zatrudnienia pracownika zatrudnionego najwcześniej spośród wszystkich pracowników najniższego szczebla. 7. Wyświetl hierarchię zatrudnienia na podstawie tabeli employees. Wyniki mają być posortowane w taki sposób, by na początku byli wymienieni pracownicy najwyższego stopnia, a następnie kolejni wg stopnia.