Podstawy SQL Zadania
Transkrypt
Podstawy SQL Zadania
Podstawy SQL Zadania Tabele w bazie danych: • studenci(nr indeksu, imie, nazwisko, plec, adres), • rekrutacja(imie, nazwisko, plec, adres, punkty) • przedmioty(symbol, nazwa, punkty), • egzaminy(nr indeksu, przedmiot, ocena). Zadanie 1. Napisać zapytanie SQL do bazy danych zwracające następujące informacje: a) Listę wszystkich studentów: SELECT * FROM studenci b) Nazwy wszystkich przedmiotów egzaminacyjnych: SELECT nazwa FROM przedmioty c) Listę nazw miast, z których pochodzą studenci i rekruci: SELECT adres FROM studenci UNION SELECT adres FROM rekrutacja d ) Listę wszystkich studentek: imię, nazwisko, numer indeksu (w podanej kolejności): SELECT imie, nazwisko, nr indeksu FROM studenci WHERE plec = ’K’ e) Listę rekrutów (imię i nazwisko), którzy przekroczyli próg 150 punktów: SELECT imie, nazwisko FROM rekrutacja WHERE punkty > 150 f ) Łączną listę (imię, nazwisko, indeks) „starych” studentów i „nowych” studentów (tych, którzy się zakwalifikowali): a) przy założeniu, że żaden student nie brał udziału w rekrutacji na drugi kierunek: SELECT imie, nazwisko, nr indeksu FROM studenci UNION SELECT imie, nazwisko, NULL FROM rekrutacja WHERE punkty > 150 w wyniku czego otrzymujemy 226 wierszy. b) przy założeniu, że studenci wyższych lat mogli brać udział w rekrutacji na kolejny kierunek: SELECT [imie] = ISNULL (studenci.imie, rekrutacja.imie), [nazwisko] = ISNULL (studenci.nazwisko, rekrutacja.nazwisko), nr indeksu FROM studenci FULL OUTER JOIN rekrutacja ON studenci.imie = rekrutacja.imie AND studenci.nazwisko = rekrutacja.nazwisko WHERE ISNULL (punkty, 200) > 150 w ten sposób jednak pomijamy tych studentów wyższych lat, którym nie udało się zdobyć minimum 151 punktów w czasie rekrutacji, więc prawidłowe zapytanie powinno wyglądać w następujący sposób: SELECT [imie] = ISNULL (studenci.imie, nowi studenci.imie), [nazwisko] = ISNULL (studenci.nazwisko, nowi studenci.nazwisko), nr indeksu FROM studenci FULL OUTER JOIN ( SELECT * FROM rekrutacja WHERE punkty > 150 ) nowi studenci ON studenci.imie = nowi studenci.imie AND studenci.nazwisko = nowi studenci.nazwisko g) Listę wszystkich studentów, którzy wzięli udział w nowej rekrutacji: SELECT * FROM studenci WHERE EXISTS ( SELECT * FROM rekrutacja WHERE studenci.imie = rekrutacja.imie AND studenci.nazwisko = rekrutacja.nazwisko ) h) Listę studentów, którzy nie zdawali jakiegokolwiek egzaminu. SELECT * FROM studenci WHERE NOT EXISTS ( SELECT * FROM egzaminy WHERE studenci.nr indeksu = egzaminy.nr indeksu ) i ) Listę studentów, którzy nie zaliczyli sesji (WSKAZÓWKA: funkcja ISNULL({nazwa argumentu}, {wartość jaką zastępowana jest wartość NULL})). a) nie zdali co najmniej jednego egzaminu: SELECT DISTINCT imie, nazwisko, [nr indeksu] = studenci.nr indeksu FROM studenci LEFT OUTER JOIN egzaminy ON studenci.nr indeksu = egzaminy.nr indeksu WHERE ISNULL (ocena, 2) = 2 – – jeżeli nie zdawali egzaminów to dostają „dużą” dwóję albo inaczej: SELECT * FROM studenci WHERE EXISTS ( – – dostali 2 z jakiegoś przedmiotu SELECT * FROM egzaminy WHERE studenci.nr indeksu = egzaminy.nr indeksu AND ocena = 2 ) OR NOT EXISTS ( – – nie zdawali żadnego egzaminu SELECT * FROM egzaminy WHERE studenci.nr indeksu = egzaminy.nr indeksu ) b) nie zdali wszystkich egzaminów: SELECT DISTINCT stud1.nr indeksu FROM studenci AS stud1 WHERE NOT EXISTS ( SELECT * FROM przedmioty LEFT JOIN egzaminy ON przedmioty.symbol = egzaminy.przedmiot WHERE egzaminy.nr indeksu = stud1.nr indeksu AND ISNULL (ocena, 2) <> 2 ) ale to nie wszystko, gdyż w bazie jest pewien błąd! j ) Listę studentów, którzy zdali wszystkie egzaminy: SELECT DISTINCT egzam1.nr indeksu FROM egzaminy AS egzam1 WHERE NOT EXISTS ( SELECT * FROM przedmioty WHERE NOT EXISTS ( SELECT * FROM egzaminy AS egzam2 WHERE egzam2.przedmiot = przedmioty.symbol AND egzam2.nr indeksu = egzam1.nr indeksu AND ocena > 2 ) ) k ) Listę studentów, którzy zdali wszystkie egzaminy na 5: SELECT DISTINCT egzam1.nr indeksu FROM egzaminy AS egzam1 WHERE NOT EXISTS ( SELECT * FROM przedmioty WHERE NOT EXISTS ( SELECT * FROM egzaminy AS egzam2 WHERE egzam2.przedmiot = przedmioty.symbol AND egzam2.nr indeksu = egzam1.nr indeksu AND ocena = 5 ) ) Zadanie 2. Czy w bazie danych są błędy? Należy się zastanowić, gdzie w bazie mogą wystąpić niespójności i jak można je wykryć (odpowiednie zapytania SQL). Zadanie 3*. Wykonać skrypt (listę poleceń INSERT), który mógłby posłużyć do przeniesienia danych pomiędzy bazami o tych samych tabelach: egzaminy, przedmioty, studenci i rekrutacja. WSKAZÓWKA: Niech nią będzie poniższe zapytanie SQL: SELECT ’przedmiot ”’, nazwa, ”’ ma’ + ’ ’ + ’symbol ”’ + symbol + ”” FROM przedmioty