SELECT [predykat] { * | tabela.* | [tabela.]pole1 [AS alias1] [,
[tabela.]pole2 [AS alias2] [, ...]] }
FROM wyrażenie_tabelowe [, ...] [IN
zewnętrzna_baza_danych]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
predykat
Jeden z następujących predykatów: ALL, DISTINCT, DISTINCTROW lub TOP. Predykat
służy do ograniczenia liczby zwracanych rekordów. Jeśli nie podano żadnego
predykatu, domyślnie przyjmuje się predykat ALL.
*
Wskazuje, iż wybrane mają być wszystkie pola z podanej tabeli lub tabel.
tabela
Nazwa tabeli zawierającej pola, które składają się na rekordy będące
rezultatem instrukcji.
pole1, pole2
Nazwy pól zawierających dane, które mają być pobrane. Jeśli podano kilka pól,
są one pobierane w kolejności podanej na liście.
alias1, alias2
Nazwy, które zostaną użyte jako nagłówki kolumn w miejsce nazw kolumn z
tabeli.
wyrażenie tabelowe
Nazwa tabeli lub tabel zawierających pobierane dane.
zewnętrzna baza danych
Nazwa bazy danych zawierającej tabele wymienione w wyrażeniu_tabelowym, o ile
nie znajdują się one w bieżącej bazie danych.
Użycie:
Realizując tę operację, aparat bazy danych Microsoft Jet przeszukuje wskazaną
tabelę lub tabele, pobiera określone kolumny, wybiera wiersze spełniające
podane kryterium wyboru, po czym sortuje lub grupuje te wiersze zgodnie z
określonym w instrukcji porządkiem.
Instrukcje SELECT nie zmieniają danych w bazie danych.
Słowo SELECT jest zazwyczaj pierwszym słowem instrukcji SQL. Większość
instrukcji SQL to albo instrukcje SELECT, albo instrukcje SELECT...INTO.
Minimalna postać składni instrukcji SELECT jest następująca:
SELECT pola FROM tabela
Aby wybrać wszystkie pola z tabeli, należy użyć znaku gwiazdki (*). W
poniższym przykładzie wybierane są wszystkie pola z tabeli Pracownicy:
SELECT * FROM Pracownicy;
Jeśli dana nazwa pola występuje w kilku tabelach wymienionych w klauzuli FROM,
należy tę nazwę pola poprzedzić nazwą tabeli i operatorem . (kropka). W
kolejnym przykładzie pole Department występuje zarówno w tabeli Pracownicy,
jak i w tabeli Kierownicy. Instrukcja SQL pobiera działy z tabeli Pracownicy i
nazwiska kierowników działów z tabeli Kierownicy:
SELECT Pracownicy.Dział, Kierownicy.NazwiskoKierownika
FROM Pracownicy INNER JOIN Kierownicy
WHERE Pracownicy.Dział =
Kierownicy.Dział;
Tworząc obiekt typu Recordset, aparat bazy danych Microsoft Jet używa nazwy
pola z tabeli jako nazwy obiektu typu Field w tworzonym obiekcie Recordset.
Jeśli ma być użyta inna nazwa albo jeśli nie wynika ona bezpośrednio z
wyrażenia generującego pole, należy zastosować słowo zastrzeżone AS. W
poniższym przykładzie słowem Urodz nazwano obiekt typu Field w wynikowym
obiekcie Recordset:
SELECT DataUrodzenia AS Urodz FROM Pracownicy;
W każdym przypadku użycia funkcji agregacji lub kwerend dających w wyniku
niejednoznaczne lub powtarzające się nazwy obiektów Field należy za pomocą
klauzuli AS podać inną nazwę obiektu Field. W poniższym przykładzie słowo
Licznik służy do nadania nazwy zwracanemu przez kwerendę obiektowi Field w
wynikowym obiekcie Recordset:
SELECT COUNT(NrPracownika) AS Licznik FROM Pracownicy;
Pozostałe klauzule instrukcji SELECT służą do ograniczania i organizowania
danych zwracanych przez kwerendę. Szczegółowe informacje można znaleźć w
tematach pomocy opisujących konkretne klauzule.
FROM tabela_1 INNER JOIN tabela_2 ON tabela_1.pole_1 op_por
tabela_2.pole_2
tabela_1, tabela_2
Nazwy tabel, których rekordy są łączone (scalane).
pole_1, pole_2
Nazwy pól sprzęgających. Jeśli pola nie są numeryczne, to muszą być tego
samego typu danych i zawierać ten sam rodzaj danych; nie muszą jednak mieć tej
samej nazwy.
op_por
Dowolny operator porównania: "=", "<", ">", "<=", ">=" lub "<>".
Użycie:
Operacja INNER JOIN może być użyta w dowolnej klauzuli FROM. Jest to
najczęściej występujący typ sprzężenia. Sprzężenia wewnętrzne łączą rekordy z
dwóch tabel, jeśli w polu wspólnym dla obu tabel znajdują się odpowiadające
sobie wartości.
Operacja INNER JOIN zastosowana do tabel Działy i Pracownicy może zostać użyta
do wyboru wszystkich pracowników zatrudnionych w każdym dziale. Jeśli jednak
chcemy wybrać wszystkie działy (nawej jeśli w niektórych z nich nie ma
pracowników) lub wszystkich pracowników (nawet jeśli niektórzy z nich nie
pracują w żadnym dziale), to musimy użyć operacji LEFT JOIN lub RIGHT JOIN do
utworzenia sprzężenia rozszerzonego.
Przy próbie sprzężenia pól zawierających dane typu Memo lub obiekt OLE wystąpi
błąd.
Można sprząc dwa pola numeryczne podobnych typów. Na przykład, można sprząc
pola Autonumer i Long, gdyż są podobnego typu. Nie można jednak sprząc pól o
typach Single i Double.
Przykład przedstawiony poniżej pokazuje, w jaki sposób można sprząc tabele
Kategorie i Produkty według pola NrKategorii.
SELECT NazwaKategorii, NazwaProduktu
FROM Kategorie INNER JOIN Produkty
ON Kategorie.NrKategorii =
Produkty.NrKategorii;
W poprzednim przykładzie pole NrKategorii jest polem sprzęgającym, lecz pomimo
tego nie zostaje dołączone do wyników kwerendy, gdyż nie jest wymienione w
instrukcji SELECT. Aby dołączyć pole sprzęgające, należy dodać nazwę pola do
instrukcji SELECT ľ w tym przypadku Kategorie.NrKategorii.
W jednej instrukcji JOIN można umieścić wiele klauzul ON, używając
następującej składni:
SELECT pola
FROM tabela_1 INNER JOIN tabela_2
ON tabela_1.pole_1 op_por tabela_2.pole_1 AND
ON tabela_1.pole_2 op_por tabela_2.pole_2 OR
ON tabela_1.pole_3 op_por tabela_2.pole_3;
Można również zagnieżdżać instrukcje JOIN, używając następującej składni:
SELECT pola
FROM tabela_1 INNER JOIN
(tabela_2 INNER JOIN tabela_3
ON tabela_2.pole_2 op_por tabela_3.pole_3)
ON tabela_1.pole_1 op_por tabela_2.pole_2a;
Operacje LEFT JOIN i RIGHT JOIN mogą być zagnieżdżone wewnątrz operacji INNER
JOIN, lecz operacja INNER JOIN nie może być zagnieżdżona wewnątrz operacji
LEFT JOIN lub RIGHT JOIN.
FROM tabela_1 [ LEFT | RIGHT ] JOIN tabela_2
ON tabela_1.pole_1 op_por tabela_2.pole_2
tabela_1, tabela_2
Nazwy tabel, których rekordy są łączone.
pole_1, pole_2
Nazwy pól sprzęgających (złączających tabele). Pola muszą być tego samego typu
danych i muszą zawierać ten sam rodzaj danych; nie muszą jednak mieć tej samej
nazwy.
op_por Dowolny operator porównania: "=", "<", ">", "<=", ">=" lub "<>".
Użycie:
Operacja LEFT JOIN służy do tworzenia sprzężenia rozszerzonego lewego.
Sprzężenia rozszerzone lewe włączają wszystkie rekordy z pierwszej (lewej) z
dwóch tabel, nawet jeśli w rekordach z drugiej (prawej) tabeli nie istnieją
odpowiadające im wartości.
Operacja RIGHT JOIN służy do tworzenia sprzężenia rozszerzonego prawego.
Sprzężenia rozszerzone prawe włączają wszystkie rekordy z drugiej (prawej) z
dwóch tabel, nawet jeśli w rekordach pierwszej (lewej) tabeli nie istnieją
odpowiadające im wartości.
Na przykład, można użyć operacji LEFT JOIN dla tabel Działy (lewa) i
Pracownicy (prawa) w celu wybrania wszystkich działów, w tym również nie
posiadających pracowników. Aby wybrać wszystkich pracowników, w tym również
nie pracujących w żadnym dziale, należy użyć operacji RIGHT JOIN.
W poniższym przykładzie pokazano, jak można dokonać sprzężenia tabel Kategorie
i Produkty według pola NrKategoria. Kwerenda daje w wyniku listę wszystkich
kategorii, w tym również nie zawierających żadnego produktu.
SELECT NazwaKategorii, NazwaProduktu
FROM Kategorie LEFT JOIN Produkty
ON Kategorie.NrKategorii =
Produkty.NrKategorii;
W powyższym przykładzie NrKategorii jest polem sprzężonym, lecz nie występuje
ono w wyniku kwerendy, ponieważ nie znajduje się w instrukcji SELECT. Aby
dołączyć pole sprzężone, należy w instrukcji SELECT dodać nazwę pola — w tym
przypadku Kategorie.NrKategorii.
Uwagi
· Aby utworzyć kwerendę zawierającą wyłącznie rekordy, w których dane w polach
sprzężonych są takie same, należy użyć operacji INNER JOIN.
· Operacje LEFT JOIN i RIGHT JOIN mogą być zagnieżdżane wewnątrz operacji
INNER JOIN, lecz operacja INNER JOIN nie może być zagnieżdżana wewnątrz
operacji LEFT JOIN lub RIGHT JOIN. Pod hasłem INNER JOIN można znaleźć
rozważania dotyczące zagnieżdżeń sprzężeń.
· Można łączyć wiele klauzul ON. Pod hasłem INNER JOIN można znaleźć
rozważania dotyczące łączenia klauzul. Wyjaśniono tam, jak należy dokonywać
tej operacji.
· Nie należy sprzęgać pól zawierających dane typu Memo lub obiekt OLE, gdyż
powoduje to błąd.