Projektowanie Aplikacji Internetowych

Slides:



Advertisements
Podobne prezentacje
Indeksy w bazie danych Oracle
Advertisements

Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Skrypty, procedury przechowywane i wyzwalane
SQL – Strukturalny język zapytań
Bazy danych II Instrukcja SELECT Piotr Górczyński 25/08/2001.
Język SQL Część II.
BD-LAB4 Wojciech Pieprzyca
Podejście relacyjne Podejście relacyjne opiera się na wykorzystaniu do przedstawiania danych modelu relacyjnego i zarządzania nimi matematycznego modelu.
Bazy danych 8. SQL podstawy P. F. Góra semestr letni 2004/05.
PHP + MySQL część II.
WPROWADZENIE DO BAZ DANYCH
MS Access 2003 Kwerendy Paweł Górczyński.
(c) 1999, Instytut Informatyki Politechniki Poznańskiej Rozdział 7: Relacje i ograniczenia integralnościowe Język definiowania danych - DDL (Data Definition.
Wykład 10 Prowadzący: dr Paweł Drozda
Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze
Język definicji danych (Data Definition Language)
Język definicji danych (Data Definition Language)
WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE.
Funkcje znakowe, liczbowe i obsługa dat Kolejny krok w poznaniu SQL-a.
Funkcje znakowe, liczbowe i obsługa dat Kolejny krok w poznaniu SQL-a.
SQL-owskie szlaki górskie
Funkcje znakowe ASCII(znak IN VARCHAR2) RETURN INTEGER
ASCII(znak IN VARCHAR2) RETURN INTEGER zwraca wartość numeryczną kod ascii znaku CHAR(n Integer)zwraca znak odpowiadający kodowi n CONCAT(tekst1, tekst2)zwraca.
Wykład 8 Wojciech Pieprzyca
BD-LAB6 Wojciech Pieprzyca
Wykład 5 Wojciech Pieprzyca
WYKONYWANIE ZAPYTAŃ Przygotował Lech Banachowski na podstawie: 1.Raghu Ramakrishnan, Johannes Gehrke, Database Management Systems, McGrawHill, 2000 (książka.
Modele baz danych - spojrzenie na poziom fizyczny
Język SQL – ciąg dalszy DML (Data Manipulation Language)
Język SQL (Structured Query Language) DDL (Data Definition Language)
Bezpieczeństwo baz danych
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
SQL – zapytania posumowanie
SQL – Structured Query Language (3)
MySQL – ODBC - ACCESS.
Bazy danych.
Instrukcje: CREATE, INSERT, UPDATE, DELETE, DROP
SQL – Structured Query Language (1)
Linux - polecenia.
dr hab. Ryszard Walkowiak prof. nadzw.
Użytkownicy i przywileje Sesja - przykład Błędy Komunikacja międzyskryptowa Wykład 83PD Technologie internetowe.
MySQL bazy danych dla witryny
SQL - Structured Query Language
Wybrane zagadnienia relacyjnych baz danych
Komendy SQL do pracy z tabelami i bazami
PL/SQL – dalsza wędrówka
SQL – część II.
Projektowanie bazy danych
1 SBD, L.Banachowski Podstawy SQL - języka relacyjnych i obiektowo-relacyjnych baz danych (SQL2, SQL'1999, Oracle) Powtórzenie wyk ł adu 3.
Michał Krawczykowski kl. IIIB
1 SBD, L.Banachowski Zaawansowane cechy SQL Powtórzenie wyk ł adu 5.
Autor: Damian Urbańczyk
Slajd 1© J.Rumiński Jacek Rumiński  Bazy danych Kontakt: Katedra Inżynierii Biomedycznej, pk. 106, tel.: , fax: ,
1 SBD, L.Banachowski Oprogramowanie strony serwera cz. 1 Powtórzenie wyk ł adu 6.
Komendy SQL do pracy z danymi
Relacja (ang.relation) Po podzieleniu danych na tabele i zdefiniowaniu pól kluczy podstawowych trzeba wprowadzić do systemu bazy danych informacje na temat.
Projektowanie postaci formularza:
Wykład 3 Prowadzący: dr Paweł Drozda. Użytkownik bazy danych – osoba lub aplikacja, mająca dostęp do części danych zgromadzonych w bazie Uprawnienia –
Bazy Danych Wprowadzenie
BAZY DANYCH Microsoft Access Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej Katedra Automatyki i.
Współpraca PHP i MySQL Wygodniejszym i wydajniejszym sposobem przechowywania i korzystania z danych zapisanych na serwerze jest współpraca z relacyjna.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
1 Definicja danych: Do utworzenia tabeli służy instrukcja CREATE TABLE, wymagająca podania nazwy tworzonej tabeli, nazwy każdej kolumny w tej tabeli, typu.
Temat: Tworzenie bazy danych
1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS.
Widoki (views) - Perspektywy:
Strukturalny język zapytań SQL - historia
Technologie Informacyjne Bazy danych
Modele baz danych - spojrzenie na poziom fizyczny
Zapis prezentacji:

Projektowanie Aplikacji Internetowych Artur Niewiarowski Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska

Baza danych

Baza danych Baza danych - zbiór wzajemnie powiązanych danych, przechowywanych w pamięci komputerów i wykorzystywanych przez programy użytkowe instytucji lub organizacji wraz z oprogramowaniem umożliwiającym definiowanie, wykorzystywanie i modyfikowanie tych danych. źródło: Encyklopedia PWN innymi słowy… Baza danych jest to zbiór logicznie powiązanych danych, zarządzany przez system zarządzania bazą danych (SZBD), który działa w interakcji z użytkownikiem i jego programami.

Co umożliwiają bazy danych i systemy zarządzające nimi?

łatwość składowania dużych ilości danych przejrzystość danych dzięki odpowiednim strukturom jakimi są tabele i relacjom pomiędzy nimi szybki dostęp do danych współdzielenie danych przez wielu użytkowników zabezpieczenia przed utratą danych

dostarczają środowiska programistycznego współpraca z wieloma platformami programistycznymi dostarczają licznych specjalistycznych funkcji zaimplementowana polityka bezpieczeństwa

Projektujemy własną bazę danych

Odpowiedzi na następujące pytania: Jak zaprojektować schemat bazy danych? Jak budować poprawnie tabele? Jakie mamy typy relacji pomiędzy tabelami? Jakich typów danych używać? Czym są postacie normalne w bazach danych? Co to jest nadmiarowość danych i jak jej unikać? Co to są anomalie: modyfikacji, usunięć?

Jak zaprojektować schemat bazy danych?

Jak poprawnie budować tabele? Tabele w bazie danych należy budować z zachowaniem pewnych norm, dzięki którym baza będzie spójna, czytelna, a dane nie będą zajmowały zbędnego miejsca na dysku.

Jak projektować schemat bazy danych? Normalizacja baz danych jest procesem mającym na celu zlikwidowanie danych niepotrzebnie powtarzających się w relacyjnej bazie danych. Dzięki normalizacji zmniejsza się ryzyko powstawania: nadmiarowości danych, anomalii modyfikacji oraz anomalii usunięć.

Nadmiarowość danych ma miejsce wtedy, kiedy dana wartość niepotrzebnie jest powielana w krotkach danego atrybutu (kolumny). Kiedy podczas dodawania kolejnego wiersza, użytkownik popełni błąd w wartości powielanej danej, to baza traci spójność.

Anomalia modyfikacji – chęć zmiany powielanej informacji wymusza zmianę tej informacji we wszystkich krotkach. Pominięcie choćby jednej krotki powoduje utratę spójności danych. Uaktualnianie powielanej danej zabiera niepotrzebnie dużo czasu i zajmuje proces. Chcemy uaktualnić nazwę miejscowości „Krynica Zdrój” na „Krynica-Zdrój”

Anomalia usunięć – ma miejsce wtedy, gdy usuniemy wiersz, który przechowywał istotną informację, która w konsekwencji została niepotrzebnie utracona.

Kiedy powielane informacje nie są wynikiem błędnego projektu?

Kiedy powielane informacje nie są wynikiem błędnego projektu?

Prosty przepis na poprawny projekt bazy danych: Wypunktować to co powinna przechowywać baza danych. Pogrupować w tabelę powyższe dane tak, aby jednoznacznie charakteryzowały dany obiekt. Każda tabela powinna zawierać kolumnę jednoznacznie identyfikującą wiersze w pozostałych kolumnach (tzw. klucz główny) – 2 postać normalna Poszczególne kolumny powinny zawierać dane atomowe, np. kolumna adres powinna zostać rozbita na kolumny przechowujące: nazwę ulicy, numer domu, numer mieszkania, miasto, kod pocztowy itd. – 1 postać normalna

Prosty przepis na poprawny projekt bazy danych: Wyeliminować zależności przechodnie, czyli wykluczyć takie kolumny, których wartości nie są bezpośrednio zależne od klucza głównego, ale od innej kolumny – 3 postać normalna Jeżeli jest taka możliwość, to połączyć kolumny w danej tabeli z kolumnami jednoznacznie identyfikującym wiersze w tabeli pokrewnej. przykład →

W praktyce wygląda to następująco: temat przykładowego zadania: zaprojektować bardzo prosty schemat bazy danych przechowujący informacje o klientach supermarketu i ich zakupach

Jakie informacje będzie przechowywała nasza baza danych? Jak je pogrupować? Klienci: imię, nazwisko, miejsce zamieszkania Produkty: nazwa, typ produktu, producent, cena Typy produktów: nazwa Producenci: nazwa, adres firmy Historia zakupów: produkt, klient, data zakupu

3. Każda tabela powinna zawierać klucz główny. Klienci: ID_klient, imie, nazwisko, miejsce_zamieszkania Produkty: ID_produkt, nazwa, typ roduktu, producent, cena Typy produktów: ID_typ_produktu, nazwa Producenci: ID_producent, nazwa, adres_firmy Historia zakupów: ID_historia, produkt, klient, cena, data_zakupu

4. Poszczególne kolumny powinny zawierać dane atomowe. Klienci: ID_klient, imie, nazwisko, zam_miejscowosc, zam_ulica, zam_nr_domu, zam_nr_mieszkania, zam_kod_pocztowy, zam_kraj Produkty: ID_produkt, nazwa, typ produktu, producent, cena Typy produktów: ID_typ_produktu, nazwa Producenci: ID_producent, nazwa, adres_miejscowosc, adres_ulica, adres_nr_domu, adres_nr_mieszkania, adres_kod_pocztowy, adres_kraj Historia zakupów: ID_historia, produkt, klient, cena, data_zakupu

5. Wyeliminować zależności przechodnie w tabelach. Jeżeli w danej tabeli występują kolumny, których wartości nie są bezpośrednio zależne od klucza głównego, ale od innej kolumny, to należy je wykluczyć poprzez utworzenie dodatkowej tabeli przechowującej tą inną kolumnę jako klucz główny i wartości bezpośrednio zależne od niej.

5. Wyeliminować zależności przechodnie w tabelach. Klienci: ID_klient, imie, nazwisko, zam_ID_miejscowosc, zam_ulica, zam_nr_domu, zam_nr_mieszkania, zam_kod_pocztowy Produkty: ID_produkt, nazwa, ID_typ_produktu, ID_producent, cena Typy produktów: ID_typ_produktu, nazwa Producenci: ID_producent, nazwa, adres_ID_miejscowosc, adres_ulica, adres_nr_domu, adres_nr_mieszkania, adres_kod_pocztowy Historia zakupów: ID_historia, ID_produkt, ID_klient, cena, data_zakupu Województwa: … Kraje: … itd. itp.

Baza danych MySQL

Charakterystyka bazy danych MySQL jeden z najpopularniejszych systemów zarządzania relacyjnymi bazami danych posiada wiele mechanizmów zapewniających bezpieczeństwo danych, w tym m.in.: odzyskanie spójności danych po awarii autoryzację dostępu do danych możliwość łączenia się z bazą poprzez sieć komunikacja użytkownika z SZBD poprzez język zapytań SQL (ang. Structured Query Language)

Charakterystyka bazy danych MySQL każda tabela jest obsługiwana przez silnik bazodanowy (ang. engine), który przydziela użytkownik według potrzeb najpopularniejsze silniki to: MyISAM – posiada algorytmy w celu szybkiego wyszukiwania danych w tabeli InnoDB – posiada algorytmy obsługujące transakcje bazodanowe FEDERATED – umożliwia połączenie z konkretną tabelą w konkretnej bazie danych na innym serwerze

Instalacja i konfiguracja systemu bazodanowego MySQL

Windows…

Instalacja i konfiguracja bazy danych MySQL 1.1. Pobranie ze strony internetowej: http://dev.mysql.com/downloads/mysql/ odpowiedniej instalacji bazy danych względem systemu operacyjnego. Przykład:

Instalacja i konfiguracja bazy danych MySQL 1.2. Pobranie ze strony internetowej: http://dev.mysql.com/downloads/mysql/ odpowiedniej instalacji bazy danych względem systemu operacyjnego. Przykład:

Instalacja i konfiguracja bazy danych MySQL 1.3. Pobranie ze strony internetowej: http://dev.mysql.com/downloads/mysql/ odpowiedniej instalacji bazy danych względem systemu operacyjnego. Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Instalacja i konfiguracja bazy danych MySQL Przykład:

Linux - RedHat

Instalacja i konfiguracja bazy danych MySQL [root@sirius ~]# yum install mysql php-mysql

Instalacja i konfiguracja bazy danych MySQL [root@sirius ~]# more /etc/sysconfig/iptables | grep 3306 -A INPUT -s 149.156.0.0/255.255.0.0 -p tcp -m tcp --dport 3306 -j ACCEPT -A INPUT -p tcp -m tcp --dport 3306 -j DROP

Logowanie do systemu bazodanowego MySQL

Logowanie do MySQL Zarządzanie serwisem.

Logowanie do MySQL Zarządzanie serwisem. [root@sirius ~]# ps -A | grep -i mysql 5957 ? 00:27:40 mysqld [root@sirius ~]# service mysqld start Uruchamianie mysqld: [ OK ] [root@sirius ~]# service mysqld stop [root@sirius ~]# service mysqld restart [root@sirius ~]# service mysqld status mysqld (pid 5957) jest uruchomiony...

Logowanie do MySQL Polecenie służące do zalogowania się do bazy danych: mysql –u uzytkownik –p nazwa_bazy_danych –h IP/host omówienie parametrów: -u – nazwa użytkownika -p – wymuszenie poproszenia przez system o wpisanie hasła przez użytkownika -h – adres komputera, na którym działa baza. Jeżeli jest to localhost, to parametr nie jest wymagany

Logowanie do MySQL z poziomu wiersza poleceń Przykład:

Logowanie do MySQL z poziomu programu Navicat

Logowanie do MySQL z poziomu programu Navicat

Tunelowanie - Putty

Tworzenie kopii zapasowej bazy danych [aniewiarowski@torus ~]$ mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump --help

Tworzenie kopii zapasowej bazy danych [aniewiarowski@torus ~]$ mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump --help 0 0 * * * mysqldump -u root --all-databases –password=haslo > "/root/kopie_mysql/dump`date`.sql"

Podstawowe polecenia języka SQL

Czym jest język SQL? Język SQL (ang. Structured Query Language) jest językiem używanym do komunikacji użytkownika z system zarządzania bazą danych Obecnie każdy popularny system bazodanowy posiada zaimplementowany interpreter języka SQL z zachowaniem pewnego standardu Język SQL umożliwia tworzenie skomplikowanych zapytań do bazy danych w celu otrzymania wyniku

Za pomocą języka SQL można: tworzyć: bazy danych, użytkowników, tabele zarządzać prawami dostępu do baz, do poszczególnych poleceń wydawanych przez użytkowników zarządzać danymi w tabelach (umieszczać, usuwać, uaktualniać, wyszukiwać) tworzyć funkcje, wyzwalacze (triggery), itd. i wiele innych…

Tworzenie i zarządzanie bazami danych. Uprawnienia.

Tworzenie nowej bazy danych. create database [if not exists] nazwa; Więcej informacji na stronie internetowej: http://dev.mysql.com/doc/refman/5.6/en/create-database.html Lista wszystkich baz danych: show databases; Usunięcie bazy danych. drop database [if exists] nazwa;

Tworzenie nowego użytkownika. create user login@host; Więcej informacji na stronie internetowej: http://dev.mysql.com/doc/refman/5.6/en/create-user.html Usunięcie użytkownika. drop login@host [, itd];

Uprawnienia użytkowników. Uprawnienia względem wybranej bazy danych: grant [all,select,create,…] on nazwa_bazy.* to login@host; Uprawnienia globalne: grant [all,select,create,…] on *.* to login@host;

Uprawnienia użytkowników. Uprawnienia względem wybranej tabeli w bazie danych: grant [all,select,insert,…] on nazwa_bazy.tabela to login@host; Uprawnienia względem wybranych kolumn danej tabeli w bazie danych: grant [all(kolumna1, kolumna2),select(kolumna1, kolumna2),insert(kolumna),…] on nazwa_bazy.tabela to login@host;

Uprawnienia użytkowników. Odbieranie uprawnień: revoke zdarzenie on baza.* from uzytkownik; revoke zdarzenie on baza.tabela from uzytkownik; revoke zdarzenie (kolumna1, kolumna2,…) on baza.* from uzytkownik@host;

Uprawnienia – operacje na tabelach systemowych +---------------------------+ | Tables_in_mysql | | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | tmp_db | | tmp_user | | user | mysql> use mysql; Database changed mysql> show tables;

Uprawnienia – operacje na tabelach systemowych mysql> desc user; +------------------------+-----------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Password | char(41) | NO | | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Reload_priv | enum('N','Y') | NO | | N | | | Shutdown_priv | enum('N','Y') | NO | | N | |

Uprawnienia – operacje na tabelach systemowych mysql> desc db; +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | |

Uprawnienia – operacje na tabelach systemowych mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

Hasła. Nadawanie i zmiana haseł: set password for uzytkownik@host = password('haslo'); set password = password('haslo');

Pozostałe polecenia SQL

1. Tworzenie tabel – polecenie create table Przykład: CREATE TABLE `Klienci` ( ID_klient int(11) unsigned NOT NULL AUTO_INCREMENT, imie varchar(20) NOT NULL, nazwisko varchar(80) NOT NULL, PESEL varchar(11) DEFAULT 'brak', rok_urodzenia date NOT NULL, PRIMARY KEY (ID_klient), UNIQUE KEY uniq_Klienci (imie,nazwisko,PESEL) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

1. Tworzenie tabel – polecenie create table Przykład: CREATE TABLE `Pliki` ( `ID_pliki` int(10) unsigned NOT NULL AUTO_INCREMENT, `ID_klient` int(10) unsigned DEFAULT NULL, `nazwa` varchar(100) NOT NULL, `plik` blob, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`ID_pliki`), KEY `Klienci_pliki` (`ID_klient`) USING BTREE, CONSTRAINT `Klienci_pliki` FOREIGN KEY (`ID_klient`) REFERENCES `Klienci` (`ID_klient`) ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

1. Tworzenie tabel – polecenie create table Przykład: mysql> create table tmp_uzytkownicy select * from uzytkownicy; Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0 mysql> desc uzytkownicy; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | | ID_uzytkownik | int(10) unsigned | NO | PRI | NULL | auto_increment | | login | varchar(20) | NO | UNI | NULL | | | imie | varchar(20) | NO | | NULL | | | nazwisko | varchar(80) | NO | | NULL | | | haslo | varchar(32) | NO | | NULL | | mysql> desc tmp_uzytkownicy; +---------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | | ID_uzytkownik | int(10) unsigned | NO | | 0 | | | login | varchar(20) | NO | | NULL | | | imie | varchar(20) | NO | | NULL | | | nazwisko | varchar(80) | NO | | NULL | | | haslo | varchar(32) | NO | | NULL | |

Wybrane typy danych w MySQL Ciągowe typy danych: char varchar blob (przechowuje wartości binarne, np. pliki) text (przechowuje duże teksty) enum (umożliwia umieszczenie w kolumnie ciągu z listy podanych)

Wybrane typy danych w MySQL Liczbowe typy danych: bit (przechowuje od 1 do 64 znaków) bool (przechowuje wartości: 0 lub 1) decimal(M,D) (M – wartość całkowita: od 1 do 65 znaków, D – wartość po przecinku: od 0 do 30 znaków) smallint [unsigned] (liczba całkowita od -128 do 127 znaków) int [unsigned] float [unsigned] double [unsigned]

Wybrane typy danych w MySQL Typy danych związane z czasem i datą: datetime (przechowuje datę i czas, rok z przedziału: od 1000 do 9999) date (przechowuje wyłącznie datę) timestamp (przechowuje datę i czas, rok z przedziału: od 1 stycznia 1970 do 19 stycznia 2038) time (przechowuje wyłącznie czas) year (przechowuje wyłącznie rok)

2. Usuwanie tabel – polecenie drop table Składnia polecenia: DROP TABLE [IF EXISTS] nazwa_tabeli; Przykład: DROP TABLE Klienci;

3. Zmiana struktury tabel – polecenie alter table Składnia polecenia zmieniającego kolumnę: ALTER TABLE nazwa_tabeli CHANGE nazwa_kolumny nowa_nazwa_kolumny nowe parametry dla kolumny; Przykład: ALTER TABLE Klienci CHANGE imie imiona varchar(50) not null;

3. Zmiana struktury tabel – polecenie alter table Składnia polecenia dodającego kolumnę: ALTER TABLE nazwa_tabeli ADD nazwa_kolumny parametry dla kolumny; Przykład: ALTER TABLE Klienci ADD drugie_imie varchar(12) default ' brak ';

3. Zmiana struktury tabel – polecenie alter table Składnia polecenia usuwającego kolumnę: ALTER TABLE nazwa_tabeli DROP nazwa_kolumny; Przykład: ALTER TABLE Klienci DROP drugie_imie;

4. Umieszczanie danych w tabeli – polecenie insert into Składnia polecenia: INSERT INTO nazwa_tabeli (kolumna_1, kolumna_2, … ) VALUES ('wartość_1', 'wartość_2'); Przykład: INSERT INTO Klienci (imie, nazwisko, PESEL, data_urodzenia) VALUES ('Jan', 'Kowalski', '89020212345', '1989-02-02');

4. Umieszczanie danych w tabeli – polecenie insert into Przykład: mysql> insert into uzytkownicy select null,concat('tmp', login), imie, nazwisko, haslo from tmp_uzytkownicy; Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0

5. Usuwanie danych z tabeli – polecenie delete from Składnia polecenia: DELETE FROM nazwa_tabeli WHERE warunek; Przykład: DELETE FROM Klienci WHERE Nazwisko = 'Kowalski';

6. Uaktualnianie danych w tabeli – polecenie update Składnia polecenia: UPDATE nazwa_tabeli SET nazwa_kolumny_1 = 'wartość' , nazwa_kolumny_2 = 'wartość' WHERE warunek; Przykład: UPDATE Klienci SET imie = ‘Michał’ WHERE Nazwisko = 'Kowalski' and Imie = 'Jan';

7. Odczytywanie danych z tabeli – polecenie select Składnia polecenia: SELECT nazwa_kolumny_1, nazwa_kolumny_2, ... FROM nazwa_tabeli WHERE warunek Przykład: SELECT imie, nazwisko, PESEL FROM Klienci WHERE Nazwisko = 'Kowalski' and Imie = 'Jan';

7. Odczytywanie danych z tabeli – polecenie select Składnia polecenia: SELECT * FROM nazwa_tabeli WHERE warunek Przykład: SELECT * FROM Klienci WHERE Nazwisko = 'Kowalski' and Imie = 'Jan';

7. Pozostałe polecenia SQL w SZBD MySQL show tables – wyświetla listę zawierającą nazwy wszystkich tabel w aktualnej bazie danych describe nazwa_tabeli – opisuje szczegółowo wybraną tabelę use nazwa_bazy – przełącza się do innej bazy danych show create table nazwa_tabeli – wyświetla kod SQL tworzący daną tabelę exit – wylogowanie z bazy danych

Operatory i funkcje matematyczne

Operatory matematyczne + (dodawanie) - (odejmowanie) * (mnożenie) / (dzielenie) % (dzielenie modulo)

Operatory i funkcje matematyczne

Funkcje matematyczne abs() (oblicza wartość absolutną) sin(), cos(), tan(), cot() (funkcje sinus, cosinus, itd.) pow() (funkcja potęgowa) sqrt() (obliczanie pierwiastka) pi() (zwraca wartość liczby pi, 3.14159265) rand() (zwraca wartość losową)

Funkcje matematyczne log(), ln(), log2(), log10() (obliczanie logarytmów) degrees() (funkcja konwertująca radiany na stopnie) radians() (funkcje konwertująca stopnie na radiany) mod() (funkcja modulo) round() (zaokrąglanie wartości liczbowych) crc32() (cykliczny kod nadmiarowy)

Operatory i funkcje matematyczne

Operatory i funkcje matematyczne

Operatory i wybrane funkcje komparacji

Operatory i wybrane funkcje komparacji between wartość1 and wartość2 (wartość pomiędzy) wartość1 = wartość2 (porównanie dwóch wartości) >, <, >=, <= (znaki: większości, mniejszości, …) <>, != (znaki różności) is, is not (wyrażenie: jeżeli, jeżeli nie) wartość1 like ‘%wartoś_2%’ (podobny) in() (zawiera się w …)

Operatory i funkcje matematyczne

Operatory i funkcje matematyczne

Funkcje agregujące

Funkcje agregujące avg() (funkcja obliczająca średnią) Funkcje operują na wierszach w kolumnie: avg() (funkcja obliczająca średnią) count() (funkcja zliczająca liczbę wierszy) min() (funkcja zwracająca wartość minimalną) max() (funkcja zwracająca wartość maksymalną) sum() (funkcja sumująca wartości)

Funkcje agregujące

Funkcje agregujące

Funkcje agregujące Zadanie. Uaktualnić wiersze kolumny liczba w tabeli tab, mnożąc je przez 10. Pominąć wartości: minimalną i maksymalną. create table tab (liczba double); insert into tab values (1),(2),(3),(4),(5);

Operatory i funkcje matematyczne Zadanie. Uaktualnić wiersze kolumny liczba w tabeli tab, mnożąc je przez 10. Pominąć wartości: minimalną i maksymalną. create table tab (liczba double); insert into tab values (1),(2),(3),(4),(5); begin; select @mini:=(select min(liczba) from tab), @maks:=(select max(liczba) from tab); update tab set liczba = liczba*10 where liczba <> @mini and liczba <> @maks; commit; update tab set liczba = liczba*10 where liczba <> (select min(liczba) from (select liczba from tab) c) and liczba <> (select max(liczba) from (select liczba from tab) c);

Wybrane funkcje operujące na ciągach

Wybrane funkcje operujące na ciągach concat() (łączy znaki w ciąg) hex() (oblicza wartość heksalną na podstawie zadanego parametru) instr() (szuka jednego ciągu w drugim) lcase(), lower() (zamieniają duże litery na małe) left() (wycina znaki od lewej strony ciągu) length() (zwraca długość podanego ciągu) ltrim() (usuwa spacje po lewej stronie zadanego ciągu) mid(), substring() (wycina środek ciągu) position(), locate() (zwraca pozycję ciągu w zadanym ciągu)

Wybrane funkcje operujące na ciągach repeat() (powtarza n razy podany ciąg) replace() (zamienia ciąg na inny w zadanym ciągu) reverse() (zamienia kolejnośc liter w ciągu) right() (wycina znaki od prawej strony ciągu) rtrim() (usuwa spacje po prawej stronie zadanego ciągu) soundex(), ... sounds like ... (zwraca w postaci ciągu brzmienie w języku angielskim podanego wyrazu) space() (tworzy spacje) trim() (usuwa po obu stronach ciągu spacje) ucase(), upper() (zamienia małe na duże litery w zadanym ciągu)

Wybrane funkcje operujące na ciągach

Wybrane funkcje operujące na ciągach

Wybrane funkcje operujące na ciągach

Wybrane funkcje operujące na ciągach

Wybrane funkcje daty i czasu

Wybrane funkcje daty i czasu adddate() (zwraca datę utworzoną poprzez dodanie lub odjęcie dni) addtime() (zwraca czas utworzony poprzez dodanie lub odjęcie czasu) curdate() (zwraca aktualną datę) curtime() (zwraca aktualny czas) date() (zwraca datę z podanego ciągu) datediff() (oblicza różnicę dat i zwraca ją w dniach) now() (zwraca aktualną datę i czas) day(), month(), year() (na podstawie ciągu zwracają odpowiednio: dzień, miesiąc, rok) dayname() (zwraca nazwę dnia w j. angielskim na podstawie daty)

Wybrane funkcje daty i czasu dayofmonth(), dayofweek(), dayofyear() (na podstawie daty zwracają odpowiednio: numer dnia w miesiącu, dnia w tygodniu i dnia w roku) hour(), minute(), second() (na podstawie daty zwracają odpowiednio godzinę, minuty, sekundy) monthname() (nazwa miesiąca podanej daty) sysdate() (zwraca aktualną datę i czas w momencie wywołania funkcji) sec_to_time() (zamienia sekundy na czas) time() (zwraca czas z podanej daty i czasu) timediff() (oblicza różnicę czasów) time_to_sec() (zamienia czas na sekundy)

Wybrane funkcje daty i czasu

Wybrane funkcje daty i czasu

Relacje pomiędzy tabelami

Relacje pomiędzy tabelami Relacjami pomiędzy tabelami nazywamy logiczne połączenia danych rozmieszonych w tych tabelach ostatecznie tworzące pewien rodzaj całości. Mamy następujące typy relacji: jeden-do-jednego – relacja rzadko spotykana, tabela pierwsza może mieć tylko jeden rekord dopasowany z drugiej tabeli, i również druga tabela może mieć tylko jeden rekord dopasowany z tabeli pierwszej. jeden-do-wielu – powszechny typ relacji. Rekord z tabeli pierwszej może mieć wiele dopasowań rekordów z tabeli drugiej, natomiast rekord z tabeli drugiej może mieć tylko jedno dopasowanie rekordu z tabeli pierwszej. wiele-do-wielu – wiele rekordów z tabeli pierwszej może być dopasowanych do wielu rekordów z tabeli drugiej, i na odwrót. W rzeczywistości tworzona jest trzecia tabela, która odpowiednio tworzy most pomiędzy tabelami (tzw. tabela łącza). Tabela łącza posiada dwa klucze obce – z tabeli pierwszej i z tabeli drugiej.

Referencje pomiędzy kluczami

Referencje pomiędzy kluczami Schemat tworzenia klucza obcego: * [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]   reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION create table table_name (ID int, …,…, ID_fk int, *); alter table table_name add *; alter table table_name drop foreign key constr_name_fk;

Referencje pomiędzy kluczami Tworzenie klucza obcego z referencjami - SQL Przykład:

Referencje pomiędzy kluczami Tworzenie klucza obcego z referencjami w programie Navicat

Podzapytania

Podzapytania Przykład: Mamy następujące tabele: select * from Klienci;   Mamy następujące tabele: select * from Klienci; +-----------+-----------+------------+-------------+ | ID_klient | imie | nazwisko | PESEL | | 1 | Jan | Kowalski | 89562314710 | | 2 | Anna | Nowakowska | 87985658745 | | 3 | Katarzyna | Nowicka | 85214589652 | | 4 | Andrzej | Bachleda | 82145658745 | select * from Koszyk; +-----------+-----------+-------------------+ | ID_koszyk | ID_klient | nazwa_produktu | | 1 | 1 | chleb | | 2 | 3 | maslo | | 3 | 1 | szynka | | 4 | 3 | chleb | | 5 | 4 | jablko | | 6 | 4 | jogurt | | 7 | 2 | proszek do prania | | 8 | 2 | plyn do naczyn |

Podzapytania Podzapytania – zapytania zagnieżdżone w innych zapytaniach. Przykłady: select * from Klienci where ID_klient = (select max(ID_klient) from Klienci); select imie, nazwisko, PESEL, (select count(*) from Koszyk where Koszyk.ID_klient = Klienci.ID_klient) as liczba_zakupionych_towarow from Klienci; select imie, nazwisko, PESEL from (select * from Klienci) as tabelka; select P numer_pesel from (select nazwisko, PESEL P from (select * from Klienci) T) T2;

Podzapytania Operator ANY(). Warunek w zapytaniu będzie spełniony, jeżeli porównywana wartość będzie spełniała warunek z przynajmniej jedną wartością zwróconą w podzapytaniu umieszczonych w operatorze. W podzapytaniu może zostać zwrócona wyłącznie jedna kolumna. Przykłady: select * from Studenci where indeks = any (select indeks from Absolwenci); select * from Klienci where ID_klient = any (select ID_klient from Koszyk); select PESEL = any (select PESEL from Absolwenci), PESEL from Studenci; select * from Klienci where not ID_klient = any (select ID_klient from Koszyk); select * from Klienci where ID_klient <> any (select ID_klient from Koszyk);

Podzapytania Operator ALL(). Warunek w zapytaniu będzie spełniony, jeżeli porównywana wartość będzie spełniała warunek ze wszystkimi zwróconymi w pozapytaniu umieszczonym w operatorze. W podzapytaniu może zostać zwrócona wyłącznie jedna kolumna. Przykłady: select * from Klienci where ID_klient <> all (select ID_klient from Koszyk);

Podzapytania Operator/funkcja EXISTS(). Jeżeli podzapytanie umieszczone w funkcji zwraca przynajmniej jeden wiersz, to funkcja zwraca wartość true, w przeciwnym przypadku false. Przykłady: select * from Klienci where exists (select * from Koszyk); select exists(select * from Koszyk where Koszyk.ID_klient = Klienci.ID_klient) as zakup, imie, nazwisko, PESEL from Klienci;

Podzapytania Operator IN(). Umożliwia sprawdzenie zawierania się wartości w wartościach wierszy danej kolumny, zwróconych przez podzapytanie. W podzapytaniu może zostać zwrócona wyłącznie jedna kolumna. Przykłady: select * from Klienci where ID_klient in (select ID_klient from Koszyk where year(data_zakupu) = ' 2011 '); select imie, nazwisko, PESEL from Studenci where not PESEL in (select PESEL from Absolwenci);

Unie - Union

Unie - Union Unia – służą do łączenia wyników wielu zapytań w jeden wynik. Podczas łączenia zapytań należy zachować jednakową liczbę kolumn w poszczególnych wynikach. Schemat: SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]

Unie - Union Przykład: select imie from Klienci union select nazwisko from Klienci union select nazwa_produktu from Koszyk;

Unie - Union Przykład: select imie from Klienci union +-------------------+ | imie | | Jan | | Anna | | Karolina | | Andrzej | | Kowalski | | Nowakowska | | Nowicka | | Bachleda | | chleb | | maslo | | szynka | | jablko | | jogurt | | proszek do prania | | plyn do naczyn | select imie from Klienci union select nazwisko from Klienci union select nazwa_produktu from Koszyk;

Unie - Union Przykład: select ID_klient from Klienci union +-----------+ | ID_klient | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | select ID_klient from Klienci union select ID_koszyk from Koszyk union select ID_klient from Koszyk;

Unie - Union Przykład: select ID_klient, nazwisko from Klienci union select ID_koszyk, nazwa_produktu from Koszyk union select ID_klient, imie from Klienci; +-----------+-------------------+ | ID_klient | nazwisko | | 1 | Kowalski | | 2 | Nowakowska | | 3 | Nowicka | | 4 | Bachleda | | 1 | chleb | | 2 | maslo | | 3 | szynka | | 4 | chleb | | 5 | jablko | | 6 | jogurt | | 7 | proszek do prania | | 8 | plyn do naczyn | | 1 | Jan | | 2 | Anna | | 3 | Karolina | | 4 | Andrzej |

Unie - Union Przykład: select * from (select ID_klient, nazwisko from Klienci union select ID_koszyk, nazwa_produktu from Koszyk union select ID_klient, imie from Klienci) c where ID_klient = 1; +-----------+----------+ | ID_klient | nazwisko | | 1 | Kowalski | | 1 | chleb | | 1 | Jan |

Przykład – dane z różnych baz i serwerów: Unie - Union Przykład – dane z różnych baz i serwerów: CREATE TABLE `uzytkownicy` ( `ID_uzytkownicy` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(60) NOT NULL, PRIMARY KEY (`ID_uzytkownicy`) ) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://login:haslo@149.156.136.154/BAZA/tabl_uzytkownicy' CREATE TABLE `users` ( `ID_users` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(60) NOT NULL, PRIMARY KEY (`ID_users`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 select login from uzytkownicy union all select login from users;

Złączenia - Join

Złączenia - Join Złączanie tabel daje możliwość zwracania w jednym wyniku zapytania, rekordów pochodzących z różnych tabel. Wyróżniamy następujące typy złączeń:   INNER JOIN – najczęściej używane, łączy kolumny pod odpowiednim warunkiem zgodności par wierszy. EQUI-JOIN – nie używa operatorów: mniejszości (<), większości (>) i różności (<>). NATURAL JOIN – podobne do EQUI-JOIN, używa do złączenia domyślnie tych samych nazw kolumn z dwóch różnych tabeli, wyświetla w wyniku odpowiednio jedną kolumnę z pary. CROSS JOIN – zwraca produkt kartezjański, czyli kombinację każdego wiersza z pierwszej tabeli z każdym wierszem z drugiej tabeli. 

Złączenia - Join OUTER JOIN – ten typ złączenia nie wymaga, aby tabela pierwsza miała odpowiedniki w postaci wierszy w drugiej tabeli (i na odwrót), by wiersze zostały wyświetlone.   LEFT OUTER JOIN – złączenie lewostronne. Zawsze wyświetla wszystkie wiersze z lewej tabeli i odpowiednio (według warunku) złącza wiersze z prawej tabeli. Jeżeli nie ma odpowiadających wierszy w prawej tabeli, wiersze żądanych kolumn prawej tabeli wypełniane są wartościami NULL. RIGHT OUTER JOIN – złączenie prawostronne. Zawsze wyświetla wszystkie wiersze z prawej tabeli i odpowiednio (według warunku) złącza wiersze z lewej tabeli. Jeżeli nie ma odpowiadających wierszy w lewej tabeli, wiersze żądanych kolumn lewej tabeli wypełniane są wartościami NULL. FULL OUTER JOIN – złączenie obustronne. Wyświetlone zostaną wszystkie wiersze z lewej jak i z prawej tabeli i odpowiednio (według analogii do dwóch poprzednich przykładów) nieistniejące wiersze wypełniane są wartościami NULL. SELF-JOIN – łączy wiersze kolumn tej samej tabeli.

Złączenia - Join Uproszczony schemat złączenia tabel:    table_references: table_reference [, table_reference] ... table_reference: join_table join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition] | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor join_condition: ON conditional_expr | USING (column_list)

Złączenia - Join Przykład: Mamy następujące tabele:   Mamy następujące tabele: select * from Klienci; +-----------+-----------+------------+-------------+ | ID_klient | imie | nazwisko | PESEL | | 1 | Jan | Kowalski | 89562314710 | | 2 | Anna | Nowakowska | 87985658745 | | 3 | Katarzyna | Nowicka | 85214589652 | | 4 | Andrzej | Bachleda | 82145658745 | select * from Koszyk; +-----------+-----------+-------------------+ | ID_koszyk | ID_klient | nazwa_produktu | | 1 | 1 | chleb | | 2 | 3 | maslo | | 3 | 1 | szynka | | 4 | 3 | chleb | | 5 | 4 | jablko | | 6 | 4 | jogurt | | 7 | 2 | proszek do prania | | 8 | 2 | plyn do naczyn |

Złączenia - Join Przykład: - inner join:   - inner join: select * from Koszyk inner join Klienci on Klienci.ID_klient = Koszyk.ID_klient; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 1 | chleb | 1 | Jan | Kowalski | 89562314710 | | 3 | 1 | szynka | 1 | Jan | Kowalski | 89562314710 | | 7 | 2 | proszek do prania | 2 | Anna | Nowakowska | 87985658745 | | 8 | 2 | plyn do naczyn | 2 | Anna | Nowakowska | 87985658745 | | 2 | 3 | maslo | 3 | Katarzyna | Nowicka | 85214589652 | | 4 | 3 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 5 | 4 | jablko | 4 | Andrzej | Bachleda | 82145658745 | | 6 | 4 | jogurt | 4 | Andrzej | Bachleda | 82145658745 |

Złączenia - Join Przykład: - inner join:   - inner join: select * from Koszyk, Klienci where Koszyk.ID_klient = Klienci.ID_klient; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 1 | chleb | 1 | Jan | Kowalski | 89562314710 | | 3 | 1 | szynka | 1 | Jan | Kowalski | 89562314710 | | 7 | 2 | proszek do prania | 2 | Anna | Nowakowska | 87985658745 | | 8 | 2 | plyn do naczyn | 2 | Anna | Nowakowska | 87985658745 | | 2 | 3 | maslo | 3 | Katarzyna | Nowicka | 85214589652 | | 4 | 3 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 5 | 4 | jablko | 4 | Andrzej | Bachleda | 82145658745 | | 6 | 4 | jogurt | 4 | Andrzej | Bachleda | 82145658745 |

Złączenia - Join Przykład: - inner join:   - inner join: select * from Koszyk, Klienci where Koszyk.ID_klient <> Klienci.ID_klient; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 1 | chleb | 2 | Anna | Nowakowska | 87985658745 | | 1 | 1 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 1 | 1 | chleb | 4 | Andrzej | Bachleda | 82145658745 | | 2 | 3 | maslo | 1 | Jan | Kowalski | 89562314710 | | 2 | 3 | maslo | 2 | Anna | Nowakowska | 87985658745 | | 2 | 3 | maslo | 4 | Andrzej | Bachleda | 82145658745 | | 3 | 1 | szynka | 2 | Anna | Nowakowska | 87985658745 | | 3 | 1 | szynka | 3 | Katarzyna | Nowicka | 85214589652 | | 3 | 1 | szynka | 4 | Andrzej | Bachleda | 82145658745 | | 4 | 3 | chleb | 1 | Jan | Kowalski | 89562314710 | | 4 | 3 | chleb | 2 | Anna | Nowakowska | 87985658745 | | 4 | 3 | chleb | 4 | Andrzej | Bachleda | 82145658745 | | 5 | 4 | jablko | 1 | Jan | Kowalski | 89562314710 | | 5 | 4 | jablko | 2 | Anna | Nowakowska | 87985658745 | | 5 | 4 | jablko | 3 | Katarzyna | Nowicka | 85214589652 | | 6 | 4 | jogurt | 1 | Jan | Kowalski | 89562314710 | | 6 | 4 | jogurt | 2 | Anna | Nowakowska | 87985658745 | | 6 | 4 | jogurt | 3 | Katarzyna | Nowicka | 85214589652 | | 7 | 2 | proszek do prania | 1 | Jan | Kowalski | 89562314710 | | 7 | 2 | proszek do prania | 3 | Katarzyna | Nowicka | 85214589652 | | 7 | 2 | proszek do prania | 4 | Andrzej | Bachleda | 82145658745 | | 8 | 2 | plyn do naczyn | 1 | Jan | Kowalski | 89562314710 | | 8 | 2 | plyn do naczyn | 3 | Katarzyna | Nowicka | 85214589652 | | 8 | 2 | plyn do naczyn | 4 | Andrzej | Bachleda | 82145658745 |

Złączenia - Join Przykład: - equi-join:   - equi-join: select * from Koszyk inner join Klienci using(ID_klient); +-----------+-----------+-------------------+-----------+------------+-------------+ | ID_klient | ID_koszyk | nazwa_produktu | imie | nazwisko | PESEL | | 1 | 1 | chleb | Jan | Kowalski | 89562314710 | | 1 | 3 | szynka | Jan | Kowalski | 89562314710 | | 2 | 7 | proszek do prania | Anna | Nowakowska | 87985658745 | | 2 | 8 | plyn do naczyn | Anna | Nowakowska | 87985658745 | | 3 | 2 | maslo | Katarzyna | Nowicka | 85214589652 | | 3 | 4 | chleb | Katarzyna | Nowicka | 85214589652 | | 4 | 5 | jablko | Andrzej | Bachleda | 82145658745 | | 4 | 6 | jogurt | Andrzej | Bachleda | 82145658745 |

Złączenia - Join Przykład: - natural join:   - natural join: select * from Koszyk natural join Klienci; +-----------+-----------+-------------------+-----------+------------+-------------+ | ID_klient | ID_koszyk | nazwa_produktu | imie | nazwisko | PESEL | | 1 | 1 | chleb | Jan | Kowalski | 89562314710 | | 1 | 3 | szynka | Jan | Kowalski | 89562314710 | | 2 | 7 | proszek do prania | Anna | Nowakowska | 87985658745 | | 2 | 8 | plyn do naczyn | Anna | Nowakowska | 87985658745 | | 3 | 2 | maslo | Katarzyna | Nowicka | 85214589652 | | 3 | 4 | chleb | Katarzyna | Nowicka | 85214589652 | | 4 | 5 | jablko | Andrzej | Bachleda | 82145658745 | | 4 | 6 | jogurt | Andrzej | Bachleda | 82145658745 |

Złączenia - Join Przykład: - cross join:   - cross join: select * from Koszyk cross join Klienci; select * from Koszyk, Klienci; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 1 | chleb | 1 | Jan | Kowalski | 89562314710 | | 1 | 1 | chleb | 2 | Anna | Nowakowska | 87985658745 | | 1 | 1 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 1 | 1 | chleb | 4 | Andrzej | Bachleda | 82145658745 | | 2 | 3 | maslo | 1 | Jan | Kowalski | 89562314710 | | 2 | 3 | maslo | 2 | Anna | Nowakowska | 87985658745 | | 2 | 3 | maslo | 3 | Katarzyna | Nowicka | 85214589652 | | 2 | 3 | maslo | 4 | Andrzej | Bachleda | 82145658745 | | 3 | 1 | szynka | 1 | Jan | Kowalski | 89562314710 | | 3 | 1 | szynka | 2 | Anna | Nowakowska | 87985658745 | | 3 | 1 | szynka | 3 | Katarzyna | Nowicka | 85214589652 | | 3 | 1 | szynka | 4 | Andrzej | Bachleda | 82145658745 | | 4 | 3 | chleb | 1 | Jan | Kowalski | 89562314710 | | 4 | 3 | chleb | 2 | Anna | Nowakowska | 87985658745 | | 4 | 3 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 4 | 3 | chleb | 4 | Andrzej | Bachleda | 82145658745 | | 5 | 4 | jablko | 1 | Jan | Kowalski | 89562314710 | | 5 | 4 | jablko | 2 | Anna | Nowakowska | 87985658745 | | 5 | 4 | jablko | 3 | Katarzyna | Nowicka | 85214589652 | | 5 | 4 | jablko | 4 | Andrzej | Bachleda | 82145658745 | | 6 | 4 | jogurt | 1 | Jan | Kowalski | 89562314710 | | 6 | 4 | jogurt | 2 | Anna | Nowakowska | 87985658745 | | 6 | 4 | jogurt | 3 | Katarzyna | Nowicka | 85214589652 | | 6 | 4 | jogurt | 4 | Andrzej | Bachleda | 82145658745 | | 7 | 2 | proszek do prania | 1 | Jan | Kowalski | 89562314710 | | 7 | 2 | proszek do prania | 2 | Anna | Nowakowska | 87985658745 | | 7 | 2 | proszek do prania | 3 | Katarzyna | Nowicka | 85214589652 | | 7 | 2 | proszek do prania | 4 | Andrzej | Bachleda | 82145658745 | | 8 | 2 | plyn do naczyn | 1 | Jan | Kowalski | 89562314710 | | 8 | 2 | plyn do naczyn | 2 | Anna | Nowakowska | 87985658745 | | 8 | 2 | plyn do naczyn | 3 | Katarzyna | Nowicka | 85214589652 | | 8 | 2 | plyn do naczyn | 4 | Andrzej | Bachleda | 82145658745 |

Złączenia - Join Przykład: - left outer join:   - left outer join: select * from Koszyk left outer join Klienci on Klienci.ID_klient=Koszyk.ID_klient; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 1 | chleb | 1 | Jan | Kowalski | 89562314710 | | 2 | 3 | maslo | 3 | Katarzyna | Nowicka | 85214589652 | | 3 | 1 | szynka | 1 | Jan | Kowalski | 89562314710 | | 4 | 3 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 5 | 4 | jablko | 4 | Andrzej | Bachleda | 82145658745 | | 6 | 4 | jogurt | 4 | Andrzej | Bachleda | 82145658745 | | 7 | 2 | proszek do prania | 2 | Anna | Nowakowska | 87985658745 | | 8 | 2 | plyn do naczyn | 2 | Anna | Nowakowska | 87985658745 |

Złączenia - Join Przykład: - left outer join:   - left outer join: select * from Koszyk left outer join Klienci on Klienci.ID_klient=Koszyk.ID_klient; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 1 | chleb | 1 | Jan | Kowalski | 89562314710 | | 2 | 3 | maslo | 3 | Katarzyna | Nowicka | 85214589652 | | 3 | 1 | szynka | 1 | Jan | Kowalski | 89562314710 | | 4 | 3 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 5 | 4 | jablko | 4 | Andrzej | Bachleda | 82145658745 | | 6 | 4 | jogurt | 4 | Andrzej | Bachleda | 82145658745 | | 7 | 2 | proszek do prania | 2 | Anna | Nowakowska | 87985658745 | | 8 | 2 | plyn do naczyn | 2 | Anna | Nowakowska | 87985658745 | Po wykonaniu polecenia: update Koszyk set ID_klient = 5 where ID_klient = 1; | 1 | 5 | chleb | NULL | NULL | NULL | NULL | | 3 | 5 | szynka | NULL | NULL | NULL | NULL |

Złączenia - Join Przykład:   Składnia full outer join nie jest obsługiwana przez MySQL, natomiast można zastąpić ją następującym podejściem: select * from Koszyk left outer join Klienci on Klienci.ID_klient=Koszyk.ID_klient union select * from Koszyk right outer join Klienci on Klienci.ID_klient = Koszyk.ID_klient; +-----------+-----------+-------------------+-----------+-----------+------------+-------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_klient | imie | nazwisko | PESEL | | 1 | 5 | chleb | NULL | NULL | NULL | NULL | | 2 | 3 | maslo | 3 | Katarzyna | Nowicka | 85214589652 | | 3 | 5 | szynka | NULL | NULL | NULL | NULL | | 4 | 3 | chleb | 3 | Katarzyna | Nowicka | 85214589652 | | 5 | 4 | jablko | 4 | Andrzej | Bachleda | 82145658745 | | 6 | 4 | jogurt | 4 | Andrzej | Bachleda | 82145658745 | | 7 | 2 | proszek do prania | 2 | Anna | Nowakowska | 87985658745 | | 8 | 2 | plyn do naczyn | 2 | Anna | Nowakowska | 87985658745 | | NULL | NULL | NULL | 1 | Jan | Kowalski | 89562314710 |

Złączenia - Join Przykład: - self-join:   - self-join: select * from Koszyk K1, Koszyk K2 where K1.ID_klient = K2.ID_klient; +-----------+-----------+-------------------+-----------+-----------+-------------------+ | ID_koszyk | ID_klient | nazwa_produktu | ID_koszyk | ID_klient | nazwa_produktu | | 1 | 5 | chleb | 1 | 5 | chleb | | 3 | 5 | szynka | 1 | 5 | chleb | | 2 | 3 | maslo | 2 | 3 | maslo | | 4 | 3 | chleb | 2 | 3 | maslo | | 1 | 5 | chleb | 3 | 5 | szynka | | 3 | 5 | szynka | 3 | 5 | szynka | | 2 | 3 | maslo | 4 | 3 | chleb | | 4 | 3 | chleb | 4 | 3 | chleb | | 5 | 4 | jablko | 5 | 4 | jablko | | 6 | 4 | jogurt | 5 | 4 | jablko | | 5 | 4 | jablko | 6 | 4 | jogurt | | 6 | 4 | jogurt | 6 | 4 | jogurt | | 7 | 2 | proszek do prania | 7 | 2 | proszek do prania | | 8 | 2 | plyn do naczyn | 7 | 2 | proszek do prania | | 7 | 2 | proszek do prania | 8 | 2 | plyn do naczyn | | 8 | 2 | plyn do naczyn | 8 | 2 | plyn do naczyn |

Widoki

Widoki Widok – jest to wirtualna tabela stworzona na podstawie zapytań, najczęściej zawierających złączenia wielu tabel. Widok nie przechowuje danych, natomiast pokazuje dane z tabel wchodzących w jego budowę. Przy założeniu jednoznaczności odwołań do danych, dane, które reprezentuje widok można edytować i usuwać odwołując się bezpośrednio do widoku, tak jak do tabeli.

Widoki Uproszczony schemat tworzenia widoku: CREATE [OR REPLACE] VIEW view_name [(column_list)] AS select_statement Przykład: create or replace view Historia_odwiedzin as select imie, nazwisko, login, dataiczas, IP from Uzytkownicy left join Historia_logowania using(ID_uzytkownika);

Widoki Uproszczony schemat usuwania widoku: DROP VIEW [IF EXISTS] view_name Przykład: drop view if exists Historia_odwiedzin;

Widoki Uproszczony schemat zmiany struktury widoku: ALTER VIEW view_name [(column_list)] AS select_statement Ostateczny efekt jest taki sam jak polecenia create or replace view.

Widoki Informacje o widoku: Szczegóły widoków znajdują się w tabeli: information_schema.views Wyświetlenie ciała widoku: show create table nazwa_widoku

Procedury

Procedury Procedura – jest to zestaw sekwencji poleceń do wykonania. Procedura może zwracać wartości wyprowadzone poprzez zmienne. W procedurze mogą zostać zawarte polecenia SQL (w przeciwieństwie do funkcji). Wyświetlanie listy procedur: show procedure status [like '%nazwa%'] Wyświetlanie ciała procedury: show create procedure [nazwa] Tabela opisująca procedury i funkcje: information_schema.routines

Procedury Uproszczony schemat tworzenia procedury: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type type: Any valid MySQL data type routine_body: Valid SQL routine statement

Procedury Przykład: delimiter | drop procedure if exists procedura | create procedure procedura (out p1 int, out p2 int, in vnazwisko varchar(40)) begin set p1=1; select 'Wynik dzialania procedury.' as info; select * from Klienci where lower(nazwisko) = lower(vnazwisko); select count(*) into p2 from Klienci where nazwisko like concat('%', vnazwisko, '%'); select p2; end | delimiter ;

Procedury Przykład cd: call procedura(@a, @b, 'Kowal'); - wywołanie procedury select @a, @b; - wyświetlenie zmiennych zwróconych przez procedurę

Procedury Przykład 2 - rekurencja: Efekt: delimiter | create procedure liczby (in liczba int) begin set liczba = liczba -1; select liczba; if liczba > 0 then call liczby(liczba); end if; end | delimiter ; Efekt: mysql> call liczby(4); +--------+ | liczba | | 3 | 1 row in set | 2 | | 1 | | 0 | Query OK, 0 rows affected

Procedury – program Navicat

Procedury – program Navicat

Procedury – program Navicat

Procedury – program Navicat mysqli_query($link, "call dodaj_uzytkownika('jan','tajne_haslo');");

Funkcje

Funkcje Funkcja – podobnie jak procedura, jest to zestaw sekwencji poleceń do wykonania. W odróżnieniu od procedury, funkcja zwraca wartość nie poprzez zmienną będącą składową parametrów, ale standardowo – jak w innych językach programowania. Funkcja nie posiada możliwości wykonywania zapytań SQL. Wyświetlenie listy funkcji: show function status [like '%nazwa%'] Wyświetlenie ciała funkcji: show create function [nazwa] Tabela opisująca procedury i funkcje: information_schema.routines

Funkcje Uproszczony schemat tworzenia funkcji: CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type routine_body func_parameter: param_name type type: Any valid MySQL data type routine_body: Valid SQL routine statement

Funkcje Przykład: Wywołanie funkcji: delimiter | drop function if exists nazwiska_klientow | create function nazwiska_klientow (vnazwisko varchar(40)) returns int begin declare zm int; select count(*) into zm from Klienci where lower(nazwisko)=lower(vnazwisko); return zm; end | delimiter ; Wywołanie funkcji: select nazwiska_klientow('Kowalski');

Funkcje – program Navicat

Funkcje – program Navicat

Elementy języka programowania

Elementy języka programowania Loop While Do If Iterate Leave Case

Triggery - wyzwalacze

Triggery - wyzwalacze Trigger – służy do automatycznego wykonania poleceń proceduralnych, po zajściu danego zdarzenia na tabeli w bazie danych. Uproszczony schemat tworzenia triggera: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body trigger_time: before, after trigger_event: insert, update, delete

Triggery - wyzwalacze Przykład: delimiter | create trigger t_Klienci_insert before insert on Klienci for each row begin if lower(NEW.imie) = NEW.imie then set NEW.imie = Upper(NEW.imie); end if; end | delimiter ;

Triggery - wyzwalacze Schemat usuwania triggera: DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name Przykład: drop trigger if exists t_Klienci_insert;

Triggery - wyzwalacze SIGNAL SQLSTATE '45000'              SET MESSAGE_TEXT = 'Nie mogę dodać wartości';

Transakcje

Transakcje Transakcja – jest to zbiór operacji, który ma za zadanie wykonać się w całości lub wcale. Transakcję charakteryzują zasady ACID: Atomicity – Atomowość Consistency – Spójność Isolation – Izolacja Durability – Trwałość

Transakcje Transakcja składa się z trzech etapów: rozpoczęcia transakcji, polecenia: start transaction lub begin wykonywanie sekwencji poleceń. Istnieje możliwość przerwania transakcji lub ewentualnego cofnięcia do wcześniej zapisanego stanu za pomocą polecenia savepoint nazwa zakończenia transakcji, polecenia: commit (zatwierdzenie nowego stanu danych), rollback (cofnięcie transakcji) lub rollback to nazwa, cofnięcie się do punktu zapisu. Zerwane połączenie z bazą danych anuluje wprowadzone zmiany.

Transakcje Automatyczne kończenie transakcji ma miejsce po następujących poleceniach: alter table, create index, create table, drop database, drop table, lock tables, rename table, set autocommit = 1, truncate, unlock tables.

Transakcje Parametry ograniczające dostęp do danych: klauzula for update – wywoływana jest w poleceniu select, blokuje tabelę do momentu zatwierdzenia lub cofnięcia transakcji. Inna transakcja nie może założyć blokady; klauzula lock in share mode – wywoływana jest w poleceniu select, działa podobnie jak blokada omawiana powyżej, natomiast umożliwia innym transakcjom założenie blokady na tą samą tabelę. poziomy (stopnie) izolacji – umożliwiają określenie domyślnej izolacji transakcji od innych transakcji oraz wolnych poleceń SQL.

Transakcje Poziomy izolacji transakcji: READ UNCOMMITTED – zmiany wykonywane przez polecenia wewnątrz transakcji są na bieżąco widoczne poza nią, pomimo nie zatwierdzenia poleceniem commit. READ COMMITTED – zmiany wykonane przez polecenia wewnątrz transakcji są widoczne dopiero po zatwierdzeniu poleceniem commit. REPEATABLE READ – zmiany wykonane przez polecenia wewnątrz jednej transakcji nie są widoczne w drugiej transakcji, nawet pomimo zatwierdzenia ich poleceniem commit. Tryb domyślnie używany przez silnik InnoDB. SERIALIZABLE – działa tak samo jak REPEATABLE READ i dodatkowo blokuje wiersze odczytywane przez pierwszą transakcję – tak jak klauzula lock in share mode.

Transakcje Poziomy izolacji transakcji: Sprawdzanie aktualnego poziomu izolacji: mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | | REPEATABLE-READ |

Transakcje Poziomy izolacji transakcji: Ustawienie poziomu izolacji: mysql> set session transaction isolation level read uncommitted; Query OK, 0 rows affected (0.00 sec) mysql> set session transaction isolation level repeatable read;

Transakcje Przykład: begin; select * from Klienci for update; insert into Klienci (imie, nazwisko, PESEL) values ('Jan','Kowalski','89121212345'); commit;

Transakcje Przykład: delimiter | drop procedure pr11 | create procedure pr11() begin start transaction; select * from Klienci for update; savepoint pierwszy_insert; insert into Klienci (imie, nazwisko, PESEL) values ('Jan','Kowalski','89121212345'); savepoint drugi_insert; insert into Klienci (imie, nazwisko, PESEL) values ('Anna','Nowak','89121214567'); set @k= (select count(*) from Klienci where nazwisko = 'Nowak'); if @k>1 then rollback to savepoint drugi_insert; end if; commit; end | delimiter ;

Transakcje Przykład fragmentu aplikacji

Transakcje Read uncommitted Niezatwierdzony odczyt (dirty reads) - transakcje mają dostęp do modyfikacji wprowadzonych przez inne transakcje, nawet jeszcze nie zatwierdzone. Odczytywane są niezatwierdzone dane. Niepowtarzalny odczyt (nonrepeatable (fuzzy) reads) - każdy kolejny odczyt danych przez jedną transakcję może zwrócić inne wyniki. Dane zostały w międzyczasie zmodyfikowane przez równoległą, zatwierdzoną transakcję. Fantomy (phantom reads) - każdy kolejny odczyt danych przez jedną transakcję, może zwrócić inne wyniki. Dane zostały w międzyczasie dodane przez równoległą, zatwierdzoną transakcję.

Transakcje Read committed Niezatwierdzony odczyt (dirty reads) - transakcje mają dostęp do modyfikacji wprowadzonych przez inne transakcje, nawet jeszcze nie zatwierdzone. Odczytywane są niezatwierdzone dane. Niepowtarzalny odczyt (nonrepeatable (fuzzy) reads) - każdy kolejny odczyt danych przez jedną transakcję może zwrócić inne wyniki. Dane zostały w międzyczasie zmodyfikowane przez równoległą, zatwierdzoną transakcję. Fantomy (phantom reads) - każdy kolejny odczyt danych przez jedną transakcję, może zwrócić inne wyniki. Dane zostały w międzyczasie dodane przez równoległą, zatwierdzoną transakcję.

Transakcje

Transakcje Read uncommitted – przykład fragmentu aplikacji mysql> set session transaction isolation level read uncommitted; Query OK, 0 rows affected mysql> select * from pliki; +----------+---------+-------------------+ | ID_pliki | nazwa | zawartosc_binarna | | 1 | obrazek | | | 2 | program | | | 3 | tekst | | 3 rows in set mysql> select * from uzytkownicy_pliki; +----------------+----------+ | ID_uzytkownicy | ID_pliki | | 1 | 2 | | 2 | 2 | | 1 | 3 | mysql> set session transaction isolation level read uncommitted; Query OK, 0 rows affected mysql> select * from pliki; +----------+---------+-------------------+ | ID_pliki | nazwa | zawartosc_binarna | | 1 | obrazek | | | 2 | program | | | 3 | tekst | | 3 rows in set mysql> select * from uzytkownicy_pliki; +----------------+----------+ | ID_uzytkownicy | ID_pliki | | 1 | 2 | | 2 | 2 | | 1 | 3 |

Transakcje Read uncommitted – przykład fragmentu aplikacji mysql> begin; Query OK, 0 rows affected mysql> delete from uzytkownicy_pliki where ID_uzytkownicy = 2 and ID_pliki = 2; Query OK, 1 row affected mysql> select * from uzytkownicy_pliki; +----------------+----------+ | ID_uzytkownicy | ID_pliki | | 1 | 2 | | 1 | 3 | 2 rows in set mysql> rollback; mysql> mysql> begin; Query OK, 0 rows affected mysql> select * from uzytkownicy_pliki; +----------------+----------+ | ID_uzytkownicy | ID_pliki | | 1 | 2 | | 1 | 3 | 2 rows in set mysql> insert into uzytkownicy_pliki values (2,2); --tutaj SZBD czeka! 1062 - Duplicate entry '2-2' for key 'PRIMARY' mysql>

Transakcje Read committed – przykład fragmentu aplikacji mysql> set session transaction isolation level read committed; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | 4 rows in set mysql> insert into uzytkownicy values (null, 'alex', ''); Query OK, 1 row affected mysql> commit; mysql> mysql> set session transaction isolation level read committed; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | 4 rows in set | 5 | alex | | 5 rows in set mysql> commit;

Transakcje Read committed – przykład fragmentu aplikacji mysql> set session transaction isolation level read committed; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | 4 rows in set mysql> insert into uzytkownicy values (null, 'alex',''); Query OK, 1 row affected mysql> rollback; mysql> set session transaction isolation level read committed; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | 4 rows in set mysql> insert into uzytkownicy values (null, 'alex',''); --tutaj SZBD czeka!!!! Query OK, 1 row affected mysql> commit;

Transakcje Repeatable read Niezatwierdzony odczyt (dirty reads) - transakcje mają dostęp do modyfikacji wprowadzonych przez inne transakcje, nawet jeszcze nie zatwierdzone. Odczytywane są niezatwierdzone dane. Niepowtarzalny odczyt (nonrepeatable (fuzzy) reads) - każdy kolejny odczyt danych przez jedną transakcję może zwrócić inne wyniki. Dane zostały w międzyczasie zmodyfikowane przez równoległą, zatwierdzoną transakcję. Fantomy (phantom reads) - każdy kolejny odczyt danych przez jedną transakcję, może zwrócić inne wyniki. Dane zostały w międzyczasie dodane przez równoległą, zatwierdzoną transakcję.

Transakcje Repeatable read Niezatwierdzony odczyt (dirty reads) - transakcje mają dostęp do modyfikacji wprowadzonych przez inne transakcje, nawet jeszcze nie zatwierdzone. Odczytywane są niezatwierdzone dane. Niepowtarzalny odczyt (nonrepeatable (fuzzy) reads) - każdy kolejny odczyt danych przez jedną transakcję może zwrócić inne wyniki. Dane zostały w międzyczasie zmodyfikowane przez równoległą, zatwierdzoną transakcję. Fantomy (phantom reads) - każdy kolejny odczyt danych przez jedną transakcję, może zwrócić inne wyniki. Dane zostały w międzyczasie dodane przez równoległą, zatwierdzoną transakcję. MySQL ->

Transakcje Repeatable read – przykład fragmentu aplikacji [1] mysql> set session transaction isolation level repeatable read; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | | 8 | alex | | 5 rows in set mysql> delete from uzytkownicy where ID_uzytkownicy = 8; Query OK, 1 row affected mysql> insert into uzytkownicy values (null, 'monika', ''); mysql> set session transaction isolation level repeatable read; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | | 8 | alex | | 5 rows in set

Transakcje Repeatable read – przykład fragmentu aplikacji [2] mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | | 9 | monika | | 5 rows in set mysql> commit; Query OK, 0 rows affected mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | | 8 | alex | | 5 rows in set mysql> insert into uzytkownicy values (null, 'monika', ''); -- tutaj SZBD czeka! 1062 - Duplicate entry 'monika' for key 'uniq_uzytkownicy_login' mysql> commit; Query OK, 0 rows affected | 9 | monika | |

Transakcje Repeatable read – przykład fragmentu aplikacji mysql> begin; Query OK, 0 rows affected mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | | 9 | monika | | 5 rows in set mysql> insert into uzytkownicy values (null, 'franek', ''); Query OK, 1 row affected mysql> delete from uzytkownicy where login='monika'; mysql> commit; mysql> begin; Query OK, 0 rows affected mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | | 14 | franek | | 5 rows in set

Transakcje Serializable Niezatwierdzony odczyt (dirty reads) - transakcje mają dostęp do modyfikacji wprowadzonych przez inne transakcje, nawet jeszcze nie zatwierdzone. Odczytywane są niezatwierdzone dane. Niepowtarzalny odczyt (nonrepeatable (fuzzy) reads) - każdy kolejny odczyt danych przez jedną transakcję może zwrócić inne wyniki. Dane zostały w międzyczasie zmodyfikowane przez równoległą, zatwierdzoną transakcję. Fantomy (phantom reads) - każdy kolejny odczyt danych przez jedną transakcję, może zwrócić inne wyniki. Dane zostały w międzyczasie dodane przez równoległą, zatwierdzoną transakcję.

Transakcje Repeatable read – przykład fragmentu aplikacji mysql> set session transaction isolation level serializable; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | 4 rows in set mysql> commit; -- tutaj SZBD czeka! | 21 | monika | | | 22 | franek | | mysql> set session transaction isolation level serializable; Query OK, 0 rows affected mysql> begin; mysql> select * from uzytkownicy; +----------------+--------+----------------------------------+ | ID_uzytkownicy | login | haslo | | 1 | ala | 1b95538f3035f4cba2189716fd96173c | | 2 | jan | 1b95538f3035f4cba2189716fd96173c | | 3 | michal | 1b95538f3035f4cba2189716fd96173c | | 4 | edyta | 207023ccb44feb4d7dadca005ce29a64 | 4 rows in set mysql> insert into uzytkownicy values (null, 'monika', ''); --tutaj SZBD czeka! Query OK, 1 row affected mysql> insert into uzytkownicy values (null, 'franek', ''); mysql> commit;

PHP i Transakcje Istotne funkcje: mysqli_autocommit($link,FALSE); mysqli_commit($link); mysqli_rollback($link) mysqli_query($link, "SET autocommit=0;"); mysqli_query($link, "commit;") mysqli_query($link, "rollback;") mysqli_insert_id($link);

PHP i Transakcje Przykładowe fragmenty funkcjonalności aplikacji do rozważenia rejestracja użytkownika – umieszczenie danych w kilku tabelach, np. takich jak: użytkownicy, pliki użytkowników, kilku użytkowników w jednym czasie chce zarejestrować ten sam login

PHP i Transakcje Przykładowe fragmenty funkcjonalności aplikacji do rozważenia koszyk zakupów – nie można zamówić produktu, jeżeli nie ma go na stanie magazynu. W trakcie wyboru produktu był jeszcze na stanie i jednocześnie w koszyku innego użytkownika jako ostatni egzemplarz.

PHP i Transakcje Przykładowe fragmenty funkcjonalności aplikacji do rozważenia rezerwacja przedmiotów wybieralnych przez studentów z poziomu systemu. Limity na przedmiot o danej godzinie.

PHP i Transakcje Przykładowe fragmenty funkcjonalności aplikacji do rozważenia rezerwacja biletów lotniczych, wybór biletu rezerwuje go na czas trwania sesji. Oprogramować moment wyboru biletu z uwzględnieniem wielu użytkowników dokonujących tej samej rezerwacji w danej chwili.

PHP i Transakcje Przykładowe fragmenty funkcjonalności aplikacji do rozważenia przelew bankowy – wykonywany przez dwóch współwłaścicieli konta w jednakowym czasie, z różnych komputerów, z uwzględnieniem debetu.

C. D. N.