Własności relacji: Baza danych jest zbiorem relacji, o następujących własnościach: każda relacja w bazie danych jest jednoznacznie określona przez swoją nazwę; każda kolumna w relacji (atrybut) ma jednoznaczną nazwę (w ramach tej relacji); kolumny relacji tworzą zbiór nieuporządkowany; wszystkie wartości w danej kolumnie muszą być tego samego typu (pochodzić z tej samej dziedziny); każdy wiersz (krotka) jest inny – nie ma duplikatów krotek;
teoretycznie, kolejność wierszy nie ma znaczenia (w praktyce może mieć wpływ na efektywność wyszukiwania odpowiednich grup kotek); każde pole (przecięcie wiersza z kolumną) zawiera wartość atomową z dziedziny określonej przez kolumnę. Brakowi wartości odpowiada wartość specjalnej NULL, zgodna z każdym typem kolumny (chyba, że została jawnie wykluczona przez definicję typu kolumny). każda relacja zawiera klucz główny - kolumnę (lub kolumny), której wartości jednoznacznie identyfikują wiersz (a więc w szczególności nie powtarzają się). Wartością klucza głównego nie może być NULL. Wartość pusta (NULL) - reprezentuje wartość atrybutu, która w danej chwili nie jest znana lub nie może zostać ustalona.
Klucze relacji: Klucz główny - jedna lub więcej kolumn tabeli, w których wartości jednoznacznie identyfikują każdy wiersz w tabeli. Każda relacja musi mieć klucz główny. Dzięki temu możemy zapewnić, aby wiersze nie powtarzały się w relacji. Klucz kandydujący to kolumna lub zbiór kolumn, które mogą występować jako jednoznaczny identyfikator wierszy w tabeli. W każdej relacji może istnieć wiele kluczy kandydujących. Klucz główny jest wybierany ze zbioru kluczy kandydujących. Klucz obcy - jest kolumną lub grupą kolumn tabeli, która czerpie swoje wartości z tej samej dziedziny co klucz główny tabeli powiązanej z nią w bazie danych.
Kontrola integralności danych : Polega na przestrzeganiu więzów, które nakładamy na dane, aby uniknąć niespójnego stanu bazy danych. Mamy do dyspozycji pięć rodzajów więzów integralności, które mogą być zdefiniowane w poleceniach CREATE i ALTER TABLE: Dane wymagane (NOT NULL); W standardzie ISO (również w MySQL) możemy zdefiniować więzy danych wymaganych poprzez umieszczenie przy kolumnie klauzuli NOT NULL. Klauzulą domyślną w standardzie ISO jest dopuszczanie wartości pustych.
Kontrola integralności danych : Więzy dziedzinowe (dopuszczalny zbiór wartości atrybutu, dopuszczalny zakres długości i format atrybutu); Z każdą kolumną związana jest dziedzina, czyli zbiór dopuszczalnych wartości. Standard ISO opisuje dwa mechanizmy określania dziedziny w poleceniach CREATE i ALTER TABLE. Pierwszy z nich to klauzula CHECK, która pozwala ograniczyć dopuszczalne wartości dla konkretnej kolumny lub dla całej tabeli: CHECK (warunek_selekcji) W więzach kolumnowych w klauzuli CHECK można odwoływać się jedynie do kolumny, dla której jest zdefiniowana klauzula, np.: plec CHAR NOT NULL CHECK (plec IN ('M','K'))
Standard ISO zezwala również na niezależne od tabel definiowanie dziedzin za pomocą polecenia CREATE DOMAIN: CREATE DOMAIN NazwaDziedziny [AS] typ_danych [DEFAULT wartość_domyślna] [CHECK (warunek_selekcji)] W ten sposób dziedzinie przypisuje się nazwę NazwaDziedziny, typ danych i, opcjonalnie, wartość domyślną. Również opcjonalnie można zdefiniować regułę poprawności dla dziedziny za pomocą klauzuli CHECK, np.: CREATE DOMAIN Rodzaj AS CHAR DEFAULT 'M' CHECK (VALUE IN ('M','K')); Teraz, definiując kolumnę, możemy zastosować nazwę dziedziny Rodzaj zamiast typu danych CHAR: plec Rodzaj NOT NULL
Parametr warunek_selekcji może wymagać odwołania się do innej tabeli Parametr warunek_selekcji może wymagać odwołania się do innej tabeli. Na przykład, możemy stworzyć dziedzinę NumerBiura, by upewnić się, że wprowadzane wartości odpowiadają numerom biur występującym w tabeli Biuro: CREATE DOMAIN NumerBiura AS CHAR(4) CHECK (VALUE IN (SELECT biuroNr FROM Biuro)); Zazwyczaj lepiej jest definiować więzy dziedzinowe za pomocą polecenia CREATE DOMAIN niż tylko CHECK. Oba polecenia nie funkcjonują jednak w MySQL.
Usuwanie dziedziny z bazy danych: DROP DOMAIN NazwaDziedziny [RESTRICTI CASCADE] Zasięg usunięcia, RESTRICT lub CASCADE, określa tryb postępowania w przypadku, gdy usuwamy używaną aktualnie dziedzinę. RESTRICT - jeśli dziedzina jest wykorzystywana w istniejącej tabeli, perspektywie lub asercji, to usunięcie nie zostanie wykonane. CASCADE - w każdej kolumnie tabeli, dla której jako typ danych określono usuwaną dziedzinę, typ ten zostanie zamieniony na typ, w oparciu, o który jest zdefiniowana usuwana dziedzina. Także wartość domyślna i więzy kolumny zostaną zastąpione wartością domyślną i więzami usuwanej dziedziny, o ile występowały w definicji dziedziny.
Kontrola integralności danych : Integralność encji - każda tabela musi posiadać klucz główny, a wartości klucza głównego muszą być w ramach tabeli unikalne i nie równe NULL; Standard ISO pozwala kontrolować integralność encji za pomocą klauzuli PRIMARY KEY w poleceniach CREATE i ALTER TABLE np.: PRIMARY KEY(nieruchomośćNr) Aby zdefiniować złożony klucz główny, podajemy nazwy kilku kolumn oddzielone przecinkami: PRIMARY KEY(klientNr, nieruchomośćNr) Klauzula PRIMARY KEY może wystąpić tylko raz w definicji tabeli.
Istnieje też możliwość zapewnienia unikalności wartości kluczy alternatywnych słowem kluczowym UNIQUE (musi być także jako NOT NULL) W tabeli może wystąpić tyle klauzul UNIQUE, ile jest potrzebnych. SQL odrzuci każdą operację INSERT i UPDATE, która będzie powodowała utworzenie duplikatu wartości dowolnego klucza kandydującego (głównego lub alternatywnego). Na przykład, dla tabeli Wizyta : klientNr VARCHAR{5) NOT NULL, nieruchomośćNr VARCHAR(5) NOT NULL, UNIQUE (klientNr, nieruchomośćNr)
Kontrola integralności danych : Integralność referencyjna - każda wartość klucza obcego może być albo równa jakiejś wartości klucza głównego występującej w tabeli powiązanej, lub (ewentualnie) NULL Klucz obcy to kolumna lub zbiór kolumn, łączących każdy wiersz tabeli podrzędnej, w której występują, z wierszem tabeli nadrzędnej zawierającym wartość klucza kandydującego równą ich wartości. Integralność referencyjna oznacza, że jeśli w polach klucza obcego występują pewne wartości, to muszą odnosić się one do istniejącego, poprawnego wiersza w tabeli nadrzędnej. Standard ISO pozwala definiować klucze obce za pomocą klauzuli FOREIGN KEY w poleceniach CREATE i ALTER TABLE.
Zdefiniowanie klucza obcego biuroNr w tabeli Nieruchomość: FOREIGN KEY(biuroNr) REFERENCES Biuro ON DELETE reference_option ON UPDATE reference_option W podklauzuli PREFERENCES podaje się nazwę tabeli nadrzędnej oraz nazwę klucza głównego (w przypadku braku wpisu system przyjmuje domyślnie klucz główny tabeli nadrzędnej). SQL odrzuci każdą operacje INSERT lub UPDATE, jeżeli w jej następstwie powstałaby wartość klucza obcego, do której nie pasuje żadna wartość klucza kandydującego w tabeli nadrzędnej.
W SQL są określone cztery tryby postępowania w przypadku, gdy użytkownik próbuje usunąć wiersz z tabeli nadrzędnej, a w tabeli podrzędnej istnieją związane z nim wiersze: CASCADE – usunięcie wiersza z tabeli nadrzędnej automatycznie powoduje usunięcie związanych z nim wierszy z tabeli podrzędnej. SET NULL – usunięcie wiersza z tabeli nadrzędnej i zastąpienie wartości klucza obcego w jego wierszach podrzędnych wartością pustą.
SET DEFAULT – usuniecie wiersza z tabeli nadrzędnej i zastąpienie wartości klucza obcego w jego wierszach podrzędnych wartością domyślną. NO ACTION - zaniechanie operacji usunięcia z tabeli nadrzędnej. Jest to domyślny tryb postępowania, przyjmowany, gdy w definicji nie występuje reguła ON DELETE. SQL umożliwia takie same operacje w przypadku, gdy klucz główny w tabeli nadrzędnej zostanie zmodyfikowany.
Powiązania kluczy obcych:
Próba wykonania polecenia z nieistniejącą wartością w tabeli nadrzędnej: mysql> INSERT INTO personel VALUES ('SL33', 'Paweł', 'Biały','asystent','M','1982-03-16',1100,'B008'); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`biuro`.`personel`, CONSTRAINT `biuroNr` FOREIGN KEY (`biuroNr`) REFERENCES `biuro` (`biuroNr`) ON DELETE CASCADE ON UPDATE CASCADE) mysql>
Aktualizacja obiektów w tabeli nadrzędnej: mysql> UPDATE biuro SET biuroNr='B008' WHERE miasto='Augustów' and ulica='Akacjowa 16'; Query OK, 1 rows affected (0.03 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql> SELECT * FROM biuro; +---------+--------------+-----------+--------+ | biuroNr | ulica | miasto | kod | | B001 | Piękna 46 | Białystok | 15-900 | | B002 | Cicha 56 | Łomża | 18-400 | | B003 | Mała 63 | Białystok | 15-900 | | B004 | Miodowa 32 | Grajewo | 19-200 | | B005 | Dobra 22 | Łomża | 18-400 | | B006 | Słoneczna 55 | Białystok | 15-900 | | B008 | Akacjowa 16 | Augustów | 16-300 | 7 rows in set (0.02 sec)
mysql> SELECT * FROM personel;
Usuwanie obiektów z tabeli nadrzędnej: mysql> DELETE FROM biuro WHERE ulica='Akacjowa 16'; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM biuro; +---------+--------------+-----------+--------+ | biuroNr | ulica | miasto | kod | | B001 | Piękna 46 | Białystok | 15-900 | | B002 | Cicha 56 | Łomża | 18-400 | | B003 | Mała 63 | Białystok | 15-900 | | B004 | Miodowa 32 | Grajewo | 19-200 | | B005 | Dobra 22 | Łomża | 18-400 | | B006 | Słoneczna 55 | Białystok | 15-900 | 6 rows in set (0.00 sec)
Kolejność usuwania tabel powiązanych (powiązane, potem nadrzędne): mysql> SELECT * FROM personel; Kolejność usuwania tabel powiązanych (powiązane, potem nadrzędne): DROP TABLE personel, biuro;
Kontrola integralności danych : Więzy ogólne - dodatkowe warunki poprawności danych określone przez użytkowników lub administratorów bazy danych Możliwości zmian w tabelach mogą być ograniczone więzami ogólnymi (nazywanymi w SQL asercjami) rządzącymi przebiegiem rzeczywistych transakcji, z których takie zmiany wynikają. Standard ISO pozwala specyfikować więzy ogólne za pomocą klauzul CHECK i UNIQUE w poleceniach CREATE i ALTER TABLE oraz za pomocą polecenia CREATE ASSERTION: CREATE ASSERTION nazwa_asercji CHECK (warunek_selekcji)
Np. zdefiniować warunek zapobiegający jednoczesnemu nadzorowaniu przez pracownika więcej niż stu nieruchomości: CREATE ASSERTION PracownikNadzorującyNieZaDużo CHECK (NO EXISTS (SELECT pracownikNr FROM Nieruchomość GROUP BY pracownikNr HAVING COUNT(*)>100));
Przykład realizacji więzów ogólnych: Dla tabeli Nieruchomosc utworzono dziedziny: CREATE DOMAIN NumeryWlascieli AS VARCHAR(5) CHECK (VALUE IN (SELECT wlascicielNr FROM WlascicielPrywatny)); CREATE DOMAIN NumeryPracownikow AS VARCHAR(5) CHECK (VALUE IN (SELECT pracownikNr FROM Personel)); CREATE DOMAIN NumeryBiur AS CHAR(4) CHECK (VALUE IN (SELECT biuroNr FROM Biuro)); CREATE DOMAIN NumeryNieruchomosci AS VARCHAR(5);
CREATE DOMAIN Ulice AS VARCHAR(25); CREATE DOMAIN Miasta AS VARCHAR(15): CREATE DOMAIN KodyPocztowe AS VARCHAR(8); CREATE DOMAIN TypyNieruchomosci AS CHAR(l) CHECK(VALUE IN ('B','C','D','E','F','M','S')); CREATE DOMAIN PokojeWNieruchomos AS SMALLINT CHECK(VALUE BETWEEN 1 AND 15); CREATE DOMAIN OplatyZaWynajecie AS DECIMAL(6,2) CHECK(VALUE BETWEEN 0 AND 9999.99);
Realizacja tabeli Nieruchomosc: CREATE TABLE Nieruchomosc ( nieruchomoscNr NumeryNieruchomosci NOT NULL, ulica Ulice NOT NULL, miasto Miasta NOT NULL, kod_pocztowy KodyPocztowe, typ TypyNieruchomosci NOT NULL DEFAULT 'M', pokoje PokojeWNieruchomos NOT NULL DEFAULT 4, czynsz OplatyZaWynajecie NOT NULL DEFAULT 600, wlascicielNr NumeryWlascicieli NOT NULL,
pracownikNr NumeryPracownikow CONSTRAINT PracownikNadzorujacyNieZaDuzo CHECK (NOT EXISTS (SELECT pracownikNr FROM Nieruchomosc GROUP BY pracownikNr HAYING COUNT{*) > 100)), BiuroNr NumeryBiur NOT NULL, PRIMARY KEY (nieruchomoscNr), FOREIGN KEY (pracownikNr) REFERENCES Personel ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (wlascicielNr) REFERENCES Wlasciciel Prywatny ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (biuroNr) REFERENCES Biuro ON DELETE NO ACTION ON UPDATE CASCADE);
Schemat relacyjnej bazy danych (Biuro_nieruchomości): Relacyjna baza danych składa się z pewnej liczby znormalizowanych relacji, np.: Biuro (biuroNr, ulica, miasto, kod pocztowy) Personel (pracownikNr, imię, nazwisko, stanowisko, płeć, dataUr, pensja, biuroNr) Nieruchomość (nieruchomośćNr, ulica, miasto, kod pocztowy, typ, pokoje, czynsz, właścicielNr, pracownikNr, biuroNr) Klient (klientNr, imię, nazwisko, adres, telefon, preferencje, maksCzynsz) Właściciel (właścicielNr, imię, nazwisko, adres, telefon) Wizyta (klientNr, nieruchomośćNr, dataWizyty, uwagi) Rejestracja (klientNr, biuroNr, pracownikNr, dataRejestracji) Wynajęcie (umowaNr, nieruchomośćNr, klientNr, czynsz, formaPłatności, kaucja, zapłacona, od, do, okres)
SQL – język manipulacji danymi 1974 – D.Chamberlin, który tak jak dr Codd pracował w IBM Research Laboratory w San Jose, zdefiniował język nazwany SEQUEL (Structured English Query Language); 1976 – ulepszona wersja SEQUEL/2, jednocześnie nazwa, ze względów prawnych, zmieniona na SQL; 1976 – Firma IBM wyprodukowała prototypowy SZBD oparty na SEQUEL/2, nazywany Systemem R; Koniec lat siedemdziesiątych – pierwsza komercyjna implementacja relacyjnego SZBD opartego na SQL – system Oracle; 1983 – system DB2 firmy IBM;
1986 – amerykański instytut standardów ANSI zdefiniował standard SQL uznany w 1987 roku przez międzynarodową organizację standardów ISO za standard międzynarodowy ; Kolejne standardy SQL2 i SQL3 po modyfikacjach ISO 1992 i 1999a. Istnienie międzynarodowego standardu sprawia, że język ten jest formalnym i faktycznym standardem języka definiowania i operowania na relacyjnych bazach danych. Obecnie ponad sto SZBD umożliwia stosowanie języka SQL na różnych platformach sprzętowych.
Formułowanie poleceń w SQL Zdanie (polecenie, zapytanie) języka SQL składa się ze słów zarezerwowanych (kluczowych) oraz ze słów zdefiniowanych przez użytkownika. Słowa zarezerwowane są niezmienną częścią języka i mają ustalone znaczenie. W wielu dialektach SQL wymagane jest zakończenie każdego zdania znakiem średnika ‘;’ – chociaż standard tego nie określa. Większość elementów polecenia SQL można pisać dowolnie, wielkimi lub małymi literami, za wyjątkiem danych podawanych „dosłownie”, czyli literałów, które muszą być zapisane dokładnie w takiej postaci, w jakiej występują w bazie danych.
INSERT – dopisywanie danych do tabeli; Operowanie na danych: INSERT – dopisywanie danych do tabeli; UPDATE – modyfikowanie danych w tabelach; DELETE – usuwanie danych z tabel; SELECT – wyszukiwanie danych w bazie.
Instrukcja SELECT: Instrukcja SELECT jest podstawową instrukcją języka SQL, służącą głównie (choć nie tylko) do pobierania danych z tabeli lub tabel na podstawie zadanych warunków. Kolejność klauzul (odpowiednich słów kluczowych) jest istotna. Wynikiem jej wywołania (o ile nie wystąpi błąd) jest zawsze pewna tabela. W postaci: SELECT wyrażenie zwróci po prostu wartość podanego wyrażenia (zbudowanego z wykorzystaniem stałych i funkcji) - czyli tabelę składającą się z jednego wiersza i jednej kolumny, zawierającą wartość tego wyrażenia. 32
SELECT wyrażenie1, wyrażenie2, ... Wynikiem postaci: SELECT wyrażenie1, wyrażenie2, ... będzie tabela o jednym wierszu i o kolumnach zawierających kolejno wartości podanych wyrażeń. Natomiast: SELECT wyrażenie1, wyrażenie2, ... FROM tabela Dane będą pobierane z tabeli wymienionej po słowie kluczowym FROM. Możemy budując wyrażenia, używać nazw kolumn z tej tabeli. Kolejność kolumn w tabeli wynikowej będzie taka, jak kolejność podanych wyrażeń. W szczególności, wyrażenia mogą być po prostu nazwami interesujących nas kolumn. 33
Proste przykłady: mysql> SELECT 2+2; +-----+ | 2+2 | | 4 | | 4 | mysql> SELECT SQRT(16); +----------+ | SQRT(16) | | 4 | mysql> SELECT IF(5>6,1,2); +-------------+ | IF(5>6,1,2) | | 2 | 34
Komentarze w liniach komend: mysql> SELECT 1+1; # Komentarz do końca linii mysql> SELECT 1+1; -- Komentarz do końca linii mysql> SELECT 1 /* komentarz w linii */ + 1; mysql> SELECT 1+ /* komentarz składający się z wielu linii */ 1; 35
Składnia: postać ogólna: SELECT [DISTINCTALL] {*[wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROM NazwaTabeli [alias],[...] [WHERE warunek_selekcji_wierszy] [GROUP BY lista_kolumn] [HAVING warunek_selekcji_grup] [ORDER BY lista_kolumn];
SELECT – wskazuje, które kolumny powinny pojawić się w wyniku; DISTINCT – eliminuje powtórzenia po wykonaniu rzutowania na wybrane kolumny; FROM – określa tabelę (lub tabele), z których będziemy korzystać; WHERE – pozwala wybrać wiersze spełniające zadany warunek selekcji wierszy; GROUP BY – tworzy grupy wierszy o tej samej wartości wskazanej kolumny; HAVING – pozwala wybrać grupy ze względu na podany warunek selekcji grup; ORDER BY – określa uporządkowanie wyniku.
Wyszukiwanie wszystkich wierszy: 1. wszystkie kolumny i wszystkie wiersze: SELECT * FROM klient; 2. wybrane kolumny i wszystkie wiersze: SELECT pracownikNr, imie, nazwisko, pensja FROM personel;
Wyszukiwanie: 1. Wszystkie kolumny i wszystkie wiersze: SELECT * FROM personel; mysql> SELECT * FROM personel; +------------+------------+------------+------------+------+------------+--------+---------+ | personelNr | imie | nazwisko | stanowisko | plec | dataUr | pensja | biuroNr | | SA8 | Katarzyna | Morawska | kierownik | K | 1971-05-06 | 1700 | B007 | | SA9 | Maria | Hojna | asystent | K | 1970-02-19 | 900 | B007 | | SB20 | Sabina | Bober | dyrektor | K | 1940-06-03 | 2400 | B003 | | SB21 | Daniel | Frankowski | kierownik | M | 1958-03-24 | 1800 | B003 | | SB22 | Małgorzata | Kowalska | asystent | K | 1972-03-15 | 1000 | B003 | | SB23 | Anna | Biały | asystent | K | 1960-11-10 | 1200 | B003 | | SB30 | Katarzyna | Michalska | dyrektor | K | 1960-11-17 | 2500 | B006 | | SB31 | Dawid | Piotrowski | asystent | M | 1975-03-22 | 1100 | B006 | | SB32 | Małgorzata | Plichta | asystent | K | 1971-10-03 | 1200 | B006 | | SG20 | Karolina | Mucha | dyrektor | K | 1953-03-03 | 2200 | B004 | | SG21 | Piotr | Cybulski | asystent | M | 1974-12-06 | 1300 | B004 | | SL20 | Paweł | Nowak | kierownik | M | 1962-02-02 | 1500 | B002 | | SL21 | Paweł | Kowalski | asystent | M | 1969-05-05 | 1000 | B002 | | SL22 | Monika | Munk | asystent | K | 1977-07-26 | 1100 | B002 | | SL30 | Jan | Wiśniewski | dyrektor | M | 1945-10-01 | 3000 | B005 | | SL31 | Julia | Lisicka | asystent | K | 1965-07-13 | 900 | B005 | | SL32 | Michał | Brzęczyk | asystent | M | 1959-03-15 | 1000 | B005 | 17 rows in set (0.00 sec) 39
2. Wybrane kolumny i wszystkie wiersze: SELECT personelNr, imie, nazwisko, pensja FROM personel; mysql> SELECT personelNr, imie, nazwisko, pensja -> FROM personel; +------------+------------+------------+--------+ | personelNr | imie | nazwisko | pensja | | SA8 | Katarzyna | Morawska | 1700 | | SA9 | Maria | Hojna | 900 | | SB20 | Sabina | Bober | 2400 | | SB21 | Daniel | Frankowski | 1800 | | SB22 | Małgorzata | Kowalska | 1000 | | SB23 | Anna | Biały | 1200 | | SB30 | Katarzyna | Michalska | 2500 | | SB31 | Dawid | Piotrowski | 1100 | | SB32 | Małgorzata | Plichta | 1200 | | SG20 | Karolina | Mucha | 2200 | | SG21 | Piotr | Cybulski | 1300 | | SL20 | Paweł | Nowak | 1500 | | SL21 | Paweł | Kowalski | 1000 | | SL22 | Monika | Munk | 1100 | | SL30 | Jan | Wiśniewski | 3000 | | SL31 | Julia | Lisicka | 900 | | SL32 | Michał | Brzęczyk | 1000 | 17 rows in set (0.00 sec) 40
Operacje jednoargumentowe (unarne): Algebra relacji Algebra relacji – zawiera operacje, które pozwalają definiować nowe relacje w oparciu o relacje wyjściowe bez zmiany ich zawartości. Operacje jednoargumentowe (unarne): Operacja rzutowania: Operacja selekcji:
Tabela Personel:
Operacja selekcji:
Operacja selekcji - wynik:
Operacja rzutowania:
Operacja rzutowania - wynik:
Operacje binarne działające na parze relacji: Suma zbiorów: È R S Różnica zbiorów: R S R - S Ç S R Przekrój zbiorów:
Suma zbiorów:
Suma zbiorów - wynik:
Tabele Biuro, Nieruchomość:
Różnica zbiorów:
Różnica zbiorów - wynik:
Przekrój zbiorów:
Przekrój zbiorów - wynik:
Sortowanie wyników - uporządkowane malejąco: SELECT personelNr, imie, nazwisko, pensja FROM personel ORDER BY pensja DESC; mysql> SELECT personelNr, imie, nazwisko, pensja FROM personel ORDER BY pensja DESC; +------------+-------------+-------------+--------+ | personelNr | imie | nazwisko | pensja | | SC1 | Jan | Bogacz | 16250 | | SL30 | Jan | Wiśniewski | 14650 | | SB20 | Sabina | Bober | 14050 | | SB23 | Anna | Biały | 11566 | | SL21 | Paweł | Kowalski | 11366 | | SL32 | Michał | Brzęczyk | 11366 | | SL31 | Julia | Lisicka | 11266 | | SB21 | Daniel | Frankowski | 1500 | | SL22 | Monika | Munk | 1466 | | SB22 | Małgorzata | Kowalska | 1366 | | SL20 | Paweł | Nowak | 1200 | 11 rows in set (0.00 sec)
Sortowanie według wielu kolumn: SELECT nieruchomoscNr, typ, pokoje, czynsz FROM nieruchomosc ORDER BY typ, czynsz DESC; mysql> SELECT nieruchomoscNr, typ, pokoje, czynsz -> FROM nieruchomosc -> ORDER BY typ, czynsz DESC; +----------------+------------+--------+--------+ | nieruchomoscNr | typ | pokoje | czynsz | | G01 | dom | 7 | 830 | | A14 | dom | 6 | 715 | | B21 | dom | 5 | 660 | | B16 | mieszkanie | 4 | 495 | | L94 | mieszkanie | 4 | 440 | | B17 | mieszkanie | 3 | 412 | | B18 | mieszkanie | 3 | 385 | 7 rows in set (0.01 sec)
Aliasy nazw kolumn i wyrażeń: Jako argumenty klauzul ORDER BY i GROUP BY nie mogą być użyte wyrażenia złożone - jedynie nazwy kolumn, lub - jeżeli chcemy grupować lub sortować według wartości wyrażeń złożonych - aliasy tych wyrażeń. Stosuje się słowo kluczowe AS, w sposób następujący: SELECT wyrażenie1, wyrażenie2 AS alias FROM złączenie ORDER BY alias Alias nadany wyrażeniu staje się nazwą odpowiedniej kolumny tabeli wynikowej (zamiast dosłownej postaci tego wyrażenia).
Wyliczanie pensji rocznej: SELECT personelNr, imie, nazwisko, pensja*12 AS Roczna FROM personel; mysql> SELECT personelNr, imie, nazwisko, pensja*12 AS Roczna FROM personel; +------------+-------------+-------------+--------+ | personelNr | imie | nazwisko | Roczna | | SB20 | Sabina | Bober | 168600 | | SB21 | Daniel | Frankowski | 18000 | | SB22 | Małgorzata | Kowalska | 16392 | | SB23 | Anna | Biały | 138792 | | SC1 | Jan | Bogacz | 195000 | | SL20 | Paweł | Nowak | 14400 | | SL21 | Paweł | Kowalski | 136392 | | SL22 | Monika | Munk | 17592 | | SL30 | Jan | Wiśniewski | 175800 | | SL31 | Julia | Lisicka | 135192 | | SL32 | Michał | Brzęczyk | 136392 | 11 rows in set (0.00 sec)
Wyliczanie pensji rocznej z sortowaniem: SELECT personelNr, imie, nazwisko, pensja*12 AS Roczna FROM personel ORDER BY Roczna; mysql> SELECT personelNr, imie, nazwisko, pensja*12 AS Roczna FROM personel ORDER BY Roczna; +------------+-------------+-------------+--------+ | personelNr | imie | nazwisko | Roczna | | SL20 | Paweł | Nowak | 14400 | | SB22 | Małgorzata | Kowalska | 16392 | | SL22 | Monika | Munk | 17592 | | SB21 | Daniel | Frankowski | 18000 | | SL31 | Julia | Lisicka | 135192 | | SL21 | Paweł | Kowalski | 136392 | | SL32 | Michał | Brzęczyk | 136392 | | SB23 | Anna | Biały | 138792 | | SB20 | Sabina | Bober | 168600 | | SL30 | Jan | Wiśniewski | 175800 | | SC1 | Jan | Bogacz | 195000 | 11 rows in set (0.00 sec)
Wyliczanie pensji rocznej (bez alias’u): SELECT personelNr, imie, nazwisko, pensja*12 FROM personel; mysql> SELECT personelNr, imie, nazwisko, pensja*12 FROM personel; +------------+-------------+-------------+-----------+ | personelNr | imie | nazwisko | pensja*12 | | SB20 | Sabina | Bober | 168600 | | SB21 | Daniel | Frankowski | 18000 | | SB22 | Małgorzata | Kowalska | 16392 | | SB23 | Anna | Biały | 138792 | | SC1 | Jan | Bogacz | 195000 | | SL20 | Paweł | Nowak | 14400 | | SL21 | Paweł | Kowalski | 136392 | | SL22 | Monika | Munk | 17592 | | SL30 | Jan | Wiśniewski | 175800 | | SL31 | Julia | Lisicka | 135192 | | SL32 | Michał | Brzęczyk | 136392 | 11 rows in set (0.00 sec)
SELECT DISTINCT nieruchomoscNr FROM wizyta; Eliminacja powtórzeń DISTINCT – podaj numery nieruchomości odwiedzone przez klientów: SELECT DISTINCT nieruchomoscNr FROM wizyta; mysql> SELECT DISTINCT nieruchomoscNr -> FROM wizyta; +----------------+ | nieruchomoscNr | | A14 | | B36 | | B4 | 3 rows in set (0.00 sec) 61
SELECT nieruchomoscNr FROM wizyta; z powtórzeniami: SELECT nieruchomoscNr FROM wizyta; mysql> SELECT nieruchomoscNr FROM wizyta; +----------------+ | nieruchomoscNr | | A14 | | B36 | | B4 | 5 rows in set (0.01 sec) 62