[wersja nieprzejrzana][wersja przejrzana]
Usunięta treść Dodana treść
Znaczniki: usuwanie dużej ilości tekstu (filtr nadużyć) VisualEditor
m Wycofano edycje użytkownika 46.228.91.90 (dyskusja). Autor przywróconej wersji to Ignasiak.
Linia 1:
{{dopracować|źródła=2014-12}}
{{Język programowania infobox
| nazwa = SQL
| logo =
| wielkość_loga =
| data = [[1974]]
| paradygmat = [[Programowanie wieloparadygmatowe|wieloparadygmatowy]]
| typowanie = [[typowanie statyczne|statyczne]], [[typowanie silne]]
| implementacje = [[Lista systemów zarządzania relacyjnymi bazami danych|wiele]]
| pochodne = [[SQL-86]], [[SQL-89]], [[SQL-92]], [[SQL:1999]], [[SQL:2003]], [[SQL:2006]], [[SQL:2008]]
| wersja = SQL:2011/ 2011
| wersja testowa =
| twórca = [[Donald D. Chamberlin]] i [[Raymond F. Boyce]]
| licencja =
| platforma =
| system = [[wieloplatformowość|wieloplatformowy]]
| wikibooks =
| www =
}}
'''SQL''' ([[język angielski|ang.]] ''Structured Query Language'' wym. /ɛskjuːˈɛl/) – strukturalny [[język zapytań]] używany do tworzenia, modyfikowania [[baza danych|baz danych]] oraz do umieszczania i pobierania danych z baz danych.
 
Język SQL jest [[Programowanie deklaratywne|językiem deklaratywnym]]. Decyzję o sposobie przechowywania i pobrania danych pozostawia się [[System zarządzania bazą danych|systemowi zarządzania bazą danych]] (DBMS).
 
== Historia ==
SQL został opracowany w latach 60. w firmie [[IBM]]. Stał się [[standard]]em w komunikacji z [[serwer]]ami relacyjnych [[baza danych|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 Corporation|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ą ([[Międzynarodowa Organizacja Normalizacyjna|ISO]]) i jej członka, Amerykański Narodowy Instytut Normalizacji ([[American National Standards Institute|ANSI]]).
 
Wczesne wersje specyfikacji ('''SQL86''' i '''SQL89''') były w dużej mierze jedynie określeniem wspólnej płaszczyzny łączącej różne istniejące wówczas produkty i pozostawiały wiele swobody twórcom implementacji. Z czasem jednak systemy [[komputer]]owe uległy integracji i rynek zaczął domagać się [[Oprogramowanie użytkowe|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 jednocześ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 [http://www.acm.org/sigmod/record/issues/0403/E.JimAndrew-standard.pdf 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 [[Online Analytical Processing|OLAP]] w formie wbudowanych funkcji (skalarnych i agregujących).
# Wprowadzono klauzulę WINDOW.
 
Prowadzone są również prace nad alternatywnymi językami zapytań opartymi na SQL. Przykładem takiego języka może być język ciągłych zapytań [[CQL]] lub język SQL wyposażony w możliwość przetwarzania sekwencji danych [[AQuery]].
 
== Funkcje silnika i oprogramowania pośredniczącego ==
Produkty związane z [[Model relacyjny|relacyjnymi bazami danych]] to nie tylko serwery. Sam serwer określa się często takimi nazwami jak „back end”, „engine”, czy też „motor/[[silnik (informatyka)|silnik]] bazy danych”. Przechowuje on dane oraz zapewnia ich pobieranie i aktualizacje w odpowiedzi na pobierane instrukcje w SQL-u.
 
Uzupełnieniem serwera jest zazwyczaj „front end”, „[[oprogramowanie pośredniczące]]” czy też „fronton” – narzędzia upraszczające komunikację z serwerem i wyposażone w mechanizmy pozwalające wykorzystać pobrane dane. Należą do nich mechanizmy generowania i obsługi formularzy oraz raportów, języki czwartej generacji ([[4GL]]), graficzne języki zapytań, narzędzia konstrukcyjne użytkownika, [[oprogramowanie]] do prezentacji [[multimedia]]lnych, systemy tworzenia [[hipertekst]]u, systemy [[Projektowanie wspomagane komputerowo|CAD]]/[[Komputerowe wspomaganie wytwarzania|CAM]], [[arkusz kalkulacyjny|arkusze kalkulacyjne]], jak również [[Interfejs (urządzenie)|interfejsy]] dostępu bezpośredniego. Wszystkie one wykorzystują do komunikacji z serwerem i wykonywania za jego pośrednictwem różnych operacji język SQL. Serwer odpowiada za przechowywanie, porządkowanie i pobieranie danych, zapewnia ich integralność, bezpieczeństwo oraz zabezpiecza przed ewentualnymi konfliktami między użytkownikami.
 
== Formy SQL-a ==
Z technicznego punktu widzenia, SQL jest podjęzykiem danych. Oznacza to, że jest on wykorzystywany wyłącznie do komunikacji z bazą danych. Nie posiada on cech pozwalających na tworzenie kompletnych programów. Jego wykorzystanie może być trojakie i 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 lub wprowadzania informacji do bazy. Przykładem może być zapytanie prowadzące do uzyskania zestawienia aktywności kont w miesiącu. Wynik jest wówczas przekazywany na ekran, z ewentualną opcją [[przekierowanie|przekierowania]] go do [[plik]]u lub [[drukarka|drukarki]].
# '''Statyczny''' kod SQL (Static SQL) nie ulega zmianom i 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ć mogą odwołania do zmiennych lub parametrów przekazujących wartości z lub do aplikacji. Statyczny SQL występuje w dwóch odmianach.
## '''Embedded SQL''' (Osadzony SQL) oznacza włączenie kodu SQL do kodu źródłowego innego języka. Większość aplikacji pisana jest w takich językach jak [[C++]] czy [[Java]], jedynie 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 i z parametrów, podobnie jak to się dzieje przy wywoływaniu podprogramów w większości [[programowanie proceduralne|języków proceduralnych]]. Jest to pierwotne podejście, zaproponowane w standardzie SQL. Embedded SQL został 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ę i znajduje to odbicie w wykorzystywanych przez nie konstrukcjach językowych. Zarówno statyczny, jak i dynamiczny SQL uzupełniają formę autonomiczną cechami odpowiednimi tylko w określonych sytuacjach. Zasadnicza część języka pozostaje jednak dla wszystkich form identyczna.
 
== Składnia SQL ==
Linia 6 ⟶ 71:
* '''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, niektóre 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''' – zmiana danych,
* '''DELETE''' – usunięcie danych z bazy.
 
Dane tekstowe muszą być zawsze ujęte w znaki pojedynczego cudzysłowu (').
 
=== DDL ===
Dzięki DDL (Data Definition Language) można operować na strukturach, w których dane są przechowywane – czyli np. dodawać, zmieniać i kasować tabele lub bazy. Najważniejsze polecenia tej grupy to:
 
* '''[[Create (SQL)|CREATE]]''' (np. CREATE TABLE, CREATE DATABASE, ...) – utworzenie struktury (bazy, tabeli, indeksu itp.),
* '''[[Drop (SQL)|DROP]]''' (np. DROP TABLE, DROP DATABASE, ...) – usunięcie struktury,
* '''[[Alter (SQL)|ALTER]]''' (np. ALTER TABLE ADD COLUMN ...) – zmiana struktury (dodanie kolumny do tabeli, zmiana 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 (SQL)|GRANT]]''' – służące do nadawania uprawnień do pojedynczych obiektów lub globalnie konkretnemu użytkownikowi (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 (SQL)|REVOKE]]''' – służące do odbierania wskazanych uprawnień konkretnemu użytkownikowi (np. REVOKE ALL PRIVILEGES ON EMPLOYEE FROM PIOTR – odebranie użytkownikowi wszystkich praw do tabeli EMPLOYEE).
* '''[[DENY (SQL)|DENY]]'''.
 
=== DQL ===
DQL (Data Query Language) to język formułowania zapytań do bazy danych. W zakres tego języka wchodzi jedno polecenie – SELECT. Często SELECT traktuje się jako część języka DML, ale to podejście nie wydaje się właściwe, ponieważ DML z definicji służy do manipulowania danymi – ich tworzenia, usuwania i uaktualniania. Na pograniczu obu języków znajduje się polecenie SELECT INTO, które dodatkowo modyfikuje (przepisuje, tworzy) dane.
 
=== Przykładowe zapytania ===
Przykłady użycia wyżej wymienionych rodzajów zapytań:
<source lang="sql">
SELECT *
FROM pracownicy
WHERE pensja > 2000
ORDER BY staz DESC;
</source>
: 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''') i sortuje wynik malejąco według parametru '''staz''' ('''ORDER BY staz DESC''').
 
<source lang="sql">
INSERT INTO pracownicy
(imie, nazwisko, pensja, staz)
VALUES
('Jan', 'Kowalski', 5500, 1);
</source>
: Dodaje do tabeli „pracownicy” ('''INTO pracownicy''') wiersz (rekord) zawierający dane pojedynczego pracownika.
 
<source lang="sql">
UPDATE pracownicy
SET pensja = pensja * 1.1
WHERE staz > 2;
</source>
: Podwyższa o 10% pensję ('''SET pensja = pensja * 1.1''') pracownikom, których staż jest większy niż 2 (np. lata).
 
<source lang="sql">
DELETE FROM pracownicy
WHERE imie = 'Jan' AND nazwisko = 'Kowalski';
</source>
: Usuwa z tabeli „pracownicy” wszystkie wiersze (rekordy) dotyczące pracownika o imieniu „Jan” i nazwisku „Kowalski” (czyli takie, w których pole "imię" ma wartość '''Jan''', a pole "nazwisko" – '''Kowalski''').
 
<source lang="sql">
CREATE TABLE pracownicy
(
imie varchar(255),
nazwisko varchar(255),
pensja float,
staz int
);
</source>
: Tworzy tabelę „pracownicy” zawierającą pola tekstowe zmiennej długości (varchar) o nazwach „imie” (imię) i „nazwisko”, o maksymalnej długości 255 znaków, zapisaną za pomocą [[liczby rzeczywiste]]j (float od ang. '''floating point''') pensję oraz zapisany za pomocą [[liczby całkowite]]j (int od ang. '''integer''') staż.
 
<source lang="sql">
DROP TABLE pracownicy;
</source>
: Usuwa z bazy tabelę „pracownicy”.
 
<source lang="sql">
ALTER TABLE pracownicy
ADD dzial varchar(255);
</source>
: Dodaje do struktury tabeli „pracownicy” kolumnę „dzial” (dział), jako pole tekstowe o długości maks. 255 bajtów.
 
== Bezpieczeństwo ==
Ponieważ 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ą tworzone dynamicznie w oparciu o SQL-ową bazę danych serwisy internetowe. Jeśli twórca aplikacji nie zadba o sprawdzenie poprawności (tzw. [[walidacja danych|walidację]]) danych wejściowych stanowiących część zapytania, atakujący może dopisać do zapytania („wstrzyknąć”) dodatkowe komendy lub 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 ==
* [[Apache Derby]]
* [[Caché]]
* [[DATAllegro]]
* [[DB2]]
* [[Firebird]]
* [[First SQL]]
* [[Greenplum]]
* [[HSQLDB|HSQL]]
* [[Ingres (baza danych)|Ingres]]
* [[Informix]]
* [[InterBase|InterBase SQL]]
* [[MariaDB]]
* [[MaxDB]] (dawniej SAP DB)
* [[Microsoft Access]]
* [[Microsoft Jet]]
* [[Microsoft SQL Server]]
* [[Mimer SQL]]
* [[MySQL]]
* [[mSQL]]
* [[Neteeza]]
* [[Oracle Database]]
* [[Oracle Rdb]]
* [[PostgreSQL]]
* [[Pervasive]]
* [[SQL/DS]]
* [[SQLite]]
* [[Sybase]] ([[Sybase Adaptive Server Enterprise]], [[Sybase SQL Anywhere]], [[Sybase IQ]])
* [[Teradata]]
 
== Linki zewnętrzne ==
* http://troels.arvin.dk/db/rdbms/ Różnice pomiędzy popularnymi implementacjami SQL
 
{{Języki programowania}}
 
{{Kontrola autorytatywna}}