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