bazy danych

advertisement
baza samochodów (komis)(1)
► dane
: nr_rejestracyjny, marka, rocznik, kolor,
cena, właściciel (dane sprzedającego)
► 1) określenie cech obiektów istniejacych w
rzeczywistości (przypisanie atrybutów)
► 2) zaprojektowanie odpowiednich tabel
► 3) określenie związków między tabelami
► 4) pozbycie się ewentualnych związków (m-n)
baza samochodów (komis)(2)
►
►
►
►
►
►
samochód i właściciel są rozłącznymi obiektami
istniejącymi w rzeczywistości.
zarówno samochód jak i właściciel istnieją niezależnie
od siebie
w pierwszym przybliżeniu tworzymy dwie tabele:
„samochody” i „wlasciciele”
(IDsamochodu,nr_rej,marka,kolor,rocznik,cena)
(IDwlasciciela,imie,nazwisko,kontakt)
zanim określimy związki przyjrzyjmy się tabeli
„samochody”
baza samochodów (komis)(3)
►
►
►
►
►
►
►
(IDsamochodu,nr_rej,marka,kolor,rocznik,cena)
nr_rej – przypisanie jednoznaczne
cena – przypisanie jednoznaczne ( jeśli dwa auta maja tą sama
cenę to zbieżność jest przypadkowa)
rocznik – kwestia umowy, jeśli bierzemy pod uwagę daty, jest to
dana prawie ciągła, jeśli zaś rocznik to zbiór jest ograniczony –
typowy słownik
kolor – jest cechą samochodu, jednak wiele samochodów ma ten
sam kolor, ponadto kolory tworzą zbiór przeliczalny niewielkich
rozmiarów – typowe dane słownikowe
marka – jest atrybutem związanym a nie cechą – firmy ( marki)
istnieją niezależnie od poszczególnych egzemplarzy
wyróżnimy więc niezależne tabele : kolory, marki, roczniki
Schemat relacyjny
Student-przedmiot-prowadzący
► Związki
wieloznaczne:
► Student studiuje wiele przedmiotów – na
jeden przedmiot uczęszcza wielu studentów
► Asystent prowadzi przedmioty – jeden
przedmiot prowadzi wielu asystentów
► Student uczy się u wielu asystentów – jeden
asystent uczy wielu studentów
tabela asocjacyjna
► asocjacje(ID,IDstudenta,IDasystenta,IDprzedmiotu)
►
►
dodatkowo w tabeli mogą wystąpić jej cechy (termin?)
pole IDstudenta stanowi klucz obcy ( jest stroną
„wiele” związku 1-n z tabelą „studenci”
► w tabeli „studenci” stanowi klucz główny ( jest
stroną „jeden” związku
► pola IDasystenta, IDprzedmiotu stanowią
analogiczne połączenia
► poprzez konstrukcję tabeli asocjacyjnej uniknęliśmy
związków „wiele-do-wiele”
diagram związków studiowania
Diagram związków studiowania (2)
►
►
►
Tabela asocjacyjna zawiera bardzo dużo wpisów – w
szczególności iloczyn liczby studentów, liczby asystentów i
liczby przedmiotów
Można zrezygnować z poprawnej postaci normalnej i
połączyć asystentów z przedmiotami. Efektem
niekorzystnym będzie redundancja w kolumnie przedmiot
Takie podejście pozwala uprościć tabelę asocjacyjną
Diagram związków studiowania(2)
►
Do przedmiotu dodano pole „termin” aby umożliwić
prowadzenie jednego przedmiotu przez dwóch
asystentów. W tabeli przedmioty pojawi się
redundancja – ten sam przedmiot jest wpisany tyle
razy ilu asystentów go prowadzi
diagram związków dla linii lotniczej
Pasażer leci rejsem - związek wieloznaczny (m-n)
► Piloci pilotują rejsy – związek m-n
► Samolot obsługuje wiele rejsów – związek 1-n
► Proponowane tabele :
►




►
samoloty (IDsamolotu,nazwa)
rejsy (Nr_Rejsu,skąd, dokąd, godz-odlotu, godz_przylotu)
pasażerowie (IDpazazera, imie, nazwisko, adres, telefon)
piloci ( IDpilota, imie, nazwisko)
Proponowany układ tabel nie redukuje związków
wieloznacznych
redukcja związku pasażer  rejs
►
Należy wprowadzić dodatkową tabelę Rezerwacje zawierającą jako
klucze obce IDpasażera i Nr_Rejsu co rozwiąże problem : wielu
pasażerów podróżuje wieloma samolotami
redukcja związku piloci  rejsy
►
Należy wprowadzić dodatkową tabelę Przydzialy zawierającą jako
klucze obce IDpilota i IDsamolotu co rozwiąże problem: wielu
pilotów lata wieloma rejsami
diagram bez związków wieloznacznych
MySQL silnik bazodanowy (DB engine)
►
duża szybkość – odstępstawa od standardu SQL
►
brak obsługi transakcji w wersjach starszych niż 4.0
►
obsługa wielu platform:
►
Linux (x86, S/390, IA64 (Itanium), Alpha, PowerPC,
AMD64 / EM64T),
Windows (x86),
Solaris (SPARC,x86), FreeBSD (x86), MacOS X, HP-UX
(PA-RISC, IA64) AIX (RS6000) QNX (x86), Novell
Netware (x86), SGI, DEC OSF.
►
►
MySQL - cechy
►rodzaje
obsługiwanych tablic :
MyISAM – domyślny, nie obsługuje transakcji,
► HEAP – najszybszy, gdyż wszystko jest przechowywane wyłącznie w
pamięci RAM. Posiada jednak kilka ograniczeń, między innymi nie
przechowuje danych po wyłączeniu serwera MySQL,
► InnoDB – obsługuje transakcje,
► Licencja : GPL, również wersje z licencjami zamkniętymi
►
►
Wraz z serwerem Apache i parserem PHP
zaimplementowanymi na platformie Linux stanowi
popularne środowisko serwerowe – LAMP – Linux,
Apache, MySQL, PHP
podstawy SQL (1)
– Structured Query Language –
strukturalny język zapytań
► wszystkie wartości danych są typów
prostych
► wszystkie dane zapisywane w
dwuwymiarowych tablicach (relacjach)
► operacje są zdefiniowane logicznie, a nie
przez pozycje wiersza w tabeli
► Wiersze posiadają unikalny klucz
► SQL
podstawy SQL (2)
w odróżnieniu od „zwykłych” języków programowania SQL
określa raczej CO ma być zrobione a nie JAK to zrobić
► takie języki nazywamy DEKLARATYWNE
►
►
Decyzję o sposobie przechowywania i pobrania danych
pozostawia się systemowi zarządzania bazą danych DBMS
DBMS - Data Base Management System
SZBD -System Zarządzania Bazą Danych
► SELECT * FROM osoby WHERE imie=’Ola’;
WYBIERZ wszystkie pola Z tabeli osoby DLA KTÓRYCH
SPEŁNIONY JEST WARUNEK imie=’Ola’;
►
►
►
W 1986 roku SQL stał się oficjalnym standardem, wspieranym
przez Międzynarodową Organizację Normalizacyjną (ISO)
Standard obecnie obowiązujący to SQL92
podstawy SQL (3)
► ze
względu na zastosowanie wyróżniamy
trzy typy SQL:
► SQL
interakcyjny (np. praca na konsoli z
programem mysql)
► Statyczny kod SQL (Static SQL) – stanowi na
ogół niezmienną część aplikacji
 Embedded SQL (Osadzony SQL) (np. C++,Java)
 Język modułów – w analogii do podprogramów)
► Dynamiczny
kod SQL (Dynamic SQL) -
generowany jest w trakcie pracy aplikacji
podstawy SQL (4) – podział zapytań
(ang. Data Manipulation Language,
czyli Język Manipulacji Danymi)
► SQL DML
SELECT - pobranie z bazy danych,
► INSERT - umieszczenie danych w bazie,
► UPDATE - zmiana danych,
► DELETE - usunięcie danych z bazy.
►
(ang. Data Definition Language, czyli
Język Definicji Danych - struktur)
► SQL DDL
CREATE (np. CREATE TABLE, CREATE DATABASE, ...)
► DROP (np. DROP TABLE, DROP DATABASE, ...)
► ALTER (np. ALTER TABLE ADD COLUMN ...)
►
podstawy SQL (5) – przykłady zapytań
►
SELECT * FROM pracownicy WHERE pensja > 2000 ORDER BY staz DESC;
Wyświeta z tabeli pracownicy (FROM pracownicy) wszystkie kolumny (*)
dotyczące tych pracowników, których pensja jest większa niż 2000 (WHERE
pensja > 2000) i sortuje wynik malejąco według stażu pracy (ORDER BY staz
DESC).
INSERT INTO pracownicy (imie, nazwisko, pensja, staz) VALUES ('Jan',
'Kowalski', 5500, 1);
UPDATE pracownicy SET pensja = pensja * 1.1 WHERE staz > 2;
DELETE FROM pracownicy WHERE imie = 'Jan' AND nazwisko = 'Kowalski';
CREATE TABLE pracownicy (imie varchar(255), nazwisko varchar(255),
pensja float, staz int);
DROP TABLE pracownicy;
►
ALTER TABLE pracownicy ADD COLUMN dzial varchar(255);
►
►
►
►
►
Podstawowe typy danych
►
►
►
►
►
►
CHAR(M) Pole znakowe. Przechowuje teksty o ustalonej z góry
długości. Ograniczone do 255 znaków.
VARCHAR(M) Pole znakowe. Przechowuje taką długość tekstu, jaka jest
używana.
INT[(M)] [UNSIGNED] Pole liczb całkowitych. Przechowuje liczby z
zakresu od -2147483648 do 2147483647 (z parametrem UNSIGNED od 0 do 4294967295).
DATE Pole daty przechowuje daty z zakresu od '1000-01-01' do '999912-31'.
BLOB/TEXT Pole tekstowe. Przechowuje dłuższe, wielowierszowe teksty
do 65535 znaków.
Przykład tworzenia tabeli:
CREATE TABLE badania (
ID_badania INT NOT NULL auto_increment,
badanie VARCHAR(15),
PRIMARY KEY (id_badania)
);
Funkcje agregujące
►
►
►
►
►
►
►
►
Count() - zliczanie wynikowych wierszy
Avg() – średnia z pól podanej kolumny
Max(),Min() – maksimum/minimum w kolumnie
Sum() – suma wartości wszystkich pól w kolumnie
Przykłady:
SELECT max(cena) FROM produkty;
SELECT sum(cena*ilosc) from produkty;
SELECT count (ID) FROM produkty.
podstawy SQL (1) – podział zapytań
(ang. Data Definition Language, czyli
Język Definicji Danych - struktur)
► SQL DDL
CREATE (np. CREATE TABLE, CREATE DATABASE, ...)
► DROP (np. DROP TABLE, DROP DATABASE, ...)
► ALTER (np. ALTER TABLE ADD COLUMN ...)
►
(ang. Data Manipulation Language,
czyli Język Manipulacji Danymi)
► SQL DML
SELECT - pobranie z bazy danych,
► INSERT - umieszczenie danych w bazie,
► UPDATE - zmiana danych,
► DELETE - usunięcie danych z bazy.
►
MySQL –konto uzytkownika
►
►
►
►
z poziomu administratora MySQL (root) należy
stworzyć bazę u żytkownika:
>create database naszabaza;
oraz nadać uzytkownikowi prawa do niej :
>GRANT ALL PRIVILEGES ON naszabaza.* TO
user@localhost IDENTIFIED BY 'haslo';
oznacza to nadanie wszystkich praw do wszystkich tabel w
‘naszabaza’ użytkownikowi ‘user’ podającemu ‘haslo’ i łączącemu
się z lokalnego serwera
przywileje mogą być ograniczone do poszczególnych poleceń
(SELECT, INSERT, UPDATE ….)
oraz do wybranych tabel :
>grant SELECT on naszabaza.klienci to user@localhost
IDENTIFIED BY 'haslo';
MySQL –nawiązanie połączenia
►
►
►
►
►
►
►
nawiązanie połączenia terminalowego wymaga:
posiadania konta na serwerze
posiadania dostępu do bazy MySQL (konta MySQL)
To są dwa INNE konta (często nazywają się tak samo
dla ułatwienia)
po zalogowaniu na serwer wpisujemy z konsoli:
mysql –u uzytkownik_bazy –p
password : *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32359 to server version: 3.23.49-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
MySQL –nawigacja
► przegląd
baz : show databases;
► wybranie bazy ( konieczne uprawnienia)
>use naszabaza;
database changed
► przegląd tabel : show tables;
► struktura tabeli:
>describe nazwa; / >explain nazwa;
MySQL –TYPY DANYCH
►liczbowe
(całkowite i zmiennopozycyjne)
►tekstowe
►daty i czasu
MySQL – LICZBY CAŁKOWITE
BAJTÓW
MIN
MAX
TINYINT
1
-128
127
SMALLINT
2
-32768
32767
MEDIUMINT
3
-8388608
8388607
INT
4
-2147483648
-2147483647
BIGINT
8
-2^63
2^63-1
MySQL – liczby zmiennopozycyjne
►
►
FLOAT(M,D) – pojedyncza precyzja , zakres +/1.175494351E-38 - 3.402823466E+38
M- całkowita ilość cyfr
D- ilość cyfr po przecinku
dokładność ok. 7 cyfr znaczących
DOUBLE(M,N) – double precision
2.2250738585072014E-308 do 1.7976931348623157E+308
dokładność ok. 15 cyfr znaczących
MySQL –data i czas
►
►
DATE
zakres : '1000-01-01' do '9999-12-31'
DATETIME
zakres: '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
►
►
TIME
zakres: -838:59:59' to '838:59:59'
YEAR
zakres 1901 - 2155
MySQL –typy tekstowe
► CHAR
(synonim CHAR(1)) – jednoznakowy
► VARCHAR(M) – łańcuch o zmiennej
długości maksymalnie m-znaków
► BLOB - 65,535 (2^16 – 1) bytes
► MEDIUMBLOB 16,777,215 (2^24 – 1)
► LONGBLOB 4294967295 (4GB) (2^32 – 1)
► TEXT – to samo co BLOB
► SET('value1','value2',...)
jawnie wyspecyfikowane, max 64 elementy
MySQL –specyfikacja pól
► not
NULL – zabroniony wpis null
► auto_increment – jeśli w takie pole nie
wpiszemy nic, lub wpiszemy 0, MySQL
uzupełnia wpisem o 1 większym od
ostatniego
► primary key / primary key(nazwa)
wyspecyfikowanie klucza
► częste łączenie :
ID int not null auto_increment primary key,
MySQL –tworzenie tabeli
►
►
►
►
►
create table elementy(
ID int not null auto_increment primary key,
element varchar(20),
cena float
)
MySQL –wstawianie rekordów
► insert
into
► elementy(ID,nazwa,cena)
► values(0,’srubka’,10);
►
skrócone:
insert into elementy values(0,’srubka’,10);
► można
ręcznie nadać ID ale na ogół jest to
zbędne ( czasem szkodliwe !)
MySQL –wybieranie rekordów
►
►
►
►
►
►
►
SELECT nazwy_kolumn
FROM nazwy_tabel
WHERE warunek_logiczny;
wybranie wszystkich:
select * from elementy;
wybranie niektórych kolumn z warunkiem:
select nazwa,cena from elementy
where
cena < 100;
SELECT DISTINC … - usuwanie duplikatów
… ORDER BY nazwa –sortowanie (na końcu)
MySQL –zapytania łączące tabele
►
►
select * from marki;
select * from modele;
IDmarki
marka
1
fiat
2
ford
IDmodelu
IDmarki model
1
1
125P
2
1
Croma
3
1
Bravo
4
2
Fiesta
5
2
Focus
6
2
Mondeo
MySQL –zapytania łączące tabele
►
złączenie kluczy w relacji 1-n jest tzw.
złączeniem naturalnym i dla tego
równoważnę są dwie instrukcje :
►
select model,marka from modele,marki where
marki.IDmarki=modele.IDmarki;
select model,marka from modele natural join marki;
select model,marka from modele join marki on
marki.IDmarki=modele.IDmarki;
( w MySQL ta wersja nie działa)
MySQL –zapytania łączące tabele
► złączenie
lewostronne – składa się z
wierszy tablicy LEWA i pasujących wierszy
z tablicy PRAWA . Gdy brak pasujących
wierszy z prawej pojawi się NULL
►W
naszym przypadku nie ma różnicy
między złączeniem lewostronnym i
naturalnym:
select model,marka from marki left join
modele on
marki.IDmarki=modele.IDmarki;
► Jednak
po dodaniu rekordu do tabeli
marki, który nie ma jeszcze dodanego
modelu :
insert into marki(marka) values (‘BMW’)
model
marka
125P
fiat
Croma
fiat
Bravo
fiat
Fiesta
ford
Focus
ford
Mondeo
ford
model
marka
125P
fiat
Croma
fiat
Bravo
fiat
Fiesta
ford
Focus
ford
Mondeo
ford
NULL
BMW
MySQL –zapytania łączące tabele
► Wykorzystując złączenie lewostronne
można uzyskać te wiersze z tabeli,
które nie mają odpowiedników
drugiej tabeli :
►
select model,marka from
marki left join modele
on marki.IDmarki=modele.IDmarki
WHERE model is NULL;
model
NULL
marka
BMW
MySQL –zapytania łączące tabele
►
►
►
Czy jest możliwe skrzyżowanie
tabeli samej ze sobą?
select marki,marki from
marki,marki;
błąd ERROR 1066: Not unique
table/alias: 'marki’
słowo AS przechowuje tabelę w
zapytaniu pod inną nazwą:
select tab1.marka as
marka1,tab2.marka as marka2
FROM
marki AS tab1, marki AS tab2;
marka1
marka2
fiat
fiat
ford
fiat
BMW
fiat
fiat
ford
ford
ford
BMW
ford
fiat
BMW
ford
BMW
BMW
BMW
MySQL –zapytania łączące tabele
► przykład
wykorzystania – usuwanie
duplikatów.
►
►
ID1
zrobiono błędny wpis – dodatkowy rekord o
identycznej zawartości lecz innym ID:
insert into marki values(4,'fiat');
i usunięto ‘BMW’
delete from marki where marka=„BMW”;
interesują nas rekordy o tym samym wpisie
lecz różnych ID więc modyfikujemy zapytanie
dodając:
►
select tab1.IDmarki as ID1,tab1.marka as marka1,
tab2.IDmarki as ID2,tab2.marka as marka2
FROM
marki AS tab1, marki AS tab2
►
where
marka1=marka2 and ID1<>ID2
ID1
marka1
ID2
marka2
1
fiat
1
fiat
2
ford
1
fiat
4
fiat
1
fiat
1
fiat
2
ford
2
ford
2
ford
4
fiat
2
ford
1
fiat
4
fiat
2
ford
4
fiat
4
fiat
4
fiat
marka1
ID2
marka2
4
fiat
1
fiat
1
fiat
4
fiat
MySQL –przykłady
►klient
składa zamówienia, na jednym może być wiele pozycji
►dostawca proponuje ofertę
►obiektami są towary wyszczególnione w tabeli
MySQL –przykłady
Insert into towary values(1,'laptop','Toshiba','X100',3200,10);
Insert into towary values(2,'laptop','HP','HP100',3600,10);
Insert into towary values(3,'laptop','HP','HP200',3800,2);
Insert into towary values(4,'laptop','CompaQ','CQ999',2800,10);
Insert into towary values(5,'laptop','CompaQ','CQ222',1800,15);
Insert into towary values(6,'laptop','CompaQ','CQ123',5800,5);
MySQL –przykłady
insert into dostawcy values(1,'importer1','Krakow');
insert into dostawcy values(2,'importer2','Wieliczka');
insert into dostawcy values(3,'importer3','Warszawa');
MySQL –przykłady
►insert
into klienci values(1,'Sklep Hani','Krolewska 10','Krakow');
►insert into klienci values(2,'Sklep Oli','Dluga 1','Krakow');
►insert into klienci values(3,'Sklep Komputerek','Sliczna 32','Krakow');
►insert into klienci values(4,'Sklep Laptopik','Pawia 10','Wieliczka');
►insert into klienci values(5,'Hurtownia WW ','Kopalniana 1','Wieliczka');
►insert into klienci values(6,'Hurtownia Elektro','Aleje 12','Krakow');
MySQL –przykłady
-- dostawca 1
insert into oferty_dostawcow values(1,1,1,3000);
insert into oferty_dostawcow values(2,1,2,3000);
insert into oferty_dostawcow values(3,1,3,3300);
insert into oferty_dostawcow values(4,1,4,2000);
insert into oferty_dostawcow values(5,1,5,1000);
insert into oferty_dostawcow values(6,1,6,5000);
MySQL –przykłady
-- dostawca 2
insert into oferty_dostawcow values(7,2,1,3100);
insert into oferty_dostawcow values(8,2,2,3200);
insert into oferty_dostawcow values(9,2,3,3000);
insert into oferty_dostawcow values(10,2,4,1900);
insert into oferty_dostawcow values(11,2,5,1200);
insert into oferty_dostawcow values(12,2,6,5200);
MySQL –przykłady
--dostawca 3
insert into oferty_dostawcow values(13,3,1,3050);
insert into oferty_dostawcow values(14,3,2,2900);
insert into oferty_dostawcow values(15,3,3,3000);
insert into oferty_dostawcow values(16,3,4,1800);
insert into oferty_dostawcow values(17,3,5,1300);
insert into oferty_dostawcow values(18,3,6,4500);
MySQL –przykłady
-- klient 1 ma 2 zamówienia
insert into zamowienia values(1,'2005-11-01',1);
insert into zamowienia values(2,'2005-11-05',1);
-- klient 2 ma 1 zamówienie
insert into zamowienia values(3,'2005-11-05',2);
MySQL –przykłady
-- pozycje zamowienia klienta1
-- zam1
insert into pozycje_zamowien values(1,1,1,10);
insert into pozycje_zamowien values(2,1,2,10);
insert into pozycje_zamowien values(3,1,3,5);
insert into pozycje_zamowien values(4,1,5,15);
--zam2
insert into pozycje_zamowien values(6,2,1,5);
insert into pozycje_zamowien values(7,2,3,10);
insert into pozycje_zamowien values(8,2,4,15);
insert into pozycje_zamowien values(9,2,5,5);
insert into pozycje_zamowien values(10,2,6,2);
-- pozycje zamowienia klienta2
-- zam3
insert into pozycje_zamowien values(11,3,1,20);
insert into pozycje_zamowien values(12,3,2,30);
insert into pozycje_zamowien values(13,3,3,20);
insert into pozycje_zamowien values(14,3,4,2);
insert into pozycje_zamowien values(15,3,5,2);
insert into pozycje_zamowien values(16,3,6,2);
MySQL –przykłady
►-zamowienia
zlozone przez 'Sklep Hani'
►select Nr_zamowienia as zamowienia_Hani
►from
►zamowienia natural join klienci
►where
►klienci.nazwa_firmy='Sklep Hani';
MySQL –przykłady
►--
policzyc ilosc zamowien klienta 'Sklep Hani‘
►select COUNT(Nr_zamowienia) as zamowienia_Hani
►from zamowienia natural join klienci
►where klienci.nazwa_firmy='Sklep Hani';
MySQL –przykłady
►--
wyszczegolnic pozycje zamowienia 1( nazwy towarow i ich ceny sprzed)
►select model,cena_sprzed from
►zamowienia,pozycje_zamowien,towary
►where
►towary.nr_katalog_towaru=pozycje_zamowien.nr_katalog_towaru
►and
►pozycje_zamowien.Nr_zamowienia=zamowienia.Nr_zamowienia
►and zamowienia.Nr_zamowienia=1;
MySQL –przykłady
►----
wartosci kolejnych zamowien
►select zamowienia.nr_zamowienia,klienci.nazwa_firmy,sum(cena_sprzed) from
zamowienia,pozycje_zamowien,towary,klienci where
zamowienia.nr_zamowienia=pozycje_zamowien.nr_zamowienia and
pozycje_zamowien.nr_katalog_towaru=towary.nr_katalog_towaru and
klienci.ID_klienta=zamowienia.ID_klienta group by zamowienia.nr_zamowienia;
MySQL –przykłady
►--
zamowienia i porownaie ilosci dostepnej
►select model,sum(ilosc_w_mag),sum(ilosc_zam) from
zamowienia,pozycje_zamowien,towary where
towary.nr_katalog_towaru=pozycje_zamowien.nr_katalog_towaru and
pozycje_zamowien.Nr_zamowienia=zamowienia.Nr_zamowienia group by
model;
MySQL –przykłady
►--oferty
wg dostawcow
►select nazwa_firmy, cena, nazwa_producenta,model from
towary,oferty_dostawcow,dostawcy where
towary.nr_katalog_towaru=oferty_dostawcow.nr_katalog_towaru and
oferty_dostawcow.ID_dostawcy=dostawcy.ID_dostawcy;
‘
►Jak
uzyskać informację ----najtansze oferty wg modeli –
select nazwa_firmy, min(cena), nazwa_producenta,model from
towary,oferty_dostawcow,dostawcy where
towary.nr_katalog_towaru=oferty_dostawcow.nr_katalog_towaru and
oferty_dostawcow.ID_dostawcy=dostawcy.ID_dostawcy
group by model;
►NIE DZIAŁA !! – wszystko co jest po SELECT powinno być uyte w
klauzuli GROUP BY
‘
►create
temporary table tmp select
concat(nr_katalog_towaru,':',min(cena)) as test
from oferty_dostawcow
group by nr_katalog_towaru;
test
1:3000
2:2900
3:3000
4:1800
5:1000
6:4500
►select
nazwa_firmy,model,cena
from
dostawcy,towary,oferty_dostawcow,tmp
where towary.nr_katalog_towaru=oferty_dostawcow.nr_katalog_towaru
and
dostawcy.id_dostawcy=oferty_dostawcow.id_dostawcy and
concat(towary.nr_katalog_towaru,':',cena)=tmp.test
;
PHP - wspomaganie programowania
aplikacji internetowych
►
►
►
►
►
1994 - PHP (Rasmus Lerdorf) - brak pętli, instrukcji
warunkowych, struktur danych
1995 - obsługa formularzy i dostęp do mSQL
1997 - PHP3 (Zeef Suraski, Andi Gutmans) - strukturalna i
obiektowa wersja języka
2000 - PHP4 + moduł skryptowy ZEND
Najnowsza wersja (PHP4) korzysta z potężnej platformy
skryptowej Zend (http://www.zend.com), co zwiększa jej
wydajność oraz może działać jako moduł serwera innego
niż Apache.
Kod źródłowy PHP jest powszechnie dostępny na zasadzie
Open Source (http://www.opensource.com)
Dlaczego PHP ? - zalety
► (+)
Prosta składnia zapożyczona z C, z
elementami Perl’a i skryptów powłoki
► (+) integracja z językiem HTML
► (+) naturalne połączenie warstwy baz
danych z warstwą serwera WWW
► (+) zunifikowany interfejs do różnych baz
danych
Dlaczego PHP ? - zalety
► (+)
bezpieczeństwo kodu - PHP wykonuje
się po stronie serwera ( niezależność od
przeglądarki)
► (+) bezpieczeństwo danych - wykorzystanie
ssl i HTTPS
► (+) PHP jako moduł serwera WWW
► (+) generowanie HTML, GIF, JPG, PDF
► (+) dostępność kodu
Dlaczego PHP ? - wady
► (-)
język interpretowany więc wolny
► (-) brak systemu transakcji
► (-) brak STDIN - w Linuxie można obejść
otwierając jawnie plik /dev/stdin
Dla kogo PHP ?
► Administratorzy
serwisów WWW
► autorzy dynamicznych stron WWW
► użytkownicy bez prawa do uruchamiania
skryptów CGI
► projektanci aplikacji mają „za darmo”
interfejs użytkownika (HTML)
Instalacja UNIX
►
►
RH 7.2 - wystarczy wybrać odpowiednie pakiety instalacyjne (PHP +
MySQL)
W starszych wersjach PHP było dostarczane bez wkompilowanych
funkcji do obsługi baz danych. Konieczna była ręczna kompilacja.
./configure --with-apache=/sciezka_do_zrodel_apache
--withmysql=/sciezka_do_zainst_MySQL
make
make install
Instalacja UNIX
►
►
►
►
Podobnie kompilujemy serwer APACHE
./configure --activate-module=src/modules/php3/libphp3
make
make install
w plikach konfiguracyjnych APACHE należy dodac wpisy:
AddType aplication/x-httpd-php .php .php3 [.php4]
Instalacja WINDOWS
►
►
Istnieje wersja „na skróty” pod system Windows o nazwie PHPTriad
(PHP +APACHE +MySQL) (binaria)
system można testować na lokalnym komputerze posługując się
adresem - http://localhost
Plik index.html powinien znajdować się w
c:\apache\htdocs , tam również skrypty PHP, konfiguracja w pliku
c:\apache\conf\httpd.conf
literatura
►
►
►
►
►
Craig Hilton, Jeff Willis
PHP3 - internetowe aplikacje bazodanowe
Marek Nowakowski
PHP4 & MySQL dla webmastera
Rasmus Lerdorf
Leksykon PHP
http://www.php.pl ; http://www.php.net
http://ux.ap.krakow.pl/~bar/
Strona tymczasowa, trochę polskojęzycznych informacji, kursy PHP i
MySQL,
Umieszczanie PHP w
dokumentach HTML
►
►
►
►
►
►
Kod skryptu umieszczany jest bezpośrednio w kodzie HTML ujęty w
parę znaczników:
<?PHP ........ ?>
(skrócone <? ..... ?>
<HTML><BODY>
<?PHP echo ‘Jestem skryptem PHP <BR>`; ?>
</BODY></HTML>
Skrypt niekoniecznie w sekcji BODY
przeglądarka wyświetla stronę HTML i WYNIK skryptu PHP
Przeglądarka ignoruje odstępy i znaki końców akapitu, trzeba je
zastąpić odpowiednimi znacznikami HTML (&nbsp, <BR> itp.)
plik skryptu powinien mieć jedno z akceptowanych rozszerzeń (.php) ,
treść skryptu jest niedostępna dla użytkownika po stronie
przeglądarki
Możliwości języka
►
►
►
►
►
►
►
►
Dołączanie plików include ("filename.abc")
zmienne
tablice
operatory i wyrażenia
instrukcje (struktury sterujące)
funkcje użytkownika
integracja z bazami danych - ogromna ilość funkcji
pomocniczych dedykowanych dla najpopularniejszych
systemów (MySQL, ORACLE, PostgreSQL, Informix)
funkcje obsługi :stringów, tablic, dat, URL, sieci, ODBC,
grafiki i plików
PHP - Dołączanie plików
►
include ("nazwapliku.php”);
dołączanie plików jest nieodzownym mechanizmem zapewniającym
przejrzystość kodu i zwiększającym bezpieczeństwo, wymagane jest
aby w dołączanym pliku występowały znaczniki PHP
►
►
Do standardowych metod należy definiowanie w osobnych plikach
pewnych stałych elementów stron (np. nagłówków) i dołączanie ich do
różnych stron
Pliki dołączane muszą mieć odpowiednie atrybuty
PHP - zmienne
►
►
W zmiennych odgrywa znaczenie wielkość liter
PHP operuje następującymi typami danych:




►
►
►
Liczby całkowite
Liczby zmiennopozycyjne
Łańcuchy znaków
Tablice
Zmienne tworzymy BEZ ich deklarowania w momencie pierwszego
przypisania wartości:
$x=1.234; $i=3;
tab[0]='ala'; tab[]='ma kota';
PHP - operatory i wyrażenia
►
►
►
►
►
Oper. logiczne <, <= , > , >= , != , ==
#$x<=3;
Oper. Przypisania =
# $x=2*$y;
Złożone $a++ ; #$a=$a+1;
Wartości logiczne:
FALSE - odpowiada "" {pusty napis} lub 0
TRUE - cokolwiek innego
Każda zmienna jest skojarzona z wartością logiczną i tak np. pusta
tablica - FALSE, zmienna jeszcze nie użyta - FALSE
PHP - instrukcje
►
►
►
Instrukcja warunkowa - jeżeli .... A jeżeli NIE ...
IF ($warunek) {
instrukcja; }
ELSE {
instrukcja;}
dopóki warunek powtarzaj instrukcję
WHILE ($warunek) { instrukcja; }
powtarzaj instrukcję dopóki warunek
DO { instrukcja; }
WHILE ($warunek;)
PHP - instrukcje
►
►
FOR (instrukcja0;$warunek;instrukcja_sterująca) {
instrukcja_w_pętli;}
konstrukcja często stosowana przy ustalonej liczbie powtórzeń
for($i=0;$i<10;$i++) {echo $i};
instrukcja wyboru:
SWITCH ($x)
case 0:
instrukcja0;
break;
case 1:
instrukcja1;
break;
DEFAULT : instrukcja_ANI_1_ANI_2;
}
PHP - funkcje
►
►
►
Funkcja jest konstrukcją programistyczną wykonująca
określony algorytm i przyjmującą określoną wartość.
Pozwala również dzielić złożone problemy na fragmenty,
Wewnątrz funkcji powinna się znaleźć instrukcja RETURN
definiująca wartość funkcji (zwracająca wartość)
definicja przykładowa:
function moja($a,$b) {
return ($a+$b)/2;
}
użycie:
echo moja(3,5); #wypisze wartość 4
PHP - funkcje - argumenty
►
Przekazywanie przez wartość
Z tą sytuacją mamy do czynienia gdy
funkcja ma w odpowiedzi zwrócić pewną
wartość ale NIE ZMIENIĆ wartości
argumentów
► definicja przykładowa:
function srednia($a,$b) {
return ($a+$b)/2;
}
użycie:
echo srednia(3,5); #wypisze
wartość 4
Przekazywanie przez zmienną
Z tą sytuacją mamy do czynienia gdy
chcemy aby funkcja w efekcie swojego
działania ZMIENIAŁA wartości
argumentów
► definicja przykładowa:
function zamiana(&$a,&$b) {
$z=$a;
$a=$b;
$b=$z;
return 0; #funkcja niczego nie liczy
}
► użycie:
$x=1;$y=2;
$temp=zamiana($x,$y);
echo $x,$y;
wypisane zostanie 2 1 a nie 12 co
oznacza że funkcja zmieniła swoje
argumenty\’’’’’’
►
PHP - przekazywanie parametrów
►
PHP udostępnia ciekawy mechanizm obsługujący sytuacje gdy chcemy
w samym programie narzucić funkcji przekazanie parametru przez
odwołanie:
►
function zamiana($a,$b) {
$z=$a; $a=$b; $b=$z;
}
►
użycie:
$x=1;$y=2;
$temp=zamiana(&$x,&$y);
echo $x,$y; #wypisanie 2 1
►
użycie:
$x=1;$y=2;
$temp=zamiana($x,$y);
echo $x,$y; #wypisanie 1 2
PHP- wartości domyślne funkcji
i zasięg zmiennych
►
►
►
►
►
►
Obsługa sytuacji gdy w wywołaniu nie podamy niektórych argumentów
function opis($nazwisko="NIEZNANY"){
return "Ten człowiek ma na nazwisko $nazwisko";}
echo opis("nowak");
da w efekcie : Ten człowiek ma na nazwisko Nowak
echo opis() ;
da w efekcie : Ten człowiek ma na nazwisko NIEZNANY
UWAGA!: zmienne z programu NIE są widoczne w funkcjach
$x=1;
function test1() {
echo $x;}
function test2() {
global $x; echo $x;}
test1();test2();
da w efekcie 1 ( a nie 11 gdyż wywołanie test1() nic NIE WYPISAŁO
PHP- obsługa plików (1)
Korzystanie z plików wymaga następujących czynności :
► otwarcie pliku
$fi=fopen("$nazwa_pliku","$tryb");
►
• 'r' - Otwórz tylko do odczytu; ustawia wskaźnik pliku na początku pliku.
• 'r+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku.
• 'w' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na początku pliku i
obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go
utworzyć.
• 'w+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku
i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go
utworzyć.
• 'a' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli
plik nie istnieje to próbuje go utworzyć.
• 'a+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na końcu pliku.
Jeśli plik nie istnieje to próbuje go utworzyć.
$fi jest tzw. uchwytem pliku
► w nazwie pliku można używać http:// oraz ftp://
► gdy się coś nie powiedzie $fi=FALSE
► przydatna funkcja file_exists("nazwa") typu logicznego
►
►
PHP- obsługa plików (2)
Po prawidłowym otwarciu można z plikiem pracować
 zapisać coś do pliku
fputs($fi,"ten tekst trafi do pliku \n");
 odzcytać z pliku
 $linia=fgetS($fi,100); # 100 znaków
lub $znak=fgetC($fi);
 Przy tych operacjach znacznik pliku przesuwany jest o 1 do
przodu
 plik należy zamknąć fclose($fi);
PHP- funkcje wbudowane
►
►
►
►
►
►
►
►
Matematyczne - sin($x)
obsługi stringów - ereg($wzorzec,$napis) - przeszukuje $napis z
wykorzystaniem
wyrażenia regularnego $wzorzec
obsługi tablic - sort($tablica) - sortuje tablice od min do max
obsługi sieci mail($odbiorca,$temat,$wiadomosc,$d\odatkowe_nagłowki)
graficzne - imagecreate($wysokosc,$szerokosc) - tworzy obrazek typu
GIF
obsługi plików - fopen($plik,$tryb) - otwiera plik i zwraca jego
identyfikator
obsługa dat i czasu - date($format)
obsługi baz danych - mysql_connect($host,$user,$password) - otwiera
połaczenie z baza MySQL
Połączenie PHP-MySQL (1)
►
►
►
►
PHP zawiera wiele funkcji umożliwiających prace z bazą. Wymienię tylko
kilka najczęściej używanych.
INT mysql_connect(‘nazwa hosta’,’nazwa_użyt’,’hasło’);
funcja zwraca identyfikator (numer) połączenia
użycie:
$link = mysql_connect("localhost", ”info", ”info")
or die ("Nie można się połączyć");
połączenie zostaje zamknięte po użyciu funkcji:
mysql_close(link);
Połączenie PHP-MySQL(2)
►
►
►
►
►
Wybranie bazy:
mysql_select_db (”moja_baza")
or die ("Nie mozna wybrać bazy danych");
zapytanie SQL:
$result = mysql_query ("SELECT * FROM adresy",$link)
or die ("Zapytanie zakończone niepowodzeniem");
Nie trzeba podawac $link- wtedy domyślnie ostanio użyte połączenie
$result jest identyfikatorem (int) zbioru wynikow
przykład:
$result = mysql_query ("SELECT * FROM adresy",$link);
echo "w zbiorze jest " . mysql_num_rows($result) . "rekordow" ;
Połączenie PHP-MySQL(3)
►
mysql_fetch_array($result) - pobiera wiersz i zwraca go w postaci tabeli
jeśli w zbiorze wyników nie ma już rekordów zwracane jest FALSE
►
pozwala to używać konstrukcji:
while ($osoba=mysql_fetch_array($result)){
echo $osoba["imie"] . $osoba["nazwisko"] . $osoba["adres"] . "<br>" ;
}
przykład – licznik w pliku tekstowym
►
►
►
►
►
►
►
►
►
►
<?PHP
$filename="/tmp/licznik"; # WSTAW TU SWOJA
NAZWE
$fp=fopen($filename,"r+");
$nr=fgets($fp,10);
$nr++;
fseek($fp,0);
fwrite($fp,$nr,10);
fclose($fp);
echo "<h1> licznik = $nr </h1>";
?>
przykład – licznik i ciasteczko
<? setcookie("licznik","1",time()+100); ?>
ustawia ciastko o nazwie licznik ważne 100 sekund
► <html> <body>
<?
► @$odwiedzony = $_COOKIE['licznik'];
//odczytanie wartości ciasteczka
► $filename=„./licznik”
$plik = fopen($filename,"r");
$licz = fread($plik, 10);
fclose($plik);
►
if ($odwiedzony)
{ echo("Jeste6 tu po raz " . $licz); }
► else
{ $licz++; echo("Jeste6 tu po raz " . $licz); }
► $wczyt = fopen($filename,"w"); fwrite($wczyt,$licz); fclose($wczyt);
► ?>
</body> </html>
►
Download