/*EXERCISE lecture 15-06-2020 */ CREATE TABLE stadium ( city varchar NOT NULL, /*To be sure we specify NOT NULL but is implicity implemented using primary key*/ name varchar NOT NULL, country integer NOT NULL REFERENCES country(id) ON UPDATE CASCADE ON DELETE NO ACTION, /* what happen to stadium when we update the country? CASCADE, ON DELETE or NO ACTION since in this case there is not specification, we will leave NO ACTION */ address varchar, capacity integer DEFAULT 10000 CHECK (capacity > 10000 ), PRIMARY KEY(name,city,country) /* we need a vector since we need multiple teams in a stadium but in a RELATIONAL DB is incorrect. We need a table called team team vector(?) */ ); -- 1) -- consider that a team has just one associated stadium_city -- modify the structure of the team table ALTER TABLE team ADD COLUMN stadium_name varchar; ALTER TABLE team ADD COLUMN stadium_city varchar; ALTER TABLE team ADD COLUMN stadium_country integer; ALTER TABLE team ADD CONSTRAINT fk_stadium FOREIGN KEY (stadium_name, stadium_city, stadium_country) REFERENCES stadium(name, city, country) ON UPDATE CASCADE ON DELETE NO ACTION; ALTER TABLE team ADD COLUMN gallery varchar; -- 2) -- Consider that a team can have more than one associated stadium -- We need to create a new table CREATE TABLE team_stadium ( /*If team deleted the association with the stadium needs to be deleted*/ team integer REFERENCES team(id) ON UPDATE CASCADE ON DELETE CASCADE, stadium_name varchar, stadium_city varchar, stadium_country integer, gallery varchar, FOREIGN KEY (stadium name,stadium_city, stadium_country) REFERENCES stadium(name, city, country) ON UPDATE CASCADE ON DELETE NO ACTION, PRIMARY KEY(team, stadium_name, stadium_city, stadium_country) ); -- ================ QUERIES EXERCISES ================= -- retrieve the league name and the -- corresponding country name for Italy and France -- league -- id -- country -- name /* We need to JOIN the league with country table*/ SELECT league.name AS "league name", league.country AS "country name" FROM league INNER JOIN country ON country.id = league.country_id WHERE country.name = "Italy" OR country.name = "France" -- retrieve teams that have "Real" in their name SELECT * FROM team WHERE team_long_name ilike "%real%" -- ilike is insensitive (we do not know if is upper or lower case) -- retrieve bets where away_odds are higher than home_odds SELECT * FROM bets WHERE bets.away_odds > bets.home_odds -- retrieve the bets where the draw_odds are not provided SELECT * FROM bets WHERE draw_odds IS NULL -- IS NOT NULL if we want to check NOT NULL -- retrieve the total number of goals scored by Real Madrid -- in hoem meatches in 2010/2011 SELECT SUM(home_team_goal) FROM team INNER JOIN match ON match.home_team_id = team.id WHERE team_long_name ilike "%real madrid%" AND match.season = "2010/2011" -- >> 61 is the result. -- Real Madrid gives NULL since the real name of Real Madrid CF -- ===== aggregate OPERATORS: SUM, MAX, MIN, AVG, COUNT -- ===== group by -- retrieve the average odds -- for any match of Spain Liga of 2010/2011 SELECT match.id AS "match" AVG(home_odds) AS "home odds", AVG(draw_odds) AS "draw odds", AVG(away_odds) AS "away odds" FROM match INNER JOIN league ON match.league_id = league.id INNER JOIN country ON country.id = league.country_id INNER JOIN bet ON match.id = bet.match_id WHERE country.name = "Spain" AND league.name = "Liga" AND match.season = "2010/2011" GROUP BY match.id; -- retrieve the average odds -- for any match of Spain Liga of 2010/2011 -- where the average home_odds are higher than 0.5 SELECT match.id AS "match" AVG(home_odds) AS "home odds", AVG(draw_odds) AS "draw odds", AVG(away_odds) AS "away odds" FROM match INNER JOIN league ON match.league_id = league.id INNER JOIN country ON country.id = league.country_id INNER JOIN bet ON match.id = bet.match_id WHERE country.name = "Spain" AND league.name = "Liga" AND match.season = "2010/2011" GROUP BY match.id HAVING AVG(home_odds) > 0.5; -- WHERE filter the record of the TABLE -- HAVING filter record of the GROUP BY