sql - nauka, SQL nauka, 4


4. STRUKTURALNY JĘZYK ZAPYTAŃ (SQL)

Kiedy E.F. Codd opublikował wstępną pracę o relacyjnych bazach danych w 1969 roku, został głośno zaatakowany jako heretyk przez konserwatywnych twórców baz danych. Jednak równocześnie wzbudził zainteresowanie szeregu znaczących twórców baz danych, włączając w to grupę IBM. W 1974 roku, około pięciu lat po pierwszej publikacji Codda, IBM stworzył swój projekt System /R, który był odpowiedzialny za projektowanie i tworzenie prototypowego systemu relacyjnej bazy danych. Specyfikacja Codda dla relacyjnych baz zalecał powstanie języka zapytań, który byłby jedyną drogą operowania danymi wewnątrz bazy danych. Tak więc część tego projektu, System /R zaprojektował język zapytań, który został nazwany SEQEL, później przemianowany na SQL inaczej strukturalny język zapytań.

SQL podobnie jak każdy standardowy język, ma być uniwersalnym rozwiązaniem dla wszystkich produktów na różnych platformach. Niestety, rozwój SQL-a doprowadził do powstania wielu dialektów, często wzajemnie sprzecznych.

4.1 Zalety i wady języka SQL

SQL cechuje zarówno wiele zalet, jak i kilka wad. Najpierw przytoczymy te gorsze cechy, później przejdziemy do lepszych. Pierwszy jest oczywiście jest to, że SQL nie jest jednym językiem, ale całą rodziną ściśle ze sobą powiązanych języków. Poza tym SQL nie do końca dotrzymuje zasad modelu relacyjnego. Model relacyjny został tak zaprojektowany, by być precyzyjnym i jednoznacznym modelem dla przetwarzanych danych. Kiedy SQL odchodził od modelu relacyjnego. Miał tendencje do wprowadzania dwuznaczności.

SQL, mimo że nie ustnego się błędów, jest obowiązującym standardem. Standard nawet zły jest lepszy od żadnego. SQL jako język jest jasny i łatwy do opanowania. Nawet osoby nie będące programistami mogą się nauczyć pisać w nim własne zapytania i raporty. Pomocny jest fakt, że zwykli użytkownicy mają dostęp do ich własnych danych wewnątrz bazy danych w efekcie otwiera to więzienie, w którym znajdują się informacje, co jest, zwłaszcza w biznesie, zaletą trudną do przecenienia.

4.2 Struktura SQL-a

Teraz pokażemy jak używać SQL-a dla implementacji przykładowych baz danych zaprojektowanych wcześniej. Wprowadzimy do tych baz danych, które następnie będziemy wybierać i modyfikować.

My nasze rozważania ograniczymy do głównych cech standardu SQL2. Nie będziemy się zagłębiać w szczegółowe właściwości języka, jednak informacje, które przytoczymy, pozwolą na wykonanie wszystkich zadań wymaganych przy tworzeniu i pracy z relacyjnymi bazami danych.

4. 3 Terminologia SQL-a

Podczas omawiania relacyjnych baz danych posługiwaliśmy się terminami: relacja, atrybut i krotka. SQL jednak nadaje odmienną nazwę każdej tych cech:

Ponieważ SQL nie dotrzymuje całkowicie zasad modelu relacyjnego, istnieją pewne różnice pomiędzy relacyjnymi określeniami relacji, atrybutu i krotki, a ich odpowiednikami w SQL-u.

Od tej pory posługiwać się będziemy terminologią SQL-a .

4.4 Słowa kluczowe SQL-a

SQL rezerwuje słowa dla własnego użytku - nazywane są one słowami kluczowymi. Nie można użyć słowa kluczowego dla nazwania bazy danych, tablicy lub kolumny ani żadnego innego "nazywalnego" elementu programu w SQL-u.

SQL2 określa ponad 300 słów kluczowych. Z tej szerokiej liczby słów kluczowych, potrzebne są jedynie te najbardziej użyteczne w codziennej pracy z SQL-em. Poniżej podajemy najbardziej powszechnie używane słowa kluczowe SQL-a.

Tabela 1. Najczęściej używane słowa kluczowe

ALL

COUNT

FETCH

INTO

ORDER

AND

CREATE

FLOAT

IS

PRECISION

ANY

CURRENT

FOR

KEY

PRIMARY

AS

CURSOR

FOREGIN

LANGUAGE

PRIVILEGES

ASC

DATE

FOUND

LIKE

PROCEDURE

AUTHORIZATION

DEC

FROM

MAX

PUBLIK

AVG

DECIMAL

GO

MIN

REAL

BEGIN

DECLARE

GOTO

MODULE

REFERENCES

BETWEEN

DEFAULT

GRANT

MONEY

REVOKE

BIT

DELETE

GROUP

NCHAR

ROLLBACK

BY

DESC

HAVING

NOT

SCHEMA

CHAR

DISYINCT

NULL

NUMERIC

SECTION

CHARACTER

DOUBLE

IN

OF

SELECT

CHECK

END

INDICATOR

ON

SET

CLOSE

ESCAPE

INSERT

OPEN

SMALLINT

COMMIT

EXEC

INTEGER

OPTION

SOME

COMTINUIE

EXIST

INTERVAL

OR

SUM

COUNT

FETCH

INTO

ORDER

TABLE

CREATE

FLOAT

IS

PRECISION

TIME

CURRENT

FOR

KEY

PRIMARY

TIMESTAMP

CURSOR

FOREGIN

LANGUAGE

PRIWILEGES

TO

DATE

FOUND

LIKE

PROCEDURE

UNION

DEC

FROM

MAX

PUBLIK

UNIQUE

DECIMAL

GO

MIN

REAL

UPDATE

DECLARE

GOTO

MODULE

REFERENCES

USER

DEFAULT

GRANT

MONEY

REVOKE

VALUES

DELETE

GROUP

NCHAR

ROLLBACK

VARCHAR

DESC

HAVING

NOT

SCHEMA

VIEW

DISYNCT

NULL

NUMERIC

SECTION

WHENEVER

DOUBLE

IN

OF

SELECT

WHER

END

INDICATOR

ON

SET

WITH

ESCAPE

INSERT

OPEN

SMALLINT

WORK

EXEC

INTEGER

OPTION

SOME

EXIST

INTERVAL

ON

SUM

Kod SQL- a jest nie wrażliwy na wielkość liter: „CHARACTER”, „character” i „chArActEr” są do niego równoważne. Zwyczajowo przyjęło się pisać słowa kluczowe SQL-a dużymi literami i nazwy tablic, a kolumn małymi, choć nie jest to wymagane.

4.5 Typy danych

SQL jak wszystkie języki, definiuje typy danych. Każdy typ danych rezerwuje zdefiniowaną wielkość pamięci i może przechowywać określony rodzaj danych. Typy danych SQL-a narzucają nie tylko różnorakie rodzaje danych, którymi program w SQL-u mogą operować, ale także to, jakie dane mogą być przechowywane w bazie danych. Typy danych określają pewne własności dotyczące dopuszczalne wartości danych w kolumnie. Każda wartość danych w kolumnie musi być takiego samego typu. Standard SQL definiuje około piętnastu typów danych, podzielonych na następujące grupy:

1. Typy napisowe (String)

a) Character (N). Napis znakowy o stałej długości. Jeżeli na wejściu znajdzie się napis o mniejszej długości niż N, to na końcu napisu są dodawane spacje.

b) Character varying (N). Napis znakowy o minimalnej długości 1 i maksymalnej długości określonej przez system. Jeżeli. na wejściu pojawi się napis o mniejszej długości określonej przez system. To jest przechowywana tylko właściwa długość napisu.

c) Bit. Napisy bitowe głównie używane dla danych graficznych i dźwięku.

d) Bif varying. Napisy bitowe zmiennej długości.

2. Typy liczbowe (Numeric)

a) Numeric. Synonim dla Decimal.

b) Decimal (M.,N). Liczba dziesiętna o długości M. Z N miejscami po przecinku dziesiętnym.

c) Integer. Liczba całkowita z zakresu wartości określonych przez system.

d) Smallint. Liczba całkowita z mniejszego zakresu wartości określonych przez system.

e) Float. Liczba przechowywana w reprezentacji zmiennopozycyjnej.

f) Real. Jest synonimem Float.

g) Double Precision.

3. Typy daty i godziny (Datetime)

a) Date. Daty określone przez system.

b) Time. Godziny określone przez system.

c) Timestamp. Daty i godziny z uwzględnieniem ułamków sekund.

4. Interval. Przedziały między datami.

Konkretne implementacje różnią się w realizacji tych typów danych.

4.6 Projektowanie bazy danych

Naszą bazą danych, którą będziemy wykorzystywać w przykładach, będzie baza zaprojektowana w poprzedniej części. Jest to baza danych zapisująca informacje o meczach piłki nożnej. Dzięki niewielkiej liczbie instrukcji SQL-a można w bardzo zwarty sposób programować systemy użytkowe baz danych. Instrukcje te mogą być wykonane na dwa sposoby: pierwszy polegający na pracy w trybie interakcyjnym i drugi polegający na wykonywaniu programów w języku SQL. Instrukcja języka SQL powinna być zakończona znakiem średnika ;

4.7 Instrukcje dla baz danych

W języku SQL bazą danych jest zbiór tablic zawartych w jednym katalogu, który powstaje w momencie tworzenia bazy. Każda baza musi być unikalna. Dla baz danych wykorzystuje się następujące instrukcje:

CREATE DATABASE nazwa_bazy_danych

tworzy bazę danych.

CONNECT DATABASE nazwa_bazy_danych

DISCONNECT DATABASE

Mówi, że kończymy pracę z bazą danych. Należy zakończyć pracę z daną bazą, aby rozpocząć pracę z

inną.

EXIT

Mówi programowi SQL, że praca zostaje z nim zakończona.

Aby zbudować naszą przykładową bazę danych musimy posłużyć się następującą

instrukcją:

CREATE DATABASE piłka_nożna;

4.8 Instrukcje dla tabeli

Jak już wcześniej zaznaczono, tablice odpowiadają relacjom. Jeden wiersz tablicy tworzy jedną krotkę relacji, a nazwy kolumn tablicy są atrybutami relacji.

Do operacji na tablicach są wykorzystywane następujące instrukcje: CREATE TABLE, INSERT TABLE, DROP TABLE, UPDATE TABLE.

4.8.1 CREATE TABLE: tworzenie tabeli

Instrukcja CREATE TABLE tworzy tabelę. Poniższy przykład przedstawia jego składnię, elementy ujęte w nawiasach są opcjami i nie zawsze są używane:

CREATE TABLE nazwa_tabeli (

nazwa_kolumny typ_kolumny[,]

...);

Ta instrukcja tworzy tabelę o nazwie nazwa_tabeli i nadaje typ każdej kolumnie określonej pomiędzy nawiasami. Każde zdefiniowane kolumny, z wyjątkiem ostatniego, musi być poprzedzony przecinkiem. Prawy nawias zamyka instrukcję.

Poniższy przykład pokazuje, w jaki sposób można utworzyć tabele dla bazy danych piłka_nożna przy użyciu podstawowej implementacji SQL-a:

CREATE TABLE drużyna (

nazwa_druż CHARACTER(15) NOT NULL,

miasto CHARACTER(15) NOT NULL,

stadion CHARACTER(30) NOT NULL,

liga CHARACTER(l) NOT NULL,

);

CREATE TABLE gra (

dnuż_gosp CHARACTER(15) NOT NULL,

druż_gości CHARACTF.R(15) NOT NULL,

bramki_gosp SMALLINT NOT NULL ,

bramki_gośći SMALLINT NOT NULL,

rozgrywki CHARACTER(1) NOT NULL,

data CHARACTER(10) NOT NULL,

numer SMALLINT NOT NULL,

);

SQL2 dodał klauzulę do instrukcji CREATE TABLE, która definiuje klucze tabeli. Poniżej przedstawiamy składnię instrukcji CREATE TABLE uwzględniając tę klauzulę:

CREATE TABLE nazwą_tabeli(

nazwa_kolumny typ_kolumny[,]...

[PRIMARYKEY(nazwa kolumny [,nazwa_kolumny,...])]

[FOREIGN KEY [nazwa_klucza] (nazwa_kolumny [,nazwa_kolumny ,...

)

REFERENCES nazwa_tabeli

[ONDELETE działanie ]]

);

Opcjonalna klauzula PRIMARY KEY nazywa kolumny obejmujące klucz podstawowy tabeli. Zauważmy, że kiedy wcześniej projektowaliśmy relacje, na których bazują tabele, niektórym nadaliśmy więcej niż jeden klucz podstawowy. Jest to rozbieżność pomiędzy teorią relacyjną i SQL-em. Jak można domyślić się, każdy wiersz w kolumnie musi mieć unikatową wartość dla swojego klucza podstawowego - deklaracja klucza podstawowego pozwala programowi sterującemu bazy danych wyegzekwować tę zasadę. Poza tym, kiedy deklarujemy klucz podstawowy dla tabeli, SQL pozwala zadeklarować klucze obce wskazując go z innych tabel.

Klauzula opcjonalna FOREIGN KEY definiuje klucz obcy. Jest ona bardziej złożona niż klauzula PRIMARY KEY:

następujące:

Aby klucz został zadeklarowany jako FOREIGN KEY, musi wskazywać zadeklarowany klucz podstawowy tabeli, do której ten klucz obcy się odwołuje. Wcześniej, kiedy projektowaliśmy relacje, na których tabele bazowały, zdefiniowaliśmy kilka kluczy obcych związanych z innymi kolumnami niż te, które były kluczami podstawowymi. Jest to całkowicie dozwolone przez teońę relacyjną, ale nie wykonalne w SQL-u. Takie klucze pozostają w naszych projektach, musimy je wdrożyć we własnym zakresie, jako część interfejsu użytkownika. Teraz omówimy składnię instrukcji CREATE TABLE. Dzięki temu dowiemy się, jak można tworzyć tabelę dla naszych danych piłki nożnej w pełnej wersji SQL-a:

CREATE TABLE drużyna (

nazwa_druż CHARACTER(15) NOT NULL,

miasto CHARACTER(IS) NOTNULL,

stadion CHARACTER(30) NOT NULL,

liga CHARACTER(1) NOT NULL,

PRIMARY KAY (nazwa_druż)

);

CREATE TABLE gra (

druż_gosp CHARACTER(15) NOT NULL,

druż_gości CHARACTER(15) NOT NULL,

bramki_gosp SMALLINT NOT NLL,

bramki_gości SMALLINT NOT NULL,

data CHARACTER(10) NOT NULL,

numer SMALLINT NOT NULL,

rozgrywki CHARACTER(1) NOT NULL,

PRIMARY KEY(druż_gosp, data, numer)

FOREIGN KEY GHAKEYI (druż_gosp) REFERENCES drużyna,

FOREIGN KEY GRAKEY2 (druż_gości) REFERENCES drużyna

);

4.8.2 CREATE INDEX : tworzenie indeksu

Instrukcja SQL-a CREATE INDEX tworzy indeks. Ma ona następującą składnię:

CREATE INDEX [UNIQUE] nazwa_indeksu

ON nazwa_tabeli (nazwa_kolumny[,...]

Słowa kluczowe CREATE INDEX pozwalają, by opcjonalnie występowało za nimi słowo kluczowe UNIQUE. Informuje ono SQL, że chcemy, aby ten index był unikatowy - nie mogą w nim wystąpić dwa wiersze zawierające tę samą wartość dla kolumny lub kolumn, dla których powstał indeks. Ten rodzaj indeksu daje wstępną grupę kluczy podstawowych, z zastrzeżeniem, że nie mogą być wskazane przez klauzulę FOREIGN KEY w innej tabeli.

Teraz zbudujemy indeksy dla naszej przykładowej bazy danych.

CREATE UNIQUE INDEX indexl ON drużyna ( nazwa_druż );

CREATE INDEX index2 ON drużyna (druż_gosp);

CREATE INDEX index2 ON drużyna ( druż_gość );

Użyliśmy słowa kluczowego UNIQUE dla oznaczenia, że indeks nie może zawierać takiej samej wartości dla kolumny bądź dla kombinacji kolumn. Trzeba pamiętać o tym, iż lepiej najpierw wprowadzić dane do tabeli a następnie budować indeksy. Oczywiście istnieje ryzyko, że instrukcja CREATE UNIQUE INDEX można błędnie utworzyć więcej niż jeden wiersz zawierający te same dane w nazwanej kolumnie lub kolumnach, ale dzieje się tak w przypadku, gdy najpierw tworzymy indeksy wówczas ładowanie danych może przebiegać niewłaściwie. Błędy w danych są zawsze problemem, kiedy ładujemy ogromne ilości do bazy danych.

4.8.3 DROP: usunięcie tabeli lub indeksu

SQL pozwala dodawać tabele i indeksy do bazy danych. Umożliwia również ich usuwanie.

Instrukcja DROP TABLE usuwa tabelę z bazy danych. ma ona następującą składnię:

DROP TABLE nazwa_tabeli [CASCADE\RESTRICT]

Słowo kluczowe DROP TABLE poprzedza nazwę tabeli, którą zamierzamy usunąć. Nazwa tabeli opcjonalnie może być rozszerzona słowami kluczowymi CASCADE lub RESTRICT.

W prezentowanym diagramie składniowym pionowa kreska | oznacza logiczną operację alternatywy wykluczającej ("albo...albo"): w tym przypadku można użyć słowa CASCADE lub RESTRICT lub też żadnego z nich. CASCADE oznacza, że program sterujący ma sprawdzić wszystkie tabele i usunąć te, których klucze obce odwołują się do usuwanej tabeli. Słowo kluczowe RESTRICT oznacza zaniechanie kasowania tabeli, jeśli choć jedna tabela ma połączenie z daną tabelą poprzez klucz obcy.

Instrukcja DROP INDEX usuwa indeks. Jego składnia jest następująca:

DROP INDEX nazwa indeksu;

4.8.4 GRANT i REVOKE: przyznawanie praw

Jako sposób na zabezpieczenie bazy, SQL pozwala nadawać i odbierać prawa innym użytkownikom systemu Linux. Przyznanie uprawnień odbywa się za pomocą instrukcji GRANT, a ich odebranie instrukcją REVOKE.

Składnia instrukcji GRANT:

GRANT uprawnienie [ ON nazwa tabeli ]

TO użytkownik [, użytkownik,...];

Nazwa_tabeli określa tabelę, do której zostają przyznane uprawnienia. Uprawnienie jest przyznawanym prawem, a użytkownik to identyfikator użytkownika, któremu przywilej został nadany.

Niektóre uprawnienia dotyczą tylko poszczególnych tabel, inne natomiast odnoszą się do całej bazy danych. Poniższe uprawnienia, które są definiowane w standardzie SQLI, przyznawane są dla pojedynczych tabel:

Te uprawnienia z pewnością wyglądają znajomo: odpowiadają one czterem kategoriom operacji na bazach danych. Każde jest także poleceniem SQL-a, które zostaną opisane w dalszej części naszej pracy. Przykładowo, użytkownik może posiadać uprawnienie SELECT dla wszystkich tabel całej bazy, ale UPDATE jedynie dla tej, która jest mu niezbędna do pracy.

Standard ANSI/ISO SQLI nie definiuje uprawnień odnoszących się do całej bazy danych. Definiowane są one natomiast przez poszczególne pakiety.

Poniższy przykład pokazuje, w jaki sposób nadane zostają niektóre przywileje

użytkownikowi Filip w bazie piłka_nożna :

GRANT CONNECT TO Filip

GRANT SELECT TO drużyna TO Filip

GRANT SELECT TO gra TO Filip

GRANT INSERT TO gra TO Filip

Powyższe polecenia pozwalają użytkownikowi Filip połączyć się z bazą danych, wybierać dane z obu tabel: gra i drużyna. Umożliwiają także wprowadzanie danych do tabeli gra co jest właściwe ze względu na to, że mecze odbywają się bardzo często. Natomiast nie ma tego prawa dla tabeli drużyna, która jest tabelą statyczną modyfikowaną bardzo rzadko.

Przywileje SQL-a są pomocne w ochronie integralności bazy danych. Jednak uprawnienia działają tylko wobec użytkowników zalogowanych w systemie, w którym jest osadzona. Praca w sieci wyostrza wszystkie problemy bezpieczeństwa baz danych, tak samo jak czyni to z innymi aspektami działania systemu Linux.

Instrukcja SQL-a REVOKE usuwa przywileje przyznane poleceniem GRANT. Jej składnia wygląda następująco:

REVOKE uprawnienie

FROM użytkownik [, użytkownik,...];

Uprawnienie dotyczy tego samego zakresu praw, które nadaje polecenie GRANT. Jak widać, nie można odebrać uprawnień tylko jednej tabeli. Nie jest możliwe cofnięcie prawa wybierania danych użytkownikowi Filip dla jednej tabeli i pozostawienie go w stosunku do pozostałych. W takiej sytuacji konieczne jest odebranie wszystkich uprawnień danego użytkownika i ponowne przyznanie tych, które nadal powinien posiadać. Jest to niezgrabna metoda, która jednak, pozwala ograniczyć błędy powstające przy przyznawaniu i odbieraniu uprawnień przez system cząstkowy.

4.8.5 INSERT: Wprowadzanie danych do bazy

Teraz, kiedy utworzone są tabele wewnątrz bazy, możemy dodać do nich dane.

Wprowadzanie wiersza do tabeli

Instrukcja SQL-a, INSERT, wprowadza dane do tabeli. Jego składnia przybiera kilka różnych form, które scharakteryzujemy po kolei.

Pierwsza forma instrukcji INSERT pozwala wprowadzać wartość bezpośrednio do tabeli:

INSERT INTO nazwa_tabeli

[(nazwa kolumny[,...])]

VALUES (wartość [,...]);

Ta forma umożliwia wprowadzenie jednego wiersza do tabeli, którego wartości będą zestawem wpisanych danych. Zmienna nazwa_tabeli nazywa tabelę, do której dane zostaną wprowadzane. Opcjonalna klauzula nazwa_kolumny nazywa kolumny wewnątrz tabeli nazwa_tabeli do której będą wprowadzane dane. Wszystkie kolumny nie nazwane tą klauzulą będą automatycznie zawierały wartość NULL. Jeśli klauzula nie zostanie użyta, wartości są wpisywane standardowo do każdej kolumny tabeli.

Klauzula VALUES podaje wartości, które są wprowadzane do tabeli nazwa_tabeli. Każdej kolumnie określonej w klauzuli musi być przypisana jedna wartość. Jeśli w poleceniu nie występuje klauzula nazwa_kolumny, każdej kolumnie w tej tabeli może zostać nadana tylko jedna wartość. Rodzaj danych każdej wartości musi odpowiadać typowi, jaki został nadany danym w kolumnie. Przykładowo nie można wprowadzić danych tekstowych do kolumny o zdefiniowanym typie danych INTEGER.

Następny skrypt wprowadza trzy rekordy do tabeli drużyna, bazy danych piłka_ nożna:

INSERT INTO drużyna (nazwa_druż, stadion, miasto, liga)

VALUES (`Legia `, `Łazienkowska' , `Warszawa' , 1)

INSERT INTO drużyna (miasto, nazwa_druż, liga, stadion)

VALUES (`Poznań' , `Lech' , `1' , `Bułgarska')

INSERT INTO drużyna

VALUES (`Ruch' , `Chorzów' , `Cicha' , `I `)

Każde z trzech poleceń INSERT wprowadza wartość do każdej z pięciu kolumn w tabeli drużyna. Musieliśmy to zrobić, ponieważ kiedy definiowaliśmy, tabelę drużyna, określiliśmy, że żadna z jej kolumn nie może zawierać wartości NULL.

Dwie pierwsze instrukcje INSERT wyraźnie nazywają kolumny. Pierwsza instrukcja, która wprowadza rekord dla Legi, nazywa kolumny w kolejności, w jakiej zostały zadeklarowane w instrukcji CREATE TABLE, tworzącej tabelę drużyna. W drugiej została zmieniona kolejność kolumn. Jak widać, instrukcja INSERT nie zwraca uwagi na kolejność kolumn, tak długo jak wartości podane w klauzuli VALUE występują w tej samej kolejności co kolumny określone w klauzuli nazwa kolumny.

Jak już wspomnieliśmy, jeśli kolumna w tabeli nazwa_kolumny akceptuje NULL (gdy nie użyta została klauzula NOT NLTLL podczas definiowania kolumny instrukcją CREATE TABLE tworzącej tabelę nazwa_tabeli), możemy ją wyłączyć z klauzuli nazwa_kolumny. Jeśli to zrobimy, SQL wprowadzi do takiej kolumny wartość NULL.

Transfer wartości z innej tabeli

Druga forma instrukcji INSERT umożliwia transfer wartości z jednej lub kilku innych tabel. Składnia wygląda następująco:

INSERT INTO nazwa_tabeli

[(nazwą_kolumny [, ...])]

SELECT wybór_polecenia

Ta forma instrukcji zastępuje klauzulę VALUE instrukcją SELECT (SELECT wybiera dane z tabel; wybrane dane są "wtłaczane" do wierszy, które polecenie zwraca - opisane to zostanie później). Wiersze, które zwraca instrukcja SELECT, zostają wprowadzane do tabeli nazwa_tabeli.

Kolumny w wierszach zwróconych przez SELECT muszą odpowiadać kolumnom z nazwa_tabeli, zarówno w odniesieniu do typów danych, jak i dziedziny. Jeżeli kolumna nie może akceptować wartości NULL, instrukcja SELECT nie może zwracać NULL dla tej kolumny.

Standard SQL-a charakteryzuje tylko dwie formy poleceni INSERT podane wyżej. Jednak większość pakietów SQL-a zawiera trzecią formę, która pozwala wprowadzać dane do tabeli bezpośrednio z pliku. Składnia tej instrukcji jest specyficzna i różni się w zależności od pakietu.

4.8.6 SELECT: Wybieranie danych z bazy danych

Teraz, kiedy zbudowana została baza i wprowadzone do niej dane, możemy zająć się odzyskiwaniem zgromadzonych danych (innymi słowy, uzyskiwaniem do nich dostępu).

Naszym zadaniem instrukcja SELECT jest sercem relacyjnej bazy danych. Może być ona niezwykle skomplikowana. Jednak jeśli opanuje się ją, opanuje się jednocześnie jeden z najważniejszych elementów SQL-a i modelu relacyjnego.

SQL i rachunek relacyjny

We wcześniejszym rozdziale omawialiśmy algebrę relacyjną i rachunek relacyjny. Te systemy matematyczne służą jako podstawa dla wszystkich języków, którymi "przepytujemy bazy danych.

Zarówno rachunek relacyjny, jak i algebra relacyjna, operują istniejącymi operacjami, żeby zbudować nową relację Różnią się jednak w opisie budowanych relacji. Algebra relacyjna jest nakazowa: definiuje osiem dyskretnych działań, którymi można modyfikować istniejące relacje, aby utworzyć nowe relacje. Rachunek relacyjny jest opisowy: pozwala określić jedną lub kilka istniejących relacji, następnie umożliwia opisanie relacji, które chcemy z nim utworzyć, bez szczegółowego nakazywania, w jaki sposób relacja ta ma być budowana.

Instrukcja SQL-a SELECT bazuje na rachunku relacyjnym. Jednak zawiera także cechy przeniesione z algebry relacyjnej, pomocne w rozwiązywaniu zawikłanych problemów.

Wybór z tabeli

W tym podrozdziale, scharakteryzujemy stopniowo instrukcję SELECT. Rozpoczniemy od najprostszej jej formy i kolejno będziemy przechodzić do bardziej złożonych.

Instrukcja SELECT w swej najprostszej postaci ma następującą składnię:

SELECT nazwa_kolumny

FROM nazwa_tabeli;

nazwa_kolumny określa kolumnę wewnątrz bazy danych.

nazwa_tabeli określa tabelę, wewnątrz której znajduje się ta kolumna.

Przykładowe wykorzystanie tej instrukcji w naszej bazie to:

SELECT nazwa_druż

FROM drużyna;

Oto postać wyniku na ekranie:

|nazwa_druż |

|-----------------|

|Legia |

|Lech |

|Ruch |

|-----------------|

Wybór wielu kolumn

Kiedy poznaliśmy już podstawową formę instrukcji SELECT, czas przejść do jej bardziej rozbudowanej postaci.

Możliwe jest użycie instrukcji SELECT do selekcji wielu kolumn znajdujących się wewnątrz bazy. Składnia tej instrukcji ma postać:

SELECT nazwa_kolumny [, ...]

FROM nazwa_tabeli;

Jedna uwaga: w większości implementacji SQL-a pojedyncza gwiazdka (*) w klauzuli nazwa_kolumuy jest synonimem wszystkich kolumn w tabeli lub tabel nazwanych w klauzuliFROM

Poniżej przedstawiono przykładowe wyniki instrukcji wybierającej nazwy drużyny i ich lig z naszej przykładowej bazy:

SELECT nazwa, liga

FROM drużyna ;

Wynik:

| nazwa | liga |

|----------|------|

|Legia |1 |

|Lech |1 |

|Ruch |1 |

Budowanie nowej tabeli

Można zauważyć, że efekt wyjściowy instrukcji SELECT ma postać wierszy i kolumn: jedna kolumna dla każdej określonej kolumny w klauzuli nazwa_kolumny polecenia i jeden wiersz dla każdego wiersza w tabeli, z której wybierane są dane. Jest to bardzo ważny punkt: podobnie jak każde działanie w algebrze relacyjnej i rachunku relacyjnym tworzy w efekcie nową relację, tak samo instrukcja SELECT tworzy nową tabelę. Kolumny tej nowej tabeli są zdefiniowane przez klauzule tabeli: nazwa_kolumny i FROM. Wiersze są zdefiniowane przez klauzulę WHERE, której szczegółowy opis znajduje się w następnym podrozdziale.

Nowa tabela nie jest dodawana do bazy danych. Raczej jest zwracana do tego programu, który użył instrukcji SELECT dla wybrania danych z bazy.

Jak już wiemy, można osadzić instrukcję SELECT wewnątrz INSERT w celu zapełnienia tabeli wewnątrz bazy danych z bazy. Następny przykład dodaje nową tabelę do bazy danych i używa instrukcji SELECT w celu jej wypełnienia:

CREATE TABLE temp_drużyna(

nazwa CHAR(15) NOT NULL,

liga CHAR(1) NOT NULL

);

INSERT INTO temp_drużyna (nazwa, liga )

SELECT nazwa, liga

FROM drużyna;

Instrukcja INSERT przekazuje efekt wyjściowy instrukcji SELECT do nowo powstałej tabeli temp drużyny.

Warto zauważyć, że liczba kolumn wewnątrz instrukcji SELECT i typ każdej kolumny muszą

odpowiadać tabeli, w której zostaną umieszczone, w przeciwnym razie SQL zgłosi błąd.

4.8.7 Klauzula warunkowa WHERE

Jak dotąd, używaliśmy instrukcji SELECT do wybierania poszczególnych kolumn i tabeli. Każdy z przykładów wybierał wszystkie wiersze z danej tabeli. Instrukcja SELECT pozwala jednak budować filtry umożliwiające precyzyjne określenie wierszy, które chcemy wydobyć z tabeli. Instrukcja SELECT zawiera klauzulę o nazwie WHERE, która wdraża ograniczenie Poniższy przykład przedstawia składnię instrukcji SELECT uwzględniając tę nową klauzulę:

SELECT nazwa_kolumny\stała\wyrażenie [, ...]

FROM nazwa_tabeli

[WHERE wyrażenie warunkowe ];

Wyrażenie_warunkowe jest frazą kodu, które używa operatora do modyfikowania stałej, nazwy kolumny lub efektu wyjściowego. Program w SQL-u może używać wyrażenia do obliczania wartości, której użyje do sterowania wyborem danych z bazy. Tak więc, wyrażenie pojawia się bardzo często w klauzuli WHERE instrukcji INSERT, DELETE lub SELECT.

Przed przedstawieniem wyrażeń używanych w klauzuli WHERE musimy wprowadzić dwa z elementów, które składają się na wyrażenie. Chodzi tu o stałe i operatory.

Stałe

SQL, tak jak większość innych języków, pozwala używać stałych wewnątrz wyrażenia. Są cztery rodzaje stałych: arytmetyczne, łańcuchy, daty/czasu i symboliczne.

Stała arytmetyczna, jest liczbą. Może być liczbą całkowitą stałą lub liczbą zmiennoprzecinkową. Liczby ujemne muszą być poprzedzone znakiem minus (-). Liczby dodatnie może poprzedzać plus (+), ale nie jest to konieczne.

SQL implementuje zasady, mówiące jak przedstawić działania arytmetyczne na stałych i które mogą być porównywane z którymi kolumnami:

Stała łańcuchowa (tekstowa) jest łańcuchem zamkniętym wewnątrz apostrofów. Standard ANSI/ISO dla SQL-a wymaga, aby stałe łańcuchowe ujęte były w apostrofy. Wstawienie apostrofu wewnątrz stałej łańcuchowej wymusza wstawienie dodatkowego apostrofu przed kolejnym łańcuchem.

`To jest apostrof ” wewnątrz łańcucha'

Stałe daty i czasu są łańcuchami, które określają datę i czas. Stałe te można porównywać z zawartością kolumn, które zawierają dane typu data lub czas.

Niestety, format zapisu łańcuchów daty i czasu jest bardzo zróżnicowany, w zależności kraju i używanego pakietu bazy danych.

Stała symboliczna reprezentuje pewną wartość, stałą dla systemu w momencie jego używania. Przykładowo, stałą symboliczną może być nazwisko osoby, która właśnie używa systemu lub bieżąca data.

Równie nieszczęśliwie jak w przypadku daty, stałe symboliczne są bardzo zróżnicowane w zależności od pakietu, z którym pracujemy.

Operatory

Operator, jest czasownikiem wyrażenia: mówi wyrażeniu, co należy zrobić. SQL zawiera operatory które odpowiadają działaniom arytmetycznym oraz takie, które dokonują porównań. Operator arytmetyczny daje jako efekt wyjściowy (wynik) liczbę, podczas gdy operator relacji wynik logiczny ( TRLTE, FALSB, NULL ).

Operatory arytmetyczne.

SQL rozpoznaje następujące operatory arytmetyczne:

+

Dodawanie

-

Odejmowanie

*

Mnożenie

/

Dzielenie

Powyższe operatory są akceptowane przez wszystkie implementacje SQL-a. Niektóre posiadają także własny zestaw operatorów:

%

Modulo

II

Konkatencja

Operatory arytmetyczne mogą być używane jedynie z numerycznymi typami danych - nie mogą to być łańcuchy, daty i inne typy nienumeryczne.

Operatory relacji

Następujące operatory pozwalają porównywać wyrażenia SQL-a:

=

Równy

<>

Nierówny

<

Mniejszy

<=

Mniejszy lub równy

>

Większy

>=

Większy lub równy

Każde wyrażenie, które jest budowane wokół operatorów relacji, zwraca wartość logiczną jako wynik- TRUE, FALSE lub NLTLL.

Operatory BETWEEN i IN

Operatory BETWEEN i IN dają możliwość porównania wartości pól z listy elementów.

Można ich używać z elementami numerycznymi lub łańcuchami.

Operator BETWEEN

Operator ten daje łatwą metodę sprawdzania, czy kolumna zawiera się w pewnej grupie wartości. Składnia wygląda następująco:

kolumna BETWEEN element AND element

Przykładowo, jeśli bramki_gosp jest kolumną numeryczną można użyć następującego wyrażenia dla sprawdzenia, czyjej wartość zawiera się pomiędzy 1 i 3:

bramki_gosp BETWEEN 1 AND 3

Można użyć dla sprawdzenia, czy łańcuch leży pomiędzy ( wewnątrz ) danym zakresem znaków leksykalnych.

BETWEEN można również zastosować do sprawdzenia, czy dana data zawiera się pomiędzy dwiema innymi.

Warto zauważyć, że element użyty w operatorze BETWEEN jest zwykle stałą, ale może być wyrażeniem. Jednak nie często stosuje się taką kombinację, ponieważ jeśli element przyjmuje logiczną wartość NULL, trudno przewidzieć, jaki będzie wynik tego wyrażenia. jest to w części powodem tego, że zasady SQL-a standardów ANSI/ISO, które kierują tym jak BETWEEN operuje wyrażeniami NULL, są dość złożone w części dlatego, że w sposób sprzeczny są implementowane w różnych pakietach.

Operator IN

Operator ten sprawdza, czy wartość kolumny odpowiada wartości z listy. Ma następującą składnię:

kolumna IN (element, element, ...)

Każdy element z listy musi odpowiadać typowi danych zawartych przez kolumnę - numeryczne, tekstowe lub typu data. Następujące wyrażenie sprawdza, czy wartość kolumny bramki_gosp odpowiada trzem podanym wartościom:

bramki_gosp IN (1, 2, 5)

Jest to jednoznaczne z wyrażeniem:

bramki_gosp = 1 OR bramki_gosp = 2 OR bramki_gosp = 5

Ponownie, kolejne wyrażenie kontroluje, czy kolumna nazwa_druż przyjmuje jedną z zadanych wartości:

nazwa_drużyny IN(`Legia' , `Ruch' , `Widzew' , `Pogoń' )

Element w liście może samym być wyrażeniem, ale nie stosuje się tego, ponieważ takie rozwiązanie niesie ze sobą więcej problemów niż przynosi korzyści.

Operator LIKE

Operator LIKE jest używany wyłącznie z łańcuchem. Sprawdza, kiedy łańcuch jest równoznaczny z podanym wzorcem łańcucha. Oto jego składnia:

kolumna LIKE wzorzec

Wzorzec łączy stały łańcuch ze znakami zastępującymi. SQL rozpoznaje dwa znaki zastępujące:

Jeżeli znamy zagadnienia z UNIX-owym shellem, pomocne może być nam takie porównanie: `%' jest odpowiednikiem shellowym znaku `*', a `_' odpowiada `?'.

Pojawia się jednak pytanie: co zrobić, gdy chcemy znaleźć łańcuch zawierający `%' lub `_' ? W większości przypadków nie jest to problem, gdyż `%' oznacza każdą grupę znaków włączając w to `%', a `_' każdy pojedynczy znak wraz z `_'. Nie da się jednak zagnieździć `%' i `_' wewnątrz łańcucha i oczekiwać, że operator LIKE będzie traktował je jako stałe. SQL opisuje klauzulę ESCAPE, za pomocą której możliwe jest definiowanie symbolu zastępującego znak wypełniający. To znaczy, ze poprzedzenie znaku wypełniającego znakiem zastępującym mówi operatorowi LIKE, że ma traktować znak wypełnienia dosłownie (literalnie) jako dany znak.

Operator IS

Ostatnim operatorem, który poznamy jest operator IS. Nie jest on właściwie operatorem relacji, sprawdza tylko, czy dana kolumna ma wartość NULL. Operator IS może być użyty do sprawdzenia, czy logiczny wynik operacji porównania być NULL. Jednak operacje porównawcze zwracają NULL tylko wówczas, jeśli jedna z kolumn podlegająca porównaniu sama była NULL. Tak więc zastosowanie tego operatora ma sens wówczas, gdy sprawdzamy, czy kolumna jest NLTLL. Raczej nie stosuje się go do sprawdzenia wyniku wyrażenia zawierającego daną kolumnę. Wyrażenia w SQL-u są używane do oceny czy zawartość danej kolumny wewnątrz bazy danych spełnia pewne ustalone kryteria. Tak więc każde wyrażenie dostarcza określoną wartość: TRLTE FALSE lub NULL. Jak to zostało wcześniej pokazane, ten wynik kieruje tym czy dane polecenie SQL-a jest wykonywane dla określonego wiersza wewnątrz bazy. Każde wyrażenie jest budowane wokół operatora. Operator, z kolei, działa na jednym lub kilku operandach. Operand może być kolumną (mówiąc precyzyjnie: zawartością kolumny), stałą lub wynikiem innego wyrażenia. Jeśli operandy wyrażenia zawierają jedynie kolumny lub stałe, wyrażenie nazywane jest prostym. Jeśli jeden lub więcej operandów stanowią inne wyrażenia wewnątrz siebie. Dlatego, pomimo że SQL oferuje tylko garstkę operacji i stałych, można utworzyć bardzo dokładne testy dla stałych z jednej lub więcej kolumn wewnątrz bazy danych. Złożone wyrażenie może być rzeczywiście złożone.

Wyrażenia proste

W tym punkcie pokażemy, w jaki sposób wyrażenia są używane wewnątrz wyrażenia SELECT.

Proste wyrażenie porównuje dwie kolumny lub porównuje kolumnę z jedną lub kilkoma stałymi. Na przykład, jeżeli kolumna bramki_gosp zawiera wartość numeryczną, poniższy zapis sprawdzi, czy liczba punktów była mniejsza lub równa 3:

bramki_gosp <= 3

Demonstruje to poniższy zapis:

SELECT druż_gosp, bramki_gosp

FROM gra

WHERE bramki_gosp <= 3;

Jeśli kolumna bramki_gosp dla wiersza, który jest właśnie badany, zawiera wartość mniejszą lub równą 3, wyrażenie to odpowie TRUE. Jeśli bramki_gosp wewnątrz tego wiersza jest wartością większą niż 3, wyrażenie to odpowie FALSE. Jeśli bramki_gosp nie sprowadza się do żadnej wartości, czyli jest NULL, wtedy wyrażenie odpowiada NULL.

Dodatkowo w celu porównania wartości kolumny ze stałą wyrażenie może porównywać wartości z dwóch kolumn. Na przykład, następujące wyrażenie sprawdza czy wartość przechowywana w wierszu bramki_gosp, która właśnie jest badana, przechowuje wartość, większą niż ta przechowywana przez bramki_gości:

bramki_gosp > bramki_gości

Przedstawia to poniższy zapis:

SELECT druż_gosp, data

FROM gra

WHERE bramki_gosp > bramki_gości;

Jeśli wartość, dla której bramki_gosp jest większa od wartości, do której przypisana jest bramki_gości, wtedy to wyrażenie odpowiada TRUE. Gdy, wartość ,dla której bramki gosp jest mniejsza od wartości, do której przypisana jest bramki_gości, wtedy to wyrażenie odpowiada FALSE. Jeśli jednak ani bramki_gosp, ani bramki_gości nie mają żadnej wartości - są NULL wtedy to wyrażenie odpowiada NULL.

Wyrażenia SQL wdrażają trójwartościową logikę modelu relacyjnego: każde wyrażenie może być TRUE lub FALSE lub może odpowiedzieć NULL, jeśli jeden z jego operandów jest NULL. Kiedy pisze się wyrażenie w SQL-u, trzeba być przygotowanym na fakt że może ono zwrócić jeden z trzech logicznych rezultatów, nie jeden z dwóch, jak w większości innych języków komputerowych.

Wyrażenia złożone

Jak już mówiliśmy w wyrażeniu złożonym operand sam w sobie jest wyrażeniem. W większości przypadków podwyrażenie będzie uwzględniało operator arytmetyczny. Rozważamy ponownie następujące wyrażenie:

bramki_gosp > bramki_gości

Powiedzmy jednak, że chcielibyśmy dowiedzieć się nie tego, czy bramki_gosp były większe niż bramki_gości, ale czy bramki_gosp było w połowie tak duże jak bramki_gości. Aby to określić, trzeba najpierw podzielić bramki_gości przez 2 i wtedy porównać rezultat z bramki_gości, jak poniżej:

bramki_gosp > (bramki_gości / 2)

Wykonać to powinniśmy następująco:

SELECT druż_gosp, bramki_gosp, druż_gości, bramki_gości

FROM gra

WHERE bramki_gosp > ( bramki_gości / 2 );

Nawiasy wskazują na to, że operacja arytmetyczna ma zostać wykonana przed porównaniem. W powyższym przykładzie nie jest to konieczne, ale nawiasy czynią wyrażenie łatwiejszym do czytania.

Operatory AND oraz OR

Operatorów logicznych AND oraz OR można używać w celu połączenia wyrażeń. Każdy z tych operatorów logicznych ma dwa operandy. Każdy zwraca logiczną wartość, która zależy od logicznej wartości swoich operandów. Poniższe tabele są tabelami prawdy dla operacji AND oraz OR.

AND

T

F

M.

F

F

F

F

M

M

F

M

OR

T

F

M

T

T

T

T

F

T

F

M

M

T

M.

M

Wybory z wielu tabel

Aby użyć więcej niż jednej tabeli, w wyrażeniu SELECT dodać trzeba dwa elementy do jego składni:

Z tymi dodatkami instrukcja SELECT ma następującą składnię:

SELECT nazwa_kolumny\stała\wyrażenie arytmetyczne [, ...]

FROM nazwa_tabeli [,...]

[ WHERE wyrażenie_ograniczające ]

[ wyrażenie_ łączące ];

Wyrażenie_łączące opisuje połączenia między tabelami. Zwykle daje to obcy klucz, który wiąże tabele (ale nie zawsze).

Najlepszą metodą na uchwycenie sposobu w jaki działa połączenie wielu tabel, jest zobaczenie tego na przykładzie. Nasz przykład drukuje wszystkie mecze rozgrywane na stadionie

SELECT stadion, druż_gosp, dnruż_gości, bramki_gosp, bramki_gości, data

FROM drużyna, gra

WHERE stadion = `Cicha'

AND

drużyna . nazwa = gra .druż_gosp;

A oto przykładowy wynik:

|stadion |druż_gosp |druż_gości |bramki_gosp |bramki_gości |data |

|----------|--------------|-----------------|-----------------|------------------|--------------|

|Cicha |Ruch |Legia | 2 | 1 | 20-08-98 |

|----------|--------------|-----------------|-----------------|------------------|--------------|

Klauzula drużyna.nazwa = gra.druż_gosp jest wyrażeniem łączącym - pokazuje, w jaki sposób są połączone tabele drużyna i gra. Uwzględniliśmy nazwę tabeli w tym warunku, aby uczynić go bardziej przejrzystym, nie musieliśmy jednak tego robić, jako że nazwy kolumn nie są dwuznaczne.

Jeśli pamiętamy wykład na temat algebry relacyjnej z poprzedniej części pracy, możemy zobaczyć, że powyższa instrukcja SELECT wykonuje następujące działania algebraiczne, z których buduje swój wynik końcowy:

1. Używa operacji iloczynu kartezjańskiego do zbudowania drugiej tymczasowej

tabeli, której zawartość łączy zawartość tabel gra i drużyna.

2. Używa operacji ograniczenia do zbudowania drugiej tymczasowej tabeli z tabeli budowanej w kroku 1. Ta nowa tymczasowa tabela zawiera tylko wiersze, w których kolumna stadion równa się ciągłemu łańcuchowi "Cicha".

3. Ponownie używa operacji ograniczenia do zbudowania trzeciej tymczasowej tabeli z tabeli budowanej w tabeli w kroku 2. Ta nowa tymczasowa tabela zawiera tylko wiersze, w których wartość kolumny nazwa równa się wartości z kolumny druż_gosp.

4. Ostatecznie program sterujący SQL-a używa operacji projektu do zbudowania jeszcze jednej tymczasowej tabeli - tym razem z tabeli budowanej w kroku 3. Ta tabela tymczasowa składa się z kolumn stadion, druż_gosp, druż_gości, bramki_gosp, bramki_gości i data, w tym porządku.

Ostateczna tabela tymczasowa zbudowana za pomocą operacji projektu, jest tą którą program sterujący SQL-a formatuje i wyświetla na ekranie. Program sterujący SQL-a wyrzuca wtedy wszystkie tabele tymczasowe zbudowane w trakcie procesu.

Związki

Instrukcja SELECT może stać się bardzo skomplikowana. To z kolei oznacza, że nie możemy usunąć z niego błędów, ponieważ nie możemy zrozumieć, co instrukcja ta ma wykonać.

Klauzula UNION łączy ze sobą w jedną tabelę wynik z jednego lub więcej instrukcji . SELECT. Ta klauzula pozwala na uporanie się ze złożonymi problemami przez napisanie serii prostych wyrażeń SELECT i scalenie ich ze sobą.

Po dodaniu tego warunku składnia wyrażenia SELECT wygląda następująco:

SELECT nazwa_kolumny\stala\wyrażenie arytmetyczne [, ...]

FROM nazwa_tabeli [,...]

[ WHERE wyrażenie_ograniczajace] [wyrażeni_łączące] [UNION

SELECT polecenie_wyboru ];

Rozważamy, na przykład, problem związany z rozgrywkami. Klauzula UNION pozwala na napisanie dwóch prostych wyrażeń SELECT - jednego dla Legii jako gospodarza, drugiego dla przeciwnika, czyli dla gości - później połączymy wyniki w jedną tabelę, która wyświetlana jest na ekranie. Poniższa instrukcja SELECT wdraża tę strategię:

SELECT druż_gosp, bramki_gosp, druż_gości,

bramki_gości, data, liga, rozgrywki

FROM drużyna, gra

WHERE druż_gosp = `Legia'

AND

bramki_gosp < bramki_gości

AND

drużyna.nazwa = gra.druż_gości

AND

rozgrywki ='L'

UNION

SELECT druż_gosp, bramki_gosp, druż_gości,

bramki_gości, data, liga, rozgrywki

FROM drużyna, gra

WHERE druż_gosp = `Legia'

AND

bramki_gosp > bramki_gości

AND

drużyna.nazwa = gra.druż_gosp

AND

rozgrywki = `L';

Jak pokazuje powyższy przykład, każde z wyrażeń SELECT, które łączy się z warunkiem UMON musi odpowiadać dokładnie temu samemu zbiorowi kolumn z naszej bazy danych i tej samej kolejności. Innymi słowy, nazwa_kolumny z warunku FROM z każdego wyrażenia SELECT musi być dokładnie taka sama.

4.8.8 ORDER BY : porządkowanie wyniku

Instrukcja SELECT uwzględnia klauzulę, dzięki której można sortować wynik selekcji.

Klauzula ORDER BY porządkuje rezultat wyrażenia SELECT. Można sortować przez więcej niż jedną kolumnę i można sortować w kolejności rosnącej (ASC) lub malejącej (DESC). Kiedy doda się tę klauzulę do wyrażenia SELECT, składnia wygląda następująco:

SELECT nazwa_kolumny\stala\wyrażenie arytmetyczne [, ...]

FROM nazwa_tabeli[,...]

[WHERE wyrażenie_ograniczajace] [wyrażenie_łączące] --> [Author:MSOffice]

ORDER BY nazwa kolumny [ASC\DESC] [,...][ASC\DESC]

[UNION

SELECT polecenie_wyboru]

Następny przykład, selekcjonuje nazwy drużyn:

SELECT nazwa, liga

FROM drużyna;

A oto przykładowe wyniki:

|nazwa |liga |

|----------|-------|

|Legia |1 |

|Lech |1 |

|Ruch |1 |

|---------|--------|

Następne polecenie, porządkuje wynik w kolejności alfabetycznej:

SELECT nazwa, liga

FROM drużyna

ORDER BY nazwa;

I daje w rezultacie:

|nazwa |liga |

|----------|-------|

|Lech |1 |

|Legia |1 |

|Ruch |1 |

|---------|--------|

Można także sortować na podstawie więcej niż jednej kolumnie. Klauzula ORDER BY najpierw sortuje cały rezultat według wskazanej kolumny, później dla każdej wartości z pierwszej kolumny sortuje wartość drugiej kolumny. Domyślnie klauzula ORDER BY stosuje dane rosnąco. Dla łańcucha oznacza to sortownie według kolejności leksykalnej (alfabetycznej), a dla liczb oznacza to sortowanie przez wartość, zaś dla daty w kolejności terminów. Można też sortować malejąco. Co odwraca każde z tych kryteriów.

Słowo kluczowe ASC mówi klauzuli ORDER BY o uporządkowaniu w sposób narastający, natomiast DESC w sposób malejący.

4.8.9 Modyfikowanie wewnątrz bazy danych

Teraz przedstawimy jak modyfikować dane, które już znajdują się w bazie danych. Przedstawimy tez sposoby wprowadzania zmian do transakcji, co wpływa korzystnie na ochronę integralności danych.

COMMIT I ROLBACK: odesłanie lub zawieszenie zmian w bazie danych.

Załóżmy, że podczas ładowania plików danych do bazy danych system zawiesza się. Może to sprawić, że baza danych znajdzie się w bardzo opłakanym stanie; nie będziemy wiedzieć jak dużo z ładowanych plików zostało załadowanych. Mechanizmy, które mają chronić relacyjną integralność, mogą teraz pracować przeciwko nam - jeśli będziemy próbować ręcznie naprawić tabelę.

Na szczęście ANSI/ISO SQL posiada mechanizmy, dzięki któremu można chronić bazę danych przed błędnymi uaktualnieniami lub wprowadzeniami. Są to transakcje. Kiedy w ANSI/ISO SQL zaczyna się pracę z baza danych program sterujący SQL-a otwiera transakcje, zapisuje wszystkie zmiany, które robimy w bazie danych na okres tymczasowy. Wszystkie zapisane zmiany, które robimy w bazie danych na okres tymczasowy. Wszystkie zapisane zmiany bazy danych razem tworzą treść transakcji.

Jeśli zostanie wydane polecenie COMMIT, program sterujący SQL-a skopiuje wszystkie z zapisanych zmian do stałej, ostatecznej bazy danych. Jeśli jednak wydamy polecenie ROLLBACK, program sterujący SQL-a odrzuci wszystkie zmiany, wracając do początku transakcji. W obydwu przypadkach, otwiera to nową transakcję i znów rozpoczyna proces.

DELETE: usuwanie wierszy w tabeli

Najprostszą modyfikacją jaką można wykonać w bazie danych, polega na usunięciu niektórych z jej wierszy. Instrukcja DELETE, usuwa wiersze z tabeli. Oto jej składnia:

DELETE FROM nazwa_tabeli

[WHERE wyrażenie ]

Klauzula FROM nazwa tabelę, z której mają być usunięte wiersze. Klauzula WHERE pozwala na zidentyfikowanie usuwanych wierszy. Jeśli użyje się DELETE bez klauzuli WHERE, usunie się wszystkie wiersze w tabeli nazwa tabeli. Na przykład wyrażenie:

DELETE FROM drużyna;

Usunęłoby wszystkie wiersze z tabeli drużyna.

Klauzula WHERE wprowadza wyrażenie, dzięki któremu mogą być identyfikowane wiersze przeznaczone do usunięcia. Wyrażenie jest standardowym wyrażeniem SQL-a. Na przykład następujące wyrażenie usuwa z tabeli drużyna wszystkie drużyny z pierwszej ligi

DELETE FROM drużyna

WHERE liga = `1';

Podobnie, jak zechcemy się usunąć wszystkie drużyny, których nazwy miasta zaczynają się od liter z pierwszej połowy alfabetu, możemy użyć następującego wyrażenia:

DELETE FROM drużyna

WHERE miasto BETWEEN ` A%' AND `M%'

Usunięcie jest kontrolowane przez transakcje podobnie, jak instrukcja INSERT lub LTPDATE. Chroni to wielu użytkowników przed konsekwencjami różnych błędów.

Modyfikacja wierszy wewnątrz tabeli

UPDATE jest to wyrażenie modyfikujące zawartość wiersza lub wierszy wewnątrz tabeli. Jego składnia to:

UPDATE nazwa_tabeli

SET nazwa_kolumny = wyrażenie [, nazwa_kolumny = wyrażenie]

[WHERE wyrażenie ]

nazwa_tabeli określa tabelę, której wiersze mają być zmodyfikowane. Klauzula SET nazwa kolumny, które mają być zmodyfikowane oraz wartość, którą każda z nich ma zawierać. Wyrażenia tego można użyć zdefiniowania wartości, do której każda ma być sprowadzona. Załóżmy, że podczas opracowania bary danych wyników gry, źle zrozumieliśmy układ wyników - myśleliśmy, że pierwsza nazwa należy do gospodarzy i w ten sposób pomyliliśmy nazwę gospodarzy i gości liczbę punktów zdobytych przez każdą drużynę. Do rozwiązania problemu użyj poniższego wyrażenia:

UPDATE score

SET druż_gosp = druż_gości,

druż_gości = druż_gosp,

druż_gosp_score = bramki_gości,

druż_gości_score = bramki_gosp;

Klauzula WHERE przedstawia wyrażenie umożliwiające zdefiniowanie, które wiersze mają być zaktualizowane. Jeśli ta klauzula nie jest wykorzystywana, wyrażenie UPDATE modyfikuje każdy wiersz w tabeli - zakładając, że nie narusza wyrażenia integralności odwołań określonej przy definiowaniu tabeli.

4.8.10 Perspektywy

Perspektywa, jaka wskazuje nazwa, pozwala użytkownikowi oglądać treść danych wewnątrz bazy danych, w tym przypomina instrukcję SELECT. Równocześnie perspektywa jest przechowywana wewnątrz bazy danych i biorąc to pod uwagę, przypomina tabelę. W efekcie perspektywa jest instrukcja SELECT magazynowaną wewnątrz bazy danych.

Aby utworzyć perspektywę, trzeba użyć wyrażenia CREATE VIEW. Będzie ono miało następująca składnię:

CREATE VIEW nazwa_perspektywy

[(nazwa_kolumny[,nazwa_kolumny,...)]

AS SELECT wyrażenie_selekcyjne

Nazwa_perspektywy podaje nazwę perspektywy. Nazwa perspektywy musi być unikatowa dla bazy danych, wewnątrz której się go tworzy. Wyrażenie nazwa_kolumny pozwala na nadanie nazwy każdej kolumnie wewnątrz perspektywy. Klauzula AS SELEKT tworzy instrukcję SELECT, dzięki której dane są wybierane z bazy danych. Może być nim każda postać legalnej instrukcji SELECT. Aby użyć perspektywy, po prostu trzeba ją osadzić wewnątrz klauzuli FROM instrukcja SELECT, tak samo jak nazwę tabeli.

Perspektywy są używane, bo umożliwiają użytkownikowi bierne przeglądanie danych. Są także używane do budowania grup danych, które mogą być ładowane do innych programów w celu przeglądania lub manipulowania nimi.



Wyszukiwarka

Podobne podstrony:
Epidemiologia jako nauka podstawowe założenia
Nauka chodu
socjologia jako nauka
transakcyjny SQL
NAUKA O ORGANIZACJI(1)
Prezentacja Nauka o polityce zaj 3
06 podstawy SQL 3id 6524 ppt
NAUKA WPŁYWANIA
Prezentacja Nauka o polityce zaj 4
prezentacja Nauka i kultura
Dydaktyka jako nauka podstawowe informacje
Nauka pisania 05
Praktyczna Nauka Języka Rosyjskiego Technologia4

więcej podobnych podstron