SQL3 - implementacje
SQL3, inaczej SQL99 - to aktualnie obowiązujący standard ISO/ANSI języka SQL. Zwykle standard nie jest w pełni implementowany przez producentów.
Poziomy zgodności
Mówi się o tzw. poziomach zgodności ze standardem:
1) podstawowy - minimalna liczba elementów standardu, która musi funkcjonować w implementacji, aby mówić o zgodności produktu ze standardem SQL3
2) rozszerzony - kilka (9) zestawów funkcji dodatkowych; minimalne wymagania dla rozszerzonego poziomu zgodności, to implementacja przynajmniej jednego dodatkowego zestawu funkcji (można się domyślać, że producenci poszczególnych serwerów opracowali zestawy dodatkowe - na podstawie możliwości swoich serwerów)
Pakiety rozszerzeń, to:
PKG001 - rozszerzone funkcje daty i czasu (strefy czasowe, typ danych interval, pełna obsługa datetime)
PKG002 - rozszerzone zarządzanie integralnością (asercje, referencyjne operacje usuwania, referencyjne operacje zmiany wartości, zarządzanie wiązami, podzapytania w klauzuli CHECK, wyzwalacze, wyzwalacze FOR EACH STATEMENT, referencyjna operacja RESTRICT)
PKG003 - możliwości OLAP (CUBE i ROLLUP, operator INTERSECT, konstrukcja tabel i rekordów, FULL OUTER JOIN, skalarne wyniki podzapytań)
PKG004 - trwale składowane moduły SQL (PSM - persistent stored modules) (programistyczne rozszerzenie SQL pozwalające na tworzenie funkcjonalnie kompletnych aplikacji, CASE, IF, WHILE, REPEAT, LOOP i FOR, składowane moduły, zupełność obliczeniowa, perspektywy INFORMATION_SCHEMA)
PKG005 - SQL CLI (Call Level Interface) (obsługa interfejsu CLI w SQL: API pozwalające na wykonywanie operacji SQL, podobny do standardu ODBC)
PKG006 - podstawowa obsługa obiektów (przeładowywanie wywoływanych przez SQL funkcji i procedur, pojedyncze dziedziczenie w typach definiowanych przez użytkownika, podstawowe operacje SQL na tych typach, typy referencyjne, CREATE TABLE, obsługa tablic: podstawowa, wyrażenia tablicowe, lokalizatory, obsługa w tablicach typów danych użytkownika UDT - user datatype i typów referencyjnych, operacje SQL na tablicach, referencje pól i atrybutów, operacja tworzenia i usuwania referencji)
PKG007 - rozszerzona obsługa obiektów (ALTER TABLE, ADD, rozszerzenia w typach definiowanych przez użytkownika - konstruktor, domyślne atrybuty, wielokrotne dziedziczenie, klauzule porządkujące, funkcje SQL, podtabele, ONLY w zapytaniach, predykat type, obsługa podtypów, definiowana przez użytkownika funkcja CAST, lokatory UDT, operacje SQL na typach zdefiniowanych przez użytkownika)
PKG008 - cechy aktywnych baz danych (wyzwalacze)
PKG009 - obsługa multimediów (obsługa multimedialnych danych strumieniowych oraz dużych i złożonych danych audio i wideo)
Klasyfikacja instrukcji
W SQL92 język SQL podzielono na cztery (trzy) subjęzyki: DDL,DML,DCL. Polecenie SELECT umieszczano osobno, alno w grupie poleceń DML.
W SQL3 wyróżnia się siedem kategorii zamiast wymienionych powyżej:
Instrukcje obsługi połączeń SQL otwarcie i zamknięcie połączenia z klientem (CONNECT, DISCONNECT)
Instrukcje kontrolne SQL Kontrolują wykonanie zbiorów instrukcji SQL (CALL,RETURN)
Instrukcje obsługi danych SQL wywierają trwały efekt na dane (SELECT,INSERT,UPDATE,DELETE)
Instrukcje diagnostyczne SQL dostarczają informacji diagnostycznych, zgłaszają wyjątki i błędy (GET DIAGNOSTICS)
Instrukcje obsługi schematów SQL wywierają trwały efekt na schematy bazy danych i obiekty wewnątrz schematów (ALTER,CREATE,DROP)
Instrukcje obsługi sesji kontrolują domyślne zachowania i inne parametry sesji (SET)
Instrukcje obsługi transakcji SQL ustalają początkowy i końcowy punkt transakcji (COMMIT,ROLLBACK)
Dialekty SQL
Pomimo, że standard jest jeden, sposób realizacji poleceń przez serwery różnych producentów może być zupełnie odmienny. Wynika to głównie z faktu, że standard jest tworzony w oparciu o istniejące rozwiązania (de facto), czyli np. sposób wykonania polecenia SELECT w Oracle i DB/2 został dopracowany, zanim powstał standard. Wielu producentów wprowadziło do swoich implementacji opcje proceduralne, np.:
1) PL/SQL - Oracle; składnia nieco podobna do języka programowania ADA
2) Transact-SQL - Microsoft SQL Server, Sybase Adaptive Server; aktualnie wersje Transact-SQL dla obu producentów też się różnią
3) PL/pgSQL - Procedural Language/postgreSQL
Serwery realizują zdania SQL według jednego z trzech podstawowych styli:
1. SQL Module Language - instrukcje są przygotowywane podczas tworzenia modułów i wykonywane, gdy moduł jest wywoływany
2. Embedded SQL Syntax - instrukcja SQL przygotowywana podczas prekompilacji programu (w którym kod SQL został zanurzony) w języku podstawowym i wykonywana podczas wywołania tego programu (np. PRO*C)
3. Direct SQL Invocation - statyczna instrukcja SQL jest przygotowywana i natychmiast wykonywana
Najczęściej stosuje się ostatni z tych stylów.
Hierarchia zbiorów
Klastry
Katalogi
Schematy
Obiekty
Kolumny
Dziedziny i typy definiowane przez użytkownika
Reguły i asercje
klaster - unikatowo nazwany zbiór katalogów dostępny podczas sesji SQL; w przybliżeniu można porównać je do instalacji serwera bazy danych; wg ANSI klastry pozwalają zarządzać uprawnieniami dostępu do danych; w praktyce uprawnienia ustalane są na poziomie katalogów
katalog - unikatowo nazwane zbiory schematów; w Oracle tożsame z instancją
schemat - unikatowo nazwany zbiór obiektów i danych należących do konkretnego użytkownika, wraz z odpowiednimi meta danymi
obiekt - unikatowo nazwany zbiór danych lub podprogramów SQL; np. tabele, perspektywy, moduły, składowane procedury
kolumna - unikatowo nazwany zbiór wartości
dziedzina - identyfikator zbioru prawidłowych i dostępnych wartości dla kolumny
reguła i asercja - dalsze reguły definiujące prawidłowe i dostępne wartości dla danej kolumny; np. wyzwalacz
Porównanie przykładowych reprezentacji typów danych
Dla przykładu pokazano porównanie sposobu przechowywania danych w formacie daty. SQL3 - date, time, time with timezone (ze znacznikiem strefy), timestamp (wyliczany podczas działania komputera), timestamp with timezone, interval (odcinek czasu)
MS SQL Server - daty od roku 1752 do roku 9999; typy datetime oraz smalldatetime (daty od 1900 do 2079)
MySQL - daty od roku 1000 do roku 9999; typ datetime, timestamp (od 1970 do 2037), year - od (19)70 do (20)69 dla roku dwucyfrowego oraz od 1901 do 2155 dla roku czterocyfrowego
Oracle - daty od 4712 p.n.e do 9999 n.e.; date
PostgreSQL - date, datetime, time, timespan, timestamp, timetz (ze strefą czasową)
Wartości NULL
Wartość NULL to wartość nieznana lub nieokreślona. Jeśli w tablicy jest kolumna do przechowywania cen, wówczas wartość NULL dla wybranego towaru nie oznacza, że cena jest równa 0, ale że nie została jeszcze wprowadzona.
Należy pamiętać, że
wartość NULL nie da się umieścić w kolumnie zdefiniowanej jako NOT NULL
nie można porównywać do siebie wartości NULL; to znaczy wartości NULL nie są sobie równe: zapis a=NULL nie daje wartości TRUE, gdy a jest NULL; testowanie wartości NULL powinno się odbywać za pomocą składni: "wartość IS NULL".
kolumna zawierająca wartości NULL jest ignorowana podczas obliczania wartości funkcji agregujących, takich jak AVG, SUM, MAX
jeśli kolumna zawierająca wartości NULL zostanie umieszczona w klauzuli GROUP BY, to wynik zapytania będzie zawierać rekordy z tymi wartościami
złączenia pomiędzy tabelami, z których jedna z warunku złączenia ma zwykłe wartości, a druga wartości NULL, są traktowane jako złączenia zewnętrzne
Przykłady implementacji poleceń SQL
Instrukcje obsługi połączeń SQL: CONNECT
CONNECT [TO] DEFAULT |{[specyfikacja_serwera] [AS nazwa_połączenia] [USER nazwa_użytkownika]};
okres pomiędzy CONNECT i DISCONNECT nosi nazwę sesji; polecenie jest obsługiwane przez Oracle, SQL Server, ale nie implementowane w MySQL,PostgreSQL (ale w PosgreSQL jest instrukcja "zastępcza" SPI_CONNECT oraz PG_CONNECT);
jeśli polecenie jest wydane z aktywnej sesji wówczas zatwierdzane są wszystkie aktualnie otwarte trasakcje, zamykana jest sesje poprzednia i otwierana kolejna
Instrukcje kontrolne SQL: CALL CALL nazwa_procedury [(parametr [,...n])] - służy do wywołania procedury składowanej w serwerze;
obsługiwane przez Oracle, PostgreSQL, nie obsługiwane w MS SQL Server, MySQL; Microsoft oferuje polecenie "zastępcze": EXECUTE
Instrukcje obsługi danych SQL: SELECT w MS SQL Server - obsługuje złączenia ANSI
w MySQL - złączenia ANSI obsługiwane częściowo
w Oracle - brak obsługi złączeń ANSI (pojawiły się w 9i)
PostgreSQL - częściowa obsługa złączeń ANSI
pełna składnia jest rozbudowana i złożona; zwykle wymagane są przynajmniej człony SELECT oraz FROM (w SQL Server i PostgreSQL nie musi się pojawiać nawet FROM: np. select 2+2;);
w MS SQL Server lista wyrażeń po SELECT może zawierać podzapytanie;
w instrukcji mógł się pojawić komentarze: albo ujęte w /* */, albo -- (wówczas komentarz kończy się ze znakiem końca linii)
jeśli dla tablicy w zapytaniu zdefiniowano alias, to należy go stosować konsekwentnie w całym zapytaniu, a nie używać go zamiennie z właściwą nazwę tablicy;
jeśli funkcje agregujące są stosowane do kolumn, w których mogą pojawiać się wartości NULL, należy zastosować funkcji ISNULL() (SQL Server) albo NVL (Oracle) w celu kontrolowanego uwzględnienia tych kolumn w wyniku zapytania;
można mówić o agregacjach wektorowych (zwracają wiele wierszy w wyniku) jak i o agregacjach skalarnych (zwracają jedną wartość, np. select avg(cena) from towary; )
SQL Server -
polecenie SELECT ... INTO, np.
select lista into nowa_tabela from tabela_stara where warunek;
kopiuje wiersze i kolumny, których dotyczą zapytanie z innych tabel i tworzy na ich podstawie nową tabelę; polecenie wybitnie niestandardowe, gdyż zmiany nie są zapisywane w dzienniku transakcji; użycie tego polecenia w aplikacji oznacza, że program będzie działać wyłącznie z SQL Server Microsoftu;
klauzula TOP (PERCENT), np.
Select [top n [percent] [with ties]] lista from nazwa_tabeli; w zbiorze wyników znajdzie się tylko n pierwszych wierszy, albo n procent wszystkich wierszy; opcja [with ties]oznacza, że dla ostatniej zwracanej wartości jest więcej krotek, to zwrócone zostaną wszystkie te krotki (a więc w praktyce może być więcej niż wyznaczone wartościami top percent);
zmiany w GROUP BY
[group by [all] wyrażenie_group_by [,...n] [with {cube|rollup}]]
słowo ALL wymusza, aby w wyniku wyświetlono wszystkie grupy, nawet nie posiadające wierszy spełniających kryteriów klauzuli WHERE; ALL nie może być użyte razem z CUBE czy ROLLUP; CUBE oznacza, że w zbiorze wyników znajdą się również dodatkowe streszczenia wszystkich kombinacji grup i podgrup, natomiast ROLLUP zwróci takie grupy w porządku hierarchicznym - od najniższego do najwyższego poziomu
klauzula COMPUTE
[compute {{avg|count|max|min|stdev|stdevp|var|varp|sum} (wyrażenie)} [,...n] [ by wyrażenie [,...n]]]
wystąpić może po klauzuli ORDER BY i tworzy podsumowanie, które pojawia się na końcu zbioru wyników jako dodatkowe kolumny; służy do tworzenia sum częściowych i przerw kontrolnych na raportach
klauzula OPTION
służy do zmiany domyślnego sposobu przetwarzania zapytania i zdefiniowania wskazówki zapytania - wg której zapytanie będzie realizowane
MySQL -
select [straight join][sql_small_result][sql_big_result][high_priority] [into {outfile |dumpfile} nazwa_pliku opcje from ... join... [limit [[offset,] liczba_wierszy]]; klauzula STRAIGHT_JOIN
wymusza na optymalizatorze łączenie tabel w kolejności ich wypisania w klauzuli FROM klauzula SQL_SMALL_RESULT, SQL_BIG_RESULT informacja dla optymalizatora, czy ma tworzyć tablicę tymczasową w pamięci operacyjnej (small), czy spowalniając wykonanie zapytania - tablicę tymczasową na dysku (big)
klauzula HIGH_PRIORITY
zapytanie dostaje wyższy priorytet wykonania niż operacje modyfikujące dane w tabeli - powinno być używane wyłącznie w sytuacjach specjalnych - do szybkich zapytań
klauzula LIMIT
ogranicza liczbę zwracanych wierszy, rozpoczynając od wartości offset i zwracając liczbę liczba_wierszy; jeden parametr w klauzuli LIMIT oznacza offset równy zero;
klauzula INTO
wynik zapytania można zapisać do pliku zewnętrznego (nie może istnieć wcześniej), a plik dumpfile jest plikiem do przechowywania dużych obiektów binarnych
ograniczenia ANSI JOIN
MySQL obsługuje podzbiór pełnej składni ANSI JOIN
Oracle
obsługa tablic zagnieżdżonych i partycjonowanych
wymagane, gdyż Oracle udostępnia takie specyficzne obiekty
klauzula SAMPLE
from ... [sample [block] [procentowy_rozmiar_próbki]
rekordy do zbioru wynikowego mają być wybrane z próbki losowej, a nie z całej tabeli; jeśli pojawi się słowo BLOCK, to losowość dotyczy bloków a nie rekordów; próbkowanie może być stosowane tylko w zapytaniach dotyczących jednej tabeli
obsługa linków
za pomocą klauzuli @połączenie_z_bazą_danych zapytanie może sięgać do innych baz i serwerów, o ile taki link zostać wcześniej zadeklarowany
klauzula NULL FIRST, NULL LAST
występują po ORDER BY i definiują, czy w wyniku uporządkowania rekordy zawierające wartości NULL mają być na początku, czy na końcu zestawu zwróconych krotek
hierarchizacja wyniku
za pomocą klauzul START WITH i CONNECT BY można zbudować hierarchiczną strukturę wyniku zapytania
klauzula FOR UPDATE OF - NOWAIT
blokuje wiersz zwracany przez zapytanie w celu skutecznego zachowania spójności realizowanych transakcji; opcja NOWAIT oznacza, że Oracle ma zwrócił wynik natychmiast, nie czekając na zwolnienie ewentualnie zablokowanych wierszy - wówczas zamiast wyświetlenia rezultatu użytkownik dostanie informację, że zapytanie jest zakończone i może podejmować dalsze działania
składnia SELECT ... INTO
można stosować tylko w PL/SQL; służy do przypisywania wartości zmiennym
PostgreSQL
składnia SELECT ...INTO
działa podobnie jak w MS-SQL Server
klauzula LIMIT
działa podobnie jak w MySQL
klauzula FOR UPDATE
podobnie jak w Oracle
Instrukcje diagnostyczne SQL: GET DIAGNOSTICS instrukcja nie implementowana w serwerach
Instrukcje obsługi schematów SQL: CREATE TABLE
zwykle oprócz utworzenia tablicy implementacje pozwalają na definiowanie kluczy, integralności referencyjnej, więzów, wartości domyślnych; wszystkie znane implementacje odbiegają od ustalonegop standardu, czyli dodają swoją funkcjonalność
SQL3:
create [global temporary|local temporary] table nazwa_tabeli [on commit {preserve rows|delete rows} (Nazwa_kolumny typ_danych atrybuty [,...n]) | [like nazwa_tabeli] | [więzy_tabeli] [,...n]];
tabela tymczasowa powstaje w trakcie bieżącej sesji i jest automatycznie usuwana, gdy kończy się sesja; tabela może być globalna - dostępna dla wszystkich aktywnych sesji użytkowników lub lokalna - dostępna tylko w sesji użytkownika, który ją stworzył; po wydaniu polecenia COMMIT wiersze z tablicy tymczasowej mogą być usunięte, albo zachowane;
operator LIKE pozwala na utworzenie tabeli z takimi samymi definicjami kolumn i więzów, jak w istniejącej tabeli
MS-SQL Server
można nadawać więzy na poziomie kolumn (wiele więzów na kolumnę, o ile więzy się nie wykluczają (np. PRIMARY KEY oraz NULL));
możliwe jest tworzenie lokalnych tablic tymczasowych w specjalnej bazie danych tempdb (nazwa tablicy lokalnej zaczyna się od #); nazwa globalnej tablicy tymczasowej zaczyna się od ##;
można zażądać nadawania dla danej kolumny globalnie unikatowej wartości (ROWGIDCOL) - tylko jedna taka kolumna w tabeli, wartości wstawiane za pomocą funkcji NEWID - pomocne w replikacji
kolumna zdefiniowana jako IDENTITY - dla typu całkowitego generuje automatycznie wartości licznikowe poczynając od wartości wskazanej i z inkrementacją o wartość zdefiniowaną w deklaracji tablicy
kolumna zdefiniowana jako DEAFULT będzie przyjmować zdefiniowane w deklaracji wartości domyślne - nie dotyczy kolumn typu timestamp, albo o zdefiniowanej własności IDENTITY w definicji kluczy obcych można wskazać zachowanie się referencji przy aktualizacji i usuwaniu wierszy: CASCADE albo NO ACTION
w SQL Server2000 można ustawić własność COLLATE na poziomie kolumny ; sortowanie i zestaw znaków narodowych dla każdej kolumny osobno
można zadeklarować kolumny wyliczane na podstawie wartości innych kolumn - i na nich nakładać więzy, sortowanie itd.
Można zdefiniować, w której grupie plików mają być zapisane dane z tabeli (ON grupa_plików | DEFAULT )
MySQL
tworzenie tablic tymczasowych tylko dla bieżącej sesji
w czasie tworzenia tabeli powstają 3 pliki: plik definicji tabeli z rozszerzeniem .frm, plik z danymi o rozszerzeniu .myd, plik indeksu z rozszerzeniem .myi. Dla kolumn o typach całkowitych można ustawić autoinkrementacją (tylko jedna kolumna w tabeli); usunięcie wiersza z wartością najwyższą powoduje ponowne użycie największej wartości; usunięcie wszystkich wartości powoduje liczenie od początku synonimem dla indeksu jest w MySQL KEY
klauzule FOREIGN KEY, CHECK,REFERENCES w MySQL nie robić nic i zostały dodane tylko dla zwiększenia kompatybilności ze standardem
za pomocą opcji TYPE można opisać sposób fizycznego rozmieszczenia danych; klasycznym typem jest ISAM, bardziej przenośnym - MyISAM; tablice typu HEAP są przechowywane w pamięci operacyjnej
jest wiele opcji służących do optymalizacji wydajności tabeli
możliwe jest wypełnienie tablicy wynikami polecenia select, np. CREATE TABLE przykład_testowy
(Kolumna_a INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (kolumna_a) INDEX (kolumna_b)) TYPE = HEAP SELECT kolumna_b, kolumna_c FROM przyklady; Oracle
bardzo skomplikowana implementacja; wg wielu najbardziej złożone pojedyncze polecenie we wszystkich SQL - część składni pokazano na wykładach; tu pokazany zostanie przykładowy element ponad standard:
-- cechy fizyczne
{[{[atrybuty fizyczne]
| TABLESPACE nazwa_przestrzeni_tabel
|{LOGGING | NOLOGGING}}]
|{ORGANISATION {HEAP [{[atrybuty fizyczne]
|TABLESPACE nazwa_przestrzeni_tabel
|{LOGGING|NOLOGGING}}]
|INDEX (klauzula_indeksu_tabeli)]
|CLUSTER nazwa_klastra (kolumna [,...n])}
[specjalne_klauzule_składowania]
Atrybuty fizyczne: pctfree,pctused,initrans,maxtrans
Organisation heap: system fizycznie ma rozmieszczać wiersze w dowolnym porządku
Klauzula składowania: initial, next, minextents, maxextents, pctincrease, freelists, freelist groups, optimal, buffer_pool
Specjalne_klauzule_składowania - definiują sposób przechowywania trzech specjalnych typów danych: dużych obiektów, danych typów varray oraz tabel zagnieżdżonych:
{LOB {obiekt_LOB [,n]) STORE AS {ENABLE|DISABLE} STORAGE IN ROW | (obiekt_LOB) STORE AS {nazwa_segmentu_LOB ({ENABLE|DISABLE} STORAGE IN ROW) |nazwa_segmentu_LOB |({ENABLE|DISABLE} STORAGE IN ROW)} | VARRAY obiekt_varray STORE AS | NESTED TABLE obiekt_zagnieżdżony STORE AS tabela_składowania [(cechy fizyczne)] [RETURN AS {LOCATOR|VALUE}]}, przykład: create table duze_obiekty (Zdjęcie BLOB, tekst CLOB) Storage (initial 256M next 256M) Lob (zdjęcie,tekst) store as (tablespace segment_duych_obiektow storage (initial 512M next 512M) nocache logging);
tabela zagnieżdżona - to wirtualnie umieszczona tabela w kolumnie innej tabeli
PostgreSQL
tablice tymczasowe tworzone podobnie jak w MySQL;
podstawowe więzy podobnie jak w MS SQL Server; umożliwia tworzenie więzów poziomu
kolumny jednocześnie na zbiorze kolumn
więz klucza obcego może wymagać tylko częściowego dopasowania (niekoniecznie pełnego)
Więz klucza obcego obsługiwany podobnie jak w MS-SQL Server z akcjami ON DELETE i ON UPDATE, z ustawianiem wartości domyślnej, albo wartości NULL (oprócz trybu restrykcyjnego oraz kaskadowego)
Zezwala się na opóźnienie testowania spójności więzów po zakończeniu całej transakcji zezwala się na dziedziczenie struktury tabeli w celu utworzenia nowej tabeli
Instrukcje obsługi sesji SET TRANSACTION
nie obsługiwane w MySQL, w pełni obsługiwane w PostgreSQL
SQL3:
set [local] transaction {{read only|read write}[,...] |isolation level {read commited|read uncommited|repeatable read|serializable}[,...]|diagnostic size liczba};
polecenie dotyczy następnej rozpoczętej (i ważnej) transakcji
klauzula LOCAL oznacza, że ustawienia mogą być zastosowane tylko do lokalnego serwera;
klauzula DIAGNOSTIC SIZE pozwala na podanie liczby komunikatów o błędach przechwytywanych w transakcji domyślny poziom izolacji to SERIALIZABLE
transakcje READ WRITE nie mogą być ustawione w tryb READ UNCOMMITED
MS SQL Server domyślny poziom izolacji to READ COMMITED, a poziomy izolacji ustawiane są na czas trwania sesji, a nie transakcji; w składni polecenia pozostaje tylko fragment dotyczący ustawiania poziomu izolacji Oracle obsługuje tylko READ COMMITED i SERIALIZABLE; domyślne jest READ COMMITED; gdy ustawione są polecenia: READ ONLY, ALTER SESSION, ALTER SYSTEM, LOCK TABLE, SET ROLE wówczas dopuszczalne jest wykonywanie wyłącznie polecenia SELECT
PostgreSQL
set transaction isolation level read commited
oznacza, że wiersze tylko do odczytu w bieżącej transakcji są zatwierdzane przed rozpoczęciem transakcji - inna interpretacja składni polecenia
Instrukcje obsługi transakcji SQL COMMIT (TRANSACTION)
jawnie kończy transakcją otwartą jawnie za pomocą polecenia BEGIN lub niejawnie jako część instrukcji INSERT,UPDATE,DELETE. Nie obsługiwane w MySQL.
Polecenie zamyka wszystkie powiązane z zatwierdzaną transakcją otwarte kursory. Ponadto usuwa dane z wszystkich tymczasowych tabel stworzonych z klauzulą ON COMMIT DELETE ROWS. Poza tym zwalnia wszystkie blokady założone w obrębie transakcji. Następnie sprawdzane są wszystkie odroczone więzy spójności - w przypadku ich naruszenia transakcja jest wycofywana.
MS SQL Server
SQL Server zwykle zamyka ostatnio otwartą transakcją; transakcje są identyfikowane przy użyciu globalne zmiennej @@TRANCOUNT, a wszystkie są zakończone tylko wtedy, gdy wartość tej zmiennej = 0; SQL Server pozwala nazywać transakcje w celu identyfikowania transakcji do późniejszego zamknięcia:
commit [tran[saction] [nazwa_transakcji | @zmienna_z_nazwa_transakcji]]
Oracle nie pozwala nadawać nazw transakcjom; COMMIT zatwierdza wszystkie transakcje od poprzedniego COMMITa lub ROLLBACKa w sesji
PostgreSQL podobnie jak w Oracle