[ MaelstroM @ 15.01.2012. 14:35 ] @
Pokusavam da uradim neke pripremne zadatke za kolokvijum vezane za SQL upite. Napisao sam upite, pa mi recite je li ispravno i predlozite neki jednostavniji nacin za njihovo ispisivanje (ako postoji). Unaprijed hvala ![]() Date su sledeće relacione šeme: Grad(Naziv, Drzava, BrojStanovnika) Dvorana(DID, Kapacitet, Naziv references Grad) Koncert(KID, JMBG references Izvodjac, Trajanje, DID refences Dvorana) Izvodjac(JMBG, Ime, Adresa, Starost) Ulaznica(UID, KID references Koncert, Cijena, Tip) Napomena. Primarni ključevi su podvučeni. Atribut Ime u relacionoj šemi Dvorana je spoljnji ključ na relacionu šemu Grad i označava u kom gradu se nalazi dvorana. Atribut JMBG u relacionoj šemi Koncert je spoljnji ključ na relacionu šemu Izvođač i označava koji izvođač je nastupao na koncertu. U relacionoj šemi Koncert atribut DID je spoljnji ključ na relacionu šemu Dvorana i označava u kojoj dvorani je održan koncert. a) Izlistati ime izvođača, kao i broj različitih gradova u kojima je izvođač održao koncerte pod uslovom da je taj broj veći od 10. SELECT i.Ime, COUNT(DISTINCT d.Naziv) as BrGradova FROM Izvodjac i, Koncert k, Dvorana d WHERE k.JMBG = i.JMBG AND k.DID = d.DID GROUP BY i.Ime HAVING BrGradova > 10 b) Naći koncerte za koji je prodato više VIP ulaznica tipa nego ostalih karata. Napomena. VIP ulaznice su one karte čiji je Tip jednak VIP. SELECT k.* FROM Koncert k WHERE (SELECT COUNT(*) FROM ULAZNICA u1 WHERE u1.KID = k.KID AND u1.Tip = 'VIP') > (SELECT COUNT(*) FROM Ulaznica u2 WHERE u2.KID = k.KID and u2.Tip != 'VIP') c) Naći izvođače koji nastupaju isključivo u dvoranama koje imaju kapacitet veći od kapaciteta najveće dvorane u Podgorici. SELECT i.* FROM Izvodjac i, Koncert k, Dvorana d WHERE NOT EXISTS(SELECT * FROM Koncert k, Dvorana d WHERE k.JMBG = i.JMBG AND k.DID = d.DID AND d.Kapacitet < (SELECT MAX(d1.Kapacitet) FROM Dvorana d1 WHERE d1.Grad = 'Podgorica')) d) Naći parove JMBG, Naziv tako da izvođač koji je identifikovan atributom JMBG nikada nije održao koncert u gradu koji je identifikovan atributom Naziv. SELECT i.JMBG, g.Naziv FROM Izvodjac i, Grad g WHERE NOT EXISTS(SELECT * FROM Koncert k, Dvorana d WHERE k.JMBG = i.JMBG AND k.DID = d.DID AND d.Naziv = g.Naziv) e) Naći ime grada u kome je nastupao svaki izvođač. SELECT g.Naziv FROM Grad g WHERE NOT EXISTS (SELECT * FROM Izvodjac i WHERE NOT EXISTS (SELECT * FROM Koncert k, Dvorana d WHERE k.JMBG = i.JMBG AND k.DID = d.DID AND d.Naziv = g.Naziv)) f) Naći koncert za koji je prodato najviše ulazica. SELECT u.KID, COUNT(*) as ProdateUlaznice FROM Ulaznica u GROUP BY u.KID HAVING ProdateUlazince = (SELECT MAX(PrUlazn) FROM (SELECT COUNT(*) as PrUlazn FROM Ulaznica u1 GROUP BY u1.KID)) g) Naći države u kojima je nastupao izvođač koji je do sada imao najveći broj koncerata. SELECT g.Drzava FROM Grad g, Izvodjac i, Koncert k, Dvorana d WHERE k.JMBG = i.JMBG AND k.DID = d.DID AND d.Naziv = g.Naziv AND (SELECT COUNT(*) FROM Koncert k1 WHERE k1.JMBG = i.JMBG) >= ALL (SELECT BrKoncerata FROM (SELECT k2.JMBG, COUNT(*) as BrKoncerata FROM Koncert k2 GROUP BY k2.JMBG) h) Naći grad takav da je u njemu održano više od deset koncerata i nijedan izvođač nije nastupao dva puta u tom gradu. SELECT d.Naziv, COUNT(*) FROM Dvorana d, Koncert k, WHERE k.DID = d.DID AND NOT EXIST (SELECT i.JMBG, COUNT(*) FROM Izvodjac i, Koncert k1, Dvorana d1 WHERE k1.JMBG = i.JMBG AND k1.DID = d1.DID AND d1.Naziv = d.Naziv GROUP BY i.JMBG HAVING COUNT(*) >= 2) GROUP BY d.Naziv HAVING COUNT(*) > 10 i) Naći izvođača koji je imao najviše rasprodatih koncerata. Napomena. Koncert je rasprodat ako je broj prodatih ulaznica jednak kapacitetu dvorane u kojoj je održan koncert. SELECT k.JMBG, COUNT(*) from Koncert k, Dvorana d WHERE k.DID = d.DID AND (SELECT COUNT(*) FROM Ulaznica u WHERE u.KID = k.KID) = d.Kapacitet GROUP BY k.JMBG HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM (SELECT k1.JMBG, COUNT(*) FROM Koncert k1, Dvorana d1 WHERE k1.DID = d1.DID AND (SELECT COUNT(*) FROM Ulaznica u1 WHERE u1.KID = k1.KID) = d1.Kapacitet) GROUP BY k1.JMBG) j) Naći izvođača koji je u svakoj dvorani imao makar dva koncerta. SELECT i.* FROM Izvodjac i WHERE NOT EXISTS (SELECT d.DID, COUNT(*) FROM Dvorana d, Koncert k WHERE d.DID = k.DID AND k.JMBG = i.JMBG GROUP BY d.DID HAVING COUNT(*) < 2) AND NOT EXISTS (SELECT d1.DID FROM Dvorana d1 WHERE NOT EXISTS(SELECT * FROM Koncert k1 WHERE k1.DID = d1.DID AND k1.JMBG = i.JMBG )) [Ovu poruku je menjao MaelstroM dana 16.01.2012. u 21:53 GMT+1] |