Bazy Danych (cz. 1) ● Normalizacja/Denormalizacja ● Podstawowe bloki składowe, zasady tworzenia ● Diagramy ERD ● Algebra relacyjna ● Podstawy SQL na przykładzie Oracle
Bazy Danych (cz. 1)● Normalizacja/Denormalizacja● Podstawowe bloki składowe, zasady tworzenia● Diagramy ERD● Algebra relacyjna● Podstawy SQL na przykładzie Oracle
Literatura● Oracle Database 10g: SQL Fundamentals II● Książka SQL. Zaawansowane techniki
programowania, Joe Celko● ...
Normalizacja
Postać nieunormowanaid
zamówieniaid
dostawcynazwa
dostawcyadres
dostawcyid
częścinazwa części ilość
0001 M$ USA 0088 System op.
0004 111 Polska 0089 Obudowa 1
456 0001 Karta graficzna 1
Toshiba Japonia Bateria 55
Jak postać nieunormowana może też występować tabela, w której adres jest w pisany w jednym polu (tzn. Razem kod, ulica, miejscowość, numer domu etc.). W przypadku normalizacji te dane powinny zostać rozbite (atomowe, swoiste, niezwiązane o określonym typie) na poszczególne kolumny. W przedstawionym przykładzie pozostawimy tylko adres jako jedną kolumnę ze względu na oszczędność miejsca (nie będziemy też podawać pełnych danych).
Postać nieunormowanaInne przykłady nieunormowanych schematów BD
osoba Ulubione koloryMieczysław beż, róż, żółtyRoman czarny, niebieski
osoba kolor1 kolor2 kolor3Mieczysław beż róż żółtyRoman czarny niebieski NULL
UWAGA: chodzi tu o powtarzające się grupy, teoretycznie tylko przykład pierwszy łamie zasady projektowania (normalizacja), drugi przykład możemy sobie wyobrazić jako zestaw opisujący kolory różnych elementów (z punktu bazy danych kolumny w przykładzie drugim przechowują jedną wartość).Jednak drugi przykład nie jest zalecany jeśli baza ma się rozbudowywać.
AnomalieNadmiarowość – w przypadku nowego elementu tego samego producenta zostaną zdublowane jego dane: adres, nazwa. Jeśli dane te zostaną błędnie wprowadzone baza danych utraci spójność.
Anomalia wstawiania – Jeśli zajdzie potrzeba dodania nowego producenta ale bez podawania zamówienia. Baza danych stanie się wtedy niepełna (gdy będzie w 1NF to przejdzie do postaci nieunormowanej).
Anomalia modyfikacji – zmiana nazwy dostawcy wymaga zmian we wszystkich wierszach. W przypadku wielu rekordów spowoduje to nadmierne obciążenie systemu.
Anomalia usuwania – Jeśli jest wpisane jedno zamówienie to jego usunięcie spowoduje też usunięcie informacji o dostawcy.
Pierwsza postać normalna (1NF)id
zamówieniaid
dostawcynazwa
dostawcyadres
dostawcyid
częścinazwa części ilość
0001 222 M$ USA 0088 System op. 1
0004 111 Blacharnia Polska 0089 Obudowa 1
0007 456 Nvidia USA 0001 Karta graficzna 1
0010 768 Toshiba Japonia 0002 Bateria 55
Każda komórka reprezentuje wartość atomową (przy czym należy to rozumieć w sensie rzeczywistości opisywanej prze projektanta bo np.. datę można rozbić na dzień, miesiąc i rok co nie ma sensu jeśli potrzebna nam jest pełna data).
Wartości NULL w komórkach: Wielu twierdzi, że łamie to zasady 1NF. Teoretycznie nie jednak zaleca się jak najmniejszą liczebność wartości NULL ze względu, że w SQL jest to trzecia wartość logiczna, którą trzeba specjalnie traktować.
Klucz kandydujący● Minimalny zestaw atrybutów definiujący krotkę
(wiersz)● Relacja (tabela) może zawierać kilka kluczy
kandydujących● Zazwyczaj wybiera się jeden z kluczy
kandydujących (staje się on wtedy kluczem głównym).
● Atrybuty (kolumny) nie występujące w kluczach kandydujących nazywa się atrybutem pobocznym (non-prime), atrybut należący atrybutem głównym (prime).
Druga postać normalna (2NF)
id dostawcy
nazwa dostawcy
adres dostawcy
222 M$ USA
111 Blacharnia Polska
456 Nvidia USA
768 Toshiba Japonia
id zamówienia
id dostawcy
id części
ilość
0001 222 0088 1
0004 111 0089 1
0007 456 0001 1
0010 768 0002 55
id części
nazwa części nazwa producenta
adres producenta
0088 System op. M$ USA
0089 Obudowa Blacharnia Polska
0001 Karta graficzna
ATI USA
0002 Bateria Toshiba Japonia
Relacja jest w drugiej postaci normalnej wtedy i tylko wtedy gdy jest w I postaci normalnej i każda kolumna zależy funkcyjnie od całego klucza kandydującego (głównego)
Poprzednia postać nie była w 2NF gdyż w tabeli wraz z kluczem iddostawcy, idczesci oraz idzamowienia pojawiał się wartość związana tylko z częścią klucza np. Adres dostawcy jest związany tylko i wyłącznie z kluczem iddostawcy
Dostawca nie musi być związany z producentem
Trzecia postać normalna (3NF)Schemat jest w 3NF jeżeli jest w 2NF i pomiędzy atrybutami nie należącymi doklucza głównego nie występują zależności funkcjonalne.
id części id producenta
nazwa części
0088 0088 System op.
0089 0089 Obudowa
0001 0001 Karta graficzna
0002 0002 Bateria
Tabela opisująca części jest w 2NF bo od klucza idczesci zależą pola w tabeliale nie jest w 3NF dlatego, że nazwa dostawcy nie należy do opisu części samochodowej
id producenta
nazwa producenta
adres producenta
0088 M$ USA
0089 Blacharnia Polska
0001 Nvidia USA
0002 Toshiba Japonia
Trzecia postać normalna (3NF)id
zamówieniaid
dostawcyid
częściilość
0001 222 0088 1
0004 111 0089 1
0007 456 0001 1
0010 768 0002 55
id dostawcy
nazwa dostawcy
adres dostawcy
222 M$ USA
111 Blacharnia Polska
456 Nvidia USA
768 Toshiba Japonia
id producenta
nazwa producenta
adres producenta
0088 M$ USA
0089 Blacharnia Polska
0001 Nvidia USA
0002 Toshiba Japonia
id części id producenta
nazwa części
0088 0088 System op.
0089 0089 Obudowa
0001 0001 Karta graficzna
0002 0002 Bateria
Wnioski
Trzecia postać normalna jest wystarczająca do większości zastosowań pozostałe postacie normalne stosuje się gdy wymagana jest większa optymalizacja.
W przedstawionym przykładzie zastosowaliśmy pewnego typu uproszczenie (swoją drogą często stosowane) a mianowicie wprowadziliśmy unikalne oznaczenia (id) dla elementów. Równie dobrze, można by zastosować klucz „nazwa dostawcy” zamiast „id dostawcy”. Można by też zbudować unikalny klucz składający się z większej liczby kolumn.
RozbudowaRozbudujmy poprzedni przykład pomijając klucze (id) i wprowadzając kupującego.Kolumny pokolorowane będą teraz oznaczały unikalne klucze dla tabeli.Wyjaśni nam to dlaczego tak zrobiliśmy (po części intuicyjnie) w poprzednim przykładzie.
nazwa dostawcy
adres dostawcy
M$ USA
Blacharnia Polska
Nvidia USA
Toshiba Japonia
nazwa dostawcy
nazwa części Ilość w magazynie
M$ System op. 11
Blacharnia Obudowa 24
Nvidia Karta graficzna 111
Toshiba Bateria 876
nazwa kupującego
adres
Kazio Emiraty A
Możliwość zamiennika – ta sama część
Czego jeszcze potrzeba ?
Elementu opisującego transakcję oraz upewnieniu się w której postaci normalnej jesteśmy (3NF).
nazwa dostawcy
nazwa części nazwa kupującego
Data transakcji Ilość
M$ System op. Kazio 2008-01-01 1
W tabeli mamy jednak nadal pewien problem, możemy zarezerwować kilka transakcji w tymSamym czasie dla tego samego kupującego (zakładając hh:mm:ss), co jest nierealne w rzeczywistym świecie.
UWAGAZakłada się, że w 3NF nie ma zależności przechodnich. Oznacza to, że brak jest sytuacji w której w tabeli z kolumnami X,Y,Z można przedstawić w następujący sposób X->Y, Y->Z z czego wynika X->Z. Jednak dotyczy to całego klucza i jest dopuszczalne występowanie zależności przechodnich gdy X nie jest kluczem.
Do takich zależności zależy też np. kolumna powierzchnia wyliczana na podstawieBoków kwadratu a i b.
Postać normalna klucza elementarnego
EKNF – Elementary Key Normal Form
Metoda ta jest bardzo subtelną modyfikacją 3NF i częściej jest zastępowana przez następną z postaci normalnych.
nazwa dostawc
y
nazwa części id części Ilość w magazynie
M$ System op. A01 11
Blacharnia
Obudowa B02 24
Nvidia Karta graficzna
C03 111
Toshiba Bateria C04 876
nazwa dostawc
y
id części Ilość w magazynie
M$ A01 11
Blacharnia
B02 24
Nvidia C03 111
Toshiba C04 876
id części nazwa części
A01 System op.B02 ObudowaC03 Karta
graficznaC04 Bateria
Postać normalna Boyce-CoddaBCNF – Boyce-Codda Normal Form
W tej postaci normalnej nie ma nietrywialnych (poza X->X) zależności a jedynie pomiędzy atrybutami a kluczem.
Przykład X->Y, Y->Z z opisowego przykładu już nie był by w postaci BCNF
Czwarta postać normalna (4NF)Problem wielowartościowych zależności.MVD - Multivalued Dependencies
Jeśli w jednym zamówieniu będziemy chcieli umieścić więcej elementów powstanie problem. Bo np. Dodając część musimy dodać od razu wydziały, w których zostanie zostanie wykorzystana (czyli więcej niż jeden wiersz).
wydział zadanie częśćA Z1 C1A Z1 C2A Z2 C3C Z3 C1
wydział zadanieA Z1A Z2C Z3
wydział częśćA C1A C2A C3C C1
4NF jest zawsze możliwa do osiągnięcia ale nie zawsze warto/jest potrzebna.
Piąta postać normalna (5NF)Project-join normal form (PJ/NF) - postać połączonej projekcji. Zakłada ona, że istnieją zależności nie tylko między kluczami i opiera się na bezstratnym połączeniu (JOIN).Stosowana gdy mamy problem n-stronny (n>2). Buduje się ją z 3NF przy założeniu, że klucze to pojedyncze kolumny.
kupujący sprzedawca Firma Roman Genowefa SuperRoman Stefania pol-exKazimierz Stefania Super
kupujący Firma Roman SuperRoman pol-exKazimierz Super
sprzedawca Firma Genowefa SuperStefania pol-exStefania Super
kupujący sprzedawcaRoman GenowefaRoman StefaniaKazimierz Stefania
UWAGAJest to silna zależność w której wykorzystane zostało połączenie JOIN
Można sobie wyobrazić iloczyn kartezjański tych zbiorów (bardziej jasne będzie to przy poznaniu zapytania SELECT) w którym otrzymamy zarówno poprawne wiersze jak i te niepoprawne (anomalia połączenia projekcji).
kupujący sprzedawca firma Roman Genowefa SuperRoman Stefania pol-exRoman Stefania SuperKazimierz Stefania Super
Postać normalna klucza domenyDKNF - Domain Key Normal Form
Wymaga się aby klucz w jednoznaczny sposób identyfikował wiersz aby była spełniona ta zależność (DKNF) powinny być spełnione:
- pole powinno być dobrze zdefiniowane - pole powinno być związane z obiektem który chcemy trzymać w tabeli - każde pole powinno być zależne od klucza - tabela powinna reprezentować jeden temat/rodzaj obiektów
Zatem na pewno odpadają tabele wielowartościowe, relacje przechodnie. Można stwierdzić że tabela powinna być w 5NF.
Niestety forma ta jest trudna do otrzymania w praktyce w dodatku zależy od intuicji ...
(6NF)
SQL and Relational Theory: How to Write Accurate SQL Code By C. J. Date (Appendix B)
Postać ta powstała w 2002 roku i ma na celu normalizacje danych mogących się zmieniać w czasie/zależeć od czasu.
Może to być np. tabela zawierająca informacje o zatrudnieniu jakiegoś pracownika i informacji od kiedy do kiedy jest on zatrudniony. Pojawia się tu też problem łączenia danych w blokach czasu (przedłużenie ciągłości zatrudnienia).
Obecnie dopiero powstają (brak chyba jeszcze jakiś standardów)Temporal database - Temporalna baza danych
DenormalizacjaDenormalizacja jest trudnym problemem, występuje tu zjawisko polaryzacji środowiska. Pojawiają się tu osoby silnie przestrzegające zasad normalizacji jak i takie które wręcz używają postaci nieunormowanych. Można by to przyrównać do fanatyków Linux'a lub Windows'a niemających pojęcia jeden o drugim.
Zatem kiedy stosować denormalizację ?
Z pewnością kiedy mamy problemy z wydajnością (długie oczekiwanie na generowanie raportów, wolne ładowanie strony etc.). Czasami denormalizacja potrafi znacznie podnieść taką wydajność, jednak mimo wszystko powinno się najpierw sprawdzić czy nasze zapytania na pewno są dobrze zoptmalizowane, czy indeksy są dobrze założone, czy system nie wymaga ''wyczyszczenia''. Zakłada się nawet (np. SQL... J.Celko), że denormalizacja powinna być przeprowadzana tylko i wyłącznie na hurtowniach danych (w przybliżeniu baza danych do odczytu).
Projektowanie bazy danych
Dodatki z literatury
● Oracle FAQ (http://www.orafaq.com) 2009.10.11
● Data Modeling and Relational Database Design English Student Subscription (20000GC13 Production 1.3 August 2002 D37098 Orcale)
Przykład projektu BD (popularne forum phpBB)
Modelowanie danych● Co będzie przydatne i kiedy: Normalizacja czy
Denormalizacja ? Jak ma się modelowanie do normalizacji ?
● Papier, Ekran, Paint czy specjalistyczne oprogramowanie (ER) ?
Model konceptualny >>>>>>> Model fizyczny
CDM – Conceptual Data ModelPDM – Physical Data Model
Encje, Atrybuty, Relacje
Encje - Entities
Czym jest encja ?
Encja powinna określać co w naszych danych jest istotne, godne przechowywania. Elementy te powinny być dobrze zdefiniowane, tak aby było możliwe ich rozróżnienie. Powinny to być informacje o obiektach takich które można umieścić w liście. Nazwy encji najczęściej przyjmuje się jako rzeczownik w liczbie mnogiej np. użytkownicy, przedmioty.Aczkolwiek są różne zdania. Ja wychodzę z założenia, że:● Należy na 100% stosować tą samą notację w całym projekcie.● Dostosować się do istniejącej notacji, notacji używanej przez grupę do której się dołączyło
UżytkownicyImięPESELData urodzeniaAdresUprawnienia
Encje zazwyczaj można utożsamiać z tabelami.
Encja a instancja Encji
Zbiór instancji encji
UżytkownicyImię RomanPESEL 64062687368Data urodzenia 1964-06-26Adres PoznańUprawnienia Użytkownik
Instancja encji
UWAGA !Bardzo często mówi
się o instancji encji, encja
Atrybuty - Attributes
Poszczególne atrybuty pozwalają na odróżnienie poszczególnych instancji encji.Podczas projektowania encji należy zaznaczyć który z nich jest identyfikatorem.Dopuszcza się też podanie domeny oraz typu atrybutu.Zatem atrybut jest: - własnością jednowartościową opisującą encje - reprezentuje jakiś ważny wycinek logiki - reprezentuje informację którą możemy opisać, klasyfikować, kwalifikować, podać ilość/wielkość oraz jest istotna z punktu widzenia encji.
UżytkownicyImię RomanPESEL 64062687368Data urodzenia 1964-06-26Adres PoznańUprawnienia Użytkownik
Na diagramie często wyświetlenie wszystkich atrybutów mogło by go zaciemnićWyświetla się wtedy tylko najważniejsze informacje (np. Klucze własne, obce)
Relacje - Relations
● Reprezentują fragment opisywanej rzeczywistości
● Opisują wzajemne relacje encji● Zawsze Istnieją pomiędzy dwoma encjami (albo
jednej podwójnie)● Mają dwie perspektywy● Są nazwane na obu końcach
Przykład● Pracownik ma stanowisko● Stanowisko jest utrzymywane przez
pracownika● Produkt jest klasyfikowany wedle typu
produktu● Typ produktu jest jest klasyfikacją dla
produktu● Ludzie robią rezerwacje● Rezerwacją jest robiona przez ludzi
● Wszyscy pracownicy mają stanowisko ● Nie ma pracownika bez stanowiska● Nie wszystkie stanowiska są obsadzone● Niektóre stanowiska są obsadzone więcej niż jednym
pracownikiem
Perspektywy
Czytanie relacji
Więzy - Constraints
● Unikalny identyfikator (UID - Unique Identifiers)● ARC Relationship
Unikalny identyfikatorJuż pojawiły się takie jak zestaw danych teleadresowych, unikalny numer (EAN, PESEL).Mogą być jeszcze (i wiele wiele innych):
ARC Relationship
Relacje tego typu opisują relacje pomiędzy relacjami wykluczającymi się np.
Numer konta bankowego może być firmowy albo prywatny, jednak nigdy na raz firmowy i prywatny
XOR 0 10 0 11 1 0
Dobre przykłady
Źle zdefiniowane
Ma należeć do jednej encji
Relacje powinny być tego samego typu
Przynajmniej dwie relacje
Ta może być ale mogą pojawić się problemy przy implementacji
Dodatkowe więzy integralności● Ważność wobec daty● Zakres parametrów
Diagramy związków encjiERD – Entity-relationship diagrams
● Modelują sferę ''biznesu'' a nie implementacje● Są techniką mającą dobrze zdefiniowaną
strukturę i składnię● Jako rezultat otrzymujemy diagramy ułatwiające
poznanie struktury
Diagramy związków encji
● Zawierają wszystkie informacje● Informacje występują tylko raz ● Jeśli informacje da się odziedziczyć z już
stworzonego modelu, nie jest ona powtarzana● Informacje znajdują się w odpowiednim miejscu
(logika)
ERD – Entity-relationship diagrams
Diagramy związków encjiERD – Entity-relationship diagrams
● Notacja Barkera (Oracle)● Notacja Martina (kruczej stopki -
Crow's Foot)● EER (Extended Entity
Relationship Diagrams)● UML
EER
EER [n:m]
Barkera
Crow's FootTODO:Błąd w oznaczeniu
1:1
1:n
n:m
Relacje n:m
Czy ten opis jest wystarczający ? Czy czegoś nie brakuje ?
Czy dodanie atrybutu poprawi naszą sytuacje oraz czy będzie zgodne z zasadami ?Najchętniej dodalibyśmy atrybut pośrodku a zatem ...
... powinniśmy utworzyć nową encje i zastosować relacje 1:n
Idąc dalej jeśli chcielibyśmy obsługiwać zamówienia składające się z większej liczby towarów
Słowniki danychTekstowy opis modelu, daje to możliwość umieszczenia danych, które zaciemniły by diagramLub nie ma możliwości ich zamieszczenia (dodatkowe więzy).
O ile w przypadku encji, atrybutów, relacji jest to oczywiste (tabela z opisem),To w przypadku dodatkowych więzów warto podać choć wyjaśniającą tabelkę
Sposób max_min_objętośćopis Zapewnia kontrolę objętości płynu.zawartość Pozwala utrzymać objętość w zakresie od
100l do 1000l
Manipulowanie danymiAlgebra Relacyjna
Algebra relacyjna jest podstawowym zbiorem operacji dla modelu relacyjnego.Za pomoc operacji należących do algebry relacyjnej użytkownik ma możliwość budowania zapytań wyszukiwania. Operacja może działać na jedną lub więcej istniejących relacji a wynikiem jest relacja.Operacje należące do algebry relacyjnej:
● Suma,● Różnica,● Część wspólna,● Iloczyn kartezjański,● Selekcja,● Projekcja,● Złączenie,
Relacja
Czemu nie ''tabela''. Otóż aby tabela mogła zostać nazwana relacją (będącą jedyna strukturą danych w modelu relacyjnym) musi spełnić następujące kryteria (już znane):
1) Każda tabela ma unikalną nazwę w obrębie bazy danych.2) Każda kolumna ma unikalną nazwę w obrębie tabeli.3) Wszystkie wartości w kolumnie są tego samego typu, w każdej tabeli jest co najmniej
jedna kolumna.4) Każdy wiersz jest unikalny w obrębie tabeli (nie ma dwóch takich samych). Tabela
może być pusta.5) Dane są atomowe (nie można przechowywać zbioru wartości).6) Kolejność nie jest istotna.7) Kolejność kolumny nie jest istotna.
Operacja sumy (łączenia)
Relacja wynikowa zawiera wszystkie wiersze z relacji wejściowych bez powtórzeń.Obie tabele (po za tym, że muszą być relacjami) muszą mieć identyczną strukturę (ale dopuszcza się różne nazwy kolumn).
R1 UNION R2 -----> RESULT
Operacja różnicy
Operacja różnicy tworzy relacje na podstawie dwóch relacji biorąc wszystkie wiersze w relacji pierwszej nie występujące w drugiej relacji.
UWAGA: Istotna jest kolejność podania relacji.
R1 DIFFERENCE R2 -----> RESULT1R2 DIFFERENCE R1 -----> RESULT2
Operacja przecięcia (część wspólna)
R1 INTERSECTION R2 ---> RESULT
Relacja wyjściowa zawiera wiersze wspólne dla obu relacji wejściowych.W tym przypadku struktura tabel też powinna być taka sama.
Operacja iloczynu kartezjańskiego
PRODUCT R1 WITH R2 ---> RESULT
Jako relacja wynikowa pojawia się tablica ze wszystkimi kombinacjami wierszy z jednej relacji z wierszami z drugiej relacji. W przypadku tej operacji nie jest wymagane aby relacje miały identyczne struktury
Operacja selekcji (ograniczenia)
RESTRICT R1 WHERE WAR -> RESULTDziałą na pojedynczą relacje zwracając relacje z ograniczoną liczbą wierszy do podanego warunku (np. Ograniczenie do jednego miasta Gdańsk relacji – zakładając, że istnieje kolumna odpowiedzialna za przechowywanie tego typu danych - miasto).
Operacja projekcji (rzutowania)
PROJECT R1 (COL LIST) -> RESULT
Operacja działa na atrybuty relacji, wybiera tylko zadane w liście kolumn (COL LIST)
Operacja złączenia (scalania)
Jako argumenty mogą być podane dwie relacje o różnych strukturach. Jako dodatkowe argument przyjmuje się nazwy kolumn, po jednej z każdej relacji (kolumny złączenia). Wartości z kolumn muszą pochodzić z tej samej dziedziny oraz warunek scalający nie musi być warunkiem równości. Najczęściej wybiera się kolumny będące też kluczami.
● Równozłączenie● Złączenie naturalne● Złączenie zewnętrzne● Lewostronne złączenie zewnętrzne● Prawostronne złączenie zewnętrzne● Obustronne złączenie zewnętrzne
Równozłączenie
EQUIJOIN R1 WITH R2 ON K1=K2 -> RESULT
W relacji wynikowej znajdują się tylko te wiersze z dwóch relacji, w których wartości w kolumnach złączenia są takie same .
Złączenie naturalne
JOIN R1 WITH R2 ON K1=K2 -> RESULT
Różni się od równozłączenia tym że eliminuje powtarzające się wiersze.
Integralność● Encji● Referencyjnej● Semantyczną (dziedziny)
Integralność encji
Już było !
Integralność referencyjna
Reguła określająca stan klucza obcego. Teoretycznie dopuszczalne są dwie wartości: może on przyjąć wartość klucza głównego albo wartość NULL. Ostatnia możliwość oznacz, że element nie ma reprezentanta . Przypadek taki występuje bardzo rzadko (np. drzewo) i nie jest on pożądany.
Zachowanie tego typu integralności możliwe jest na poziomie tworzenia schematu. Istnieją trzy możliwości wyboru:
●Zmiany ograniczone (RESTRICTED)●Zmiany kaskadowe (CASCADES)●Zmiany powodujące ustawienie NULL (NULLIFIES)
Jako przykład (użytkownicy+tematy)
Integralność semantyczna
Constrains – dodatkowe więzy brane pod uwagę przy zmianach w bazie danych, takie których nie da uwzględnić się w projektowanym diagramie.
np. - data związana z człowiekiem (> od urodzenia) - ograniczenie do poszczególnych miast
Ma to zabezpieczyć przed typowo ludzkimi pomyłkami.
Podstawy języka SQLSQL - Structured Query Language
IBM: Donald D. Chamberlin, Raymond F. Boyce wczesne lata 1970
Pierwszą firmą która zastosowała SQL w produkcie komercyjnym była Oracle
ROK Nazwa Uwagi1986 SQL-86 Pierwszy st.1989 SQL-891992 SQL-92 CROSS JOIN 1999 SQL:1999 Reg. Exp. Rekurencja, wyzwalacze, typy nieskalarne, OO2003 SQL:2003 XML, Kolumny z automatyczną generacją numeru2006 SQL:20062008 SQL:2008 TRUNCATE, dodatki do wyzwalaczy, ORDER BY
American National Standards Institute (ANSI)
(tyle ile będzie potrzeba aby zrozumieć niektóre akcje)
Rozwinięcia proceduralne
Wikipedia, hasło SQL (eng)
Na razie zaznaczam różnorodność, szczegóły później (tu albo następny semestr)
Alternatywy do SQL
Literatura uzupełniająca (do SQL):●Introduction to Oracle9i SQL English Instructor Subscription 40049GC11 Production 1.1 October 2001 D33996
●Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (SELECT), http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_10002.htm, 2009.10.18
LINQ Language Integrated QueryJPQL Java Persistence Query LanguageOQL Object Query Language
...i naturalnie wiele innych, te jednak zdobywają coraz większą popularność (szczególnie LINQ)
Składnia SQL
Pisanie zapytań SQL● Zapytania SQL nie są czułe na wielkość
znaków (aczkolwiek nazwy tabel mogą być)● Zapytanie może mieć więcej niż jedną linię● Słowa kluczowe nie mogą być ujęte w apostrofy
oraz nie mogą być dzielone między liniami● Warunki zazwyczaj umieszcza się w jednej lini● Zaleca się stosować formatowanie składni
(wcięcia, DUŻE/małe litery)
Kolejność operatorów
● Dzielenie i mnożenie ponad dodawaniem i odejmowaniem
● W przypadku tych samych operatorów działania wykonywane są od lewej do prawej
● Nawiasy aby wymusić kolejność i wprowadzić porządek ( ... jak w innych przypadkach tego typu)
Typ NULL i trzy stanowa logika
SQL,http://en.wikipedia.org/wiki/SQL,2009.10.18
Typy danych w OracleW bazie Oracle typ danych jest atrybutem kolumny (lub zmiennej). Określa on ty informacji w nich przechowanych. Typy można podzielić na trzy grupy
- Znakowe - Liczbowe - Pozostałe
Typy też są dostępne w PL/SQL (o czym później)
Znakowe typy danych
Character data types
● CHAR● VARCHAR2 (VARCHAR - dep.)● NCHAR● NVARCHAR2● LONG● CLOB● NCLOB
CHAR
Przechowuje od 1 do 2000 znaków. Domyślnie jeden znak. Baza danych Oracle wypełnia automatycznie pozostałe miejsca pustymi znakami. Jest to typ o stałej długości łańcucha znaków.
CHAR = CHAR(1)CHAR(10)CHAR(255)
Jako synonim dla tego typu: CHARACTER
VARCHAR2
W przeciwieństwie do poprzedniego umożliwia składowanie ciągów znaków o różnej długości. Podobnie jak poprzednio określa się długość tego typu jednak pola nie są dopełniane pustymi znakami. Typ może przechowywać do 1-4000 znaków.
VARCHAR(500)
Typ ten może być w niektórych przypadkach bardziej oszczędny jeśli chodzi o miejsce niż typ CHAR.
Istnieje jeszcze typ VARCHAR jednak Oracle zaleca porzucenie go na rzecz VARCHAR2 oraz nie zapewnia kompatybilności między tymi typami w przyszłości.
Synonimy: STRING, VARCHAR
NCHAR i NVARCHAR
Oba te typy są podobne do opisanych poprzednio jednak pozwalają przechowywać łańcuchy znaków w zestawie znaków innym niż domyślny dla bazy danych Oracle (ustawionym w konfiguracji).
Od wersji 9i można określać pola w liczbie znaków a nie bajtów
Od wersji 10g istnieje wsparcie dla wyszukiwania oraz akcentów
Zachęta:Zapoznać się z UTF8 - 8-bit Unicode Transformation FormatBOM - byte order mark (np. utf8 EF BB BF)
LONG, CLOB, NCLOB
Zawiera do 2GB danych znakowych już nie praktykowany. Typ ten ma pewne ograniczenia jeśli chodzi o zapytania SQL. Nie można tu stosować np.
GROUP BYORDER BYCONNECTED BYDISTINCT
Nie można też utworzyć indeksu na takiej kolumnie.
CLOB - Character Large ObjectNCLOB - National Character Large Object
Mogą zawierać do 4GB(128TB).
Typy te należą do typów LOB – Large Object
Liczbowe typy danych● NUMBER(p,s) np. NUMBER(10,-2)● DECIMAL● INTEGER● INT● SMALLINT● FLOAT● DOUBLE PRECISION● REAL● BINARY_FLOAT● BINARY_DOUBLE
daty● DD-MIE-RR GG:MI:SS MIE (3 lit skrót)● DATE● TIMESTAMP● TIMESTAMP (precyzja sek.) WITH {LOCAL}
TIMEZONE
Inne typy danych● RAW● LONG RAW
Typy nie interpretujące danych (surowe)
● ROWID
Pseudo kolumna zawierająca informacje o położeniu fizycznym danych (nie można jej zmieniać poleceniami SQL)
● ORA_ROWSCN
Pseudokolumna pozwalająca obserwować zmiany zachodzące podczas transakcji
● LOB● CLOB● NLOB● BLOB – Binary Large Object
● BFILE
Wskaźniki do plików poza bazą danych. Dane tylko do odczytu.
● XMLType
Wsparcie dla XML. Dane w CLOB
CREATE TABLE
Przykład tworzenia tabeliCREATE TABLE employees_demo ( employee_id NUMBER(6) , first_name VARCHAR2(20) , last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn NOT NULL , email VARCHAR2(25) CONSTRAINT emp_email_nn NOT NULL , phone_number VARCHAR2(20) , hire_date DATE DEFAULT SYSDATE CONSTRAINT emp_hire_date_nn NOT NULL , job_id VARCHAR2(10) CONSTRAINT emp_job_nn NOT NULL , salary NUMBER(8,2) CONSTRAINT emp_salary_nn NOT NULL , commission_pct NUMBER(2,2) , manager_id NUMBER(6) , department_id NUMBER(4) , dn VARCHAR2(300) , CONSTRAINT emp_salary_min CHECK (salary > 0) , CONSTRAINT emp_email_uk UNIQUE (email) ) ;
Wyświetlenie struktury tabeli
Szczegółowe informacje o tabeli● Każda baza danych ma inne rozwiązanie w
przypadku MySQL jest to konstrukcja SHOW CREATE TABLE [nazwa] lub dostęp do metadanych.
● W Oracle mamy dostęp do metadanych● SELECT * FROM user_objects WHERE
object_type = 'NazwaTabeli'; ● Lub informacje o samych kolumnach SELECT *
FROM user_tab_columns WHERE table_name = 'NazwaTabeli';
Tworzenie tabeli tymczasowej (Temporary Table)
● W Oracle służy do tego instrukcja CREATE GLOBAL TEMPORARY TABLE.
● np.CREATE GLOBAL TEMPORARY TABLE test( id INTEGER, test VARCHAR2(20),) ON COMMIT PRESERVE ROWS;
Wartości domyślne dla kolumn● Definiujemy za pomocą słowa kluczowego
DEFAULT● Po słowie kluczowym podajemy wartość
domyślną.● Możliwość wykorzystania niektórych
pseudokolumn takich jak SYSDATE● Domyślną wartością domyślną jest NULL
Możliwość szyfrowania kolumn● W bazach danych takich jak Oracle istnieje
możliwość szyfrowania poszczególnych kolumn bazy danych (słowo kluczowe ENCRYPT)
● Informacje o kolumnach szyfrowanych znajdują się w „user_encrypted_columns”
●
UWAGA: W przypadku Oracle najpierw trzeba utworzyć w systemie portfel pozwalający przechowywać informacje o systemie autoryzacji
Kolumny wirtualne● Nie wszystkie bazy danych pozwalają na
wstawianie tego typu kolumn● Kolumna wirtualna to taka, która odwołuje się
do innych kolumn w tabeli
Zmiany tabeli (ALTER)● Polecenie ALTER TABLE służy do wszelkich
zmian w obrębie tabeli takich jak:● Dodanie, usunięcie, zmiana kolumny● Dodanie, usunięcie, odblokowanie, zablokowanie
więzów● Zmiana nazwy● Każda baza danych ma jeszcze swoje dodatkowe
elementy, które można zmieniać np. dla MySQL ALTER TABLE ENGINE
WSTAWIANIE KOLUMNY● Dla tabeli TEST dodanie kolumny NOWA
wygląda następująco● ALTER TABLE TEST ADD NOWA INTEGER
● Po nazwie kolumny pojawia się definicja kolumny w takiej samej postaci jak w przypadku CREATE TABLE.
● Podobnie możemy postępować w przypadku kolumny wirtualnej, szyfrowanej, ...
MODYFIKOWANIE KOLUMNY
● Zmiany rozmiaru kolumny np. VARCHAR2(15) na VARCHAR2(20). UWAGA: Wartość może być zmniejszona tylko gdy kolumna nie zawiera wierszy lub są ustawione na NULL (Oracle). Podobnie w przypadku zmiany precyzji dla kolumny liczbowej
● Zmiana typu danych. Zmiany mogą być dokonane tylko w przypadku kiedy istnieje możliwość konwersji.
● ALTER TABLE tabela MODIFY kolumna VARCHAR(100)
● Usunięcie tabeli wymaga podania tylko nazwyALTER TABLE tabela DROP COLUMN kolumna
WięzyTu omówione tylko bardzo wstępnie. Właściwie z ograniczeniem do PK i FK i to też oględnie.
FOREIGN KEY
DODAWANIE WIĘZÓW● Więzy CHECK (dla kolumny liczba)
ALTER TABLE tabela ADD CONSTRAINT nazwa_wiezu CHECK(liczba IN (1,2,3,4,5));
● Więzy NOT NULL dla kolumny id● ALTER TABLE tabela MODIFY id
CONSTRAINT nazwa_wiezu NOT NULL;
WŁĄCZANIE WYŁĄCZANIE WIĘZÓW
● ALTER TABLE tabela ENABLE CONSTRAINT nazwa_wiezu;
● ALTER TABLE tabela DISABLE CONSTRAINT nazwa_wiezu;
● Mamy możliwość włączenia więzów ze sprawdzeniem tych co już były ENABLE VALIDATE (domyślnie) lub ze sprawdzeniem tylko nowo dodanych wierszy ENABLE NONVALIDATE
Więzy odroczone● Słowo kluczowe INITIALLY DEFERRED● Konstrukcja:● ALTER TABLE tabela ADD CONSTRAINT
nazwa_wiezu NOT NULL DEFERRABLE INITIALLY DEFERRED
● Tak dodane wiązanie nie będzie aktywny aż do wydania polecenia COMMIT.
● Często stosowane w przypadku kiedy w skrypcie SQL więzy nie są definiowane w odpowiedniej kolejności.
● Możliwość zmiany nazwy kolumny za pomocą polecenia RENAME dla ORACLE w przypadku np. MySQL realizujemy też za pomocą ALTER TABLE
● Pod tym względem (polecenie ALTER) różne systemy bazodanowe mogą posiadać drobne różnice !!
Obcinanie tabeli● TRUNCATE TABLE tabela;● Powoduje usunięcie wszystkich wierszy w tabeli
i przywrócenie (zależy od BD) ustawień dla wybranej tabeli.
● UWAGA: To polecenie ze względu na szybkość wykonania jest często używane zamiast polecenie DELETE należącego do zbioru poleceń manipulujących danymi DML. Polecenie truncate należy do DDL a zatem nie ma tutaj mowy o przywróceniu danych w obrębie transakcji !!
DROP TABLE● Usuwanie tabeli: DROP TABLE tabela;● W niektórych systemach istnieją konstrukcje
DROP TABLE IF EXISTS● Opcjonalne są też reguły (np. kaskadowo czy
restrykcyjnie).
Sekwencje● Sekwencje istnieją w większości baz danych.
Służą one do generowania sekwencji liczb rzeczywistych co wykorzystuje się najczęściej w przypadku klucza głównego.
● W bazie MySQL istnieje specyficzny typ dla kolumny AUTO_INCREMENT (nieudolnie wypełniając brak po sekwencjach)
Definicja● Najczęściej w systemach BD mamy do
dyspozycji● Nazwę● Liczbę początkową● Skok● Minimalną oraz Maksymalną wartość● Czy ma być cykliczna● Czy wartości mają być przechowywane w pamięci
podręcznej (tzw. CACHE)
Przykład wykorzystania sekwencji
SELECT
SELECT *|{[DISTINCT] column|expression [alias],...}FROM table;
SELECT - tablice do przykładów
SELECT – alias kolumn● Zmienia nagłówek(nazwę) kolumny● Przydatny podczas obliczeń na kolumnach● Występuje odrazu po nazwie kolumny
poprzedzony słowem kluczowym AS● Potrzebne ” ” gdy zawiera spacje lub ma być
czuły na wielkość liter
SELECT – znów o NULL
Operator złączenia● Łączy kolumny lub ciągi znaków w inną
kolumnę● Zapisuje się go jako: ||● Rezultatem działania jest ciąg znaków
UWAGA
RDBMS Operacja WynikOracle last_name||job_id PanX22Oracle last_name||NULL NULLPostgreSQL last_name||job_id PanX22FireBird last_name||job_id PanX22MySQL CONCAT(last_na,me||job_id) PanX22MySQL CONCAT(last_name, NULL) NULL
Zakładamy, że mamy wartości:
last_name = PanXjob_id = 22
Działanie w większości baz danych jest podobnie ale są odstępstwa, oraz przyzwyczajenia z innych programów (np. Język c++). Nie zawsze jest oczywisty wynik funkcji CONCAT w MySQL (większość spodziewa się PanX zamiast NULL, jednak to było by niezgodne ze sposobem traktowania wartości NULL)
Podwójne wiersze
Ograniczenie danych
WHERE i napisy/daty
- napisy/daty umieszczone w apostrofach ('jakiś tekst')- czułe na małe duże litery i format daty- domyślny format daty DD-MON-RR
Operatory porównania
Pozostałe operacje porównania
Użycie BETWEEN
Użycie IN
Użycie LIKE● Umożliwia podanie wzorca wyszukiwania w
ciągach znaków● Wzorzec może zawierać zarówno litery jak i
cyfry● Znak % oznacza dowolny ciąg znakó● Znak _ oznacza jeden znak
Dla wyszukania znaków % oraz _ należy użyć znaku ESCAPE
SELECT last_name FROM employees WHERE last_name LIKE '!%' escape '!';
Warunki dla NULL
Zastosowanie operatorów logicznych w ograniczeniu
WARUNEK
AND Zwraca prawdę gdy oba prawdziwe
OR Zwraca prawdę gdy jeden z dwóch prawdziwy lub oba prawdziwe
NOT Zwraca prawdę gdy nieprawdziwy
AND
OR
NOT
Kolejność wykonywania działań
ORDER BYMożna sortować: - ASC: rosnąco, ta wartość jest domyślna - DESC: malejącoSkładnia ORDER BY pojawia się ostatnio w składni SELECT
Sortowanie: malejące
Sortowanie po aliasie
Sortowanie po wielu kolumnach
Można też sortować po kolumnie, której nie ma zapytaniu SELECT
np.
SELECT * FROM tablica ORDER BY dbms_random.value
Wyświetlanie danych z wielu tabel
Iloczyn kartezjański jako efekt złego zapytania
Znaczenie konstrukcji● Optymalizator zwalnia nas z wnikliwego
analizowania zapytań w początkowej fazie, jednak tam gdzie wiemy jaki powinien być kierunek optymalizacji powinniśmy go napisać jawnie a nie liczyć na optymalizator.
● Dodatkowo, jeśli tworzymy rozwiązanie uniwersalne, działające na wielu systemach spełniających standardy SQL powinniśmy założyć różne optymalizatory (skrajnie ich brak ?!)
● Poniżej trywialny przykład pokazujący różnicę.
UWAGA !!!● Tam gdzie nie mamy pomysłu na optymalizacje
nie powinniśmy robić nic na siłę.● Optymalizator w takim przypadku w 99% będzie
dawał lepsze rezultaty) w szczególności biorąc pod uwag rozwój bazy danych (przyrost)
● Należy też zakładać rozwój optymalizatora w kolejnych wersjach systemów BD.
● CREATE TABLE a (id INT PRIMARY KEY);● CREATE TABLE b (id INT PRIMARY KEY, ida
INT NOT NULL );● INSERT INTO a VALUES(1);● INSERT INTO a VALUES(2);● INSERT INTO b VALUES(1,1);● INSERT INTO b VALUES(2,2);
Zaczerpnięte z 8.2.2. EXPLAIN Output Format (2013.02.17)http://dev.mysql.com/doc/refman/5.0/en/explain-output.html#explain_select_type
Typy złączenia
Oracle● Equijoin● Non-equijoin● Outer join● Self join
SQL: 1999● "Cross join"● "Natural join"● z zastosowaniem klauzuli
(np. ON)● Pełny albo dwustronny "outer
join"● dowolny warunek złączenia
("join") dla "outer join"
Składnia Oracle
Dostęp do przestrzeni tabel (spotykany w przypadku baz SQL)
tabela.kolumnanazwa_bazy_danych.tabela.kolumna
Warunek złączenia umieszczany jest w klauzuli WHERE
Equijoin
Stosowanie aliasów na tablice
Połączenie więcej niż jednej tablicy
Aby połączyć n tablic należy użyć minimalnie n-1 złączeń !
Non-equijoin
Outer join
Outer join (złączenie zewnęrzne) stosuje się wtedy gdy che się zobaczyć wiersze nie spełniające warunku.
W BD Oracle oznaczone jako (+)
Self joins - samozłączenie
Składnia SQL: 1999
CROSS JOIN
UWAGA: CROSS JOIN daje taki sam wynik jak iloczyn kartezjański dla dwóch tabel
NATURAL JOIN● Bazuje na kolumnach z obu tabel, które mają
takie same nazwy● Wybiera te wiersze, które mają te same
wartości we wszystkich pasujących kolumnach● W przypadku tych samych nazw a różnych
typów zwracany jest błąd
Składnia USING● Stosuje się tam gdzie nie można NATURAL
JOIN ale też NATURAL JOIN może być modyfikowany za pomocą USING
● Stosować należy do złączenia jednej kolumny gdy pasuje więcej
● Nie należy stosować aliasów ani nazw tablic dla kolumn
● NATURAL JOIN i USING wzajemnie się wykluczają
TODO: bardziej czyt. przykład
Złączenie z klauzulą ON● Bazuje na equijoin łącząc kolumny o tej samej
nazwie● Aby wybrać kolumny do złączenia lub jakiś
warunek złączenia stosuje się klauzule ON● Warunek złączenia jest odseparowany od
innych warunków wyszukania
INNER .vs. OUTER
Dołączanie dodatkowych warunków
Agregacja danych w SQL (podstawy - minimum)
● Klauzula GROUP BY i jej zastosowanie● Podstawowe funkcje agregujące COUNT, MAX, MIN, AVG● Klauzula HAVING i podstawowe zapytania z SELECT
(wszystko było na tablicy)
Funkcje w bazie Oracle
Typy funkcji
Funkcje działające na jeden wiersz● Zmieniają dane● Otrzymują argumenty, zwracają wartość● Działają na jeden wiersz po czym zwracają
wartość● Zwracają jedną wartość dlajednego wiersza● Mogą zmieniać typ● Mogą być zagnieżdżone● Argumentem może być kolumna albo wartość
Funkcje operujące na datach/czasie
● MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') --> 19.6774194● ADD_MONTHS ('11-JAN-94',6) --> '11-JUL-94'● NEXT_DAY ('01-SEP-95','FRIDAY') --> '08-SEP-95'● LAST_DAY('01-FEB-95') --> '28-FEB-95'
Funkcje jawnej konwersji typów
Oracle dokonuje niejawnie konwersji dla:
Przypisania
Wyrażeń
Jawnie
Istnieją jeszcze TO_NUMER, TO_DATE – tu chciałem tylko zaznaczyć problem konwersji !
Funkcja NVL● Konwertuje NULL na podaną wartość● Wartość może być: datą, ciągiem znaków,
liczbą całkowitą● Typy danych muszą się zgadzać ! Np.
NVL(hire_date,'01-JAN-97')
Podobne do NVL● NVL (expr1, expr2)● NVL2 (expr1, expr2, expr3)● NULLIF (expr1, expr2)● COALESCE (expr1, expr2, ..., exprn)
Podzapytania● Podzapytania to zapytania zawarte w innych
zapytaniach● W większości baz danych (w tym w Oracle)
podzapytanie może znaleźć się w klauzuli:● WHERE● FROM● SELECT
● Podzapytanie mogą być związane z innymi zapytaniami jak np. UPDATE (w tych przypadkach istnieją większe ograniczenia).
Zalety/Wady● Podzapytania pozwalają na prostszą bardziej
czytelną konstrukcję (SQL – strukturalny)● Nieumiejętnie utworzone podzapytania może
wpłynąć negatywnie na wydajność bazy danych lub podać dane o które nam nie chodziło.
Podzapytanie jako skalar● W najprostszym przypadku możemy sobie
wyobrazić zapytanie SQL, które zwraca dokładnie jeden wiersz i jedną kolumnę (a zatem skalar).
● SELECT * FROM tabela WHERE data = (SELECT sysdate FROM DUAL);
Podzapytania z ALL, ANY, SOME
Operator ALL przyrównuje z listą bądź podzapytaniemKonstrukcję:SELECT * FROM tabela WHERE pole > ANY(10,20)Można zapisać jakoSELECT * FROM tabela WHERE pole > 10 AND pole > 20
Podzapytanie może zatem wyglądać następującoSELECT * FROM tabela WHERE data >= ANY (SELECT daty FROM tabelaDat)
● W przypadku ANY w konstrukcji porównania nadal możemy używać >,<,= jak w ALL z tym, że warunek jest z operatorem OR (w przypadku ALL był to operator AND). Wybieramy zatem przynajmniej jeden z.
● SOME dokonuje dokładnie tego samego porównania co ANY
Podzapytanie z operatorem IN● Zgodnie z zasadą działania IN otrzymamy
wartość prawda jeśli w zbiorze zwróconym przez zapytanie znajdzie się chociaż raz wartość porównywana.
● Stwórzmy tabele Liczby z kolumną id dodajmy 5 wierszy jako kolejne liczby: 1,2,3,4,5
● SELECT 'jest' FROM dual WHERE 1 IN (SELECT id FROM Liczby);
● W tym przypadku zwróci napis jest, jeśli podali byśmy liczbę np.6 nie otrzymali byśmy w rezultacie ani jednego wiersza.
Podzapytania skorelowane (correlated subquery)
● Podzapytania skorelowane odnoszą się do tablicy zewnętrznejSELECT * FROM tabela1 WHERE pole1 IN(SELECT pole2 FROM tabela2 WHERE tabela2.id2 = tabela1.id1);
Podzapytania odnoszące się do wektora
● Dotychczas porównanie podzapytań odnosiło się do wartości skalarnych, SQL umożliwia wykonywanie zapytań porównujących wektor danych np.SELECT 'jest' FROM dual WHERE (2,4) = (SELECT 2,4 FROM dual);
Podzapytania w klauzuli WHERE (nested subqueries)
● W tym przypadku stosuje się podzapytania pozwalające na porównywanie z danym zbiorem danych (dotychczasowe przypadki podzapytań właśnie były w klauzuli where)
Podzapytania w klauzuli SELECT● Podzapytania w tej klauzuli muszą zwracać
wartość skalarną.● Aby uzyskać warunek pozwalający na to, że
zapytanie w sekcji SELECT zwróci jedną wartość, stosuje się funkcje agregujące.
●
Podzapytanie w klauzuli FROM (inline views)
● W tym przypadku podzapytanie można traktować jak tabelę (w uproszczeniu).SELECT * FROM (SELECT * FROM Liczby) AS AliasTabeli
Język manipulacji danymi DML - Data Manipulation Language
● INSERT● UPDATE● DELETE
Dodawanie wierszy
INSERT
INSERT INTO table [(column [, column...])]VALUES (value [, value...]);
INSERT
INSERT INTO departments(department_id, department_name, manager_id, location_id)VALUES (70, 'Public Relations', 100, 1700);
INSERT z NULL'ami
Wartości specjalne
Kopiowanie wartości z innej tabeliSkładnia
INSERT … SELECT … FROM
Konstrukcje wczytujące naraz n-wierszy
● MySQL/MSSQL 2008: dodawanie n-wierszy narazINSERT INTO tabela VALUES(1), (2), (3) … ;
● Oracle posiada konstrukcję● INSERT ALL
INTO tabela VALUES(1)INTO tabela VALUES(2) … SELECT * FROM dual;
● Zawsze (jeśli zależy nam na jednym zapytaniu) możemy użyć konstrukcji z UNION (ALL)
Rozwiązania pozwalające ładować wiersze z pliku
● Standardowe skrypty SQL (zawierające n-INSERT'ów)
● Duża część baz danych posiada składnię LOAD (czy to umieszczoną niejako składnie rozszerzającą SQL czy też w pakietach narzędziowych – wtedy dostępna tylko tam)
LOAD w oracle● LOAD DATA
INFILE <dataFile>APPEND INTO TABLE <tableName>FIELDS TERMINATED BY '<separator>'(<list of all attribute names to load>)
● W tym przypadku jest możliwość podania jak plik * i po linijce BEGINDATA można rozpocząć transmisje danych bezpośrednio.
LOAD DATAINFILE *INTO TABLE tabelaFIELDS TERMINATED BY '|'(id, data DATE 'yyyy.mm.dd')BEGINDATA1|2012.06.222|1999.11.11
LOAD w MYSQL● LOAD DATA INFILE 'c:\test.txt' INTO TABLE
test FIELDS TERMINATED BY ',' ;
● Plika test.txt zawiera dane rozdzielane przecinkami, struktura tabeli powinna być odpowiednia do danych
● W MySQL LOAD posiada bogaty wybór opcji.
BULK INSERT w MSSQL
BULKINSERT tabelaFROM 'c:\test.txt'WITH(
FIELDTERMINATOR = ',',ROWTERMINATOR = '\n'
)GO
● Przedstawione tutaj przykłady to jedne z możliwych rozwiązań bazy danych nie mają jednego wspólnego standardu ładowania dużej ilości danych, każda posiada rozwiązania własne umożliwiające wczytywanie konkretnych formatów pliku (np. XML, XLS), własne „loadery”
● Istnieje też możliwość tworzenia własnych „loaderów” danych.
Zmiana wartości w tabeli
UPDATE
UPDATE tableSET column = value [, column = value, ...][WHERE condition];
UWAGA na więzy
Usuwanie wierszy
DELETE
DELETE [FROM] table[WHERE condition];
DELETE
Więzy !