Przykład bazy danych i SQL w Acces
1. Tabele:
Założyć bazę danych uczniowie.mdb o strukturze danych:
1) UCZNIOWIE (NRU, nazwisko, imie)
a) Wpisać polecenie kwerendy przy pomocy języka SQL
Zapytanie, Nowe zapytanie,
Widok SQL,
Wpisać lub skopiować poniższe polecenie:
create table Uczniowie ( NRU
integer, nazwisko text(20) , imie text(20), data_ur date, constraint klucz primary key (NRU) );
Zapisac kwerendę pod nazwą Create Uczniowie
Wykonac komendę - kwerenda tworząca tabelę - !
Uzupełnić warunki na pola w tabeli projektu UCZNIOWIE:
Klucz - NRU
Pole NRU:
Pole nazwisko
Pole Imie
Pole data_ur
SELECT DISTINCTROW Uczniowie.NRU, Uczniowie.nazwisko, Przedmioty.nazwap, Oceny.Ocena
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
ORDER BY Uczniowie.NRU;
W polu Opis można wprowadzić odpowiedni komentarz, np. NRU --> Nr dzienniika
b) wykorzystać istniejącą tabelę wykonaną w programie dBase o schemacie:
UCZNIOWIE (NRU, imie, nazwisko, inne_dane),
- zaimportować:
Plik, pobierz dane zewnętrzne, importuj - wskazać źródło i nazwę pliku danych
i zmodyfikowac do wersji podanej wyżej
Wprowadzić nowe tabele Przedmioty i Oceny:
Tabela, Nowy, Nowa tabela, wprowadzić pola z ograniczeniami jak wyżej:
NRP, NRU, NRK - integer jak wyżej
nazwap - text(20)
ocena - liczba , pojedyncza precyzja, miejsca dzies: 1
2) PRZEDMIOTY (NRP, nazwap)
Klucz - NRP - numer przedmiotu
Przedmioty (NRP integer, nazwap text (40)
3) OCENY (NRK, NRU,NRP, ocena)
Oceny (NRK integer, NRU integer, NRP integer, ocena single, constraint klucz primary key (NRK))
Pola : NRK, NRU, NRP - integer j.w.
ocena - liczba pojedyncza precyzja, miejsca dzies - 1
Klucz - NRK - nr kolejny.
Założyć formularze na podstawie tabel i wprowadzić dane ze swojej klasy lub uzupełnic jeśli zaimportowano część danych.
Tabele te można utworzyć tez dokładając do schematu tabeli słowo CREATE i uruchomić SQL
4) Utorzyć tabelę konta (IdK, PESEL, Nazwisko, Stan)
W polu PESEL uwzględnić właściwości pola jak na rys. poniżej
W polach Nazwisko w we właściwościach pola na pozycji Format wprowadzić znak > (zamiana na duże litery)
W polu stan wprowadzić we właściwościach pola Wygenerować i uruchomić kwerendę przy kryteriach:
Wprowadzić 2 pozycje do tabeli KONTA
2. Kwerendy (zapytania)
2.1. KWERENDY WYBIERAJACE
Służą do uzyskiwania informacji z bazy danych wg określonych kryteriów
Najprostsze zapytanie oparte na jednej tabeli UCZNIOWIE
1 metoda - przy wykorzystaniu okna projektu kwerendy - QBE - Query By Example - sposób wizualny
II metoda - Widok zapytania w języku SQL Structured Query Language
SELECT Uczniowie.* FROM Uczniowie;
lub
SELECT * FROM Uczniowie;
1a) Wyprowadzić listę uczniów wraz z przedmiotami i ocenami w układzie:
nr ucznia, nazwisko, przedmiot, ocena (kwerenda wybierająca)
1 metoda - przy wykorzystaniu okna projektu kwerendy - QBE - sposób wizualny
Kwerendy, Nowy, Widok projektu, Tabele - dodaj, wskazujemy tabele: Uczniowie, Przedmioty, Oceny,
Przeciągamy pola: NRU, nazwisko z tabeli Uczniowie (lub klikamy 2 razy - wskoczy)
nazwap z tabeli Przedmioty
i ocena z tabeli Oceny
Ewentualnie w kolumnie NRU lub nazwisko zaznaczamy Sortuj rosnaco.
II metoda - Widok zapytania w języku SQL
SELECT DISTINCTROW Uczniowie.NRU, Uczniowie.nazwisko, Przedmioty.nazwap, Oceny.Ocena
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
ORDER BY Uczniowie.NRU;
1b) Zapytania - kryteria
1b1) Wygenerować i uruchomić kwerendę przy kryteriach:
Nazwisko na litere i - Like "*i" - gwiazdka oznacza wszystkie znaki, na końcu i
lub imię na literę a - Like "*a"
Zapis warunków w 2 liniach oznacza kruterium OR - LUB
a w jednej linii - kryterium AND czyli I
W SQL
SELECT DISTINCTROW Oceny.NRK, Oceny.NRU, Uczniowie.nazwisko, Uczniowie.imie, Oceny.NRP, Przedmioty.nazwap, Oceny.Ocena
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
WHERE ((Uczniowie.nazwisko Like "*i")) OR ((Uczniowie.imie Like "*a"))
ORDER BY Oceny.NRU;
1b2) Wygenerować i uruchomić kwerendę przy kryteriach:
NRU <10 i Ocena < 2 lub Ocena >4
W języku SQL
SELECT DISTINCTROW Oceny.NRK, Oceny.NRU, Uczniowie.nazwisko, Uczniowie.imie, Oceny.NRP, Przedmioty.nazwap, Oceny.Ocena
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
WHERE ((Oceny.NRU<10) AND (Oceny.Ocena<2 Or Oceny.Ocena>4));
2) Wyprowadzić średnie ocen każdego ucznia:
a) Utworzenie kwerendy w oknie projektu kwerendy i formuły QBE - Query By Example
b) Kwerenda powyższa widoczna w języku SQL - Structured Query Language
SELECT DISTINCTROW Oceny.NRU, Uczniowie.nazwisko, Avg(Oceny.Ocena) AS [Średnia:Ocena]
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
GROUP BY Oceny.NRU, Uczniowie.nazwisko;
3) Wyświetlić średnią ocen wybranego ucznia (kwerenda wybierająca z parametrem)
a) Zapytanie utworzyć w widoku projektu, następnie przejść na widok SQL
b) Kwerenda powyższa widoczna w języku SQL - Structured Query Language
SELECT DISTINCTROW Oceny.NRU, Uczniowie.nazwisko, Avg(Oceny.Ocena) AS [Średnia:Ocena]
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
GROUP BY Oceny.NRU, Uczniowie.nazwisko
HAVING ((Oceny.NRU=[Podaj NRU]));
Możemy wykonać np. jak pokazano ponizej na rysunku
4) Wyświetlić średnią każdego ucznia z każdego przedmiotu
Poniżej przykład realizacji zadania
W języku SQL:
SELECT DISTINCTROW Uczniowie.NRU, Uczniowie.nazwisko, Przedmioty.nazwap, Avg(Oceny.Ocena) AS [Średnia:Ocena]
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU
GROUP BY Uczniowie.NRU, Uczniowie.nazwisko, Przedmioty.nazwap;
KWERENDY PODSUMOWUJĄCE OPARTE NA FUNKCJACH AGREGUJĄCYCH
Należą do nich zapytania krzyżowe
Zapytanie krzyżowe
4a) Sporządzić kwerendę krzyżową na podstawie kwerendy Z-Uczniowie
Zapytanie nowy, kreatory zapytań - zapytanie krzyżowe
TRANSFORM Avg([Z-Oceny].Ocena) AS Wartość
SELECT [Z-Oceny].nazwisko, [Z-Oceny].nazwap, Avg([Z-Oceny].Ocena) AS [Średnia ocena]
FROM [Z-Oceny]
GROUP BY [Z-Oceny].nazwisko, [Z-Oceny].nazwap
PIVOT [Z-Oceny].Ocena;
Przykładowy wynik zapytania
4b) Zapytania z polami obliczeniowymi
Na podstawie tabeli oceny sporządzić kwerendę z dodatkowymi polami obliczeniowymi:
Ocena_raz_poltora:=Ocena*1,5
Ocena_zaok:=Int(Ocena)
Data: Date()
Czas: Time()
KWERENDY FUNKCJONALNE
Kwerenda aktualizująca
5) Zamienić oceny >5,4 na 6 (kwerenda aktualizująca)
W SQL:
UPDATE DISTINCTROW Oceny SET Oceny.Ocena = 6
WHERE ((Oceny.Ocena>5.4));
Kwerenda tworząca tabelę
Structured Query Language
6) Utworzyć tabelę archiwalną Uczn_ocen - zawierającą informacje wymienione w zadaniu 1) (kwerenda tworząca tabelę)
Można utworzyć najpierw kwerendę wybierającą np. Uczniowie i oceny a później przejść z niej na kwerendę tworzącą tabelę.
Kwerendy, Nowy, Widok projektu, Pokazywanie tabeli - Kwerendy, Dodaj, Wskazujemy tabelę z kwerendą, np. Uczniowie i oceny,
przeciągamy gwiazdkę, Typ kwerendy - tworząca tabelę, uruchamiamy
SELECT DISTINCTROW Uczniowie.*, Przedmioty.nazwap, Oceny.Ocena INTO Uczn_ocen
FROM Uczniowie INNER JOIN (Przedmioty INNER JOIN Oceny ON Przedmioty.NRP = Oceny.NRP) ON Uczniowie.NRU = Oceny.NRU;
Zapytanie usuwające
Najlepiej utworzyć zapytanie wybierające, sprawdzić jego działanie i zamienić na zapytanie usuwajace
7) Usunąć uczniów na literę A
DELETE DISTINCTROW Uczniowie.*, Uczniowie.nazwisko
FROM Uczniowie
WHERE ((Uczniowie.nazwisko Like "A*"));
Zapytanie dołaczające
8) Dołączyć tabelę Uczn1 do tabeli Uczniowie
Utworzyć kopię tabeli Uczniowie do tabeli Uczn1
Wykasować rekordy istniejące i wprowadzić nowe, o numerach 101, 102, napisy małymi literami.
Utworzyć zapytanie dołączające
- wskazać tabelę dołączaną, wybrać zapytanie dołączające, wskazać tabelę do której będziemy dołączać - tu Uczniowie
Dołączane pole można wskazać gwiazdką - wszystkie
3. Formularze
1) Utworzyć formularz prezentujący dane z kwerendy w której są pola:
nr ucznia, nazwisko, przedmiot, ocena
(Wyprowadzić listę uczniów wraz z przedmiotami i ocenami )
Formularz, Nowy,
Wskazać źródło formularza, np. zapytanie: Z-oceny
Kreatory formularzy: jednokolumnowy lub tabelaryczny - wybieramy tabelaryczny
2) Utworzyć formularz do przeglądania, usuwania i wprowadzania danych do tabeli Uczniowie
Analogicznie j.w. Jako źródło danych wybieramy tabelę uczniowie, formularz jednokolumnowy
4) Raporty
Przygotować raport prezentujący listę uczniów
Raporty, Nowy, wybrać źródło (tabelę lub kwerendę), np. tabela Uczniowie
Autoraport: kolumnowy lub tabelaryczny --> utworzy się raport
albo Kreator raportów, wybrać pola (> - jedno pole,
>> - wszystkie pola), dalej, dodać ewentualne poziomy grupowania,
... , zakończ
III. Zadanie z wykorzystaniem poleceń SQL
Dane są relacje o schematach:
Pracownik ( (nr
integer, nazwisko text(12) , etat text(10), szef integer,
pracuje_od date, placa_pod Currency, placa_dod Currency, id_zesp
integer, constraint klucz primary key (nr) );
Zespol (id_zesp integer, nazwa text(20), adres text(13))
Etat (etat text(10, placa_min single, placa_max currency)
Schemat relacji
Zadania:
Skopiować i rozpakować plik Prac_dane.zip ,
skopiować plik pod nazwą Prac_Nazwisko.mdb.
Zmodyfikować szerokości pól tekstowych: nazwisko na 20, etat na 15.
Sprawdzić i ewentualnie zmodyfikować powiazania miedzy tabelami
Otworzyć tabele, dopisać kilka pozycji
Założyć formularze różnego typu (kreator, autoformularz).
Utworzyć proste kwerendy z wykorzystaniem kreatora a następnie dodać tabele do tych kweend
Wykonać zadania zgodnie z poniższym opisem, wykorzystując kwerendy i SQL
I. Zapytania tworzące i modyfikujące dane
1. Tworzenie tabeli - komenda CREATE i SELECT FROM
Utworzenie tabeli Pracownik1(nr integer, nazwisko text(12),
etat text(10), szef integer, pracuje_od date, placa_pod Currency, placa_dod Currency, id_zesp integer,
z kluczem głównym nr
create table Pracownik1
(nr integer,
nazwisko text(12),
etat text(10),
szef integer,
pracuje_od date,
placa_pod Currency,
placa_dod Currency,
id_zesp integer,
constraint klucz primary key (nr)
);
Utworzenie tabeli etat2
CREATE TABLE etat2
( etat text(10) ,
placa_min single,
placa_max double
);
Utworzenie tabeli Pracownicy(nr integer, nazwisko text(30), stanowisko text(20), data_zatr date)
z kluczem głównym nr
CREATE TABLE Pracownicy
(nr integer ,
nazwisko text(30) ,
stanowisko text(20),
data_zatr date,
constraint klucz primary key (nr)
);
Utworzenie tabeli Worker
create table worker
(nr integer,
nazwisko text,
constraint indeks
foreign key (nr) references Pracownicy(Nr));
Utworzenie nowej tabeli Etat40 z wprowadzeniem danych z tabeli żródłowej Etat
SELECT * INTO ETAT40
FROM ETAT;
SELECT * INTO ETAT10
FROM ETAT
where etat like "a*";
SELECT ETAT, PLACA_MIN INTO ETAT66
FROM ETAT
WHERE placa_max >=1600;
2. Dołączenie danych: INSERT, SELECT INTO
Wprowadzenie do wyżej utworzonej tabeli Pracownicy danych z tabeli Pracownik dla pól
o etatach: adiunkt, asystent, profesor
INSERT INTO Pracownicy ( nr, nazwisko, stanowisko, data_zatr )
SELECT numer, nazwisko, etat, pracuje_od
FROM pracownik
WHERE etat in ("ADIUNKT", "ASYSTENT", "Profesor");
Wprowadzenie do tabeli Etat1 wszystkich etatów z tabeli Etat na literę s
INSERT INTO ETAT1
SELECT *
FROM ETAT
WHERE etat like "s*";
Wprowadzenie 2 pól z tabeli Pracownik do tabeli Dodatki
SELECT Numer, Placa_dod INTO Dodatki
FROM Pracownik;
Wprowadzenie do tabeli Pracownicy jednego pracownika (Mleczko) o podanych wartościach
INSERT INTO Pracownicy ( nr, nazwisko, stanowisko, data_zatr )
VALUES ("3001", "Mleczko", "portier", "1997-01-01");
lub
INSERT INTO Pracownicy ( nr, nazwisko, stanowisko, data_zatr )
SELECT "3001", "Mleczko", "portier", "1997-01-01";
3. Modyfikacja struktury tabeli istniejącej - ALTER TABLE
Dodanie kolumny (pola) PlacaPod typu liczba podwójnej precyzji
Alter Table Pracownicy
ADD COLUMN PlacaPod float;
4. Kasowanie danych - Delete
Skasować z tabeli Pracownicy pracowników o nazwsiku zaczynającym się na Ml (np. Mleczo,
Mlaska)
DELETE *
FROM Pracownicy
WHERE nazwisko like "Ml*";
Usunięcie wszystkich danych z tabeli Personel
DELETE *
FROM Personel;
5. Aktualizacja danych - UPDATE
Wstawić wszystkim pracownikom płacę 700.25
UPDATE Pracownicy SET PlacaPod = 700.25;
Zmodyfikować płacę adiunktom i profesorom
UPDATE Pracownicy SET Pracownicy.PlacaPod = PlacaPod*1.25
WHERE (stanowisko="Profesor" Or stanowisko="Adiunkt") AND Year(Data_zatr)<1980;
Ustawienie płacy dod. na 0 dla pola Numer równego 1050
UPDATE Pracownik SET PLACA_DOD = 0
WHERE Numer=1050;
6. DROP
Usunięcie całej tabeli
DROP TABLE [Wykładowcy1];
Usunięcie pola
ALTER TABLE Etat4
DROP COLUMN Salary;
II. ZAPYTANIA WYBIERAJĄCE - przykłady
SELECT nazwisko, imię, dział
FROM personel
WHERE Stanowisko = 'Kierownik';
SELECT *
FROM pracownik
WHERE placa_pod > 1500 and (etat='ADIUNKT' or etat = 'ASYSTENT');
SELECT nazwisko, etat, placa_pod
FROM pracownik
WHERE etat='ADIUNKT' or placa_pod between 1000 and 2000;
SELECT [Imię] AS [First Name (Imię)], [Nazwisko] AS [Last Name - Nazwisko],
year(Date())-Year([urodzony]) AS Wiek
FROM Personel AS [Staff - Personel];
SELECT [Imię], [Nazwisko], Year(Date())-Year([Urodzony]) AS Wiek
FROM Personel
WHERE Right([Imię],1)="a";
Porządkowanie - ORDER BY
SELECT *
FROM pracownik
ORDER BY id_zesp, placa_pod DESC;
SELECT personel.imię, nazwisko, year(date())-year([urodzony]) AS Wiek
FROM Personel
ORDER BY year(date())-year([urodzony]) DESC , [Nazwisko];
SELECT Nazwisko, Imię
FROM Personel
WHERE [Dane żony/męża] is not null;
SELECT TOP 3 *
FROM Personel
ORDER BY [Zatrudniony od];
SELECT nazwisko, imię
FROM personel
WHERE nazwisko not like "D*";
SELECT nazwisko, imię
FROM personel
WHERE nazwisko <> "Dąbek";
SELECT Nazwisko, Imię
FROM Personel
WHERE nazwisko >= 'K%';
SELECT nazwisko, imię
FROM Personel
WHERE nazwisko not in ('Barska','[Śliwa]');
Parametry
PARAMETERS [Podaj nazwisko:] Text;
SELECT *
FROM Personel
WHERE [Nazwisko]=[Podaj nazwisko:];
ALL, DISTINCT
SELECT [Zamieszkały]
FROM Personel
WHERE [Zamieszkały] <> "Wrocław";
SELECT DISTINCT [Zamieszkały]
FROM Personel
WHERE [Zamieszkały] <> "Wrocław";
GROUP BY...HAVING
SELECT etat, avg(placa_pod)
FROM Pracownik
WHERE etat <> 'DYREKTOR'
GROUP BY etat;
SELECT id_zesp, etat, ccur(avg(placa_pod+placa_dod)) AS [Płaca średnia]
FROM Pracownik
GROUP BY id_zesp, etat;
PARAMETERS [(K)obieta czy (M)ężczyzna?] Text;
SELECT [Dział], [Płeć], Count([Nazwisko]) AS [Ilość zatrudnionych]
FROM Personel
GROUP BY [Dział], [Płeć]
HAVING [Płeć]=[(K)obieta czy (M)ężczyzna?]
ORDER BY [Dział];
SELECT id_zesp, avg(placa_pod)
FROM pracownik
GROUP BY id_zesp
HAVING count(*) >3;
Połacznia w SQL (INNER, LEFT, RIGHT)
SELECT *
FROM pracownik, zespol;
SELECT [ID Pracownika], Personel.Nazwisko, Personel.Imię, [Zasadnicza]
FROM Płace, Personel
WHERE Płace.[ID Pracownika]=Personel.[ID]
and Płace.Zasadnicza in (700, 1200, 1400, 1500);
SELECT [ID Pracownika], Personel.Nazwisko, Personel.Imię, [Zasadnicza]
FROM Płace, Personel
WHERE Płace.[ID Pracownika]=Personel.[ID]
and Zasadnicza between 800 and 1500;
SELECT p.[ID Pracownika], o.Nazwisko, o.Imię, p.[Zasadnicza]
FROM Płace AS p, Personel AS o
WHERE p.[ID Pracownika]=o.[ID]
and Zasadnicza between 800 and 1500;
SELECT [ID Pracownika], Personel.Nazwisko, Personel.Imię, [Zasadnicza]
FROM Płace, Personel
WHERE Płace.[ID Pracownika]=Personel.[ID]
and Personel.Nazwisko like 'B*';
SELECT pracownik.nazwisko, zespol.nazwa
FROM Pracownik, Zespol
WHERE Pracownik.id_zesp=zespol.id_zesp;
SELECT pracownik.nazwisko, zespol.nazwa
FROM Pracownik INNER JOIN zespol ON pracownik.id_zesp=zespol.id_zesp;
SELECT pracownik.nazwisko, zespol.nazwa
FROM Pracownik RIGHT JOIN zespol ON pracownik.id_zesp=zespol.id_zesp;
SELECT [ID Pracownika], Personel.Nazwisko, Personel.Imię, [Zasadnicza]
FROM Płace, Personel
WHERE Płace.[ID Pracownika]=Personel.[ID]
and Zasadnicza not BETWEEN 800 and 1500;
SELECT Personel.Nazwisko, Personel.Imię, Płace.Zasadnicza, Personel.ID
FROM Personel INNER JOIN Płace ON Personel.ID = Płace.[ID Pracownika]
WHERE (((Personel.Nazwisko) Like 'B*') AND ((Personel.ID)=[ID Pracownika]));
Aliasy
SELECT nazwisko, nazwa
FROM Pracownik AS p, Zespol AS z
WHERE p.id_zesp=z.id_zesp;
SELECT nazwisko, nazwa
FROM Pracownik AS p INNER JOIN zespol AS z ON p.id_zesp = z.id_zesp
ORDER BY nazwisko;
SELECT nazwisko, nazwa
FROM Pracownik AS p LEFT JOIN zespol AS z ON p.id_zesp = z.id_zesp
ORDER BY nazwisko;
SELECT nazwisko, nazwa, z.id_zesp
FROM Pracownik AS p RIGHT JOIN zespol AS z ON p.id_zesp = z.id_zesp;
SELECT Personel.Nazwisko, Oferta.[Nazwa kursu]
FROM Personel
INNER JOIN (Wykładowcy
INNER JOIN Oferta
ON Wykładowcy.[ID Kursu] = Oferta.[ID kursu])
ON Personel.ID = Wykładowcy.[ID Pracownika]
ORDER BY Personel.Nazwisko;
Zapytania zagnieżdżone
SELECT NAZWISKO, PLACA_POD, ETAT, ID_ZESP
FROM PRACOWNIK
WHERE PLACA_POD > ANY
(select distinct placa_pod from Pracownik where id_zesp=30);
SELECT Personel.Dział, Format(Count([Nazwisko])/
(SELECT Count([Nazwisko])
FROM [Personel]),
"0%") AS [Odsetek zatrudnionych]
FROM Personel
GROUP BY Personel.Dział;
SELECT NAZWISKO, PLACA_POD, ETAT, ID_ZESP
FROM PRACOWNIK
WHERE PLACA_POD >= ANY
(select distinct placa_pod as placa_min from Pracownik m where id_zesp=[Podaj dział]);
SELECT Nazwisko, numer, szef, etat, id_zesp
FROM Pracownik AS p
WHERE exists
( select numer from Pracownik
where Pracownik.szef=p.numer);
Zapytania SQL-właściwe
UNION
SELECT etat from Pracownik
where id_zesp=10
UNION select etat from pracownik
where id_zesp=30;
Darmowy hosting zapewnia PRV.PL