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
)