Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Andmebaasid
Andmebaas Edu
(kordamine)
Ülesande püstitus
• Luua andmebaas õppeainete ning
õppimisega seotud andmete hoidmiseks
ja kasutamiseks.
ANDMETE FÜÜSILINE MUDEL
Ülesanded
Loo andmebaas nimega „edu“ ja järgnevad tabelid oma andmebaasi
CREATE TABLE Faculty( Id INTEGER NOT NULL DEFAULT AUTOINCREMENT PRIMARY KEY, Name VARCHAR(50) NOT NULL, Address VARCHAR(30), DeanId INTEGER, ViceDeanId INTEGER, UNIQUE(Name) );
Ülesanded CREATE TABLE Person( Id INTEGER NOT NULL DEFAULT AUTOINCREMENT PRIMARY KEY, FirstName VARCHAR(30) NOT NULL, LastName VARCHAR(30) NOT NULL, FacultyId INTEGER NOT NULL, SSN VARCHAR(11), UNIQUE(FirstName,LastName)); CREATE TABLE Registration( Id INTEGER NOT NULL DEFAULT AUTOINCREMENT PRIMARY KEY, CourseId INTEGER NOT NULL, PersonId INTEGER NOT NULL, FinalGrade VARCHAR(1));
Ülesanded
CREATE TABLE Lecturer( Id INTEGER NOT NULL DEFAULT AUTOINCREMENT PRIMARY KEY, CoursesId INTEGER, PersonsId INTEGER NOT NULL, Responsible SMALLINT); CREATE TABLE Course( Id INTEGER NOT NULL DEFAULT AUTOINCREMENT PRIMARY KEY, FacultyId INTEGER NOT NULL, Name VARCHAR(50) NOT NULL, Code VARCHAR(20), EAP INTEGER, GradeType VARCHAR(8));
INPUT näited
INPUT INTO Person FROM 'person.txt' FORMAT
ASCII DELIMITED BY '\x09'
INPUT INTO Faculty FROM 'faculty.txt' FORMAT
ASCII DELIMITED BY '\x09'
Ülesanded
Analoogselt näidetega impordi sama nimega
failidest ka järgnevad tabelid:
• Registration
• Lecturer
• Course
Failid saab alla laadida Moodle’i keskkonnast.
FK näidis
ALTER TABLE Registration ADD CONSTRAINT
fk_registration_person FOREIGN KEY (PersonId)
REFERENCES Person (Id) ON DELETE
CASCADE
ON UPDATE CASCADE;
Person tabeli kirje kustutamisel kustutatakse tema
registreeringud ainetele
ALTER TABLE Faculty ADD CONSTRAINT
fk_faculty_person_dean FOREIGN KEY (DeanId)
REFERENCES Person (Id) ON DELETE SET
NULL
ON UPDATE CASCADE;
Dekaani kirje kustutamisel ei kustutata tema teaduskonda
Ülesanne Luua lisaks näidetele kuus välisvõtit nii, et
ülemtabeli kirje kustutamisel kustutatakse ka
alamtabeli vastavad kirjed, va kahel
erandjuhul, kui seos tühistatakse:
• Registration → Course
• Lecturer → Person
• Lecturer → Course (tühista seos)
• Course → Faculty
• Faculty (ViceDeanId) → Person (tühista seos)
• Person → Faculty
PÄRINGUD
Alampäringud
Dekaanid teaduskondadest, kus oli olemas ka
prodekaan:
SELECT * FROM person
WHERE EXISTS (
SELECT * FROM faculty
WHERE faculty.deanId = person.id
AND faculty.viceDeanId IS NOT NULL
)
Mitme tabeli sidumine päringusse
SELECT firstName, lastName, name, faculty.id,
DeanId
FROM person, faculty WHERE firstName = 'Mati'
AND
deanId = person.id
Grupeerimine
Kui palju on iga EAP väärtusega aineid?
SELECT eap, count(*) FROM course GROUP BY eap
Kui palju on igale kursusele registreerunud inimesi?
SELECT name, count(*) FROM course, registration
WHERE course.id = registration.courseId
GROUP BY course.name
Grupeerimine
Kui palju on sama tähega algavaid
perekonnanimesid?
SELECT LEFT(lastName,1) AS pn,
COUNT(*) AS arv
FROM person
GROUP BY pn
ORDER BY arv DESC, pn ASC;
Mitu päringut – üks tulemus
Millist tähte kasutatakse enam nime alguses?
Vaadelda nii pere- kui ka eesnimesid. Järjestada tulemus –
nime algustäht , esinemiste arv ja ‘p’ või ‘e’ (perenimi /
eesnimi) mitte kasvavalt korduste arvu järgi.
SELECT LEFT(lastName,1), COUNT(*),'p' FROM person
GROUP BY LEFT(lastName,1)
UNION ALL
SELECT LEFT(firstName,1), COUNT(*),'e'
FROM person
GROUP BY LEFT(firstName,1)
ORDER BY 2 DESC, 1;
Näited
CREATE VIEW v_oigusteaduskonna_opilased AS
SELECT * FROM person WHERE facultyId = 2
CREATE VIEW v_oigusteaduskonna_opilased_mini
(eesnimi,perenimi) AS
SELECT FirstName, LastName
FROM person WHERE facultyId = 2
CREATE VIEW v_persons_faculty AS
SELECT p.FirstName, p.LastName, f.Name as FacultyName,
f.Address as FacultyAddress
FROM person as p JOIN faculty as f ON (p.facultyId = f.id)
Näited
CREATE VIEW v_faculty_deans (FacultyName,
DeanName, ViceDeanName) AS
SELECT f.Name, d.FirstName+' '+d.LastName as
deanName, v.FirstName+' '+v.LastName as
viceDeanName
FROM Faculty as f
JOIN Person as d ON (f.deanId = d.id)
JOIN Person as v ON (f.viceDeanId = v.id)
ORDER BY f.Name
Näited
Lisame uue kursuse "Sissesjuhatus informaatikasse"
INSERT INTO Course VALUES (101,9,'Sissejuhatus informaatikasse','MTAT.05.074',3,'Arvestus')
Lisame kursusele samad inimesed kes osalevad kursusel
Sissejuhatus ettevõtte majandusse INSERT INTO registration (CourseId,PersonId,FinalGrade)
SELECT 101, p.id, NULL FROM Course as c JOIN Registration as r ON (c.Id = r.CourseId) JOIN Person as p ON (r.PersonId = p.Id) WHERE c.Name = 'Sissejuhatus
ettevõttemajandusse'
Näited
Kuvame mõlemal kursusel õppivad õpilased
SELECT p.FirstName+' '+p.LastName as
PersonName, c.Name as CourseName
FROM Course as c
JOIN Registration as r ON (r.CourseId = c.Id)
JOIN Person as p ON (r.PersonId = p.Id)
WHERE c.Id = 101 OR c.Id = 75
ORDER BY PersonName
Ülesanded
1. Luua vaade v_persons_atleast_4eap (FirstName, LastName) õpilastest, kes õpivad Matemaatika-informaatikateaduskonna ainetel, mis annavad vähemalt 4 EAP-d
2. Luua vaade v_mostA(FirstName, LastName, NrOfA) õpilastest, kes on saanud A-sid Matemaatika-informaatikateaduskonna ainetest
3. Luua uus kursus "Andmebaaside teooria". Matemaatika-informaatikateaduskond, MTAT.03.998, 6EAP, Arvestus Lisada sinna kõik õpilased, kes said aines Andmebaasid arvestuse (A)
Ülesanded
4. Luua vaade v_andmebaasideTeooria õpilastest, kes õpivad ainet andmebaaside teooria. (PersonId, FirstName, LastName)
5. Luua vaade v_top20A (FirstName, LastName, nrOfA) päringule TOP 20 õpilastest, kes on saanud kõige rohkem A-sid
6. Luua vaade v_top20Students(FirstName, LastName, AverageGrade) päringule TOP 20 õpilastest, kelle keskmine hinne on kõige kõrgem.