Aby pobrać dane z bazy danych, musisz zażądać ich przy użyciu języka SQL (Structured Query Language). SQL to język komputerowy bardzo podobny do angielskiego, ale rozpoznawany przez programy baz danych. Każde wykonywane zapytanie w rzeczywistości używa języka SQL.
Zrozumienie sposobu działania języka SQL ułatwia tworzenie lepszych zapytań oraz poprawianie takich, które nie zwracają oczekiwanych wyników.
Niniejszy artykuł pochodzi z zestawu artykułów dotyczących języka Access SQL. Omówiono w nim podstawy używania języka SQL do wybierania danych, a także na przykładach przedstawiono składnię tego języka.
W tym artykule
Co to jest język SQL?
SQL to język komputerowy przeznaczony do pracy ze zbiorami faktów i relacjami między nimi. W programach relacyjnych baz danych, takich jak Microsoft Office Access, język SQL jest używany do pracy z danymi. W odróżnieniu od wielu innych języków komputerowych język SQL nie sprawia trudności w czytaniu ani rozumieniu nawet początkującym użytkownikom. Tak jak wiele innych języków komputerowych, SQL stanowi międzynarodowy standard i jest uznawany przez organizacje zajmujące się standardami, takie jak ISO i ANSI.
Język SQL służy do opisywania zbiorów danych umożliwiających uzyskiwanie odpowiedzi na pytania. Używając języka SQL, trzeba pamiętać o poprawności składni. Składnia to zbiór reguł poprawnego łączenia elementów języka. Składnia języka SQL jest oparta na składni języka angielskiego i zawiera wiele takich samych elementów jak składnia języka Visual Basic for Applications (VBA).
Na przykład prosta instrukcja SQL pobierająca listę nazwisk kontaktów o imieniu Maria może wyglądać następująco:
SELECT Last_Name
FROM Contacts WHERE First_Name = 'Mary';
Uwaga: Język SQL służy nie tylko do manipulowania danymi, ale również do tworzenia i zmieniania projektów obiektów baz danych, na przykład tabel. Część języka SQL używana do tworzenia i zmieniania obiektów baz danych jest nazywana językiem definicji danych (DDL, data-definition language). W tym temacie nie omówiono języka DDL. Aby uzyskać więcej informacji, zobacz artykuł Tworzenie lub modyfikowanie tabel bądź indeksów przy użyciu zapytania definiującego dane.
Instrukcje SELECT
Aby opisać zbiór danych przy użyciu języka SQL, musisz napisać instrukcję SELECT. Instrukcja SELECT zawiera pełny opis zbioru danych, który ma zostać pobrany z bazy danych. Obejmuje to następujące zagadnienia:
-
Które tabele zawierają dane.
-
W jaki sposób dane z różnych źródeł są powiązane.
-
Które pola lub obliczenia dostarczą danych.
-
Jakie kryteria muszą spełnić dane, aby zostały uwzględnione.
-
Czy i jak mają być sortowane wyniki.
Klauzule języka SQL
Podobnie jak zdanie, instrukcja SQL zawiera człony: klauzule. Każda klauzula w instrukcji SQL pełni określoną funkcję. W instrukcji SELECT niektóre klauzule są wymagane. W poniższej tabeli wymieniono najpopularniejsze klauzule języka SQL.
Klauzula SQL |
Działanie |
Wymagane |
SELECT |
Zwraca listę pół zawierających wskazane dane. |
Tak |
FROM |
Zwraca listę tabel zawierających pola wymienione w klauzuli SELECT. |
Tak |
WHERE |
Określa kryteria pól, które musi spełnić rekord, aby został uwzględniony w wynikach. |
Nie |
ORDER BY |
Określa sposób sortowania wyników. |
Nie |
GROUP BY |
W instrukcji SQL zawierającej funkcje agregujące zwraca listę pól, które nie są podsumowywane w klauzuli SELECT. |
Tylko jeśli istnieją takie pola |
HAVING |
W instrukcji SQL zawierającej funkcje agregujące określa warunki stosowane do pól podsumowywanych w klauzuli SELECT. |
Nie |
Terminologia języka SQL
Każda klauzula SQL składa się z terminów — porównywalnych do części mowy. W poniższej tabeli wymieniono typy terminów języka SQL.
Termin SQL |
Porównywalna część mowy |
Definicja |
Przykład |
identyfikator |
rzeczownik |
Nazwa identyfikująca obiekt bazy danych, na przykład nazwa pola. |
Klienci.[Numer telefonu] |
operator |
czasownik lub przysłówek |
Słowo kluczowe reprezentujące lub modyfikujące akcję. |
AS |
stała |
rzeczownik |
Wartość nie ulegająca zmianie, na przykład liczba albo wartość NULL. |
42 |
wyrażenie |
przymiotnik |
Kombinacja identyfikatorów, operatorów, stałych i funkcji, która w wyniku daje pojedynczą wartość. |
>= Produkty.[Cena jednostkowa] |
Podstawowe klauzule języka SQL: SELECT, FROM i WHERE
Instrukcja SQL ma następującą ogólną formę:
SELECT field_1
FROM table_1 WHERE criterion_1 ;
Uwagi:
-
W programie Access podziały wiersza w instrukcji SQL są ignorowane. Jednak warto umieszczać poszczególne klauzule w osobnych wierszach w celu zwiększenia czytelności instrukcji SQL dla siebie oraz innych osób.
-
Każda instrukcja SELECT kończy się znakiem średnika (;). Średnik może znajdować się na końcu ostatniej klauzuli lub w osobnym wierszu na końcu instrukcji SQL.
Przykład w programie Access
Poniżej przedstawiono przykład instrukcji SQL dla prostego zapytania wybierającego w programie Access:
1. Klauzula SELECT
2. Klauzula FROM
3. Klauzula WHERE
Ta przykładowa instrukcja SQL jest interpretowana jako „Wybierz dane przechowywane w polach o nazwach Adres e-mail i Firma z tabeli o nazwie Kontakty, a dokładnie te rekordy, w których wartością pola Miasto jest Szczecin”.
Poniżej przeanalizowano działanie składni języka SQL w przykładzie klauzula po klauzuli.
Klauzula SELECT
SELECT [E-mail Address], Company
To jest klauzula SELECT. Składa się ona z operatora (SELECT), po którym występują dwa identyfikatory ([Adres e-mail] i Firma).
Jeśli identyfikator zawiera spacje lub znaki specjalne (tak jak „Adres e-mail”), musi zostać ujęty w nawiasy kwadratowe.
W klauzuli SELECT nie trzeba podawać, które tabele zawierają pola, nie można też określać żadnych warunków, które muszą spełniać uwzględniane dane.
W instrukcji SELECT klauzula SELECT zawsze pojawia się przed klauzulą FROM.
Klauzula FROM
FROM Contacts
To jest klauzula FROM. Składa się ona z operatora (FROM), po którym występuje identyfikator (Kontakty).
Klauzula FROM nie zawiera listy pól, które mają zostać wybrane.
Klauzula WHERE
WHERE City="Seattle"
To jest klauzula WHERE. Składa się ona z operatora (WHERE), po którym występuje wyrażenie (Miasto="Szczecin").
Uwaga: W odróżnieniu od klauzul SELECT i FROM, klauzula WHERE nie jest wymaganym elementem instrukcji SELECT.
Przy użyciu klauzul SELECT, FROM i WHERE można wykonać wiele akcji realizowanych w języku SQL. Więcej informacji o stosowaniu tych klauzul przedstawiono w następujących artykułach dodatkowych:
Sortowanie wyników: klauzula ORDER BY
Podobnie jak w programie Microsoft Excel, w programie Access można sortować wyniki zapytania w arkuszu danych. Można także określić w zapytaniu sposób sortowania wyników podczas jego wykonywania, używając w tym celu klauzuli ORDER BY. Jeśli jest używana klauzula ORDER BY, stanowi ona ostatnią klauzulę w instrukcji SQL.
Klauzula ORDER BY zawiera listę pól, które mają zostać użyte do sortowania, w tej samej kolejności, w jakiej mają zostać zastosowane operacje sortowania.
Na przykład wyniki mają być sortowane w pierwszej kolejności według wartości pola Firma w porządku malejącym, następnie — jeśli istnieją rekordy z tą samą wartością pola Firma — według wartości pola Adres e-mail w porządku rosnącym. Klauzula ORDER BY może przypominać następującą:
ORDER BY Company DESC, [E-mail Address]
Uwaga: W programie Access wartości są domyślnie sortowane w porządku rosnącym (A–Z, od najmniejszych do największych). Natomiast w celu posortowania wartości w porządku malejącym należy użyć słowa kluczowego DESC.
Aby uzyskać więcej informacji dotyczących klauzuli ORDER BY, zobacz temat Klauzula ORDER BY.
Praca z podsumowanymi danymi: klauzule GROUP BY i HAVING
Czasami zachodzi potrzeba pracy z podsumowanymi danymi, na przykład dotyczącymi całkowitej miesięcznej sprzedaży lub najdroższych pozycji w spisie. Z pomocą przychodzi funkcja agregująca, którą trzeba zastosować wobec pola w klauzuli SELECT. Jeśli na przykład zapytanie ma pokazywać liczbę adresów e-mail wymienionych dla każdej firmy, klauzula SELECT może przypominać następującą:
SELECT COUNT([E-mail Address]), Company
Typy funkcji agregujących, jakie można stosować, zależą od typu danych w polu lub wyrażeniu, które ma zostać użyte. Aby uzyskać więcej informacji o dostępnych funkcjach agregujących, zobacz artykuł Funkcje agregujące w języku SQL.
Określanie pól nieużywanych w funkcji agregującej: klauzula GROUP BY
Podczas używania funkcji agregujących zazwyczaj trzeba również utworzyć klauzulę GROUP BY. Klauzula GROUP BY zawiera listę pól, do których nie zostanie zastosowana funkcja agregująca. Jeśli funkcje agregujące mają zostać zastosowane do wszystkich pól w zapytaniu, nie ma potrzeby tworzenia klauzuli GROUP BY.
Klauzula GROUP BY występuje bezpośrednio po klauzuli WHERE lub — w przypadku braku klauzuli WHERE — po klauzuli FROM. W klauzuli GROUP BY pola są wymieniane tak samo jak w klauzuli SELECT.
Jeśli klauzula SELECT z poprzedniego przykładu ma stosować funkcję agregującą do pól [Adres e-mail], ale nie do pól Firma, klauzula GROUP BY może wyglądać następująco:
GROUP BY Company
Aby uzyskać więcej informacji dotyczących klauzuli GROUP BY, zobacz temat Klauzula GROUP BY.
Ograniczanie wartości sumarycznych przy użyciu kryteriów grupowania: klauzula HAVING
Jeśli trzeba ograniczyć wyniki przy użyciu kryteriów, ale pole, do którego mają zostać zastosowane kryteria, jest używane w funkcji agregującej, nie można użyć klauzuli WHERE. Zamiast tego należy użyć klauzuli HAVING. Klauzula HAVING działa jak klauzula WHERE, ale jest stosowana do danych sumarycznych.
Na przykład do pierwszego pola w klauzuli SELECT jest stosowana funkcja AVG (obliczająca wartość średnią):
SELECT COUNT([E-mail Address]), Company
Jeśli zapytanie ma ograniczać wyniki na podstawie wartości tej funkcji COUNT, nie można stosować kryteriów wobec tego pola w klauzuli WHERE. Zamiast tego należy umieścić kryteria w klauzuli HAVING. Na przykład jeśli zapytanie ma zwracać wiersze tylko w przypadku, gdy z firmą jest powiązany więcej niż jeden adres e-mail, klauzula HAVING może przypominać następującą:
HAVING COUNT([E-mail Address])>1
Uwaga: Zapytanie może zawierać klauzulę WHERE i klauzulę HAVING — kryteria dla pól, które nie są używane w funkcji agregującej, są umieszczane w klauzuli WHERE, a kryteria dla pól używanych w funkcjach agregujących są umieszczane w klauzuli HAVING.
Aby uzyskać więcej informacji o klauzuli HAVING, zobacz temat Klauzula HAVING.
Łączenie wyników zapytań: operator UNION
Aby przejrzeć jako połączony zestaw wszystkie dane zwracane przez kilka podobnych zapytań wybierających, należy użyć operatora UNION.
Operator UNION umożliwia połączenie dwóch instrukcji SELECT w jedną. Łączone instrukcje SELECT muszą mieć taką samą liczbę pól wyjściowych, tak samo uporządkowanych i z identycznymi lub zgodnymi typami danych. Po uruchomieniu zapytania dane z każdego zestawu odpowiadających sobie pól są łączone w jedno pole wyjściowe, dzięki czemu wyniki zapytania mają taką samą liczbę pól co każda z instrukcji wybierających.
Uwaga: Na potrzeby zapytania składającego typy danych Liczba i Tekst są zgodne.
W przypadku stosowania operatora UNION można za pomocą słowa kluczowego ALL określić, czy w wynikach zapytania powinny być uwzględniane zduplikowane wiersze, o ile takie istnieją.
Podstawowa składnia SQL zapytania składającego, która łączy dwie instrukcje SELECT, jest następująca:
SELECT field_1
FROM table_1 UNION [ALL] SELECT field_a FROM table_a ;
Na przykład załóżmy, że masz jedną tabelę o nazwie Produkty i drugą tabelę o nazwie Usługi. Obie tabele zawierają pola z nazwą produktu lub usługi, ceną, informacjami o dostępności gwarancji lub rękojmi oraz informacjami o tym, czy produkt lub usługa są oferowane na wyłączność. Chociaż w tabeli Produkty są przechowywane informacje o rękojmi, a w tabeli Usługi są przechowywane informacje o gwarancji, podstawowe informacje są takie same (wskazują, czy do określonego produktu lub usługi jest dołączona gwarancja jakości). Za pomocą zapytania składającego, takiego jak przedstawione poniżej, można połączyć cztery pola z dwóch tabel:
SELECT name, price, warranty_available, exclusive_offer
FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM Services ;
Aby uzyskać więcej informacji na temat łączenia instrukcji SELECT przy użyciu operatora UNION, zobacz Łączenie wyników kilku zapytań wybierających za pomocą zapytania składającego.