SQL (ang. Structured Query Language wym. /ɛskjuːˈɛl/, rzadziej /ˈsiːkwəl/) – strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz do umieszczania oraz pobierania danych z baz danych.
Język SQL jest językiem deklaratywnym. Decyzję o sposobie przechowywania oraz pobrania danych pozostawia się systemowi zarządzania bazą danych (DBMS).
Historia
SQL stał się opracowany w latach 70. w firmie IBM. Stał się standardem w komunikacji z serwerami relacyjnych baz danych. Wiele współczesnych systemów relacyjnych baz danych używa do komunikacji z użytkownikiem SQL, dlatego potocznie mówi się, że korzystanie z relacyjnych baz danych to korzystanie z SQL-a.
Pierwszą firmą, która włączyła SQL do swojego produktu komercyjnego, był Oracle. Dalsze wprowadzanie SQL-a, w produktach innych firm, wiązało się nierozłącznie z wprowadzaniem modyfikacji pierwotnego języka. Wkrótce utrzymanie dalszej jednolitości języka wymagało wprowadzenia standardu.
Pierwotną nazwą języka miał być SEQUEL, jednakże okazało się, że nazwa ta była już zastrzeżona przez brytyjską wytwórnię lotniczą Hawker Siddeley.
Standardy SQL
W 1986 SQL stał się oficjalnym standardem, wspieranym przez Międzynarodową Organizację Normalizacyjną (ISO) oraz jej członka, Amerykański Narodowy Instytut Normalizacji (ANSI).
Wczesne wersje specyfikacji (SQL86 oraz SQL89) były w dużej mierze zaledwie określeniem wspólnej płaszczyzny łączącej zróżnicowane istniejące wówczas produkty oraz pozostawiały wiele swobody twórcom implementacji. Z biegiem czasu jednak systemy komputerowe uległy integracji oraz rynek zaczął domagać się aplikacji oraz ich funkcji faktycznie współpracujących z wieloma różnymi bazami danych. Pojawiła się potrzeba określenia standardu ściślejszego. Mógł on równocześnie obejmować nowe elementy, nieujęte do tej pory w języku. Tak powstał standard SQL92, obowiązujący w produktach komercyjnych do dziś.
W 2003 przedstawiono SQL:2003 – nowy standard języka SQL. Został on opublikowany w Sigmod Record Vol. 33 No. 1 marca 2004. Jest to w zasadzie poprawione SQL:1999 z wyjątkiem części SQL/XML oraz kilku dodatkowych właściwości.
Zmiany wprowadzone w SQL:2003:
- Dodano nowe typy danych (BIGINT, MULTISET oraz XML).
- Usunięto typy BIT oraz BIT VARYING.
- Wprowadzono rozszerzenia w sposobie wywoływania procedur.
- Poszerzono instrukcję CREATE TABLE (CREATE TABLE { LIKE | AS }).
- Wprowadzono instrukcję MERGE.
- Wprowadzono nowy obiekt schematu – generator sekwencji.
- Wprowadzono dwa nowe typy kolumn – identyfikatory oraz generowane.
- Wprowadzono retrospektywne sprawdzanie więzów integralności.
- Wprowadzono rozszerzenia dla OLAP w formie wbudowanych funkcji (skalarnych oraz agregujących).
- Wprowadzono klauzulę WINDOW.
Prowadzone są także prace nad alternatywnymi językami zapytań opartymi na SQL. Przykładem takiego języka bywa język ciągłych zapytań CQL albo język SQL wyposażony w możliwość przetwarzania sekwencji danych AQuery.
Funkcje silnika oraz oprogramowania pośredniczącego
Produkty związane z relacyjnymi bazami danych to nie tylko serwery. Sam serwer wyznacza się wielokrotnie takimi nazwami jak „back end”, „engine”, czy też „motor/silnik bazy danych”. Przechowuje on dane oraz zapewnia ich pobieranie oraz aktualizacje w odpowiedzi na pobierane instrukcje w SQL-u.
Uzupełnieniem serwera jest zwykle „front end”, „oprogramowanie pośredniczące” czy też „fronton” – narzędzia upraszczające komunikację z serwerem oraz wyposażone w mechanizmy pozwalające wykorzystać pobrane dane. Należą do nich mechanizmy generowania oraz obsługi formularzy oraz raportów, języki czwartej generacji (4GL), graficzne języki zapytań, narzędzia konstrukcyjne użytkownika, oprogramowanie do prezentacji multimedialnych, systemy tworzenia hipertekstu, systemy CAD/CAM, arkusze kalkulacyjne, jak także interfejsy dostępu bezpośredniego. Wszystkie one wykorzystują do komunikacji z serwerem oraz wykonywania za jego pośrednictwem wielorakich operacji język SQL. Serwer odpowiada za przechowywanie, porządkowanie oraz pobieranie danych, zapewnia ich integralność, bezpieczeństwo oraz zabezpiecza przed ewentualnymi konfliktami pomiędzy użytkownikami.
Formy SQL-a
Z technicznego punktu widzenia, SQL jest podjęzykiem danych. Oznacza to, że jest on wykorzystywany jedynie do komunikacji z bazą danych. Nie ma on cech pozwalających na wykonywanie kompletnych programów. Jego wykorzystanie bywa trojakie oraz z tego względu wyróżnia się trzy formy SQL-a:
- SQL interakcyjny (autonomiczny) wykorzystywany jest przez użytkowników w celu bezpośredniego pobierania albo wprowadzania informacji do bazy. Przykładem bywa zapytanie prowadzące do uzyskania zestawienia aktywności kont w miesiącu. Wynik jest wówczas przekazywany na ekran, z ewentualną opcją przekierowania go do pliku albo drukarki.
- Statyczny kod SQL (Static SQL) nie ulega zmianom oraz pisany jest wraz z całą aplikacją, podczas której pracy jest wykorzystywany. Nie ulega zmianom w sensie zachowania niezmiennej treści instrukcji, które jednak zawierać potrafią odwołania do zmiennych albo parametrów przekazujących wartości z albo do aplikacji. Statyczny SQL jest w dwóch odmianach.
- Embedded SQL (Osadzony SQL) oznacza włączenie kodu SQL do kodu źródłowego innego języka. Przeważajaca ilość aplikacji pisana jest w takich językach jak C++ czy Java, zaledwie odwołania do bazy danych realizowane są w SQL. W tej odmianie statycznego SQL-a do przenoszenia wartości wykorzystywane są zmienne.
- Język modułów. W tym podejściu moduły SQL łączone są z modułami kodu w innym języku. Moduły kodu SQL przenoszą wartości do oraz z parametrów, analogicznie jak to się dzieje przy wywoływaniu podprogramów w większości języków proceduralnych. Jest to pierwotne podejście, zaproponowane w standardzie SQL. Embedded SQL stał się do oficjalnej specyfikacji włączony nieco później.
- Dynamiczny kod SQL (Dynamic SQL) generowany jest w trakcie pracy aplikacji. Wykorzystuje się go w miejsce podejścia statycznego, jeżeli w chwili pisania aplikacji nie jest możliwe określenie treści potrzebnych zapytań – powstaje ona w oparciu o decyzje użytkownika. Tę formę SQL generują przede wszystkim takie narzędzia jak graficzne języki zapytań. Utworzenie odpowiedniego zapytania jest tu odpowiedzią na działania użytkownika.
Wymagania tych trzech form różnią się oraz znajduje to odbicie w wykorzystywanych przez nie konstrukcjach językowych. Zarówno statyczny, jak oraz dynamiczny SQL uzupełniają formę autonomiczną cechami odpowiednimi tylko w określonych sytuacjach. Zasadnicza cząstka języka pozostaje jednak dla wszystkich form identyczna.
Składnia SQL
Użycie SQL, zgodnie z jego nazwą, opiera się na zadawaniu zapytań do bazy danych. Zapytania da się zaliczyć do jednego z czterech głównych podzbiorów:
- SQL DML (ang. Data Manipulation Language – „język manipulacji danymi”),
- SQL DDL (ang. Data Definition Language – „język definicji danych”),
- SQL DCL (ang. Data Control Language – „język kontroli nad danymi”).
- SQL DQL (ang. Data Query Language – „język definiowania zapytań”).
Instrukcje SQL w obrębie zapytań tradycyjnie zapisywane są wielkimi literami, jednak nie jest to wymóg. Każde zapytanie w SQL-u musi kończyć się znakiem średnika (;).
Dodatkowo, pewne programy do łączenia się z silnikiem bazy danych (np. psql w przypadku PostgreSQL), używają swoich własnych instrukcji, spoza standardu SQL, które służą np. do połączenia się z bazą, wyświetlenia dokumentacji itp.
DML
DML (Data Manipulation Language) służy do wykonywania operacji na danych – do ich umieszczania w bazie, kasowania, przeglądania oraz dokonywania zmian. Najważniejsze polecenia z tego zbioru to:
- INSERT – umieszczenie danych w bazie,
- UPDATE – przeistoczenie danych,
- DELETE – usunięcie danych z bazy.
Dane tekstowe muszą być stale ujęte w znaki pojedynczego cudzysłowu (').
DDL
Dzięki DDL (Data Definition Language) da się operować na strukturach, w których dane są przechowywane – czyli np. dodawać, zmieniać oraz kasować tabele albo bazy. Najważniejsze polecenia tej grupy to:
- CREATE (np. CREATE TABLE, CREATE DATABASE, ...) – założenie struktury (bazy, tabeli, indeksu itp.),
- DROP (np. DROP TABLE, DROP DATABASE, ...) – usunięcie struktury,
- ALTER (np. ALTER TABLE ADD COLUMN ...) – przeistoczenie struktury (dodanie kolumny do tabeli, przeistoczenie typu danych w kolumnie tabeli).
DCL
DCL (Data Control Language) ma zastosowanie do nadawania uprawnień do obiektów bazodanowych. Najważniejsze polecenia w tej grupie to:
- GRANT (np. GRANT ALL PRIVILEGES ON EMPLOYEE TO PIOTR WITH GRANT OPTION) – przyznanie wszystkich praw do tabeli EMPLOYEE użytkownikowi PIOTR z opcją pozwalającą mu nadawać prawa do tej tabeli.
- REVOKE – odebranie użytkownikowi wszystkich praw do tabeli, które zostały przyznane poleceniem GRANT.
- DENY.
DQL
DQL (Data Query Language) to język formułowania zapytań do bazy danych. W zakres tego języka wchodzi jedno polecenie - SELECT. Wielokrotnie SELECT traktuje się jako cząstka języka DML, ale to podejście nie wydaje się właściwe, albowiem DML z definicji służy do manipulowania danymi - ich tworzenia, usuwania oraz uaktualniania.
Na pograniczu obu języków istnieje polecenie SELECT INTO, które dodatkowo modyfikuje (przepisuje, tworzy) dane.
Przykładowe zapytania
Przykłady użycia wyżej wymienionych rodzajów zapytań:
SELECT *
FROM pracownicy
WHERE pensja > 2000
ORDER BY staz DESC;
- Zwraca tabelę (listę) utworzoną ze wszystkich kolumn (*) tabeli „pracownicy” (FROM pracownicy) zawierającą pracowników, których pensja jest większa niż 2000 (WHERE pensja > 2000) oraz sortuje wynik malejąco wedle parametru staz (ORDER BY staz DESC).
INSERT INTO pracownicy
(imie, nazwisko, pensja, staz)
VALUES
('Jan', 'Kowalski', 5500, 1);
- Dodaje do tabeli „pracownicy” (INTO pracownicy) wiersz (rekord) zawierający dane pojedynczego pracownika.
UPDATE pracownicy
SET pensja = pensja * 1.1
WHERE staz > 2;
- Podwyższa o 10% pensję (SET pensja = pensja * 1.1) pracownikom, których staż jest większy niż 2 (np. lata).
DELETE FROM pracownicy
WHERE imie = 'Jan' AND nazwisko = 'Kowalski';
- Usuwa z tabeli „pracownicy” wszystkie wiersze (rekordy) dotyczące pracownika o imieniu „Jan” oraz nazwisku „Kowalski” (czyli takie, w których pole "imię" ma wartość Jan, a pole "nazwisko" – Kowalski).
CREATE TABLE pracownicy
(
imie VARCHAR(255),
nazwisko VARCHAR(255),
pensja FLOAT,
staz INT
);
- Tworzy tabelę „pracownicy” zawierającą pola tekstowe zmiennej długości (varchar) o nazwach „imie” (imię) oraz „nazwisko”, o maksymalnej długości 255 znaków, zapisaną za pomocą liczby rzeczywistej (float od ang. floating point) pensję oraz zapisany za pomocą liczby całkowitej (int od ang. integer) staż.
- Usuwa z bazy tabelę „pracownicy”.
ALTER TABLE pracownicy
ADD dzial VARCHAR(255);
- Dodaje do struktury tabeli „pracownicy” kolumnę „dzial” (dział), jako pole tekstowe o długości maks. 255 znaków.
Bezpieczeństwo
Jako że SQL jest językiem interpretowanym, istnieje możliwość nadużyć w przypadku konstruowania zapytań z wykorzystaniem parametrów pochodzących z zewnątrz aplikacji. Szczególnie podatne na ten typ ataku są wykonywane dynamicznie w oparciu o SQL-ową bazę danych serwisy internetowe. Jeśli twórca aplikacji nie zadba o sprawdzenie poprawności (tzw. walidację) danych wejściowych stanowiących cząstka zapytania, atakujący bywa w stanie dopisać do zapytania („wstrzyknąć”) dodatkowe komendy albo zmienić ich sposób działania. Atak taki nosi nazwę SQL injection (wstrzyknięcie kodu za pomocą SQL).
-
Osobny artykuł: SQL injection.
Systemy bazodanowe używające SQL
Sprawdź też
Linki zewnętrzne