Krzysztof Kozłowski,258472 Robert Kumanek, 258588

Muzyczna Baza Danych

Nasza baza danych jest próbą usystematyzowanego zarchiwizowania branży muzycznej. Muzyczna Baza Danych( dalej jako MBD) ma wiele różnych zastosowań. Dzięki niej, użytkownik może dowiedzieć się kiedy jego ulubiony zespół zagra koncert i ile będzie kosztował bilet wstępu. Z łatwością będzie również mógł sprawdzić aktualną top listę albumów jak i szybko sprawdzić całą dyskografię zespołu.

MBD składa się z 10 relacji: • album – Pierwsza główna tabela, relacja zawierająca informacje o albumie • piosenki – relacja zawierająca informacje o wnętrzu albumu • wytwornia – relacja o wytwórniach, które wydały nasze albumy • recenzja – zbiór recenzji o albumach • zespol – Druga główna tabela, relacja zawierająca informacje o nazwie zespołu i jego założeniu • koncert - relacja stworzona z myślą o fanach, przechowująca informacje o wydarzeniach muzycznych • czlonek – relacja zawierająca informacje o „wnętrzu” zespołu • instrument – relacja o tym kim są dani członkowie w zespole • ranking – widok wyświetlający top listę albumów • ranking_zespolow – widok wyświetlający top listę zespołów Kod źródłowy

DROP TABLE album CASCADE; DROP TABLE czlonek CASCADE; DROP TABLE zespol CASCADE; DROP TABLE instrument CASCADE; DROP TABLE piosenki CASCADE; DROP TABLE wytwornia CASCADE; DROP TABLE koncert CASCADE; DROP TABLE instrument CASCADE; DROP TABLE recenzja CASCADE;

CREATE TABLE album( tytul_albumu TEXT PRIMARY KEY, rok_wydania INTEGER , wytwornia TEXT NOT NULL, nazwa_zespolu TEXT NOT NULL, recenzja BOOLEAN DEFAULT FALSE );

CREATE TABLE recenzja( tresc TEXT PRIMARY KEY, imie_autora TEXT NOT NULL, nazwisko_autora TEXT NOT NULL, ocena_autora INTEGER, tytul_albumu TEXT );

ALTER TABLE recenzja ADD FOREIGN KEY (tytul_albumu) REFERENCES album(tytul_albumu) ON UPDATE CASCADE ON DELETE CASCADE;

CREATE TABLE zespol( nazwa_zespolu TEXT PRIMARY KEY, rok_zalozenia INTEGER );

ALTER TABLE album ADD FOREIGN KEY(nazwa_zespolu) REFERENCES zespol(nazwa_zespolu) ON UPDATE CASCADE ON DELETE CASCADE;

CREATE TABLE czlonek( imie TEXT NOT NULL, nazwisko TEXT NOT NULL, pseudo TEXT, nazwa_zespolu TEXT NOT NULL, PRIMARY KEY(imie, nazwisko) );

ALTER TABLE czlonek ADD FOREIGN KEY(nazwa_zespolu) REFERENCES zespol(nazwa_zespolu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE TABLE piosenki( tytul_albumu TEXT NOT NULL, tytul_piosenki TEXT NOT NULL, nr_w_albumie INTEGER NOT NULL, ocena INTEGER, gatunek TEXT, PRIMARY KEY(tytul_albumu,tytul_piosenki) );

ALTER TABLE piosenki ADD FOREIGN KEY(tytul_albumu) REFERENCES album(tytul_albumu) ON UPDATE CASCADE ON DELETE CASCADE;

CREATE TABLE wytwornia( nazwa TEXT PRIMARY KEY, kraj TEXT, miasto TEXT, kod_pocztowy TEXT );

ALTER TABLE wytwornia ADD CHECK(kod_pocztowy::text ~'^[0-9][2]-[0-9][3]$'::text); ALTER TABLE album ADD FOREIGN KEY(wytwornia) REFERENCES wytwornia(nazwa) ON UPDATE CASCADE ON DELETE CASCADE;

CREATE TABLE instrument( instrument TEXT NOT NULL, imie TEXT NOT NULL, nazwisko TEXT NOT NULL );

ALTER TABLE instrument ADD FOREIGN KEY(imie,nazwisko) REFERENCES czlonek(imie,nazwisko) ON UPDATE CASCADE ON DELETE CASCADE;

CREATE TABLE koncert( nazwa_zespolu TEXT NOT NULL, data_ DATE, nazwa_wydarzenia TEXT, miejsce TEXT, cena INTEGER, PRIMARY KEY(nazwa_wydarzenia,data_) );

ALTER TABLE koncert ADD CHECK (cena > 0); ALTER TABLE koncert ADD FOREIGN KEY(nazwa_zespolu) REFERENCES zespol(nazwa_zespolu) ON UPDATE CASCADE ON DELETE CASCADE; CREATE OR REPLACE FUNCTION srednia_zespolu(nazwa TEXT) RETURNS DECIMAL(4,2) AS $$ DECLARE r RECORD; suma DECIMAL(4,2); ilosc DECIMAL(4,2); BEGIN suma=0; ilosc=0; FOR r IN SELECT * FROM album WHERE nazwa_zespolu=nazwa LOOP suma= suma + srednia_albumu(r.tytul_albumu); ilosc=ilosc+1; END LOOP; suma = suma/ilosc; RETURN suma; END; $$ LANGUAGE 'plpgsql';

CREATE OR REPLACE FUNCTION srednia_albumu(nazwa TEXT) RETURNS DECIMAL(4,2) AS $$ DECLARE r RECORD; suma DECIMAL(4,2); ilosc DECIMAL(4,2); BEGIN suma=0; ilosc=0; FOR r IN SELECT * FROM piosenki WHERE piosenki.tytul_albumu=nazwa LOOP suma=suma+r.ocena; ilosc=r.nr_w_albumie; END LOOP; suma= suma/ilosc; RETURN suma; END; $$ LANGUAGE 'plpgsql'; --wedlug sredniej albumu

CREATE VIEW ranking AS SELECT album.tytul_albumu, srednia_albumu(tytul_albumu) FROM album ORDER BY srednia_albumu(tytul_albumu) DESC;

CREATE OR REPLACE VIEW ranking_zespolow AS SELECT DISTINCT album.nazwa_zespolu, srednia_zespolu(nazwa_zespolu) FROM album ORDER BY srednia_zespolu(nazwa_zespolu) DESC; CREATE OR REPLACE FUNCTION plyty_wydane(nazwa TEXT) RETURNS TABLE(nazwa_plyty TEXT, rok INTEGER) AS $$ BEGIN RETURN query SELECT album.tytul_albumu, album.rok_wydania FROM album WHERE nazwa=album.nazwa_zespolu; RETURN; END; $$ LANGUAGE 'plpgsql';

CREATE OR REPLACE FUNCTION piosenki_zespolu(nazwa TEXT) RETURNS TABLE(nazwa_plyty TEXT) AS $$ BEGIN RETURN query SELECT piosenki.tytul_piosenki FROM piosenki,album WHERE album.tytul_albumu=piosenki.tytul_albumu AND nazwa=album.nazwa_zespolu; RETURN; END; $$ LANGUAGE 'plpgsql';

--najblizsze koncerty zespolu CREATE OR REPLACE FUNCTION koncerty_zespolu(nazwa TEXT) RETURNS TABLE(data_ DATE,nazwa_wydarzenia TEXT,miejsce TEXT,cena INTEGER) AS $$ BEGIN RETURN query SELECT koncert.data_ ,koncert.nazwa_wydarzenia ,koncert.miejsce ,koncert.cena FROM koncert WHERE koncert.nazwa_zespolu=nazwa; END; $$ LANGUAGE 'plpgsql';

--wyswietla czlonkow zespolu CREATE OR REPLACE FUNCTION czlonkowie_zespolu(nazwa TEXT) RETURNS TABLE(imie_ TEXT,nazwisko_ TEXT, pseudonim_1 TEXT, instrument_1 TEXT) AS $$ BEGIN RETURN query SELECT czlonek.imie,czlonek.nazwisko,czlonek.pseudo,instrument.instrument FROM czlonek,instrument WHERE czlonek.imie=instrument.imie AND czlonek.nazwisko=instrument.nazwisko AND czlonek.nazwa_zespolu=nazwa; END; $$ LANGUAGE 'plpgsql';

--nie moze byc dwoch koncertow jednego dnia w innych miejscach CREATE OR REPLACE FUNCTION dwa_koncerty_jeden_dzien() RETURNS TRIGGER AS $$ BEGIN IF(SELECT nazwa_zespolu FROM koncert WHERE NEW.data_=koncert.data_ AND NEW.miejsce!=koncert.miejsce) IS NOT NULL THEN RAISE EXCEPTION 'Zespol nie moze grac tego samego dnia w dwoch roznych miejscach!'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql'; CREATE TRIGGER dwa_koncerty BEFORE INSERT OR UPDATE ON koncert FOR EACH ROW EXECUTE PROCEDURE dwa_koncerty_jeden_dzien();

--nie moze byc dwoch utworow o tych samych numerach na jednym albumie CREATE OR REPLACE FUNCTION jeden_numer_album() RETURNS TRIGGER AS $$ BEGIN IF(SELECT piosenki.tytul_piosenki FROM piosenki WHERE NEW.nr_w_albumie=piosenki.nr_w_albumie AND NEW.tytul_albumu=piosenki.tytul_albumu) THEN RAISE EXCEPTION 'Na tym albumie juz jest piosenka od tym numerze!'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql';

--albumy musza byc wydawane chronologicznie CREATE TRIGGER jeden_numer_w_albumie BEFORE INSERT OR UPDATE ON piosenki FOR EACH ROW EXECUTE PROCEDURE jeden_numer_album();

CREATE OR REPLACE FUNCTION chronologia_albumu() RETURNS TRIGGER AS $$ BEGIN IF(SELECT nazwa_zespolu FROM album WHERE (NEW.rok_wydania

CREATE TRIGGER chronologia_albumu_ BEFORE INSERT OR UPDATE ON album FOR EACH ROW EXECUTE PROCEDURE chronologia_albumu();

INSERT INTO wytwornia VALUES('Parlophone','Niemcy','',NULL); INSERT INTO wytwornia VALUES('EMI','Anglia','Londyn',NULL); INSERT INTO wytwornia VALUES('BMK','USA','Waszyngton',NULL); INSERT INTO wytwornia VALUES('Giant Records','Polska','',NULL); INSERT INTO wytwornia VALUES('Columbia Records','USA','Miami',NULL); INSERT INTO wytwornia VALUES('Epic Records','USA','Miami',NULL);

INSERT INTO zespol VALUES('The Beatles',1960); INSERT INTO zespol VALUES('Bisz',2001); INSERT INTO zespol VALUES('',1998); INSERT INTO zespol VALUES('Nneka',2009); INSERT INTO zespol VALUES('Outlawz',NULL); INSERT INTO zespol VALUES('The Clash',1977); INSERT INTO zespol VALUES('Miles Davis Quartet',1964); INSERT INTO zespol VALUES('',1996); INSERT INTO album VALUES('Revolver',1966,'Parlophone','The Beatles',TRUE); INSERT INTO album VALUES('Fandago',1993,'BMK','Bisz',NULL); INSERT INTO album VALUES('',1993,'Giant Records','Paktofonika',NULL); INSERT INTO album VALUES('Archiwum Kinematografii',1996,'Giant Records','Paktofonika',NULL); INSERT INTO album VALUES('Soul is Heavy',2001,'Giant Records','Nneka',NULL); INSERT INTO album VALUES('All eyez on me',1993,'Giant Records','Outlawz',NULL); INSERT INTO album VALUES('Still I Rise',1997,'Epic Records','Outlawz',NULL); INSERT INTO album VALUES('London Calling',1979,'Epic Records','The Clash',NULL); INSERT INTO album VALUES('Kind of Blue',1979,'Columbia Records','Miles Davis Quartet',NULL); INSERT INTO album VALUES('Czerwony Album',2002,'Giant Records','Abradab',NULL); INSERT INTO album VALUES('Panato',1994,'BMK','Bisz',NULL); INSERT INTO album VALUES('Let It Be',1970,'EMI','The Beatles',NULL);

INSERT INTO czlonek VALUES('Robert','Napisko','Abradab','Abradab'); INSERT INTO czlonek VALUES('Miles','Davis','Gringo','Miles Davis Quartet'); INSERT INTO czlonek VALUES('Michal','Urbaniak','Urbanator','Miles Davis Quartet'); INSERT INTO czlonek VALUES('Mike','Kennedy',NULL,'Miles Davis Quartet'); INSERT INTO czlonek VALUES('Sammy','Lebowsky',NULL,'Miles Davis Quartet'); INSERT INTO czlonek VALUES('Patson','Marlsow','Marlboro','The Clash'); INSERT INTO czlonek VALUES('Michael','Fins','Finito','The Clash'); INSERT INTO czlonek VALUES('Frank','Gibson','Mel','The Clash'); INSERT INTO czlonek VALUES('John','Lennon',NULL,'The Beatles'); INSERT INTO czlonek VALUES('Paul','McCartney',NULL,'The Beatles'); INSERT INTO czlonek VALUES('George','Harrison',NULL,'The Beatles'); INSERT INTO czlonek VALUES('Ringo','Starr',NULL,'The Beatles'); INSERT INTO czlonek VALUES('Jaroslaw','Jaroszewski','Bisz','The Beatles'); INSERT INTO czlonek VALUES('Piotr','Luszcz','','Paktofonika'); INSERT INTO czlonek VALUES('Wojciech','Alszer','Fokus','Paktofonika'); INSERT INTO czlonek VALUES('Sebastian','Salbert','','Paktofonika'); INSERT INTO czlonek VALUES('Nneka','Egbuna','Nneka','Nneka'); INSERT INTO czlonek VALUES('Tupac','Shakur','Tupac','Outlawz'); INSERT INTO czlonek VALUES('Mario','Beninson','50 cent','Outlawz'); ------INSERT INTO piosenki VALUES('All eyez on me','Me and my mom',1,2,'reagge'); INSERT INTO piosenki VALUES('All eyez on me','Fristajlo',2,9,'pop'); INSERT INTO piosenki VALUES('All eyez on me','When I saw her',3,4,'pop'); INSERT INTO piosenki VALUES('All eyez on me','I want only 3',4,8,'pop'); INSERT INTO piosenki VALUES('Still I Rise','Let it on',1,8,'pop'); INSERT INTO piosenki VALUES('Still I Rise','Are you ready?',2,3,'pop'); INSERT INTO piosenki VALUES('Still I Rise','I',3,2,'pop'); INSERT INTO piosenki VALUES('Still I Rise','Me and you',4,3,'pop'); INSERT INTO piosenki VALUES('Soul is Heavy','God Of Mercy',1,8,'pop'); INSERT INTO piosenki VALUES('Soul is Heavy','Oh wow..',2,2,'soul'); INSERT INTO piosenki VALUES('Soul is Heavy','Hey you',3,3,'pop'); INSERT INTO piosenki VALUES('Archiwum Kinematografii','Play+Rec',1,7,'rap'); INSERT INTO piosenki VALUES('Archiwum Kinematografii','Le sie zmahauem',2,1,'rap'); INSERT INTO piosenki VALUES('Archiwum Kinematografii','Mechaniczna pomarancza',3,2,'rap'); INSERT INTO piosenki VALUES('Archiwum Kinematografii','A robi sie to tak',4,6,'rap'); INSERT INTO piosenki VALUES('Archiwum Kinematografii','Dla pewnego swego',5,4,'rap'); INSERT INTO piosenki VALUES('Kinematografia','Priorytety',1,4,'rap'); INSERT INTO piosenki VALUES('Kinematografia','Jestem Bogiem',2,5,'rap'); INSERT INTO piosenki VALUES('Kinematografia','W moich kregach',3,2,'rap'); INSERT INTO piosenki VALUES('Kinematografia','Chwile ulotne',4,6,'rap'); INSERT INTO piosenki VALUES('Kinematografia','Gdyby..',5,8,'rap'); INSERT INTO piosenki VALUES('Revolver','Taxman',1,5,'rock'); INSERT INTO piosenki VALUES('Revolver','Eleanor Rigby',2,7,'rock'); INSERT INTO piosenki VALUES('Revolver','Yellow Submarine',3,8,'rock'); INSERT INTO piosenki VALUES('Let It Be','Two of Us',1,2,'rock'); INSERT INTO piosenki VALUES('Let It Be','Dig a Pony',2,5,'rock'); INSERT INTO piosenki VALUES('London Calling','Bankrobber',5,1,'rock'); INSERT INTO piosenki VALUES('London Calling','Should I stay or should I go',3,2,'rock'); INSERT INTO piosenki VALUES('London Calling','I fought for law',2,7,'rock'); INSERT INTO piosenki VALUES('London Calling','London Calling',7,5,'rock'); INSERT INTO piosenki VALUES('Kind of Blue','Collour of Blue',3,7,'jazz'); INSERT INTO piosenki VALUES('Kind of Blue','So what',4,9,'jazz'); INSERT INTO piosenki VALUES('Kind of Blue','Many tears',1,8,'jazz'); INSERT INTO piosenki VALUES('Kind of Blue','Me and my mom',2,8,'jazz'); INSERT INTO piosenki VALUES('Czerwony Album','Rapowe ziarno',1,6,'rap'); INSERT INTO piosenki VALUES('Czerwony Album','Piosenka o G',2,7,'rap'); INSERT INTO piosenki VALUES('Czerwony Album','Zapomnialem tytulu',6,8,'rap'); INSERT INTO piosenki VALUES('Czerwony Album','Don Kichot',3,6,'rap'); INSERT INTO piosenki VALUES('Czerwony Album','Poprawny wokal',4,5,'rap'); INSERT INTO piosenki VALUES('Panato','Sam',1,9,'rap'); INSERT INTO piosenki VALUES('Panato','Chodnikowy wilk',3,2,'rap'); INSERT INTO piosenki VALUES('Panato','Oni maja nas',2,5,'rap'); INSERT INTO piosenki VALUES('Panato','Bezpowrotny szlak',4,3,'rap'); INSERT INTO piosenki VALUES('Panato','Burza',5,2,'rap'); INSERT INTO piosenki VALUES('Fandago','Glos pokolenia',1,2,'rap'); INSERT INTO piosenki VALUES('Fandago','Bambus Murzyn',3,3,'reagge'); INSERT INTO piosenki VALUES('Fandago','Babylon',6,2,'ska'); INSERT INTO piosenki VALUES('Fandago','Tax',2,4,'heavy metal');

INSERT INTO koncert VALUES('The Clash','2014-09-09','T-rock','Miami',75); INSERT INTO koncert VALUES('Miles Davis Quartet','2014-01-09','Jazz Festiwal','New Yourk',50); INSERT INTO koncert VALUES('Bisz','2014-02-09','Hip-Hop Fest','Piotrkow Trybunalski',30); INSERT INTO koncert VALUES('The Clash','2014-10-09','T-rock','Chicago',75); INSERT INTO koncert VALUES('Abradab','2014-05-09','Hip-Hop Fest','Poznan',15);

INSERT INTO instrument VALUES('Piotr','Piotr','Luszcz'); INSERT INTO instrument VALUES('Paul','Paul','McCartney'); INSERT INTO instrument VALUES('Gitara','John','Lennon'); INSERT INTO instrument VALUES('Wokal','John','Lennon'); INSERT INTO instrument VALUES('Gitara','George','Harrison'); INSERT INTO instrument VALUES('Perkusja','Ringo','Starr'); INSERT INTO instrument VALUES('Trabka','Miles','Davis'); INSERT INTO instrument VALUES('Skrzypce','Michal','Urbaniak'); INSERT INTO instrument VALUES('Gitara Basowa','Sammy','Lebowsky'); INSERT INTO instrument VALUES('Bongosy','Mike','Kennedy'); INSERT INTO instrument VALUES('Gitara','Patson','Marlsow'); INSERT INTO recenzja VALUES('The most innovative track on the album is John Lennon "Tomorrow Never Knows." Attempting to distill an LSD trip into a three-minute song, Lennon borrowed lyrics from Timothy Leary version of The Tibetan Book of the Dead, and recorded his vocal to sound like "the Dalai Lama singing from the highest mountaintop." Tape loops, a backward guitar part (Paul McCartney blistering solo on "Taxman," in fact) and a droning tamboura completed the experimental effect, and the song proved hugely influential. For his part, on "Eleanor Rigby" and "For No One," McCartney mastered a strikingly mature form of art song, and Harrison, with "Taxman," "I Want to Tell You" and "Love You To," challenged Lennon-McCartney songwriting dominance.','John','McKandy',10,'Revolver');

INSERT INTO recenzja VALUES('Paul McCartney, the most devoted of the gang to the notion of the Beatles (Ringo Starr called him the "Beatleaholic"), thought that the group needed a special project to bring it together. Another White Album-style scenario, with the songwriters in the band working alone in separate studios, enlisting each other to serve as a de facto backup band, was bound to fail. Too much good will and trust had been lost. They needed something big they could all submit to. Several ideas were proposed, most involving a return of some kind to live performance: perhaps a live album of new songs or a huge show in a remote place; maybe the band would charter an ocean liner and make an album on it. Ultimately, it was decided that the band would be filmed on a soundstage rehearsing for a show and developing material for a new album-- a document of the Beatles at work. The theme for the project would be back-to-basics, a return of the group as a performing unit, sans overdubs, emphasizing their inherent musicality. Working title: Get Back.','Stephen','Walken',7,'Let It Be'); Dodawanie albumu

Po dodaniu

Wyzwalacz chronologia_albumu - próba wprowadzenia krotki jednego zespołu i jego albumu z rokiem wydania wcześniejszego niż poprzednie albumy tego wykonawcy. Wyzwalacz jeden_numer_album – próba wprowadzenia piosenki z konkretnym numerem 2 do albumu, w którym już jest inna piosenka o tym numerze

Widok Rankingzespolow – Na podstawie ocen z piosenek oblicza ocenę albumu, a po tym oblicza ocenę zespołu na podstawie jego ocen z albumów.