Agregacje i ciąg dalszy SQL
Transkrypt
Agregacje i ciąg dalszy SQL
Funkcje agregujące i ciąg dalszy SQL 1) Wypisz studentów i ich numery indeksów, których imię zaczyna się na literę ’A’ lub ’P’ a nazwisko ma końcówkę ’ka’: SELECT imie, nazwisko, nr indeksu FROM studenci WHERE imie LIKE ’[AP]%’ AND nazwisko LIKE ’%ka’ Operator porównania LIKE służy do testowania zgodności łańcucha znakowego z zadanym wzorcem. Składnia: testowany łańcuch [NOT ] LIKE wzorzec, gdzie wzorzec może się składać z: a-z, A-Z, 0-9 dowolnego ciągu znaków alfanumerycznych % jakikolwiek łańcuch długości 0 jakikolwiek pojedyńczy znak [] jakikolwiek znak z zadanego zakresu, np.: [a-d, k-m] albo równoważnie [abcdklm] jakikolwiek znak nie z zadanego zakresu, np.: [ˆe-h, o-z] albo rownoważnie [ˆ] [ˆefghopqrstuvwxyz] czyli wzorzec ’[p-z]%[ˆe-h, o-x, z] ’ spełniać będzie przykładowo łańcuch: rowery. 2) Ilu jest studentów (przy założeniu, że wszyscy są różni)? SELECT ’Studentów jest ’, COUNT (*) FROM studenci albo lepiej SELECT ’Studentów jest ’, COUNT (*) FROM ( SELECT DISTINCT student guid FROM egzaminy ) zdajacy 3) Ilu studentów przystąpiło do egzaminów w sesji? SELECT ’Studentów jest ’ + CAST (COUNT (*) AS varchar ) FROM studenci Jednak może się tak zdarzyć, że w tabeli egzaminy są błędy, zatem powinniśmy liczyć w nastęujący sposób: SELECT COUNT (*) FROM ( SELECT DISTINCT student guid FROM egzaminy WHERE student guid IN ( SELECT guid FROM studenci ) ) zdajacy 4) Oblicz średnią arytmetyczną ocen studenta o numerze indeksu 100203: – – średnia obcięta do liczby całkowitej SELECT AVG(ISNULL(ocena, 2)) FROM ( SELECT * FROM egzaminy WHERE student guid = ( SELECT guid FROM studenci WHERE nr indeksu = 100203 ) ) wyniki studenta RIGHT JOIN przedmioty ON wyniki studenta.przedmiot guid = przedmioty.guid – – właściwa średnia zaokrąglona do dwóch miejsc po przecinku SELECT CAST (AVG(CAST (ISNULL(ocena, 2) AS real )) AS numeric (3, 2)) FROM ( SELECT * FROM egzaminy WHERE student guid = ( SELECT guid FROM studenci WHERE nr indeksu = 100203 ) ) wyniki studenta RIGHT JOIN przedmioty ON wyniki studenta.przedmiot guid = przedmioty.guid 5) Oblicz średnią ocen dla studenta o numerze indeksu 100203 według wzoru: P uzyskana ocena · ilość punktów za przedmiot przedmioty P ilość punktów za przedmiot przedmioty SELECT CAST (SUM (CAST (ISNULL(ocena, 2) AS real) * punkty) / ( – – ten slash to nie błąd ale operator dzielenia SELECT SUM (punkty) FROM przedmioty ) AS numeric (3,2)) FROM ( SELECT * FROM egzaminy WHERE student guid = ( SELECT guid FROM studenci WHERE nr indeksu = 100203 ) ) wyniki studenta RIGHT JOIN przedmioty ON wyniki studenta.przedmiot guid = przedmioty.guid 6) Wypisz guidy i indeksy tych studentów, którzy nie zdawali co najmniej jednego egzaminu: SELECT student guid, nr indeksu FROM ( SELECT [wpisow] = COUNT (*), student guid FROM egzaminy GROUP BY student guid ) wyniki RIGHT JOIN studenci ON wyniki.student guid = studenci.guid WHERE ISNULL(wpisow, 0) <> ( SELECT COUNT(*) FROM przedmioty ) 7) Usuń z tabeli egzaminy te wszystkie wiersze, które oznaczają wpis dla nieistniejących w tabeli studenci studentów i w tabeli przedmioty przedmiotów: DELETE egzaminy DELETE egzaminy WHERE student guid IS NULL WHERE przedmiot guid IS NULL 8) Uzupełnij tabelę egzaminy o wpisy dziekanatu (ocena 2) dla studentów z podpunktu 6) i egzaminów, których nie zdawali (jest lepszy sposób ale go jeszcze nie poznamy): INSERT INTO egzaminy(przedmiot guid, student guid, ocena) SELECT zaliczenia.przedmiot guid, zaliczenia.student guid, 2 FROM ( SELECT [student guid] = studenci.guid, [przedmiot guid] = przedmioty.guid FROM ( SELECT guid FROM ( SELECT [wpisow] = COUNT (*), student guid FROM egzaminy GROUP BY student guid ) wyniki RIGHT JOIN studenci ON wyniki.student guid = studenci.guid WHERE ISNULL(wpisow, 0) <> ( SELECT COUNT (*) FROM przedmioty ) ) studenci CROSS JOIN przedmioty ) zaliczenia LEFT OUTER JOIN egzaminy ON zaliczenia.przedmiot guid = egzaminy.przedmiot guid AND zaliczenia.student guid = egzaminy.student guid WHERE ocena IS NULL 9) Oblicz średnią ocen dla wszystkich studentów (jeśli kroki 7) i 8) zostały wykonane we właściwy sposób, możemy się już niczym nie przejmować): SELECT student guid, CAST (AVG(CAST (ocena AS real)) AS numeric (3,2)) FROM egzaminy GROUP BY student guid i wyświetl tę listę w kolejności od najlepszego do najgorszego: SELECT student guid, [srednia] = CAST (AVG(CAST (ocena AS real)) AS numeric (3,2)) FROM egzaminy GROUP BY student guid ORDER BY CAST (AVG(CAST (ocena AS real)) AS numeric (3,2)) DESC – – domyślne sortowanie jest rosnące ASC Uwaga: Dobrze by było, żeby zamiast student guid wyświetlany był numer indeksu. 10) Oblicz minimalną i maksymalną średnią ocen uzyskaną z przedmiotów rozptrywanych osobno: SELECT MAX (rezultaty.srednia), MIN (rezultaty.srednia) FROM ( SELECT przedmiot guid, [srednia] = CAST (AVG(CAST (ocena AS real)) AS numeric (3,2)) FROM egzaminy GROUP BY przedmiot guid ) rezultaty