---
# System prepended metadata

title: Bazy Danych  lista1

---


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


