Bazy Danych (cz. 1) - dbserver.mif.pg.gda.pldbserver.mif.pg.gda.pl/wyk/dbora.pdf · postacie...

Preview:

Citation preview

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 !

Recommended