Rozdział 21 Rozwój standardu SQL i jego implementacji Streszczenie. Opublikowany w roku 2004 standard SQL:2003, podobnie jak jego poprzednie wersje, wprowadza szereg istotnych zmian. Standard proponuje rozwiązania, które są podstawą rozwoju systemów a jednocześnie jest punktem odniesienia dla oceny implementacji SZBD. Część tych zmian została wymuszona przez niezależnie wprowadzone rozwiązania w istniejących na rynku systemach zarządzania bazami danych. W rozdziale zostały przedstawione etapy rozwoju standardu SQL. Dokonano oceny wpływu standardu SQL na rozwój jego implementacji oraz omówiono elementy mające wpływ na rozwój standardu SQL. 1 Wstęp Język SQL został stworzony na potrzeby pierwszych systemów zarządzania relacyjnymi bazami danych w końcu lat 70-tych ubiegłego wieku. W roku 1982 pojawiły się elementy DML i DDL, by w roku 1986 stać się standardem ANSI, a rok później ISO. Poprawiona wersja standardu została opublikowana w roku 1989 i jest znana pod nazwą SQL-89. Celowo pozostawiono w niej wiele niedomówień, co wymusiło wiele dyskusji nad kształtem standardu, czego rezultatem stało się opublikowanie w roku 1992 standardu SQL-92. Od tego czasu trwa nieprzerwany i intensywny rozwój tego standardu. Kolejne wersje pojawiają się coraz częściej (SQL:1999 po siedmiu latach, SQL:2003 już po pięciu). Pomimo krótkiego czasu, jaki upłynął od publikacji najnowszej wersji standardu, trwają już prace nad jego kolejną wersją. 2 Standard SQL:1999 Rozpowszechnienie się Internetu i rozwój technologii z nim związanych spowodował wzrost wymagań użytkowników w stosunku do aplikacji i systemów. W związku z rozwojem technologii multimedialnych i znacznym zwiększeniem liczby użytkowników usług informatycznych, wzrosły również rozmiary danych przechowywanych w systemach. Jednocześnie nastąpił intensywny rozwój metodyk obiektowego wytwarzania oprogramowania. Miało to wpływ na wzrost złożoności przechowywanych danych. Pojawiły się również Lech Tuzinkiewicz, Jakub Fedyczak: Politechnika Wrocławska, Instytut Informatyki Stosowanej, Wybrzeże Wyspiańskiego 27, 50-370 Wrocław, Polska email: lech.tuzinkiewicz@pwr.wroc.pl, jakub.fedyczak@student.pwr.wroc.pl
L. Tuzinkiewicz, J. Fedyczak potrzeby tworzenia nowych typów danych, dostosowanych do wymagań użytkowników. Zdalne przetwarzanie danych zwiększyło wymagania w zakresie niezawodności systemów oraz spójności i bezpieczeństwa danych. W konsekwencji zaproponowano rozszerzenie standardu SQL-92, stosownie do potrzeb rynku, czego wynikiem było opublikowanie standardu SQL:1999. Standard SQL:1999 wprowadził szereg zmian w stosunku do wersji SQL-92. Poniżej przedstawiono najważniejsze z nich wg [1], [3]; Cztery nowe typy danych: LARGE OBJECT (LOB), którego warianty to CHARACTER LARGE OBJECT (CLOB) oraz BINARY LARGE OBJECT (BLOB). Typ LOB służy do przechowywania danych o większych rozmiarach. Nie mogą one być używane w klauzulach PRIMARY KEY oraz UNIQUE oraz w klauzulach GROUP BY i ORDER BY, BOOLEAN, typ złożony ARRAY, który umożliwia przechowywanie tabel o stałej długości w pojedynczej kolumnie, typ złożony ROW, który umożliwia deklarowanie podkolumn w wierszach. Typy rozróżnialne (ang. distinct types) ułatwiają weryfikację semantyczną typów. Predykaty SIMILAR oraz DISTINCT. SIMILAR wprowadza możliwość stosowania bardziej złożonych wyrażeń regularnych niż oferuje to predykat LIKE, natomiast DISTINCT w przeciwieństwie do UNIQUE traktuje dwie wartości NULL jako tożsame. Rozszerzenie zakresu widoków, poprzez które możliwa jest zmiana tabel bazowych. Zapytania rekursywne. Subtransakcje (ang. savepoints) umożliwiają wycofanie transakcji do wcześniej ustalonego punktu, bez konieczności wycofania całej transakcji. Role (ang. roles), czyli mechanizm zabezpieczeń, który wprowadza możliwość przyznawania uprawnień grupom użytkowników. Wyzwalacze, czyli mechanizm sterowany zdarzeniami, służący do zapewnienia integralności danych. Typy strukturalne definiowane przez użytkownika. Typy te mogą być zagnieżdżone, posiadają mechanizm polimorfizmu, podlegają dziedziczeniu. Ponadto możliwe jest zdefiniowanie metod operujących na danych tego typu. Typ specjalny REF umożliwia przechowywanie wskaźnika do instancji typu strukturalnego. Wprowadzenie typów LOB wynikało z rosnącej potrzeby przechowywania w bazach danych obszernych treści (w tym multimedialnych) osiągających rozmiary wielu megabajtów. W związku z potrzebą stosowania złożonych typów danych, wprowadzono typy rozróżnialne, typy złożone i rozszerzenia obiektowe. Rosnąca ilość danych i ich złożoność wymuszała istnienie wyrafinowanych mechanizmów wyszukiwania, pozyskiwania i modyfikacji danych. W związku z powyższym wprowadzono m. in. predykaty SIMILAR oraz DISTINCT (używane w klauzuli WHERE), rekursywne kwerendy oraz rozbudowano możliwości wprowadzania zmian danych poprzez widoki. Złożoność operacji oraz rosnąca liczba użytkowników korzystających jednocześnie z dużych baz danych, wymusiła wprowadzenie usprawnień w zakresie przetwarzania transakcji (savepoints), jak i zabezpieczeń dostępu do danych (roles) oraz nowe mechanizmy utrzymania integralności danych (wyzwalacze). 206
3 Standard SQL:2003 Rozwój standardu SQL i jego implementacji Nowe wymagania wynikające z rozpowszechnienia hurtowni danych, analiz danych wielowymiarowych (OLAP, Data Mining), a także standardu XML, wymusiły aktualizację standardu SQL. W rezultacie opracowano standard SQL:2003. Poniżej omówiono najważniejsze zmiany wg [2], [3], [4], [5]. Wprowadzono nowe typy danych: BIGINT, typ zgodny z INTEGER oraz SMALLINT, ale o zwiększonym zakresie (zależnym od implementacji). Typ dopuszcza wszystkie operacje, jakie są dozwolone na dwóch poprzednikach. MULTISET - wielozbiór, czyli nieuporządkowana kolekcja elementów, w której dopuszcza się powtórzenia. Standard nie narzuca określonego rozmiaru wielozbioru, może on być zagnieżdżony. Definiowanie wielozbioru odbywa się w dwojaki sposób: MULTISET[1,2,3,4] MULTISET (SELECT oceny FROM kursy) Wielozbiór może zostać użyty jako źródło danych w klauzuli FROM za pomocą operatora UNNEST: SELECT T.A,T.A*2 AS x2 FROM UNNEST(MULTISET[4,3,2,1]) AS T(A) MULTISET wspiera operacje rzutowania na tablicę (ARRAY) lub inny wielozbiór z elementami o zgodnych typach. Wspierane jest także usuwanie duplikatów, zliczanie elementów, wyznaczanie sumy, różnicy oraz iloczynu. Dodane są również nowe funkcje agregujące: COLLECT tworzy wielozbiór z wartości argumentu w każdym wierszu grupy, FUSION tworzy unię wielozbiorów z każdego elementu grupy, INTERSECTION tworzy część wspólną z wielozbiorów z każdego elementu grupy. Oto przykład: Tabela 1. Tabela PRACOWNICY NAZWISKO 'Kowalski' 'Nowak' 'Abacka' JEZYKI MULTISET['angielski','niemiecki','rosyjski'] MULTISET['angielski','szwedzki','niemiecki'] MULTISET['japoński','angielski'] Dla tabeli PRACOWNICY (tabela 1) następująca kwerenda: SELECT COLLECT(NAZWISKO) AS WSZYSCY_PRACOWNICY, FUSION(JEZYKI) AS WSZYSTKIE_JEZYKI, INTERSECTION(JEZYKI) AS WSPOLNE_JEZYKI, FROM PRACOWNICY; zwróci rezultat widoczny w tabeli 2. Tabela 2. Przykład działania funkcji COLLECT, FUSION i INTERSECTION WSZYSCY_PRACOWNICY WSZYSTKIE_JEZYKI WSPOLNE_JEZYKI MULTISET['Kowalski', 'Nowak','Abacka'] MULTISET['angielski', 'angielski','angielski', 'rosyjski','szwedzki', 'japoński','niemiecki', 'niemiecki'] MULTISET[ 'angielski'] 207
L. Tuzinkiewicz, J. Fedyczak SQL:2003 wprowadza również następujące funkcje dla MULTISET: CARDINALITY zwraca liczbę elementów SET tworzy zbiór z wielozbioru usuwa duplikaty ELEMENT zwraca element z jednoelementowego wielozbioru UNNEST przekształca wielozbiór w tabelę Przykładowo wyrażenie: 208 SELECT SUM (t.c) FROM UNNEST (MULTISET (2, 3, 5, 7)) AS t(c) zwróci sumę elementów wielozbioru. Z kolei wyrażenie: v1 MULTISET [UNION EXCEPT INTERSECT] [ALL DISTINCT] v2 pozwala uzyskać sumę, róznicę bądź część wspólną wielozbioru. MULTISET dopuszcza dwa operatory porównujące = oraz <>. Oprócz tego dopuszczalne są następujące predykaty: e1 [NOT] MEMBER OF v1 przynależność elementu do wielozbioru, v1 [NOT] SUBMULTISET OF v2 zawieranie się wielozbiorów, v1 IS [NOT] A SET badanie istnienia duplikatów. SQL:2003 wprowadza również funkcje tabelowe, których rezultatem jest ROW MULTISET. Przykład funkcji tabelowej zwracającej tabelę z pracownikami danego wydziału: CREATE FUNCTION PRACOWNICY_WYDZIALU (KODWYDZIALU CHAR(3)) RETURNS TABLE (PRACNR CHAR(6),NAZWISKO VARCHAR(15),IMIE VARCHAR(12)) LANGUAGE SQL READS SQL DATA DETERMINISTIC RETURN TABLE( SELECT PRACNR, NAZWISKO, IMIE FROM PRACOWNICY WHERE PRACOWNICY.WYDZIAL = PRACOWNICY_WYDZIALU.KODWYDZIALU ); gdzie: LANGUAGE SQL określa, że ciało funkcji jest napisane w języku SQL, READS SQL DATA określa, że funkcja pobiera dane z bazy w trybie tylko do odczytu, inaczej mówiąc nie modyfikuje danych DETERMINISTIC określa, że dla jednego zestawu parametrów funkcja zawsze daje te same wyniki. Zdefiniowana funkcja może być użyta w następujący sposób: SELECT * FROM TABLE(PRACOWNICY_WYDZIALU('w-8')); Oprócz funkcji tabelowych, SQL:2003 wprowadza również zmiany w możliwości wywoływania procedur składowanych. Obecnie dopuszcza się przeładowanie funkcji. Funkcje mogą być także deklarowane jako wywoływane z uprawnieniami użytkownika wywołującego (do tej pory użytkownika deklarującego). Standard rozszerza sposób tworzenia tabel w zakresie używania kolumn identyfikujących i generowanych. Ich wartość jest automatycznie wyznaczana w momencie dodawania wiersza. Możliwe stało się wybiórcze skopiowanie struktury, połączone z wypełnieniem nowej tabeli danymi, co pokazuje następujący przykład: CREATE TABLE T5 (D1, D2, D3, D4) AS (SELECT T1.C1, T1.C2, T2.C3, T2.C4 FROM T1, T2 WHERE T1.C2 = T2.C2) WITH DATA; Utworzona za pomocą CREATE TABLE AS tabela jest niezależna od tabeli źródłowej.
Rozwój standardu SQL i jego implementacji SQL:2003 wprowadza wyrażenie MERGE, które pozwala w jednym kroku uaktualnić istniejące wiersze i dodać nowe. Przykładowo: tabela AUTORZY zawiera listę wszystkich autorów publikacji wraz z ilością artykułów, a tabela tymczasowa TEGOROCZNE_ PUBLIKACJE opisuje listę tegorocznych publikacji; Tabela 3. Tabela AUTORZY NAZWISKO LICZBA_PUBLIKACJI Kowalski 10 Nowak 15 Iksiński 20 Tabela 4. Tabela TEGOROCZNE_PUBLIKACJE: AUTOR LICZBA_PUBLIKACJI Abacki 3 Nowak 2 Iksiński 1 Smith 3 MERGE INTO AUTORZY AS A USING (SELECT AUTOR,LICZBA_PUBLIKACJI FROM TEGOROCZNE_PUBLIKACJE) AS P ON (A.NAZWISKO = P.AUTOR) WHEN MATCHED THEN UPDATE SET LICZBA_PUBLIKACJI = A.LICZBA_PUBLIKACJI+P.ILOSC_PUBLIKACJI WHEN NOT MATCHED THEN INSERT (NAZWISKO,LICZBA_PUBLIKACJI) VALUES (P.AUTOR,P.LICZBA_PUBLIKACJI); Tabela 5. Tabela AUTORZY po wykonaniu operacji MERGE NAZWISKO LICZBA_PUBLIKACJI Kowalski 10 Nowak 17 Iksiński 21 Abacki 3 Smith 3 SQL:2003 wprowadza generatory sekwencji, które służą do tworzenia unikalnych wartości w obrębie schematu. Mogą one zostać wykorzystane do generowania sztucznych kluczy głównych. Oto przykład deklaracji generatora sekwencji: CREATE SEQUENCE AUTOR_SEQ AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 10000 NO CYCLE; W celu uzyskania kolejnej wartość z generatora, należy użyć wyrażenia: NEXT VALUE FOR AUTOR_SEQ Oto przykładowe wykorzystanie sekwencji: INSERT INTO AUTOR (ID, NAZWISKO, WIEK) VALUES (NEXT VALUE FOR AUTOR_SEQ,'Kowalski', 45); W przypadku włączenia opcji NO CYCLE, przy przekroczeniu zakresu generowany jest wyjątek. Możliwe jest wpływanie na działanie generatorów poprzez zastosowanie poleceń: ALTER SEQUENCE... DROP SEQUENCE... ALTER SEQUENCE... RESTART WITH... 209
L. Tuzinkiewicz, J. Fedyczak SQL:2003 wprowadza typ IDENTITY o funkcjonalności analogicznej do generatora sekwencji, przy czym zbędne staje się jawne wywołanie NEXT VALUE FOR... Przykład zastosowania typu IDENTITY w definicji tabeli: CREATE TABLE PRACOWNICY ( NR INTEGER GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 10000 NO CYCLE ), NAZWISKO VARCHAR (100), WIEK INTEGER ); W tabeli może można zdefiniować tylko jedną kolumnę typu IDENTITY. W przypadku wprowadzania danych do tabeli, wartość kolumny typu IDENTITY jest generowana automatycznie. Nowy standard wprowadził również kolumny generowane. Przykład użycia kolumny generowanej może wyglądać następująco: CREATE TABLE PRACOWNICY ( ID INTEGER, PENSJA DECIMAL(7,2), PREMIA DECIMAL(7,2), WYPLATA GENERATED ALWAYS AS (PENSJA+PREMIA) ); Wartość kolumny WYPLATA jest automatycznie uaktualniana. Kolumny tego typu mogą być indeksowane. SQL:2003 wprowadza funkcje okienkowe, które służą do zawężania widoczności danych w obrębie tabeli. Są to RANK, DENSE_RANK, PERCENT_RANK, CUME_DIST, ROW_NUMBER. Oto przykład zastosowania funkcji RANK, DENSE_RANK oraz ROWNUM (wynik w tabeli 6): SELECT IMIE, PENSJA, RANK() OVER (ORDER BY PENSJA DESC) AS RANK, DENSE_RANK() OVER (ORDER BY PENSJA DESC) AS DENSE_RANK, ROW_NUMBER() OVER (ORDER BY PENSJA DESC) AS ROWNUM FROM PRACOWNICY; gdzie: RANK zwraca pozycję względną wymaga uporządkowania; wartości równe mają tę samą wartość RANK, DENSE_RANK analogiczne do RANK, ale gwarantuje ciągłość wartościowania, ROW_NUMBER numeruje kolejne wartości; równe wartości są numerowane niedeterministycznie. Tabela 6. Rezultat przykładowego zastosowania funkcji okienkujących IMIE PENSJA RANK DENSE_RANK ROWNUM Krzysztof 8000 1 1 1 Sylwia 7900 2 2 2 Tadeusz 7900 2 2 3 Marek 6600 4 3 4 Łukasz 6600 4 3 5 Jolanta 6000 6 4 6 210
Rozwój standardu SQL i jego implementacji SQL:2003 wprowadza kwerendy na próbkach danych. Ich użycie skraca czas uzyskania wyniku zapytania kosztem dokładności. Możliwe są dwie metody próbkowania: BERNOULLI prawdopodobieństwo pojawienia się wiersza w próbce jest niezależne od pojawienia się innych wierszy SYSTEM prawdopodobieństwo może zależeć od innych wierszy zawartych w próbce Poniższa kwerenda wyznacza średnią zarobków w poszczególnych działach: SELECT DZIAL, SUM(PENSJA) * 10 FROM PRACOWNICY TABLESAMPLE BERNOULLI (10) REPEATABLE (5) GROUP BY DZIAL; gdzie opcjonalny parametr klauzuli REPEATABLE określa ziarno dla wartości losowych. Ustawienie konkretnej wartości parametru zapewnia powtarzalność wyników przy kolejnych wywołaniach kwerendy dla tego samego zestawu danych. Ponadto rozbudowano standard o wiele nowych funkcji matematycznych i statystycznych [4]. Zmiany dokonane w standardzie SQL:2003 obejmują również przypadki usunięcia elementów o znikomym znaczeniu (typy BIT oraz BIT VARYING). Omówione zmiany pokazują, że rozwój standardu SQL zmierza w kierunku wspierania dynamicznie rozwijających się dziedzin. Funkcje tabelowe mogą posłużyć do pozyskania danych ze źródeł o różnych strukturach (np. w systemie innego producenta, bądź plikach zewnętrznych), co może być wykorzystane w fazie ekstrakcji danych w procesie ETL. Innym przykładem wsparcia tego procesu jest operacja MERGE, która jest pomocna w fazie ładowania danych do baz analitycznych. Z kolei funkcje okienkowe (RANK, DENSE_RANK itp.), kwerendy operujące na próbkach danych oraz nowe funkcje agregujące mają zastosowanie w procesach analitycznych. Inną, istotną ze względu na zakres zastosowań technologią, jest standard XML, który określa zasady przechowywania, przetwarzania i wymiany różnego rodzaju dokumentów. 4 Wpływ standardu SQL na systemy zarządzania bazami danych Zarówno systemy komercyjne jak i typu open-source, rozwijają się równolegle z rozwojem standardu. Poziom zgodności ze standardem jest jednym z kryteriów oceny jakości produktu. W konsekwencji standard wymusza rozwój systemów zarządzania relacyjnymi bazami danych (SZRBD), co nie oznacza, że wszystkie jego elementy są implementowane. Trywialnym przykładem jest brak implementacji typów DATE i TIME w systemie MS SQL Server, który oferuje jedynie typ DATETIME. Innym przykładem dotyczącym tego systemu jest brak implementacji typu BOOLEAN. Kolejny przykład to ujednolicenie instrukcji dotyczących ról (ang. roles) z instrukcjami dotyczącymi uprawnień użytkowników w systemie PostgreSQL. Przykładem może być także kolejność wykonywania wyzwalaczy w tym systemie. Twórcy zdecydowali się na złamanie zaleceń standardu wyzwalacze są uruchamiane w kolejności alfabetycznej a nie w kolejności utworzenia. Projektanci często uznają, że standard traktuje daną kwestię niespójnie bądź niekompletnie i decydują się na inny, niestandardowy sposób rozwiązania problemu. Możliwe jest również, że nowa wersja standardu wprowadza rozwiązania powszechnie implementowane w istniejących produktach. Przykładem są kolumny typu IDENTITY, które wprowadził SQL:2003. Taka funkcjonalność istniała już wcześniej w takich produktach jak MySQL (atrybut auto_increment), PostgreSQL-typ SERIAL i BIGSERIAL (dyskretnie obsługiwany przez automatycznie tworzony generator sekwencji), MS SQL Server (atrybut IDENTITY). Kolejnym przykładem są wyzwalacze ustandaryzowane przez SQL:1999. 211
L. Tuzinkiewicz, J. Fedyczak Zostały wprowadzone przez Oracle w wersji 7.0 wydanej w 1992 roku. Standard bazuje wówczas na rozwiązaniach stosowanych w implementacjach (wyzwalacze zgodne ze składnią zaproponowaną przez Oracle). W przypadku implementacji komercyjnych trudno jest dostosować istniejące mechanizmy do nowej wersji standardu, ponieważ może to spowodować utratę kompatybilności wstecznej. Powoduje to niechęć klientów do zakupu nowej wersji wynikającą ze zwiększonych kosztów jej wdrożenia. Przekłada się to na wymierne straty finansowe dla producenta. Sytuacja ma się inaczej w projektach open source. Tutaj twórcy nie są związani finansowo z użytkownikami systemów bazodanowych. W dokumentacji PostgreSQL można znaleźć dokładne zestawienie obsługiwanych oraz nieobsługiwanych części standardu. Zmiany zachodzą więc znacznie szybciej. Podczas instalacji nowej wersji często konieczna jest całkowita konwersja fizycznej postaci baz danych. W celu zilustrowania omówionych sytuacji, w tabeli 7 i 8 zebrano podsumowanie obsługi rozszerzeń wprowadzonych przez najnowsze wersje standardu w systemie MS SQL Server 2005. Tabela 7. Obsługa nowych elementów standardu SQL:1999 w MS SQL Server 2005 Zmiany w SQL:1999 MS SQL Server 2005 Typy LOB (LARGE Udostępnia do tego celu typy varbinary(max) oraz OBJECTS) CLOB oraz image dla danych binarnych oraz typy text, ntext BLOB i varchar(max) dla ciągów znakowych. Nie zaleca się stosowania typów text, ntext oraz image, ponieważ zostaną one usunięte w kolejnych wersjach systemu. Typ BOOLEAN Brak typu BOOLEAN. Możliwe jest zastosowanie zamiennika np. w postaci typu BIT (usuniętego w standardzie SQL:2003). Typ złożony ARRAY Brak typu ARRAY. Typ złożony ROW Nie obsługiwany. Predykaty SIMILAR Brak obsługi. oraz DISTINCT Typy rozróżnialne (ang. distinct types) Rozszerzenia w zakresie widoków modyfikowalnych Zapytania rekursywne Subtransakcje (ang. savepoints) Role (ang. roles) Wyzwalacze Elementy obiektowe Typ specjalny REF Brak obsługi. Istnieje możliwość tworzenia własnych typów (poprzez Aliased Data Types), ale nie jest wymuszana ich zgodność. Brak implementacji rozszerzenia. Modyfikacje danych poprzez widok są możliwe tylko w zakresie przewidzianym przez standard SQL-92. Obsługiwane, ale bez konieczności dodawania słowa kluczowego RECURSIVE. Obsługiwane. Składnia niezgodna ze standardem (SAVE TRANSACTION... i ROLLBACK TRANSACTION... zamiast SAVEPOINT... i ROLLBACK TO...). Brak obsługi RELEASE SAVEPOINT. Obsługiwane. Obsługiwane. Brak obsługi. Możliwość definiowania własnych typów (klas) z użyciem wykonywanego po stronie serwera kodu platformy.net. Brak obsługi. 212
Rozwój standardu SQL i jego implementacji Tabela 8. Obsługa nowych elementów standardu SQL:2003 w MS SQL Server 2005 Zmiany w SQL:2003 MS SQL Server BIGINT Obsługiwany (64bit). MULTISET Brak obsługi. Funkcje tabelowe Implementowane w postaci TVF (Table-Valued Function). Istnieją ograniczenia w typach zwracanych kolumn brak możliwości zastosowania typu TIMESTAMP, ciągów znakowych innych niż UNICODE. Brak obsługi ograniczenia NOT NULL. CREATE TABLE LIKE Brak obsługi. CREATE TABLE AS Brak obsługi. MERGE Brak obsługi. Generatory sekwencji Brak obsługi. Kolumny IDENTITY Obsługiwane poprzez atrybut identity. Kolumny Implementowane w postaci computed column, ale generowane z ograniczeniami i niezgodnie ze standardem Funkcje okienkowe Obsługiwane zgodnie ze standardem Kwerendy Implementowane, ale bez obsługi próbkowania typu próbkowane BERNOULLI. Usunięcie typów BIT Nadal dostępny (często zastępuje brakujący typ i BIT VARYING Rozszerzenia związane z obsługą XML BOOLEAN). Obsługiwane. 5 Wnioski Od momentu powstania, standard SQL podlega stałemu rozwojowi przy aktywnym udziale producentów SZRBD. Zmiany w kolejnych wersjach odzwierciedlają tendencje w technologiach informatycznych. Standard może być podstawą do oceny przenaszalności baz danych pomiędzy różnymi środowiskami. Znajomość standardu jest dobrym przygotowaniem pojęciowym do poznawania i wykorzystywania różnych systemów baz danych. Standard SQL może być językiem specyfikacji modeli logicznych w projektowaniu baz danych, bowiem jest niezależny implementacyjnie, a jednocześnie określa technologie. Literatura 1. Eisenberg A., Melton J.: SQL:1999, formerly known as SQL3 2. Eisenberg A., Melton J., Kulikarni K., Michels J., Zemke F.: SQL:2003 Has Been Published 3. ISO/IEC 9075-2:1999, Information technology -- Database languages -- SQL - Part 2: Foundation (SQL/Foundation) 4. ISO/IEC 9075-2:2003 Information technology -- Database languages -- SQL -- Part 2: Foundation (SQL/Foundation) 5. ISO/IEC 9075-14:2003 Information technology -- Database languages -- SQL -- Part 14: XML- Related Specifications (SQL/XML) 213