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