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 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 * studenci albo lepiej SELECT Studentów jest, COUNT * SELECT DISTINCT student guid zdajacy 3 Ilu studentów przystąpiło do egzaminów w sesji? SELECT Studentów jest + CAST COUNT * AS varchar 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 * SELECT DISTINCT student guid WHERE student guid IN studenci
zdajacy 4 Oblicz średnią arytmetyczną ocen studenta o numerze indeksu 100203: średnia obcięta do liczby całkowitej SELECT AVGISNULLocena, 2 studenci wyniki studenta RIGHT JOIN przedmioty właściwa średnia zaokrąglona do dwóch miejsc po przecinku SELECT CAST AVGCAST ISNULLocena, 2 AS real AS numeric 3, 2 studenci wyniki studenta RIGHT JOIN przedmioty 5 Oblicz średnią ocen dla studenta o numerze indeksu 100203 według wzoru: przedmioty uzyskana ocena ilość punktów za przedmiot przedmioty ilość punktów za przedmiot SELECT CAST SUM CAST ISNULLocena, 2 AS real * punkty / ten slash to nie błąd ale operator dzielenia SELECT SUM punkty
przedmioty AS numeric 3,2 studenci wyniki studenta RIGHT JOIN przedmioty 6 Wypisz guidy i indeksy tych studentów, którzy nie zdawali co najmniej jednego egzaminu: SELECT student guid, nr indeksu SELECT [wpisow] = COUNT *, student guid wyniki RIGHT JOIN studenci ON wyniki.student guid = studenci.guid WHERE ISNULLwpisow, 0 <> SELECT COUNT* 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 WHERE student guid IS NULL DELETE egzaminy 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 egzaminyprzedmiot guid, student guid, ocena SELECT zaliczenia.przedmiot guid, zaliczenia.student guid, 2
SELECT [student guid] = studenci.guid, [przedmiot guid] = przedmioty.guid SELECT [wpisow] = COUNT *, student guid wyniki RIGHT JOIN studenci ON wyniki.student guid = studenci.guid WHERE ISNULLwpisow, 0 <> SELECT COUNT * 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 AVGCAST ocena AS real AS numeric 3,2 i wyświetl tę listę w kolejności od najlepszego do najgorszego: SELECT student guid, [srednia] = CAST AVGCAST ocena AS real AS numeric 3,2 ORDER BY CAST AVGCAST 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
SELECT przedmiot guid, [srednia] = CAST AVGCAST ocena AS real AS numeric 3,2 GROUP BY przedmiot guid rezultaty