1. Podać nazwiska studentów kończące się na literę K i zawierające literę A na trzeciej pozycji.

SELECT nazwisko 
FROM studenci 
WHERE nazwisko LIKE '__A%K'

2. Podać tematy, które mają temat nadrzędny (wartość pola NR_TEM_NADRZ nie jest pusta (NULL)).

SELECT * FROM tematy WHERE nr_tem_nadrz IS NOT NULL

3. Podać nazwiska studentów studiujących na kierunku INFORMATYKA.

SELECT s.nazwisko FROM studenci s 
JOIN kierunki k ON s.nr_kier = k.nr_kier 
WHERE k.nazwa_kier = 'INFORMATYKA'

4. Podać (w odwróconym porządku alfabetycznym) nazwiska studentek, które z dowolnego przedmiotu otrzymały ocenę równą 5 lub mniejszą niż 3. Nazwiska nie powinny się powtarzać.

SELECT DISTINCT s.nazwisko, s.plec
FROM studenci s
JOIN oceny o ON s.NR_STUD = o.NR_STUD
WHERE s.PLEC = 'K' AND (o.ocena = 5 OR o.ocena < 3)
ORDER BY nazwisko DESC

5. Podać nazwy przedmiotów i nazwy ich przedmiotów nadrzędnych.

SELECT p1.nazwa_przedm AS pod, p2.nazwa_przedm AS nad 
FROM przedmioty p1 
JOIN przedmioty p2 ON p2.nr_przedm = p1.nr_przedm_nadrz
 
SELECT p1.nazwa_przedm AS pod, p2.nazwa_przedm AS nad 
FROM przedmioty p1 
LEFT JOIN przedmioty p2 ON p2.nr_przedm = p1.nr_przedm_nadrz

6. Podać nazwy zespołów wraz z liczbą pracowników. Uwzględnić zespoły bez pracowników.

SELECT z.nazwa_zesp, COUNT(p.nr_prac) 
FROM zespoly z 
LEFT JOIN pracownicy p ON z.nr_zesp = p.nr_zesp 
GROUP BY z.nr_zesp, z.nazwa_zesp

7. Podać datę urodzenia najstarszego studenta.

F-cje agregujace count, max, min, avg

SELECT MIN(data_ur) FROM studenci

8. Dla każdego przedmiotu podać średnią ocen.

group by - wszystko dzielimy na grupy

SELECT o.nr_przedm, avg(ocena) FROM oceny o GROUP BY o.nr_przedm

9. Dla każdego studenta podać liczbę ocen, które otrzymał z poszczególnych przedmiotów.

SELECT s.nazwisko, p.nazwa_przedm, AVG(ocena) AS srednia
FROM przedmioty p JOIN oceny o ON p.NR_PRZEDM = o.NR_PRZEDM
	JOIN studenci s ON s.nr_stud = o.nr_stud
GROUP BY  s.NR_STUD, s.nazwisko, p.nr_przedm, p.nazwa_przedm

10. Podać nazwy przedmiotów, z których średnia ocen jest mniejsza niż 4.

SELECT o.nr_przedm, avg(ocena) FROM oceny o GROUP BY o.nr_przedm HAVING avg(ocena) < 4

11. Podać nazwiska studentów, którzy są starsi od studenta WILK (wykorzystać podzapytanie).

SELECT nazwisko FROM studenci WHERE data_ur < (SELECT data_ur FROM studenci WHERE nazwisko = 'wilk')

12. Podać nazwiska studentów, którzy nie otrzymali jeszcze żadnej oceny. a) z wykorzystaniem operatora (NOT) IN b) z wykorzystaniem operatora (NOT) EXISTS

a)

SELECT * FROM studenci WHERE nr_stud NOT IN (SELECT nr_stud FROM oceny)

b)

SELECT * FROM studenci s WHERE NOT EXISTS (SELECT * FROM oceny o WHERE o.nr_stud = s.nr_stud)

13. Podać nazwy przedmiotów, z których średnia ocen jest mniejsza niż średnia ocen z przedmiotu ALGEBRA.

SELECT p.nazwa_przedm, AVG(ocena) AS srednia 
FROM przedmioty p JOIN oceny o ON p.NR_PRZEDM = o.NR_PRZEDM
GROUP BY p.NR_PRZEDM, p.NAZWA_PRZEDM
HAVING AVG(ocena) < (
	SELECT AVG(ocena)
	FROM przedmioty p JOIN oceny o ON p.NR_PRZEDM = o.NR_PRZEDM
	WHERE p.nazwa_przedm = 'algebra'
)

14. Podaj nazwiska najmłodszych pracowników w poszczególnych zespołach.

SELECT nazwa_zesp, nazwisko, data_ur
FROM pracownicy p 
JOIN zespoly z ON p.NR_ZESP = z.NR_ZESP
WHERE data_ur = (
	SELECT MAX(data_ur) FROM pracownicy p2 WHERE p2.nr_zesp = p.NR_ZESP
)

15. Podaj przedmioty realizowane przez największą liczbę pracowników.

SELECT p.nazwa_przedm
FROM przedmioty p JOIN rozklady r ON p.nr_przedm = r.nr_przedm
GROUP BY p.NR_PRZEDM, p.nazwa_przedm
HAVING COUNT(DISTINCT r.nr_prac) >= ALL(
	SELECT COUNT(DISTINCT nr_prac) FROM rozklady GROUP BY nr_przedm
)

16. Podać nazwiska studentów kierunku INFORMATYKA starszych od dowolnego pracownika z zespołu OPROGRAMOWANIE (wykorzystać operator ANY).

SELECT nazwisko, data_ur
FROM studenci s JOIN kierunki k ON s.NR_KIER = k.NR_KIER
WHERE k.nazwa_kier = 'informatyka' AND data_ur < ANY(
	SELECT data_ur
	FROM pracownicy p JOIN zespoly z ON p.nr_zesp = z.nr_zesp
	WHERE z.nazwa_zesp = 'oprogramowanie'
	GROUP BY data_ur
)

17. Podać nazwiska studentów, którzy są starsi od studenta WILK (wykorzystać połączenie zwrotne).

SELECT s1.nr_stud, s1.nazwisko, s1.data_ur
FROM studenci s1 JOIN studenci s2 ON s1.data_ur < s2.data_ur
WHERE s2.NAZWISKO = 'wilk'

18. Podać nazwisko najstarszego studenta, ale takiego który jest młodszy od najstarszego ze wszystkich studentów.

SELECT nr_stud, nazwisko, data_ur FROM studenci
WHERE data_ur = (
	SELECT MIN(data_ur)
	FROM studenci WHERE data_ur > (
		SELECT MIN(data_ur) FROM studenci
	)
)

19. Podać nazwiska studentów, którzy mają tyle samo ocen z przedmiotu ORACLE co z przedmiotu TABAKS. Uwzględnić również studentów, którzy nie mają ocen z obu tych przedmiotów.

SELECT s.nr_stud, s.nazwisko
FROM studenci s
WHERE (
	SELECT COUNT(*)
	FROM oceny o JOIN przedmioty p ON o.nr_przedm = p.nr_przedm
	WHERE p.nazwa_przedm = 'oracle' AND o.nr_stud = s.nr_stud
	) = (
	SELECT COUNT(*)
	FROM oceny o JOIN przedmioty p ON o.nr_przedm = p.nr_przedm
	WHERE p.nazwa_przedm = 'tabaks' AND o.nr_stud= s.nr_stud
)