Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
Można utworzyć zapytania, które zawierają dowolną liczbę warunków wyszukiwania, połączonych z dowolną liczbą operatorów AND i OR. Zapytanie z kombinacją klauzul AND i OR może stać się złożone, dlatego warto zrozumieć, w jaki sposób takie zapytanie jest interpretowane, gdy je wykonujesz, oraz jak jest reprezentowane w okienku kryteriów i okienku SQL .
Notatka
Aby uzyskać szczegółowe informacje na temat warunków wyszukiwania zawierających tylko jeden operator AND lub OR, zobacz Określanie wielu warunków wyszukiwania dla jednej kolumny (Visual Database Tools) i Określanie wielu warunków wyszukiwania dla wielu kolumn (Visual Database Tools).
Poniżej znajdziesz informacje o:
Pierwszeństwo funkcji AND i OR w zapytaniach, które zawierają oba te elementy.
Sposób, w jaki warunki w klauzulach AND i OR odnoszą się logicznie do siebie.
Sposób, w jaki projektant zapytań i widoków przedstawia w okienku kryteriów zapytania zawierające zarówno AND, jak i OR.
Aby ułatwić zrozumienie poniższej dyskusji, wyobraź sobie, że pracujesz z tabelą employee
zawierającą kolumny hire_date
, job_lvl
i status
. W przykładach założono, że musisz znać informacje, takie jak czas pracy pracownika w firmie (czyli to, jaka jest data zatrudnienia pracownika), jaki typ pracy wykonuje pracownik (jaki jest poziom pracy) i status pracownika (na przykład emerytowany).
Pierwszeństwo elementów AND i OR
Gdy zapytanie jest wykonywane, ocenia najpierw klauzule połączone z elementem AND, a następnie te połączone z or.
Notatka
Operator NOT ma pierwszeństwo przed operatorem AND i OR.
Na przykład aby znaleźć pracowników, którzy są z firmą od ponad pięciu lat w pracy niższego poziomu lub pracowników z miejscami pracy na poziomie średnim bez względu na datę zatrudnienia, można utworzyć klauzulę WHERE, taką jak:
WHERE
hire_date < '01/01/95' AND
job_lvl = 100 OR
job_lvl = 200
Aby zastąpić domyślny priorytet AND nad OR, można wstawić nawiasy wokół określonych warunków w okienku SQL. Warunki w nawiasach są zawsze oceniane jako pierwsze. Aby na przykład znaleźć wszystkich pracowników, którzy byli z firmą ponad pięć lat w niższych lub średnich miejscach pracy, można utworzyć klauzulę WHERE, taką jak:
WHERE
hire_date < '01/01/95' AND
(job_lvl = 100 OR job_lvl = 200)
Napiwek
Zaleca się, aby w celu jasności zawsze uwzględniać nawiasy podczas łączenia klauzul AND i OR zamiast polegać na domyślnym pierwszeństwie.
Jak operator AND działa z wieloma klauzulami OR
Zrozumienie sposobu, w jaki klauzule AND i OR są powiązane w połączeniu, mogą pomóc w konstruowaniu i interpretowaniu złożonych zapytań w Projektancie zapytań i widoków.
Jeśli łączysz wiele warunków przy użyciu funkcji AND, pierwszy zestaw warunków połączonych z elementem AND ma zastosowanie do wszystkich warunków w drugim zestawie. Innymi słowy warunek połączony z elementem AND do innego warunku jest dystrybuowany do wszystkich warunków w drugim zestawie. Na przykład następująca reprezentacja schematu przedstawia warunek AND połączony z zestawem warunków OR:
A AND (B OR C)
Reprezentacja powyżej jest logicznie równoważna następującej reprezentacji schematu, która pokazuje, jak warunek AND jest dystrybuowany do drugiego zestawu warunków:
(A AND B) OR (A AND C)
Ta zasada dystrybucji ma wpływ na sposób korzystania z Projektanta zapytań i widoków. Załóżmy na przykład, że szukasz wszystkich pracowników, którzy pracują z firmą ponad pięć lat w pracy niższej lub średniej. W okienku SQL wprowadź następującą klauzulę WHERE:
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100 OR job_lvl = 200)
Klauzula połączona z and ma zastosowanie do obu klauzul połączonych z OR. Jawnym sposobem wyrażenia tego jest powtórzenie warunku AND raz dla każdego warunku w klauzuli OR. Następująca instrukcja jest bardziej jawna (i dłuższa) niż poprzednia instrukcja, ale jest logicznie równoważna:
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100) OR
(hire_date < '01/01/95' ) AND
(job_lvl = 200)
Zasada dystrybucji klauzul AND do połączonych klauzul OR ma zastosowanie niezależnie od liczby poszczególnych warunków. Załóżmy na przykład, że chcesz znaleźć wyższych lub średnich pracowników, którzy byli z firmą ponad pięć lat lub są na emeryturze. Klauzula WHERE może wyglądać następująco:
WHERE
(job_lvl = 200 OR job_lvl = 300) AND
(hire_date < '01/01/95' ) OR (status = 'R')
Po rozproszeniu warunków połączonych z elementem AND klauzula WHERE będzie wyglądać następująco:
WHERE
(job_lvl = 200 AND hire_date < '01/01/95' ) OR
(job_lvl = 200 AND status = 'R') OR
(job_lvl = 300 AND hire_date < '01/01/95' ) OR
(job_lvl = 300 AND status = 'R')
Jak wiele klauzul AND i OR są reprezentowane w okienku Kryteriów
Projektant zapytań i widoków reprezentuje warunki wyszukiwania w okienku kryteriów . Jednak w niektórych przypadkach, które obejmują wiele klauzul połączonych z oraz i lub, reprezentacja w okienku kryteriów może nie być oczekiwana. Ponadto, jeśli zmodyfikujesz zapytanie w oknie Kryteria lub w oknie Diagramu, może się okazać, że Twoje polecenie SQL zostało zmienione z tego, co wprowadziłeś.
Ogólnie rzecz biorąc, te reguły określają sposób wyświetlania klauzul AND i OR w okienku Kryteria:
Wszystkie warunki połączone operatorem AND są wyświetlane w kolumnie siatki filtru lub w tej samej kolumnie lub....
Wszystkie warunki połączone z or są wyświetlane w osobnych Lub... kolumn.
Jeśli logicznym wynikiem kombinacji klauzul AND i OR jest to, że klauzula AND jest rozdzielona na kilka klauzul OR, okienko kryteriów reprezentuje to jawnie, powtarzając klauzulę AND tyle razy, ile to konieczne.
Na przykład w okienku SQL można utworzyć warunek wyszukiwania, taki jak następujące, w którym dwie klauzule połączone z and mają pierwszeństwo przed trzecim połączonym z OR:
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100) OR
(status = 'R')
Projektant zapytań i widoków reprezentuje tę klauzulę WHERE w okienku Kryteriów w następujący sposób:
pierwszeństwo klauzuli LUB w okienku kryteriów
Jeśli jednak połączone klauzule OR mają pierwszeństwo przed klauzulą AND, klauzula AND jest powtarzana dla każdej klauzuli OR. Powoduje to dystrybucję klauzuli AND do każdej klauzuli OR. Na przykład w okienku SQL można utworzyć klauzulę WHERE, taką jak:
WHERE (hire_date < '01/01/95' ) AND
( (job_lvl = 100) OR
(status = 'R') )
Projektant zapytań i widoków reprezentuje tę klauzulę WHERE w okienku Kryteriów w następujący sposób:
Jeśli połączone klauzule OR obejmują tylko jedną kolumnę danych, Projektant zapytań i widoków może umieścić całą klauzulę OR w jedną komórkę siatki, unikając konieczności powtarzania klauzuli AND. Na przykład w okienku SQL można utworzyć klauzulę WHERE, taką jak:
WHERE (hire_date < '01/01/95' ) AND
((status = 'R') OR (status = 'A'))
Projektant zapytań i widoków reprezentuje tę klauzulę WHERE w okienku Kryteriów w następujący sposób:
Jeśli wprowadzisz zmianę w zapytaniu (na przykład zmieniając jedną z wartości w okienku Kryteria), Projektant zapytań i widoków ponownie utworzy instrukcję SQL w okienku SQL. Ponownie utworzona instrukcja SQL będzie przypominać wyświetlanie okienka kryteriów, a nie oryginalną instrukcję. Jeśli na przykład okienko Kryteria zawiera rozproszone klauzule AND, instrukcja wynikowa w okienku SQL zostanie ponownie utworzona za pomocą jawnie rozproszonych klauzul AND. Aby uzyskać szczegółowe informacje, zobacz "Jak AND współpracuje z wieloma klauzulami OR" we wcześniejszej części tego tematu.