-- Work on 3 tables of the form Ta(aid, a2, …), Tb(bid, b2, …), Tc(cid, aid, bid, …), where:

-- aid, bid, cid, a2, b2 are integers;
-- the primary keys are underlined;
-- a2 is UNIQUE in Ta;
-- aid and bid are foreign keys in Tc, referencing the primary keys in Ta and Tb, respectively.
-- a. Write queries on Ta such that their execution plans contain the following operators:

-- clustered index scan;
-- clustered index seek;
-- nonclustered index scan;
-- nonclustered index seek;
-- key lookup.
-- b. Write a query on table Tb with a WHERE clause of the form WHERE b2 = value and analyze its execution plan. Create a nonclustered index that can speed up the query. Examine the execution plan again.

-- c. Create a view that joins at least 2 tables. Check whether existing indexes are helpful; if not, reassess existing indexes / examine the cardinality of the tables.

--a. Write queries on Ta such that their execution plans contain the following operators:

-- clustered index scan;

--create unique constraint on name column
 
SELECT * FROM Players;

-- clustered index seek;

SELECT * FROM Players WHERE hmy = 22003;

-- nonclustered index seek;

-- add nonclustered index on name
CREATE NONCLUSTERED INDEX IX_Players_name ON Players(hmy, name) INCLUDE (totalMatches);

DROP INDEX IX_Players_name ON Players;

SELECT name, totalMatches FROM Players WHERE name = 'lerio2';

-- nonclustered index scan;

SELECT name, totalMatches FROM Players WHERE totalMatches > 0;

-- key lookup.

-- write a query that uses the nonclustered index and a key lookup
SELECT * FROM Players  WHERE name = 'lerio2';

--b. Write a query on table Tb with a WHERE clause of the form WHERE b2 = value and analyze its execution plan. Create a nonclustered index that can speed up the query. Examine the execution plan again.

-- create nonclustered index on b2
CREATE NONCLUSTERED INDEX IX_Cards_faction_cardset ON Cards(hmy, faction, cardset) INCLUDE (name, cost);

DROP INDEX IX_Cards_faction_cardset ON Cards;

-- examine execution plan
SELECT hmy, name, cost, faction, cardset FROM Cards WHERE faction = (SELECT hmy FROM Factions WHERE name='Neutral') AND cardset = (SELECT hmy FROM CardSet WHERE name='Base Set');

--c. Create a view that joins at least 2 tables. Check whether existing indexes are helpful; if not, reassess existing indexes / examine the cardinality of the tables.

-- create view
GO

ALTER VIEW CardsOwners AS
SELECT Cards.name AS cardName, Players.name AS playerName, Cards.hmy AS cardId, Players.hmy AS playerId
FROM Cards
INNER JOIN CardsOwnership ON Cards.hmy = CardsOwnership.hCard
INNER JOIN Players ON Players.hmy = CardsOwnership.hPlayer

GO

-- check if indexes are helpful

SELECT * FROM CardsOwners;
