Przecięcie przykładów sql. Operator zbiorów danych Z WYJĄTKIEM zasad ogólnych. Predykat istnienia SQL EXISTS

SQL udostępnia dwa sposoby łączenia tabel:
  • określając tabele do przyłączenia (w tym podzapytania) w klauzuli FROM instrukcji SELECT. Najpierw tabele są łączone, a dopiero potem do zbioru wynikowego stosowane są warunki określone klauzulą ​​WHERE, agregacja, kolejność danych itp., określone klauzulą ​​GROUP BY itp.;
  • definiowanie unii zestawów wynikowych powstałych w wyniku przetwarzania instrukcji SELECT. W tym przypadku obie instrukcje SELECT są połączone wyrażeniem UNIA, PRZECINAĆ, OPRÓCZ lub ODPOWIEDNIE.

UNIA

Wyrażenie UNIAłączy wyniki dwóch zapytań zgodnie z następującymi regułami:

Norma nie nakłada żadnych ograniczeń na kolejność wierszy w zestawie wyników. Tak więc niektóre DBMS najpierw wyświetlają wynik pierwszego zapytania, a następnie wynik drugiego zapytania. Oracle DBMS automatycznie sortuje rekordy według pierwszej określonej kolumny, nawet jeśli nie utworzono dla niej indeksu.

Aby jawnie określić wymaganą kolejność sortowania, użyj klauzuli ORDER BY. W takim przypadku możesz użyć zarówno nazwy kolumny, jak i jej numeru (rys. 4.3).


Ryż. 4.3.

Wyrażenie UNIA ALL wykonuje połączenie dwóch podzapytań w taki sam sposób, jak klauzula UNION, z następującymi wyjątkami:

  • pasujące wiersze nie są usuwane z wygenerowanego zestawu wyników;
  • scalone zapytania pojawiają się sekwencyjnie w zestawie wyników bez kolejności.

Przy łączeniu więcej niż dwóch zapytań można użyć nawiasów do zmiany kolejności wykonywania operacji łączenia (rysunek 4.4).


Ryż. 4.4.

INTERSECT dołącz

Wyrażenie PRZECINAĆ pozwala wybrać tylko te wiersze, które są obecne w każdym scalanym zestawie wyników. Na ryc. 4.5 pokazuje przykład łączenia zapytań jako przecinających się zbiorów.


Ryż. 4.5.

Z WYJĄTKIEM związku

Wyrażenie OPRÓCZ pozwala wybrać do scalenia tylko te wiersze, które znajdują się w pierwszym zestawie wyników, ale nie znajdują się w drugim zestawie wyników.

Zwroty PRZECINAĆ oraz OPRÓCZ powinny być obsługiwane tylko na pełnym poziomie zgodności SQL-92. Więc jakiś DBMS zamiast frazy

Jest tylko jedna ważna zasada używania instrukcji EXCEPT do zapamiętania.

Kolejność, liczba i typy danych kolumn muszą być tego samego typu we wszystkich zapytaniach.

Zgodnie ze standardem ANSI operatory mnogościowe UNION i EXCEPT mają ten sam priorytet, ale operator INTERSECT jest oceniany przed innymi operatorami mnogościowymi. Zalecamy jawne kontrolowanie pierwszeństwa operatorów przy użyciu nawiasów. Jest to generalnie bardzo dobra praktyka.

Zgodnie ze standardem ANSI w zapytaniu można użyć tylko jednej klauzuli ORDER BY. Wstaw go na sam koniec ostatniej instrukcji SELECT. Aby uniknąć niejednoznaczności podczas określania kolumn i tabel, pamiętaj o przypisaniu tego samego aliasu do wszystkich pasujących kolumn tabeli. Na przykład:

SELECT au_lname AS "nazwisko", au_fname AS "imię" FROM autorów EXCEPT SELECT emp_lname AS "nazwisko", emp_fname AS "imię" FROM pracowników ORDER BY nazwisko, imię;

Ponadto, ponieważ kolumny mogą być określone w każdej liście kolumn z odpowiednio kompatybilnymi typami danych, różne platformy RDBMS mogą mieć różne sposoby radzenia sobie z kolumnami o różnych długościach. Na przykład, jeśli kolumna au_lname z pierwszego zapytania w poprzednim przykładzie jest znacznie dłuższa niż kolumna emp_lname z drugiego zapytania, to na różnych platformach mogą obowiązywać różne reguły określania długości końcowego wyniku. Ale ogólnie rzecz biorąc, platformy wybiorą dłuższy (i mniej restrykcyjny) rozmiar dla wyniku.

Każdy RDBMS może wymusić własne zasady używania nazwy kolumny w przypadku, gdy nazwy na listach kolumn różnią się. Ogólnie używane są nazwy kolumn z pierwszego zapytania.

Typy danych nie muszą być identyczne, ale muszą być kompatybilne. Na przykład typy CHAR i VARCHAR są kompatybilne. Domyślnie wynik ustawiony w każdej kolumnie będzie używał rozmiaru odpowiadającego największemu typowi w każdej konkretnej pozycji. Na przykład zapytanie pobierające dane z kolumn zawierających wartości typu VARCHAR(IO) i VARCHAR(15) użyje typu i rozmiaru VARCHAR(15).

Żadna z platform nie obsługuje klauzuli CORRESPONDING )) Z WYJĄTKIEM

(SELECT statemenr.2 | VALUES (wyrażenie, wyrażenie2 [, ...])) Z WYJĄTKIEM

Umożliwia określenie co najmniej jednej ręcznie określonej kolumny, która zostanie uwzględniona w końcowym zestawie wyników. (Nazywa się to konstruktorem wiersza). Klauzula VALUES musi określać dokładnie tyle kolumn, ile określono w zapytaniach instrukcji EXCEPT. Chociaż instrukcja EXCEPT DISTINCT nie jest obsługiwana, EXCEPT jest funkcjonalnym odpowiednikiem. Klauzula CORRESPONDING nie jest obsługiwana. Ponadto typy danych LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK oraz typy struktur nie są używane w klauzuli EXCEPT, ale mogą być używane w klauzuli EXCEPT ALL.

Jeśli zestaw wyników zawiera kolumnę, która ma taką samą nazwę we wszystkich instrukcjach SELECT, ta nazwa jest używana jako ostateczna nazwa kolumny zwracanej przez instrukcję. Jeśli dana kolumna ma inną nazwę w różnych instrukcjach SELECT, musisz zmienić nazwę kolumny we wszystkich zapytaniach, używając tej samej klauzuli aliasu AS we wszystkich zapytaniach.

Jeśli w jednym zapytaniu używanych jest wiele operatorów do pracy z zestawami danych, najpierw wykonywany jest ten ujęty w nawiasy. Następnie kolejność wykonania będzie od lewej do prawej. Jednak wszystkie instrukcje INTERSECT są wykonywane przed instrukcjami UNION i EXCEPT. Na przykład:

SELECT empno FROM pracownik WHERE workdept LIKE "E%" Z WYJĄTKIEM SELECT empno FROM emp_act WHERE projno IN (TF1000", TF2000", -AD3110") UNION VALUES ("AA0001"), ("AB0002"), ("AC0003") ;

Powyższy przykład pobiera identyfikatory wszystkich pracowników, którzy pracują w dziale zaczynającym się na „E” z tabeli pracowników, a następnie usuwa identyfikatory tych, którzy pracują w projektach IF1000, IF200” i AD3110 z tabeli kont pracowników (emp_act) Na koniec , trzy dodatkowe identyfikatory, AA0001, AB0002 i AC0003, są dodawane za pomocą operatora mnogościowego UNION.

MySQL

MySQL nie obsługuje instrukcji EXCEPT. Alternatywnie możesz użyć operatorów NOT IN lub NOT EXISTS.

Instrukcja INTERSECT pobiera identyczne wiersze z zestawów wyników jednego lub większej liczby zapytań. Pod pewnymi względami operator INTERSECT jest bardzo podobny do INNER JOIN.

INTERSECT należy do klasy operatorów do pracy ze zbiorami danych (operator zbioru). Do innych takich operatorów należą EXCEPT i UNION. Wszystkie operatory zestawów danych służą do manipulowania zestawami wyników dwóch lub większej liczby zapytań w tym samym czasie, stąd ich nazwa.

Składnia SQL2003

Nie ma technicznych ograniczeń co do liczby zapytań w instrukcji INTERSECT. Ogólna składnia jest następująca.

PRZECINAĆ

]PRZECINAĆ

Słowa kluczowe

Uwzględniono zduplikowane wiersze ze wszystkich zestawów wyników.

ODRĘBNY

Zduplikowane wiersze są usuwane ze wszystkich zestawów wyników przed wykonaniem porównania przez instrukcję INTERSECT. Kolumny z wartościami NULL są uważane za duplikaty. Jeśli nie określono ani ALL, ani DISTINCT, domyślnie przyjmowane jest DISTINCT.

ODPOWIEDNI

Określa, że ​​zostaną zwrócone tylko kolumny, które mają tę samą nazwę w obu zapytaniach, nawet jeśli oba zapytania używają znaku wieloznacznego (*).

Określa, że ​​zostaną zwrócone tylko nazwane kolumny, nawet jeśli zapytania znajdą inne kolumny o pasujących nazwach. Klauzula ta musi być używana w połączeniu ze słowem kluczowym CORRESPONDING.

Główne zasady

Podczas pracy z operatorem INTERSECT należy pamiętać tylko o jednej ważnej zasadzie.

Kolejność i liczba kolumn we wszystkich zapytaniach musi być taka sama. Typy danych odpowiednich kolumn również muszą być zgodne.

Na przykład typy CHAR i VARCHAR są kompatybilne. Domyślnie wynik ustawiony w każdej kolumnie będzie używał rozmiaru odpowiadającego największemu typowi w każdej konkretnej pozycji.

Żadna z platform nie obsługuje klauzuli CORRESPONDING.

Zgodnie ze standardem ANSI, operator INTERSECT ma wyższy priorytet niż inne operatory zbiorowe, chociaż pierwszeństwo takich operatorów jest obsługiwane inaczej na różnych platformach. Możesz jawnie kontrolować pierwszeństwo operatorów za pomocą nawiasów. W przeciwnym razie DBMS może wykonać je w kolejności od lewej do prawej lub od pierwszego do ostatniego.

Zgodnie ze standardem ANSI w zapytaniu można użyć tylko jednej klauzuli ORDER BY. Wstaw go na sam koniec ostatniej instrukcji SELECT. Aby uniknąć niejednoznaczności podczas określania kolumn i tabel, pamiętaj o przypisaniu tego samego aliasu do wszystkich pasujących kolumn tabeli. Na przykład:

Na platformach, które nie obsługują operatora INTERSECT, można go zastąpić podzapytaniem FULL JOIN.

SELECT a.au_lname AS "nazwisko", a.au_fname AS "imię" FROM autorów AS a INTERSECT SELECT e.emp_lname AS "nazwisko", e.emp_fname AS "imię" FROM pracowników AS e ORDER BY nazwisko, imię;

Ponieważ typy danych kolumn w różnych instrukcjach INTERSECT mogą być kompatybilne, różne platformy RDBMS mogą mieć różne sposoby radzenia sobie z kolumnami o różnych długościach. Na przykład, jeśli kolumna aujname z pierwszego zapytania w poprzednim przykładzie jest znacznie dłuższa niż kolumna empjname z drugiego zapytania, to na różnych platformach mogą obowiązywać różne zasady określania długości końcowego wyniku. Ale ogólnie rzecz biorąc, platformy wybiorą dłuższy (i mniej restrykcyjny) rozmiar dla wyniku.

Każdy RDBMS może wymusić własne zasady używania nazwy kolumny w przypadku, gdy nazwy na listach kolumn różnią się. Zazwyczaj używane są nazwy kolumn z pierwszego zapytania.

DB2

Platforma DB2 obsługuje słowa kluczowe ANSI INTERSECT i INTERSECT ALL oraz opcjonalną klauzulę VALUES.

(instrukcja._SELECT_7 | WARTOŚCI (wyr7 [, ...])) PRZECIĘCIE

] (instrukcja_SCJ_2 | WARTOŚCI (wyr2 [, ...])) PRZECIĘCIE

Chociaż instrukcja INTERSECT DISTINCT nie jest obsługiwana, jej funkcjonalnym odpowiednikiem jest INTERSECT. Klauzula CORRESPONDING nie jest obsługiwana.

Ponadto typy danych LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK oraz typy struktur nie są używane w klauzuli INTERSECT, ale mogą być używane w klauzuli INTERSECT ALL.

Jeśli zestaw wyników zawiera kolumnę, która ma taką samą nazwę we wszystkich instrukcjach SELECT, ta nazwa jest używana jako ostateczna nazwa kolumny zwracanej przez instrukcję. Jeśli jednak zapytania używają różnych nazw dla kolumny, platforma DB2 wygeneruje nową nazwę dla kolumny wynikowej. Następnie staje się bezużyteczny w klauzulach ORDER BY i FOR UPDATE.

Jeśli w jednym zapytaniu używanych jest wiele operatorów do pracy z zestawami danych, najpierw wykonywany jest ten ujęty w nawiasy. Następnie kolejność wykonania będzie od lewej do prawej. Jednak wszystkie instrukcje INTERSECT są wykonywane przed instrukcjami UNION i EXCEPT, na przykład:

SELECT empno FROM pracownik WHERE workdept LIKE "E%" INTERSECT (SELECT empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001"), ("AB0002"), ("AC0003 "))

Powyższy przykład pobiera z tabeli pracowników identyfikatory wszystkich pracowników w dziale, którego nazwa zaczyna się od litery „E”. Jednak identyfikatory są pobierane tylko wtedy, gdy istnieją również w tabeli kont pracowników o nazwie emp_act i są zaangażowane w projekty IF1000, IF200" i AD3110.