Lekcja 3 - lokonopnicka.pl

Transkrypt

Lekcja 3 - lokonopnicka.pl
Lekcja 3 - SORTOWANIE DANYCH
I PRACA Z ZAPYTANIAMI
Utworzymy nową tabelę o nazwie dni, z polami: id i nazwa
Id
Nazwa
(int) auto_increment
varchar
1
sroda
2
sobota
3
poniedzialek
4
piatek
5
niedziela
6
czwartek
7
wtorek
mysql> use nazwa_bazy;
mysql>show tables;
mysql> create table dni(id int, nazwa varchar(20), primary key(id));
mysql>insert into dni values(1,’sroda’);
mysql>insert into dni values(2,’sobota’);
mysql>insert into dni values(3,’poniedzialek’);
mysql>insert into dni values(4,’piatek’);
mysql>insert into dni values(5,’niedziela’);
mysql>insert into dni values(6,’czwartek’);
mysql>insert into dni values(7,’wtorek’);
mysql>select * from dni;
 Zadanie: Chcemy posortować dane tak, by dni tygodnia były wyświetlane
po kolei: poniedziałek, wtorek…. itd. Jak to zrobić?
Użyjemy funkcji field z dwoma parametrami (pierwszy parametr określa jakie
pole przedefiniujemy, czyli id, natomiast drugi parametr wyznacza kolejność jaką
chcemy uzyskać)
czyli:
mysql> select * from dni order by field(id,3,7,1,6,4,2,5);
str. 1
Tworzenie tabeli przez zapytanie
mysql>select * from pracownicy;
 Zadanie: Chcemy utworzyć tabelę pracowników z 1 działu.
mysql> create table dzial1 as select * from pracownicy where dzial=1;
mysql> show tables;
mysql> select * from dzial1;
Zapamiętaj! Tabela utworzona przez zapytanie (dzial1) jest KOPIĄ tabeli
(pracownicy). Oznacza to, że jeśli np. skasowany zostanie rekord (lub inne
działania wykonywane w tak powstałej tabeli) to w tabeli dzial1 ten rekord
zostanie usunięty, natomiast w tabeli pracownicy nadal ten rekord istnieje.
Przykład:
mysql> delete from dzial1 where id=2;
*(widać, że record o id=2 został usunięty)
mysql>select * from pracownicy;
*(widać, że record o id=2 istnieje)
ODWROTNOŚCIĄ KOPII TABELI JEST WIDOK
Widok to bezpośrednia reprezentacja danych z jednego miejsca w inne.
Operacje na widokach wykonuje się tak jak na tabelach (select)
 Zadanie: Utworzymy widok tabeli
mysql> create view dzial2 AS select id, nazwa, zarobki from pracownicy;
mysql> select * from dzial2;
Zmienimy teraz zarobki o wartości 1000 na 555(w nowej tabeli utworzonej
jako widok)
mysql> update dzial2 SET zarobki=555 where id=6;
str. 2
mysql> select * from dzial2;
->widać, że zarobki dla id=6 zostały zmienione z 1000 na 555
A teraz sprawdzimy czy w tabeli pracownicy ta zmiana została dokonana:
mysql> select * from pracownicy;
->widać, że zarobki dla id=6 zostały zmienione z 1000 na 555
Zapamiętaj! Kiedy stosuje się widok?
1. Można wykorzystać widok do tworzenia różnych zapytań, nie tworząc
wielopiętrowych operacji select.
2. Można chronić tajne dane (np. pesel, zarobki itd.) w sytuacji gdy prawa
dostępu do bazy mają użytkownicy niezbyt zaawansowani (np.
praktykanci). Tworzy się wówczas widok z tabeli i wybrać z niej tylko te
pola, które nie są chronione. Zwiększa się bezpieczeństwo systemu.
W jaki sposób rozbudować tabelę? (Na przykładzie tabeli pracownicy, do
której chcemy dołączyć pole dyzur (pole dyżur zawierać będzie numer
dnia tygodnia, w którym pracownik będzie pełnił dyżur), czyli:
mysql>alter table pracownicy ADD dyzur int AFTER nazwisko;
*wstawiamy pole dyzur za (after) polem nazwisko
mysql> select * from pracownicy;
mysql> update pracownicy where id=dyzur;
Chcemy przypisać dni tygodnia do różnych osób (najszybciej będzie jeśli
przypiszemy dyzur do id (np. dyzur 2 do id 2)
mysql> update pracownicy set dyzur=1 where id=1;
mysql> select * from pracownicy;
mysql> update pracownicy set dyzur=2 where id=2;
mysql> update pracownicy set dyzur=3 where id=3;
mysql> update pracownicy set dyzur=4 where id=4;
mysql> update pracownicy set dyzur=5 where id=5;
mysql> update pracownicy set dyzur=6 where id=6;
mysql> update pracownicy set dyzur=7 where id=7;
*Jeśli id=8 lub więcej to musimy zmodyfikować, np.:
mysql> update pracownicy set dyzur=3 where id=8;
 Zadanie: Chcemy połączyć tabelę pracownicy z tabelą dni w taki sposób, by
wiedzieć kto (nazwisko, imie, nazwa) ma dyzur w określonym dniu
tygodnia(1,2, 3….)
mysql> select imie, nazwisko, nazwa from pracownicy, dzialy where
dyzur=dni.id;
Jeśli chcemy posortować według dni (poniedziałek, wtorek….) to trzeba
zastosować funkcję field, czyli:
mysql> select imie, nazwisko, nazwa from pracownicy, dzialy where
pracownicy.dyzur=dni.id order by field(dni.id, 3,7,1,6,4,2,5);
str. 3