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

Podobne dokumenty