SQL: Różnice pomiędzy wersjami
m (→Zobacz też) |
m (→Zobacz też) |
||
Linia 144: | Linia 144: | ||
<htmlet>zobacz-tez</htmlet> | <htmlet>zobacz-tez</htmlet> | ||
* [[Kurs SQL]] | * [[Kurs SQL]] | ||
+ | |||
+ | [[Kategoria:SQL]] |
Aktualna wersja na dzień 19:43, 3 lip 2014
SQL (ang. Structured Query Language) – strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych.
Język SQL jest językiem deklaratywnym. Decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi zarządzania bazą danych (DBMS).
Spis treści
Standardy SQL
W 1986 SQL stał się oficjalnym standardem, wspieranym przez Międzynarodową Organizację Normalizacyjną (ISO) i jej członka, Amerykański Narodowy Instytut Normalizacji (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 komputerowe uległy integracji i 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 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 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 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 relacyjnymi bazami danych to nie tylko serwery. Sam serwer określa się często takimi nazwami jak „back end”, „engine”, czy też „motor/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 multimedialnych, systemy tworzenia hipertekstu, systemy CAD/CAM, arkusze kalkulacyjne, jak również 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ą przekierowania go do pliku lub 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 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
Użycie SQL, zgodnie z jego nazwą, polega na zadawaniu zapytań do bazy danych. Zapytania można zaliczyć do jednego z trzech 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”).
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:
- SELECT – pobranie danych z bazy,
- 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 (np. CREATE TABLE, CREATE DATABASE, ...) – utworzenie struktury (bazy, tabeli, indeksu itp.),
- DROP (np. DROP TABLE, DROP DATABASE, ...) – usunięcie struktury,
- 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 (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.
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) i sortuje wynik malejąco według 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” i 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ę) i „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ż.
DROP TABLE pracownicy;
- 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ą tworzone 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ęść zapytania, atakujący może być w stanie 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).
Źródło: Wikipedia
Systemy bazodanowe używające SQL
Zobacz też
<htmlet>zobacz-tez</htmlet>