JPS. cwiczenia 3. Stosy, proste zapytania. Michał Lentner Polsko-Japońska Wyższa Szkoła Technik Komputerowych

Podobne dokumenty
JPS Duży przykład ewaluacji zapytania. Michał Lentner Polsko-Japońska Wyższa Szkoła Technik Komputerowych

JPS. cwiczenia 2. Skład danych. Michał Lentner Polsko-Japońska Wyższa Szkoła Technik Komputerowych

SBQL. język zapytań dla obiektowych baz danych. Kamil Adamczyk. Uniwersytet Warszawski 20.IV.2009

Języki i Środowiska Programowania Baz Danych 2010/2011 PJWSTK, 2010

Technologie baz danych

Języki i środowiska przetwarzania danych rozproszonych

Temat : SBQL 1 obiektowy język zapytań.

Języki i środowiska przetwarzania danych rozproszonych

MATERIAŁY DO ZAJĘĆ II

3. Podzapytania, łączenie tabel i zapytań

Systemy GIS Tworzenie zapytań w bazach danych

Interpreter Języka Zapytań SBQL dla Office Object Portal

Przestrzenne bazy danych Podstawy języka SQL

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

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Temat : SBQL 1 obiektowy język zapytań.

PODZAPYTANIE (SUBSELECT)

Autor: Joanna Karwowska

Oracle PL/SQL. Paweł Rajba.

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Materiały szkoleniowe. Podstawy języka SQL

Relacyjne bazy danych. Podstawy SQL

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Język C++ zajęcia nr 2

Funkcje analityczne SQL CUBE (1)

Ćwiczenie zapytań języka bazy danych PostgreSQL

SQL (ang. Structured Query Language)

Podstawy języka SQL cz. 2

Model relacyjny. Wykład II

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Paweł Rajba

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

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

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

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

Model relacyjny. Wykład II

Hurtownie danych - przegląd technologii

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

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

Informatyka (5) SQL. dr inż. Katarzyna Palikowska Katedra Transportu Szynowego p. 4 Hydro

Relacyjne bazy danych. Podstawy SQL

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

Oracle PL/SQL. Paweł Rajba.

Język PL/SQL Procedury i funkcje składowane

Aktualizowalne perspektywy w obiektowych bazach danych

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

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

Fazy przetwarzania zapytania zapytanie SQL. Optymalizacja zapytań. Klasyfikacja technik optymalizacji zapytań. Proces optymalizacji zapytań.

Podzapytania. Podzapytania nieskorelowane i skorelowane

Przydatne sztuczki - sql. Na przykładzie postgres a.

Autor: Joanna Karwowska

PL/SQL. Funkcje wbudowane

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Grupowanie i funkcje agregacji

Dynamiczne struktury danych

Konstruowanie Baz Danych DQL agregacja danych

Standard SQL/XML. Wprowadzenie do XQuery

Przykładowe B+ drzewo

Języki i techniki programowania Ćwiczenia 2

Oracle 12c: Nowości w SQL i PL/SQL

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Autor: Joanna Karwowska

1 Wstęp do modelu relacyjnego

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

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

Wykład 6. SQL praca z tabelami 3

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Struktury. Przykład W8_1

Marek Rakowski Podstawy zdania SELECT Strona 1 z 12

Programowanie w VB Proste algorytmy sortowania

Materiały do laboratorium MS ACCESS BASIC

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

Autor: Joanna Karwowska

Procedury i funkcje składowane

E S - uniwersum struktury stosu

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

Administracja i programowanie pod Microsoft SQL Server 2000

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Podstawy programowania skrót z wykładów:

Bazy danych wykład trzeci. Konrad Zdanowski

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup

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

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

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

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Złaczenia tablic: FROM, WHERE, JOIN

Przykład powyżej pokazuje, że w zapytaniu można umieszczać funkcje zarówno zdefiniowane w ramach środowiska, jak również własne.

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

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Podstawy programowania. Podstawy C# Tablice

Deklarowanie kursora

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Transkrypt:

JPS cwiczenia 3. Stosy, proste zapytania Michał Lentner Polsko-Japońska Wyższa Szkoła Technik Komputerowych

Baza danych używana w przykładach

Baza danych używana w przykładach <i6, loc, "Warsaw"> <i7, dname, "R&D"> <i4, dept, {i6, i7, i8, i9}> <i8, employs, i3> <i10, salary, 3500> <i11, job, "Programmer"> <i3, emp, {i10, i11, i12, i13}> <i9, employs, i2> <i12, ename, "Kowal"> <i13, works_in, i4> <i16, ename, "Dudek"> <i1, emp, {i15, i16, i17, i29}> <i17, works_in, i5> <i0, entry, {i1, i2, i3, i4, i5, i26}> <i22, employs, i1> <i23, loc, "Kraków"> <i5, dept, {i22, i23, i24}> <i29, works_in, i26> <i15, job, "Clerk"> <i2, emp, {i18, i19, i20, i21}> <i24, dname, "Sales"> <i27, loc, "Pozna!"> <i26, dept, {i27, i28}> <i18, salary, 3500> <i21, ename, "Nowak"> <i28, dname, "Accounting"> <i19, works_in, i4> <i20, job, "Programmer">

Co to jest zapytanie?

Co to jest zapytanie? dowolny literał, np. 5, 3.5, Ala ma kota

Co to jest zapytanie? dowolny literał, np. 5, 3.5, Ala ma kota dowolna nazwa, np. emp, sal

Co to jest zapytanie? dowolny literał, np. 5, 3.5, Ala ma kota dowolna nazwa, np. emp, sal jedno lub dwa zapytania połączone z jakimś operatorem

Ważniejsze operatory w SBQL

Ważniejsze operatory w SBQL operatory algebraiczne (makroskopowe i nie makroskopowe) +, -, /, *, %, etc. >, <, >=, <=,!=, etc. or, and union, intersect, minus, in min(), max(), avg(), count(), bag(), sequence() as, group as,

Ważniejsze operatory w SBQL operatory algebraiczne (makroskopowe i nie makroskopowe) +, -, /, *, %, etc. >, <, >=, <=,!=, etc. or, and union, intersect, minus, in min(), max(), avg(), count(), bag(), sequence() as, group as, operatory niealgebraiczne (makroskopowe) where. join order by for all

Rodzaje rezultatów w SBQL

Rodzaje rezultatów w SBQL wartość atomowa np. 5, 3.5, Ala ma kota, true referencja np. i0 struktura np. struct(1, 2, 3, 4) bag np. bag(1, 2, i0, blabla ) sekwencja np. sequence(1, 2, 3, 4, 5) binder np. imie(i0), x(bag(1, 2, 3))

Stos rezultatów (QRES)

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań Operacja push umieszcza nowy element na szczycie stosu

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań Operacja push umieszcza nowy element na szczycie stosu Operacja pop usuwa element ze szczytu stosu

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań Operacja push umieszcza nowy element na szczycie stosu Operacja pop usuwa element ze szczytu stosu 5 Przykład stosu QRES

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań Operacja push umieszcza nowy element na szczycie stosu Operacja pop usuwa element ze szczytu stosu 7.5 5 Przykład stosu QRES

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań Operacja push umieszcza nowy element na szczycie stosu Operacja pop usuwa element ze szczytu stosu Ala ma kota 7.5 5 Przykład stosu QRES

Stos rezultatów (QRES) Służy do tymczasowego przechowywania rezultatów zapytań Składa się z elementów będących rezultatami zapytań Operacja push umieszcza nowy element na szczycie stosu Operacja pop usuwa element ze szczytu stosu 7.5 5 Przykład stosu QRES

Proste zapytanie bez nazwy

Proste zapytanie bez nazwy 1 + 2 * 3-4

Proste zapytanie bez nazwy 1 + 2 * 3-4 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 2 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 1 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 + 1 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 + 4 1 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 - + 4 1 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 2 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1 1

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 2 3 2 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1 1 1

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 2 3 2 6 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1 1 1 1

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 2 3 2 6 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1 1 1 1 7

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 2 3 2 6 4 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1 1 1 1 7 7

Proste zapytanie bez nazwy 1 + 2 * 3-4 - tree_walk(node) { if (node is leaf) // wstaw wartość na QRES else if (node is operator) { 1 tree_walk(node.left); tree_walk(node.right); // pobierz element(y) (zależy od operatora) z QRES // wykonaj operację związaną z operatorem // odłóż wynik na QRES } + 4 * 2 3 2 3 2 6 4 Jeśli w zapytaniu nie ma nazw, to do ewaluacji wystarczy stos QRES 1 1 1 1 7 7 3

Stos środowiskowy (ENVS)

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw)

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu Operacja bind dokonuje wiązania nazw

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu Operacja bind dokonuje wiązania nazw Operacja push zazwyczaj wywoływana jest razem z operacją nested

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu Operacja bind dokonuje wiązania nazw Operacja push zazwyczaj wywoływana jest razem z operacją nested emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) Przykład stosu ENVS

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu Operacja bind dokonuje wiązania nazw Operacja push zazwyczaj wywoływana jest razem z operacją nested ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) Przykład stosu ENVS

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu Operacja bind dokonuje wiązania nazw Operacja push zazwyczaj wywoływana jest razem z operacją nested dept(i5) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) Przykład stosu ENVS

Stos środowiskowy (ENVS) Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw) Składa się z sekcji, a każda sekcja składa się z binderów Pierwsza sekcja (sekcja bazowa) inicjalizowana jest automatycznie zawartością bazy danych). Trafiają do niej bindery do obiektów korzeniowych bazy danych Operacja push umieszcza nową sekcję na szczycie stosu Operacje pop usuwa sekcję ze szczytu stosu Operacja bind dokonuje wiązania nazw Operacja push zazwyczaj wywoływana jest razem z operacją nested employs(i22), loc(i23), dname(i24) dept(i5) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) Przykład stosu ENVS

Wiązanie nazw

Wiązanie nazw Operacja bind pobiera jako argument nazwę, a następnie przechodzi ENVS od góry w dół poszukując tej nazwy. Przeszukiwanie przerywane jest w pierwszej sekcji, w której nazwa zostanie znaleziona.

Wiązanie nazw Operacja bind pobiera jako argument nazwę, a następnie przechodzi ENVS od góry w dół poszukując tej nazwy. Przeszukiwanie przerywane jest w pierwszej sekcji, w której nazwa zostanie znaleziona. employs(i22), loc(i23), dname(i24) Kolejność przeszukiwania dept(i5) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Wiązanie nazw Operacja bind pobiera jako argument nazwę, a następnie przechodzi ENVS od góry w dół poszukując tej nazwy. Przeszukiwanie przerywane jest w pierwszej sekcji, w której nazwa zostanie znaleziona. Przykłady: bind( emp ) = bag(i1, i2, i3) bind( dept ) = bag(i5) bind( works_in ) = bag(i17, i29) bind( loc ) = bag(i23) Kolejność przeszukiwania employs(i22), loc(i23), dname(i24) dept(i5) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Proste zapytanie z nazwą

emp Proste zapytanie z nazwą

Proste zapytanie z nazwą emp Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind

Proste zapytanie z nazwą emp Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS

Proste zapytanie z nazwą emp Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. emp(i1), emp(i2), emp(i3), eept(i4), dept(i5), dept(i26)

Proste zapytanie z nazwą emp Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. Wyliczamy bind( Emp ). Wynik na QRES. ENVS pozostaje bez zmian. emp(i1), emp(i2), emp(i3), eept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i1, i2, i3)

Proste zapytanie z nazwą emp Ewaluacja elementarnych zapytań będących nazwami polega na wywołaniu operacji bind Zatem jeśli w dowolnym zapytaniu występuje nazwa, to do ewaluacji potrzebny jest stos QRES i stos ENVS Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. Wyliczamy bind( Emp ). Wynik na QRES. ENVS pozostaje bez zmian. emp(i1), emp(i2), emp(i3), eept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i1, i2, i3) Inne zapytania nie są już takie proste...

Wyznaczanie wnętrza obiektów

Wyznaczanie wnętrza obiektów Operacja nested pobiera jako argument rezultat zapytania. W zależności od rodzaju argumentu wynikiem jest:

Wyznaczanie wnętrza obiektów Operacja nested pobiera jako argument rezultat zapytania. W zależności od rodzaju argumentu wynikiem jest: Dla wartości atomowej: pusty zbiór Dla referencji do obiektu prostego: pusty zbiór Dla referencji do obiektu złożonego: zbiór zawierający bindery z nazwami identyfikatorami podobiektów tego obiektu Dla referencji do obiektu referencyjnego: zbiór zawierający binder z nazwą i identyfikatorem obiektu wskazywanego Dla bindera: ten sam binder Dla struktury: suma operacji nested wszystkich elementów struktury Dla pozostałych rezultatów: pusty zbiór

Wyznaczanie wnętrza obiektów Operacja nested pobiera jako argument rezultat zapytania. W zależności od rodzaju argumentu wynikiem jest: Dla wartości atomowej: pusty zbiór Dla referencji do obiektu prostego: pusty zbiór Dla referencji do obiektu złożonego: zbiór zawierający bindery z nazwami identyfikatorami podobiektów tego obiektu Dla referencji do obiektu referencyjnego: zbiór zawierający binder z nazwą i identyfikatorem obiektu wskazywanego nested(5) = { } nested(i4) = { loc(i6), dname(i7), employs(i8), employs(i9) } nested(i8) = { emp(i3) } nested(struct(i26, i29)) = { loc(i27), dname(i28), dept(i26) } Dla bindera: ten sam binder Dla struktury: suma operacji nested wszystkich elementów struktury Dla pozostałych rezultatów: pusty zbiór

Operator.

Operator. q1.q2 q1. q2

q1.q2 Zainicjalizować dotres = bag() Operator. Wykonać eval(q1) i zrobić q1res = QRES.POP() Dla każdego elementu x q1res wykonać: Utworzyć nową sekcję na ENVS Wykonać nested(x). Wynik wprowadzić do sekcji utworzonej w poprzednim kroku Wykonać eval(q2) i zrobić q2res = QRES.POP() Dodać q2res do dotres (dotres q2res) Zamknąć sekcję ENVS Zrobić QRES.PUSH(dotres) q1. q2

Przykład

Przykład emp.ename Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename.

Przykład emp.ename Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename. Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Przykład emp.ename Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename. Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. Wyliczamy bind( emp ). Wynik na QRES. ENVS pozostaje bez zmian. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i1, i2, i3)

Przykład emp.ename Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename. Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. Wyliczamy bind( emp ). Wynik na QRES. ENVS pozostaje bez zmian. Robimy QRES.POP(). ENVS pozostaje bez zmian. QRES pusty. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i1, i2, i3)

Przykład emp.ename Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename. Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. Wyliczamy bind( emp ). Wynik na QRES. ENVS pozostaje bez zmian. Robimy QRES.POP(). ENVS pozostaje bez zmian. QRES pusty. Robimy nested(i1). ENVS dostaje nową sekcję. QRES bez zmian. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i1, i2, i3)

Przykład emp.ename Zapytanie powinno nam zwrócić referencje do wszystkich nazwisk pracowników emp ename. Inicjalizujemy ENVS i QRES. ENVS z binderami obiektów korzeniowych. QRES pusty. Wyliczamy bind( emp ). Wynik na QRES. ENVS pozostaje bez zmian. Robimy QRES.POP(). ENVS pozostaje bez zmian. QRES pusty. Robimy nested(i1). ENVS dostaje nową sekcję. QRES bez zmian. Wyliczamy bind( ename ). Wynik wrzucamy na QRES. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) ename(i16), works_in(i17), job(i15), works_in(i29) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i1, i2, i3) bag(i16)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES trafia do resdot, więc resdot = bag{i16}. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES trafia do resdot, więc resdot = bag{i16}. Robimy nested(i2). ENVS dostaje nową sekcję. QRES bez zmian. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES trafia do resdot, więc resdot = bag{i16}. Robimy nested(i2). ENVS dostaje nową sekcję. QRES bez zmian. Wyliczamy bind( ename ). Wynik wrzucamy na QRES. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i21)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES trafia do resdot, więc resdot = bag{i16}. Robimy nested(i2). ENVS dostaje nową sekcję. QRES bez zmian. Wyliczamy bind( ename ). Wynik wrzucamy na QRES. Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES do resdot, więc resdot = bag{i16, i21}. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i21)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES trafia do resdot, więc resdot = bag{i16}. Robimy nested(i2). ENVS dostaje nową sekcję. QRES bez zmian. Wyliczamy bind( ename ). Wynik wrzucamy na QRES. Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES do resdot, więc resdot = bag{i16, i21}. Robimy nested(i3). ENVS dostaje nową sekcję. QRES bez zmian. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i10), job(i11), ename(i12), works_in(i13) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i21)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES trafia do resdot, więc resdot = bag{i16}. Robimy nested(i2). ENVS dostaje nową sekcję. QRES bez zmian. Wyliczamy bind( ename ). Wynik wrzucamy na QRES. Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES do resdot, więc resdot = bag{i16, i21}. Robimy nested(i3). ENVS dostaje nową sekcję. QRES bez zmian. Wyliczamy bind( ename ). Wynik wrzucamy na QRES. emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i18), works_in(i19), job(i20), ename(i21) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i10), job(i11), ename(i12), works_in(i13) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) salary(i10), job(i11), ename(i12), works_in(i13) emp(i1), emp(i2), emp(i3), dept(i4), dept(i5), dept(i26) bag(i21) bag(i12)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES do resdot, resdot = bag{i16, i21, i12}. emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES do resdot, resdot = bag{i16, i21, i12}. Wrzucamy resdot na QRES. Koniec wykonywania zapytania. emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26) bag(i16, i21, i12)

Usuwamy sekcję z ENVS i wartość z QRES. Wartość z QRES do resdot, resdot = bag{i16, i21, i12}. Wrzucamy resdot na QRES. Koniec wykonywania zapytania. emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26) emp(i1), emp(i2), emp(i3), dept (i4), dept(i5), dept(i26) bag(i16, i21, i12) W ten sposób mamy nazwiska wszystkich pracowników

Operator where

Operator where q1 where q2 where q1 q2

Operator where q1 where q2 Zainicjalizować whereres = bag() where q1 q2 Wykonać eval(q1) i zrobić q1res = QRES.POP() Dla każdego elementu x q1res wykonać: Utworzyć nową sekcję na ENVS Wykonać nested(x). Wynik wprowadzić do sekcji utworzonej w poprzednim kroku Wykonać eval(q2) i zrobić q2res = QRES.POP() Jeśli q2res == true, wtedy dodać x do whereres Zamknąć sekcję ENVS Zrobić QRES.PUSH(whereres)

Operator where q1 where q2 Zainicjalizować whereres = bag() where q1 q2 Wykonać eval(q1) i zrobić q1res = QRES.POP() Dla każdego elementu x q1res wykonać: Utworzyć nową sekcję na ENVS Wykonać nested(x). Wynik wprowadzić do sekcji utworzonej w poprzednim kroku Wykonać eval(q2) i zrobić q2res = QRES.POP() Jeśli q2res == true, wtedy dodać x do whereres Zamknąć sekcję ENVS Zrobić QRES.PUSH(whereres) Reszta podobnie jak w przypadku operatora....

Ć w i c z e n i a