--- tags: BD, lista 1 --- # Bazy Danych lista1 ## ZADANIE 1 :rocket: * P ∪ ρS(A,B) S : * min: max(p,s) * max: p+s * πA,C (P ⨝ S) * min: 0, gdy niema żadnych par sobie odpowiadających * max: p*s, gdy w obuu tablech w kolumnie B występuje jedna ta sama wartość * πB (P ) \ (πB (P ) \ πB (S)) * min: 0, gdy przekrój P i S pusty * max: p, gdy przekrój P i S pełny * (S ⨝ S) ⨝ S * min: s, gdy w S nie ma duplikatów * max: s^3, gdy w S występuja ta sama krotka s razy * σA<B (P ) ∪ σA>B (P ) * min: 0, gdy wszystkie krotki A=B * max: p, gdy nie ma takich krotke że A=B ## ZADANIE 2 :rocket: * 1. Nie da się, bo: * co to znaczy, że jest montoniczny * operatory są monotoniczne : im większa relacja podana jako argument tym większa relacja w wyniku, a operato **\\** nie ma tej własności. * każdy z operatorów w treści zadania jest monotoniczny (selekcja też) każde wyrażenie złożone z tych operatorów będzie monotoniczne * 2. Co gdy dopuścimyw warunkach przy selekcji negację? * Nadal nie da się, ten sam argument, gdy dopuścimy negację im większa realcja tym większy wynik. ## ZADANIE 3 :rocket: Tak, wyrażenie jest poprawne, w wyniku znajdą się wpisy znajdujące się jednocześnie w X i Y albo jednocześnie w X i Z. Zatem otzrymamy dokładnie (X ∩ Y) ∪ (X ∩ Z) = X ∩ (Y ∪ Z) ## ZADANIE 4 :rocket: 1. Dla każdego filmu sprzed 1960 roku wypisz jego tytuł, nazwisko reżysera i gatunek (genre). ``` c π movies.name, directors.last_name, movies_genres.genre ( σ year < 1960 (movies) ⨝ movies.id = movies_directors.movie_id (movies_directors) ⨝ movies_directors.director_id = directors.id (directors) ⨝ movies.id=movies_genres.movie_id (movies_genres)) ``` 2. Wypisz imiona i nazwiska aktorów, którzy nie zagrali w żadnym filmie Quentina Tarantino. ``` c π directors.id (σ directors.last_name='Tarantino' (directors)) -> 78273 π actors.first_name, actors.last_name (ρ szukani_aktorzy(π id (actors) - (π roles.actor_id (σ movies_directors.director_id = 78273 (roles ⨝ roles.movie_id=movies_directors.movie_id (movies_directors))))) ⨝ szukani_aktorzy.id = actors.id (actors)) ``` 3. Wypisz imiona i nazwiska aktorów, którzy zagrali w dokładnie jednym filmie. ``` c /*pusta więc każdy aktor wystąpił w jakimś filmie*/ π id (actors) - π actor_id (roles) /* aktorzy, którzy grali w conajmniej 2 filmach */ π roles.actor_id (σ roles.movie_id≠roles2.movie_id (roles ⨝ roles.actor_id=roles2.actor_id ρ roles2 (roles))) /* aktorzy, którzy zagrali dokładnie w 1 filmie */ π first_name, last_name ((π id (actors) - π roles.actor_id (σ roles.movie_id≠roles2.movie_id (roles ⨝ roles.actor_id=roles2.actor_id ρ roles2 (roles)))) ⨝ actors) ``` 4. Wypisz tytuły filmów, które są jednocześnie gatunku Drama oraz Sci-Fi. ```c π name (σ movies_genres.genre = 'Drama' ∧ movies_genres2.genre = 'Sci-Fi' (movies_genres ⨝ movies_genres.movie_id = movies_genres2.movie_id ρ movies_genres2 movies_genres) ⨝ movies_genres.movie_id = movies.id movies) ``` 5. Wypisz pełne dane filmów z najwyższą wartością atrybutu rank. ```c (π id movies - π movies.id (σ movies.rank < movies2.rank (movies ⨯ ρ movies2 movies))) ⨝ movies ``` 6. Wypisz nazwiska aktorów, którzy zagrali taką samą rolę w co najmniej dwóch, różnych filmach. ```c π actors.last_name ((π roles.actor_id (σ roles.movie_id≠roles2.movie_id ∧ roles.role=roles2.role (roles ⨝ roles.actor_id = roles2.actor_id ρ roles2 roles))) ⨝ roles.actor_id=actors.id actors) ``` 7. Wypisz nazwiska reżyserów, którzy nigdy nie nakręcili horroru. ```c π directors.last_name ((π id directors - π movies_directors.director_id (σ movies_genres.genre = 'Horror' (movies_directors ⨝ movies_directors.movie_id=movies_genres.movie_id movies_genres))) ⨝ directors) ``` 8. Wypisz nazwiska reżyserów, którzy nakręcili film, w którym wśród aktorów nie było kobiet. ```c /* id filmów, w których wystąpiły kobiety */ π movies.id (σ actors.gender = 'F' ((movies ⨝ movies.id=roles.movie_id roles) ⨝ roles.actor_id=actors.id actors)) /* filmy, w których NIE wystąpiły kobiety */ π id movies - π movies.id (σ actors.gender = 'F' ((movies ⨝ movies.id=roles.movie_id roles) ⨝ roles.actor_id=actors.id actors)) π last_name (π movies_directors.director_id ((π id movies - π movies.id (σ actors.gender = 'F' ((movies ⨝ movies.id=roles.movie_id roles) ⨝ roles.actor_id=actors.id actors))) ⨝ movies.id=movies_directors.movie_id movies_directors) ⨝ movies_directors.director_id=directors.id directors) ``` ## ZADANIE 5 :rocket: 1. Co zwraca zapytanie ```c gamma actors.first_name; count(actors.gender) → liczba (actors ⨝ actors.id=roles.actor_id roles) ``` * Tabela: aktorzy, którzy grali w conajmniej jednym filmie. * Grupujemy aktorów o tym samym imieniu i zliczamy ile jest wpisów w kolumnie o nazwie actors.gender w każdej z grup. W wyniku otrzymam liczbę aktorów o danym imieniu. 2. Dla każdego gatunku filmowego wspomnianego w relacji movies_genre podaj liczbę filmów tego gatunku. ```c gamma movies_genres.genre; count(movies_genres.movie_id) → liczba movies_genres ``` 3. Dla każdego filmu, w którym zagrał zarówno aktor, jak i aktorka wypisz czwórkę: id, tytuł (tzn. name) oraz liczbę aktorek i liczeb aktorów, w nim grających. ```c /* dla każdego aktora kazdy film, w którym wystąpił */ π actors.id, roles.movie_id σ actors.gender='M' (actors ⨝ actors.id=roles.actor_id roles) /* dla każdego filmu liczba aktorów w nim grających */ gamma roles.movie_id; count(actors.id) → liczba π actors.id, roles.movie_id σ actors.gender='M' (actors ⨝ actors.id=roles.actor_id roles) /* dla każdego filmu liczba aktorek w nim grających */ gamma roles.movie_id; count(actors.id) → liczba π actors.id, roles.movie_id σ actors.gender='F' (actors ⨝ actors.id=roles.actor_id roles) π movies.id, movies.name, M.liczba, F.liczba ((π M.movie_id, M.liczba, F.liczba (ρ M gamma roles.movie_id; count(actors.id) → liczba π actors.id, roles.movie_id σ actors.gender='M' (actors ⨝ actors.id=roles.actor_id roles) ⨝ M.movie_id = F.movie_id ρ F gamma roles.movie_id; count(actors.id) → liczba π actors.id, roles.movie_id σ actors.gender='F' (actors ⨝ actors.id=roles.actor_id roles))) ⨝ M.movie_id = movies.id movies) ``` ## MATERIAŁY * kalkulator algebry relacji: https://dbis-uibk.github.io/relax/help#relalg-reference