Edytujesz SQL
Wygląd
Twoja edycja także może zostać zrewertowana. Sprawdź, czy na pewno chcesz wprowadzić ukazane poniżej różnice między wersjami. Jeżeli edycja, którą rewertujesz, nie jest wandalizmem, dopisz w opisie zmian powód rewertu. Nie poprzestawaj na domyślnym opisie. Pamiętaj o 4. filarze Wikipedii. |
Aktualna wersja | Twój tekst | ||
Linia 1: | Linia 1: | ||
{{dopracować|źródła=2014-12}} |
{{dopracować|źródła=2014-12}} |
||
{{Język programowania infobox |
{{Język programowania infobox |
||
| |
|nazwa = SQL |
||
| |
|logo = |
||
|wielkość_loga = |
|||
| data = 1974 |
|||
| |
|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:2016 |
||
| |
|wersja testowa = |
||
| |
|twórca = [[Donald D. Chamberlin]] i [[Raymond F. Boyce]] |
||
| |
|licencja = |
||
| |
|platforma = |
||
| |
|system = [[wieloplatformowość|wieloplatformowy]] |
||
| |
|wikibooks = |
||
|www = |
|||
| |
|commons = |
||
| www = |
|||
}} |
}} |
||
'''SQL''' ([[ |
'''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. |
||
Decyzję o sposobie przechowywania i pobrania danych pozostawia się [[System zarządzania bazą danych|systemowi zarządzania bazą danych]] (DBMS). |
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 == |
== Historia == |
||
SQL został opracowany w latach 70. w firmie [[IBM]]. Stał się [[standard]]em w komunikacji z [[serwer]]ami relacyjnych [[ |
SQL został opracowany w latach 70. 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. |
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. |
||
Linia 32: | Linia 33: | ||
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]]). |
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 |
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. |
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: |
Zmiany wprowadzone w SQL:2003: |
||
# Dodano nowe |
# Dodano nowe typy danych (BIGINT, MULTISET oraz XML). |
||
# Usunięto typy BIT oraz BIT VARYING. |
# Usunięto typy BIT oraz BIT VARYING. |
||
# Wprowadzono rozszerzenia w sposobie wywoływania procedur. |
# Wprowadzono rozszerzenia w sposobie wywoływania procedur. |
||
Linia 51: | Linia 52: | ||
== Funkcje silnika i oprogramowania pośredniczącego == |
== 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/[[ |
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]], [[ |
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 == |
== 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: |
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ą [[ |
# 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. |
# '''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 |
## '''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 [[ |
## '''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. |
# '''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. |
||
Linia 103: | Linia 104: | ||
=== Przykładowe zapytania === |
=== Przykładowe zapytania === |
||
Przykłady użycia wyżej wymienionych rodzajów zapytań: |
Przykłady użycia wyżej wymienionych rodzajów zapytań: |
||
< |
<source lang="sql"> |
||
SELECT * |
SELECT * |
||
FROM pracownicy |
FROM pracownicy |
||
WHERE pensja > 2000 |
WHERE pensja > 2000 |
||
ORDER BY staz DESC; |
ORDER BY staz DESC; |
||
</source> |
|||
</syntaxhighlight> |
|||
: 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'''). |
: 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 |
INSERT INTO pracownicy |
||
(imie, nazwisko, pensja, staz) |
(imie, nazwisko, pensja, staz) |
||
VALUES |
VALUES |
||
('Jan', 'Kowalski', 5500, 1); |
('Jan', 'Kowalski', 5500, 1); |
||
</source> |
|||
</syntaxhighlight> |
|||
: Dodaje do tabeli „pracownicy” ('''INTO pracownicy''') wiersz (rekord) zawierający dane pojedynczego pracownika. |
: Dodaje do tabeli „pracownicy” ('''INTO pracownicy''') wiersz (rekord) zawierający dane pojedynczego pracownika. |
||
< |
<source lang="sql"> |
||
UPDATE pracownicy |
UPDATE pracownicy |
||
SET pensja = pensja * 1.1 |
SET pensja = pensja * 1.1 |
||
WHERE staz > 2; |
WHERE staz > 2; |
||
</source> |
|||
</syntaxhighlight> |
|||
: Podwyższa o 10% pensję ('''SET pensja = pensja * 1.1''') pracownikom, których staż jest większy niż 2 (np. lata). |
: 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 |
DELETE FROM pracownicy |
||
WHERE imie = 'Jan' AND nazwisko = 'Kowalski'; |
WHERE imie = 'Jan' AND nazwisko = 'Kowalski'; |
||
</source> |
|||
</syntaxhighlight> |
|||
: 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'''). |
: 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 |
CREATE TABLE pracownicy |
||
( |
( |
||
Linia 140: | Linia 141: | ||
staz int |
staz int |
||
); |
); |
||
</source> |
|||
</syntaxhighlight> |
|||
: 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ż. |
: 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; |
DROP TABLE pracownicy; |
||
</source> |
|||
</syntaxhighlight> |
|||
: Usuwa z bazy tabelę „pracownicy”. |
: Usuwa z bazy tabelę „pracownicy”. |
||
< |
<source lang="sql"> |
||
ALTER TABLE pracownicy |
ALTER TABLE pracownicy |
||
ADD dzial varchar(255); |
ADD dzial varchar(255); |
||
</source> |
|||
</syntaxhighlight> |
|||
: Dodaje do struktury tabeli „pracownicy” kolumnę „dzial” (dział), jako pole tekstowe o długości maks. 255 bajtów. |
: Dodaje do struktury tabeli „pracownicy” kolumnę „dzial” (dział), jako pole tekstowe o długości maks. 255 bajtów. |
||
== Bezpieczeństwo == |
== 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. [[ |
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}} |
{{Osobny artykuł|SQL injection}} |
||
Linia 187: | Linia 188: | ||
* [[Sybase]] ([[Sybase Adaptive Server Enterprise]], [[Sybase SQL Anywhere]], [[Sybase IQ]]) |
* [[Sybase]] ([[Sybase Adaptive Server Enterprise]], [[Sybase SQL Anywhere]], [[Sybase IQ]]) |
||
* [[Teradata]] |
* [[Teradata]] |
||
== Zobacz też == |
|||
* [[GraphQL]] |
|||
== Linki zewnętrzne == |
== Linki zewnętrzne == |
||
* |
* http://troels.arvin.dk/db/rdbms/ Różnice pomiędzy popularnymi implementacjami SQL |
||
* [https://sql.org.pl/ Interpreter SQL Online] |
|||
{{Języki programowania}} |
{{Języki programowania}} |