# pog 1 ## ściąga ![](https://i.imgur.com/WMJM50A.png) ![](https://i.imgur.com/SGnsMcA.png) ![](https://i.imgur.com/UuzYMae.png) ![](https://i.imgur.com/G5PssxR.png) $\sigma$ - select $\pi$ - projection $\rho$ - rename ## zadanie 1 ![](https://i.imgur.com/hOYiRsy.png) a) max = p+s - wtedy gdy P oraz S nie mają wspólnego krotki min = max(p,s) - wtedy gdy P zawiera się w S lub S zawiera się w P b) max = $p \cdot s$ gdy natural join zachowa się jak cartesian product min = 0 gdy $B_P \cap B_S = \emptyset$ c) max = p - gdy $B_P = B_S$ min = 0 gdy $B_P \cap B_S = \emptyset$ d) max = min = s e) max = p, gdy $\forall_{p \in P} p.a \neq p.b$ min = 0 gdy $\forall_{p \in P} p.a = p.b$ ## zadanie 2 ![](https://i.imgur.com/NZcP534.png) $\rho, \pi, \times, \cup$ they don't make a boundary on a set, they can only expand it or preserve it. $\sigma$ this operator can reduce elements of the set but the constrains on the formula $F$ gives too few operations that aren't able to produce all possible formulas. `When we allow to use negation we can construct all possible formulas (logic for CS).` To co wyżej, ale jeszcze przy wprowadzeniu negacji możemy skonstruować następującą formułę $F=$ Możliwe drogi: a) sumę po singletonach lub po zbiorach pustych przy czym singelton wtw gdy dany element zbioru A nie występuje w zbiorze B $A \rightarrow \{(a),\emptyset\}$ $\pi_{a}\sigma_{a=b}A\times B = A\cap B$ $|A \cup B| = |A| + |B| - |A\cap B|$ A B 1 2 2 3 3 4 ![](https://i.imgur.com/QzbDZFo.png) rozw Kamila (bez formuły) ![](https://i.imgur.com/FG8ZHON.png) ## zadanie 3 ![](https://i.imgur.com/HCDTgdg.png) $(A,A_Y,A_Z)$ Dowód, że działa: Cel: $X \cap (Y \cup Z)=\pi_A(\sigma_{A=A_Y\vee A=A_Z}(X \times \rho_{Y(A_Y)}(Y)\times \rho_{Z(A_Z)}(Z)))$ Weźmy dowolny element $a \in \pi_A(\sigma_{A=A_Y\vee A=A_Z}(X \times \rho_{Y(A_Y)}(Y)\times \rho_{Z(A_Z)}(Z)))$ on spełnia następującą własność $a\in X \wedge (a\in Y \vee a \in Z)$ a zatem z definicji $a\in X \cap (Y \cup Z)$. Teraz weźmy dowolny element $b\in X \cap (Y \cup Z)$ wtedy $b$ spełnia $b\in X \wedge (b\in Y \vee b \in Z)$ ale wtedy istnieje taka pewna krotka $(b,y,z)$, że $y=b \vee z =b$. A zatem spełnia własność naszej $\sigma$. ## zadanie 4 ![](https://i.imgur.com/fFqqXNu.png) ![](https://i.imgur.com/Uwt31zj.png) a) pom1 = σyear<1960(movies) pom2 = ((movies_directors)⨯(pom1)) pom3 = σmovies_directors.movie_id =movies.id (pom2) pom4 = πmovies_directors.director_id,movies.id,movies.name (pom3) pom5 = (directors)⨝directors.id=movies_directors.director_id (pom4) pom6 = πmovies.name,directors.last_name,movies.id(pom5) pom7 = movies_genres ⨝movie_id=movies.id pom6 result = π movies.name,directors.last_name,movies_genres.genre pom7 result a1) π name, last_name, genre (((σ year < 1960 (movies) ⨝ movies_genres.movie_id = movies.id movies_genres) ⨝ movies.id = movies_directors.movie_id movies_directors) ⨝ movies_directors.director_id = directors.id directors) b) id = πdirectors.id(σfirst_name='Quentin' ∧ last_name='Tarantino' directors) remove = (movies_directors⨝director_id=directors.id id) remove_movies = πmovies_directors.director_id,movies_directors.movie_id(movies⨝id=movies_directors.movie_id remove) pom2 = πmovies_directors.movie_id remove_movies pom3 = πroles.actor_id (roles⨝movie_id=movies_directors.movie_id pom2) pom4 = πactors.id,actors.first_name,actors.last_name,actors.gender (actors⨝id=roles.actor_id pom3) actors - pom4 b1) tarantino_movies = movies_directors ⨝ director_id = id σ id = 78273 (directors) actors_in_tarantino_movies = π actor_id (roles ⨝ roles.movie_id = movies_directors.movie_id (tarantino_movies)) all_actors = π id (actors) π first_name, last_name(actors ⨝ (all_actors - actors_in_tarantino_movies)) c) good_ids = (πroles.actor_idσhow_many_movies=1(γ actor_id;count(movie_id)->how_many_movies roles)) πactors.first_name,actors.last_name(actors⨝id=roles.actor_id good_ids) c1) actors ⨝ (π id (actors) - (ρ actor_id->id (π r1.actor_id (σ r1.actor_id = r2.actor_id ∧ r1.movie_id ≠ r2.movie_id (ρ r1 (roles) x ρ r2 (roles)))))) d) ids = (πmovies_genres.movie_idσmovies_genres.genre='Sci-Fi'movies_genres)∩(πmovies_genres.movie_idσmovies_genres.genre='Drama'movies_genres) πmovies.name (movies⨝id=movies_genres.movie_id ids) e) pom1 = τ rank desc (movies) pom2 = γ max(rank)->x (movies) πmovies.id,movies.name,movies.year,movies.rank (pom1 ⨝movies.rank=x pom2) e1) (movies ⨝ (π id (movies) - π movies.id (σ m.rank > movies.rank ((ρ m (movies)) x movies)))) f) pom1 = γ roles.actor_id, roles.role; count(roles.movie_id)->x roles πactors.last_name ((actors)⨝id=roles.actor_id (πroles.actor_idσx>1 pom1)) f1) actors ⨝ (ρ actor_id->id (π r1.actor_id (σ r1.actor_id = r2.actor_id ∧ r1.movie_id ≠ r2.movie_id ∧ r1.role = r2.role (ρ r1 (roles) x ρ r2 (roles))))) g) (directors ⨝ ( π id (directors) - π directors.id (σ directors_genres.genre = 'Horror'(directors ⨝ id = director_id directors_genres)))) g1) remove_id = πmovies_directors.director_id(movies_directors⨝movie_id=movies_genres.movie_id (πmovies_genres.movie_idσgenre='Horror' movies_genres)) πdirectors.last_name(directors-πdirectors.id,directors.first_name,directors.last_name(directors⨝id=movies_directors.director_id remove_id)) h) id_kobiet = πidσgender='F' actors id_movies_with_f = (πroles.movie_id(roles⨝actor_id=actors.id id_kobiet)) πdirectors.first_name,directors.last_name (directors ⨝id=movies_directors.director_id (πmovies_directors.director_id (movies_directors-πmovies_directors.director_id,movies_directors.movie_id(movies_directors⨝movie_id=roles.movie_id id_movies_with_f)))) h1) directors ⨝ ρ director_id→id (π director_id (movies_directors ⨝ movie_id = id (π id (movies) - π movie_id (σ gender = 'F' (actors ⨝ actor_id = id roles))))) ## zadanie 5 ![](https://i.imgur.com/Vm7GVqW.png) a) gamma actors.first_name; count(actors.gender)→ liczba (actors ⨝ actors.id=roles.actor_id roles) zapytanie zwraca dla każdego imienia aktorów ilość roli zagranych przez aktorów z takim imieniem, w tabeli zwracanej przez child_expression mamy wszystkie rekordy aktorów i przydzielonych im ról, więć kolumna po której będziemy zliczać nie ma znaczenia b) γ genre; count(movie_id) -> liczba (movies_genres) c) female_movies = π movie_id (σ gender = 'F' (actors ⨝ actor_id = id roles)) male_movies = π movie_id (σ gender = 'M' (actors ⨝ actor_id = id roles)) actors_and_movies_with_MF = (actors ⨝ id=actor_id (roles ⨝ (male_movies ∩ female_movies))) (γ movie_id; count(actor_id)->aktorki (π actor_id, movie_id( σ gender = 'F' actors_and_movies_with_MF))) ⨝ (γ movie_id; count(actor_id)->aktorzy (π actor_id, movie_id( σ gender = 'M' actors_and_movies_with_MF)))