Konfiguracja sprzętu i oprogramowania

Wykonywanie złożonych zapytań SQL. Operator dla zbiorów danych INTERSECT Przykłady Intersect sql

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

Ten samouczek SQL wyjaśnia, jak używać SQL Operator INTERSECT ze składnią i przykładami.

Opis

Operator SQL INTERSECT służy do zwracania wyników 2 lub więcej instrukcji SELECT. Jednak zwraca tylko wiersze wybrane przez wszystkie zapytania lub zestawy danych. Jeśli rekord istnieje w jednym zapytaniu, a nie w drugim, zostanie pominięty w wynikach INTERSECT.

Przecięcie zapytania

Wyjaśnienie: Zapytanie INTERSECT zwróci rekordy w zacienionym na niebiesko obszarze. Są to rekordy, które istnieją zarówno w Zestawie Danych1, jak i Zestawie Danych2.

Każda instrukcja SQL w ramach SQL INTERSECT musi mieć taką samą liczbę pól w zestawach wyników o podobnych typach danych.

Składnia

Składnia operatora INTERSECT w SQL to:

SELECT wyrażenie1, wyrażenie2, ... wyrażenie_n FROM tabele INTERSECT SELECT wyrażenie1, wyrażenie2, ... wyrażenie_n FROM tabele ;

Parametry lub argumenty

wyrażenie1, wyrażenie2, wyrażenie_n tabele Tabele, z których chcesz pobrać rekordy. Musi istnieć co najmniej jedna tabela wymieniona w klauzuli FROM. Warunki GDZIE Opcjonalne. Są to warunki, które muszą być spełnione, aby rekordy zostały wybrane.

Przykład — z pojedynczym wyrażeniem

Poniżej znajduje się przykład operatora SQL INTERSECT, który ma jedno pole o tym samym typie danych:

SELECT id_dostawcy FROM dostawcy INTERSECT SELECT id_dostawcy FROM zamówienia;

W tym przykładzie SQL INTERSECT, jeśli a identyfikator dostawcy pojawił się zarówno w dostawców oraz Zamówienia tabeli, pojawi się w zestawie wyników.

Teraz porównajmy nasz przykład dalej, dodając do zapytania INTERSECT.

SELECT identyfikator_dostawcy FROM dostawcy WHERE identyfikator_dostawcy > 78 INTERSECT SELECT identyfikator_dostawcy FROM zamówienia WHERE ilość<> 0;

W tym przykładzie klauzule WHERE zostały dodane do każdego zestawu danych. Pierwszy zbiór danych został przefiltrowany tak, że tylko rekordy z dostawców tabela, gdzie identyfikator dostawcy jest większa niż 78 są zwracane. Drugi zbiór danych został przefiltrowany tak, że tylko rekordy z Zamówienia Ilość nie jest równe 0.

Przykład — z wieloma wyrażeniami

Następnie spójrzmy na przykład użycia operatora INTERSECT w SQL do zwrócenia więcej niż jednej kolumny.

SELECT contact_id, nazwisko, imię FROM kontakty WHERE nazwisko<>„Anderson” INTERSECT SELECT identyfikator_klienta, nazwisko, imię FROM klienci WHERE identyfikator_klienta< 50;

W tym przykładzie INTERSECT zapytanie zwróci rekordy z Łączność tabela, gdzie kontakt_id, nazwisko, oraz Imię wartości pasują do Identyfikator klienta, nazwisko, oraz Imię wartość z klienci Tabela.

W każdym zestawie danych istnieją warunki WHERE, aby dodatkowo filtrować wyniki, tak aby tylko rekordy z Łączność są zwracane tam, gdzie nazwisko nie jest Anderson. Zapisy z klienci zwracane są tabele, w których Identyfikator klienta jest mniej niż 50.

Przykład — użycie ORDER BY

SELECT identyfikator_dostawcy, nazwa_dostawcy FROM dostawcy WHERE identyfikator_dostawcy > 2000 INTERSECT SELECT identyfikator_firmy, nazwa_firmy FROM firmy WHERE identyfikator_firmy > 1000 ORDER BY 2;

Ponieważ nazwy kolumn są różne w obu instrukcjach SELECT, korzystniej jest odwoływać się do kolumn w klauzuli ORDER BY według ich pozycji w zestawie wyników. W tym przykładzie posortowaliśmy wyniki według Nazwa Dostawcy / Nazwa firmy w porządku rosnącym, zgodnie z oznaczeniem ZAMÓWIENIE PRZEZ 2 .

ten Nazwa Dostawcy / Nazwa firmy pola znajdują się na pozycji #2 w zestawie wyników.

Kiedy często spotykasz się z jakąkolwiek technologią, językiem programowania, standardem, powstaje pewien obraz ich możliwości, granic, w jakich są używane. Może to trwać bardzo długo, aż natrafimy na przykłady poszerzające zahartowane horyzonty wiedzy. Dzisiaj chciałbym opowiedzieć o takich przykładach i zademonstrować je dla języka SQL. W tym artykule czekają na Ciebie ciekawe i rzadkie projekty, zapomniane wyrażenia, dziwne sztuczki. Zainteresowanych zapraszamy pod kota.

niuanse

Często jestem pytany, dla kogo jest ten artykuł? Ale uwierz mi, nie zawsze łatwo jest udzielić odpowiedzi: z jednej strony są twórcy ninja, których trudno czymkolwiek zaskoczyć, a z drugiej młodzi padawani. Ale jedno mogę powiedzieć na pewno - dla czytelnika zainteresowanego SQL, który jest w stanie uzupełnić swój bogaty obraz o drobne, ale bardzo ciekawe szczegóły. Ten artykuł nie będzie zawierał stron kilometrowych zapytania sql, maksymalnie 1, 2 linijki i tylko to, co moim zdaniem jest rzadkie. Ale ponieważ chcę być całkowicie szczery, jeśli masz na sobie sql, artykuł będzie wydawał się nudny. Wszystkie przykłady w artykule, z wyjątkiem pierwszego i czwartego, można przypisać standardowi SQL-92.

Dane

Aby ułatwić nam życie, wrzuciłem prostą tabliczkę znamionową, na której będą testowane pewne punkty, a dla zwięzłości podam na nich wynik eksperymentu. Wszystkie żądania sprawdzam na PostgreSql.

Skrypty i tabela danych

CREATE TABLE towary(id bigint NOT NULL, znak nazwy zmienny(127) NOT NULL, znak opisu zmienny(255) NOT NULL, cena numeryczna (16,2) NOT NULL, znak artykulu zmienny(20) NOT NULL, act_time znacznik czasu NOT NULL , boolean dostępności NIE NULL, OGRANICZENIE pk_goods PRIMARY KEY (id)); WSTAWIĆ DO towarów (id, nazwa, opis, cena, articul, act_time, dostępność) WARTOŚCI (1, "Kapcie", "Miękkie", 100,00, "TR-75", (ts "2017-01-01 01:01: 01.01"), PRAWDA); WSTAWIĆ DO towaru (id, nazwa, opis, cena, articul, act_time, dostępność) WARTOŚCI (2, "Poduszka", "Biały", 200,00, "PR-75", (ts "2017-01-02 02:02: 02.02"), PRAWDA); WSTAWIĆ DO towaru (id, nazwa, opis, cena, articul, act_time, dostępność) WARTOŚCI (3, "Koc", "Kołdra", 300,00, "ZR-75", (ts "2017-01-03 03:03: 03.03”), PRAWDA); WSTAW W towar (id, nazwa, opis, cena, articul, act_time, dostępność) WARTOŚCI (4, "Poszewka na poduszkę", "Szary", 400,00, "AR-75", (ts "2017-01-04 04:04 : 04.04"), FAŁSZ); WSTAWIĆ DO towarów (id, nazwa, opis, cena, articul, act_time, dostępność) WARTOŚCI (5, "Arkusz", "Jedwab", 500,00, "BR-75", (ts "2017-01-05 05:05: 05.05"), FAŁSZ);

Upraszanie

1. Podwójne cytaty

A pierwsze, co mam, to proste pytanie: Czy możesz podać przykład zapytania sql za pomocą podwójnie cytaty? Tak, nie z singlami, dwójkami?

Przykład z podwójnymi cudzysłowami

SELECT nazwa "Nazwa produktu" FROM towary


Byłem bardzo zaskoczony, kiedy zobaczyłem to po raz pierwszy. Jeśli spróbujesz zmienić podwójne cudzysłowy na pojedyncze cudzysłowy, wynik będzie kompletny inny; różny!

Może się wydawać, że nie jest to zbyt przydatny przykład do realnego rozwoju. Dla mnie tak nie jest. Teraz aktywnie używam go we wszystkich moich sql-blankach. Konkluzja jest prosta, gdy po pół roku wrócisz do zapytania sql składającego się z 40 kolumn, och, jak ratuje ich „nasza” nazwa. Pomimo tego, że nie wspomniałem o SQL-92, w najnowszym wydaniu pojawia się wzmianka o podwójnych cudzysłowach.

2. Pseudotablica. SQL-92

Trochę nie do końca terminologicznie, ale istota jest prosta - tabela wynikająca z podzapytania w sekcji OD. Być może najbardziej znany fakt w tym artykule

Pseudo tabela

SELECT próba.pseudonim "Pseudonim", (CASE WHEN próba.huff THEN "Tak" ELSE "Nie" END) "Huffed?" FROM (SELECT nazwa AS nick, dostępność AS huff FROM towary) makieta

W naszym przykładzie makieta to pseudotabela (czasami nazywana wirtualnym stołem). Oczywiście wcale nie mają na celu zniekształcenia prawdziwego znaczenia. Oto przykład.

3. Konstruktor bloku danych. SQL-92

Brzmi przerażająco, tylko dlatego, że nie znalazłem dobrego tłumaczenia ani interpretacji. I jak zawsze łatwiej to wytłumaczyć na przykładzie:

Przykład konstruktora bloku danych

SELECT nazwa "Nazwa produktu", cena "Cena" FROM (WARTOŚCI ("Kapcie", 100,00), ("Poduszka", 200,00)) AS towary(nazwa, cena)

Nazwa produktu Cena £
Kapcie 100.00
Poduszka 200.00

W sekcji Z używany słowo kluczowe WARTOŚCI, a następnie dane w nawiasach, wiersz po wierszu. Najważniejsze jest to, że w ogóle nie wybieramy danych z żadnej tabeli, ale po prostu tworzymy je w locie, „nazywamy” tabelę, nazywamy kolumny, a następnie używamy ich według własnego uznania. Ta rzecz okazała się niezwykle przydatna podczas testowania różnych przypadków zapytania sql, gdy brakuje danych dla niektórych tabel (w Twojej lokalnej bazie danych), a pisanie insertu jest zbyt leniwe lub czasami bardzo trudne, ze względu na połączenie tabel i ograniczenia.

4. Czas, data i godzina i data

Zapewne każdy zetknął się w zapytaniach, z koniecznością podania godziny, daty lub daty i godziny. Wiele DBMS obsługuje odpowiednio literały t, d i ts do pracy z tymi typami. Ale łatwiej to wyjaśnić na przykładzie: w przypadku literałów d i t wszystko jest takie samo.
Przepraszam czytelnika za wprowadzanie w błąd, ale wszystko, co zostało powiedziane w akapicie 4, nie dotyczy języka SQL, ale odnosi się do możliwości wstępnego przetwarzania zapytań w JDBC.

5. Odmowa. SQL-92

Wszyscy wiemy o operatorze NIE, ale bardzo często zapomina się, że można go zastosować zarówno do grupy predykatów, jak i do pojedynczej kolumny:

6. Porównanie bloków danych. SQL-92

Jeszcze raz przepraszam za terminologię. To jeden z moich ulubionych przykładów.

Przykład porównania bloków danych

SELECT * FROM towar WHERE (nazwa, cena, dostępność) = ("Poszewka", 400,00, FALSE) -- lub odpowiednik SELECT * FROM towary WHERE nazwa = "Poszewka" AND cena = 400,00 AND dostępność = FALSE

Jak widać na przykładzie, porównywanie bloków danych jest podobne do porównywania element po elemencie. oznaczający_ 1 _blok_1 = wartość_ 1 _blok_2, wartość_ 2 _blok_1 = wartość_ 2 _blok_2, wartość_ 3 _blok_1 = wartość_ 3 _blok_2 za pomocą ORAZ między nimi.

7. Operatory porównania z modyfikatorami DOWOLNYMI, NIEKTÓRYMI lub WSZYSTKIMI. SQL-92

Tutaj potrzebne jest wyjaśnienie. Ale jak zawsze najpierw przykładCo to znaczy WSZYSTKO w tym przypadku? A to oznacza, że ​​warunek selekcji spełniają tylko te wiersze, których identyfikatory (w naszym przypadku 4 i 5) są większe niż każdy ze znalezionych wartości w podzapytaniu (1, 2 i 3). 4 jest większe niż 1 i niż 2 i niż 3,5 jest podobne. Co się stanie, jeśli wymienimy? WSZYSTKO na KAŻDY?
Co robi KAŻDY w tym przypadku? A to oznacza, że ​​warunek selekcji spełniają tylko te wiersze, których identyfikatory (w naszym przypadku 2, 3, 4 i 5) są większe niż przynajmniej jeden ze znalezionych wartości w podzapytaniu (1, 2 i 3). Dla siebie skojarzyłem WSZYSTKO Z ORAZ, a KAŻDY Z LUB. NIEKTÓRE oraz KAŻDY analogi do siebie.

8. Operatorzy do pracy z wnioskami / pod wnioskami. SQL-92

Dość wiadomo, że za pomocą operatorów można połączyć ze sobą 2 zapytania UNIA lub UNIA WSZYSTKO. Jest to często używane. Ale jest jeszcze 2 operatorów OPRÓCZ oraz PRZECINAĆ.

Przykład z WYJĄTKIEM

W rzeczywistości dane drugiego zestawu są wykluczone z pierwszego zestawu wartości.
W rzeczywistości istnieje przecięcie pierwszego zestawu wartości i drugiego zestawu.
To wszystko, dziękuję za uwagę.

Redakcyjny

N1. Dzięki Streetflush za konstruktywną krytykę. Wniósł artykuł z informacjami o tym, co jest standardem językowym, a co nie.
N2. Poprawiono punkt 4, z wyjaśnieniem, że ts/d/t nie jest częścią języka SQL. Dziękuję za uwagę Melkij.

W tym przewodnik do nauki nauczysz się używać Z WYJĄTKIEM oświadczenia w Serwer SQL (Transact-SQL) ze składnią i przykładami.

Opis

SQL Server EXCEPT Statement(Transact-SQL) służy do zwracania wszystkich wierszy w pierwszej instrukcji SELECT, które nie są zwracane przez drugą instrukcję SELECT. Każda instrukcja SELECT zdefiniuje zbiór danych. Instrukcja EXCEPT wyodrębni wszystkie rekordy z pierwszego zestawu danych, a następnie usunie wszystkie rekordy z drugiego zestawu danych z wyników.

Z wyjątkiem prośby

Wyjaśnienie: Zapytanie EXCEPT zwróci wpisy w szarym zacienionym obszarze. Są to rekordy, które istnieją w SELECT 1, a nie w SELECT 2.
Każda instrukcja SELECT w zapytaniu EXCEPT musi mieć taką samą liczbę pól w zestawach wyników o podobnych typach danych.

Składnia

Składnia instrukcji EXCEPT w programie SQL Server (Transact-SQL) to:

Opcje lub argumenty

wyrażenia to kolumny lub obliczenia, które chcesz porównać między dwoma instrukcjami SELECT. Nie muszą to być te same pola w każdej z instrukcji SELECT, ale odpowiadające im kolumny muszą mieć podobny typ danych.
tabele - tabele, z których chcesz pobrać rekordy. Musi istnieć co najmniej jedna tabela wymieniona w klauzuli FROM.
Warunki GDZIE - opcjonalne. Warunki, które muszą być spełnione dla wybranych rekordów.

Notatka

  • Obie instrukcje SELECT muszą mieć taką samą liczbę wyrażeń.
  • Odpowiednie kolumny w każdej z instrukcji SELECT muszą mieć podobne typy danych.
  • Instrukcja EXCEPT zwraca wszystkie rekordy z pierwszej instrukcji SELECT, które nie zostały uwzględnione w drugiej instrukcji SELECT.
  • Instrukcja EXCEPT w SQL Server jest odpowiednikiem instrukcji MINUS w Oracle.

Przykład pojedynczego wyrażenia

Spójrzmy na przykład instrukcji EXCEPT w SQL Server (Transact-SQL), która zwraca jedno pole o tym samym typie danych.
Na przykład:

Transakcja SQL

SELECT product_id FROM produkty EXCEPT SELECT product_id FROM asortyment;

WYBIERZ ID_produktu

Z produktów

WYBIERZ ID_produktu

Z inwentaryzacji ;

Ten przykład instrukcji EXCEPT zwraca wszystkie wartości product_id, które znajdują się w tabeli produktów, a nie w tabeli zapasów. Oznacza to, że jeśli wartość id_produktu istnieje w tabeli produktów i istnieje również w tabeli zapasów, wartość id_produktu nie pojawi się w wynikach zapytania EXCEPT.

Przykład z wieloma wyrażeniami

Następnie spójrzmy na przykład zapytania Z WYJĄTKIEM w programie SQL Server (Transact-SQL), który zwraca więcej niż jedną kolumnę.
Na przykład:

Transakcja SQL

W tym przykładzie kwerenda EXCEPT zwraca rekordy w tabeli kontaktów o nazwach contact_id , last_name i first_name , co nie jest zgodne z wartościami worker_id , last_name i first_name w tabeli workers.

Podobał Ci się artykuł? Podziel się z przyjaciółmi!
Czy ten artykuł był pomocny?
tak
Nie
Dziekuję za odpowiedź!
Coś poszło nie tak i Twój głos nie został policzony.
Dziękuję Ci. Twoja wiadomość została wysłana
Znalazłeś błąd w tekście?
Wybierz, kliknij Ctrl+Enter a my to naprawimy!