SQLAlchemy Core - Korzystanie z operacji na zbiorach

W ostatnim rozdziale poznaliśmy różne funkcje, takie jak max (), min (), count (), itp., Tutaj dowiemy się o operacjach na zbiorach i ich zastosowaniach.

Operacje na zbiorach, takie jak UNION i INTERSECT, są obsługiwane przez standardowy SQL i większość jego dialektu. SQLAlchemy implementuje je za pomocą następujących funkcji -

unia()

Podczas łączenia wyników dwóch lub więcej instrukcji SELECT, UNION eliminuje duplikaty z zestawu wyników. Liczba kolumn i typ danych muszą być takie same w obu tabelach.

Funkcja union () zwraca obiekt CompoundSelect z wielu tabel. Poniższy przykład demonstruje jego użycie -

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, union
engine = create_engine('sqlite:///college.db', echo = True)

meta = MetaData()
conn = engine.connect()
addresses = Table(
   'addresses', meta, 
   Column('id', Integer, primary_key = True), 
   Column('st_id', Integer), 
   Column('postal_add', String), 
   Column('email_add', String)
)

u = union(addresses.select().where(addresses.c.email_add.like('%@gmail.com addresses.select().where(addresses.c.email_add.like('%@yahoo.com'))))

result = conn.execute(u)
result.fetchall()

Konstrukcja unii przekłada się na następujące wyrażenie SQL -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?

W naszej tabeli adresów następujące wiersze przedstawiają operację unii -

[
   (1, 1, 'Shivajinagar Pune', '[email protected]'),
   (2, 1, 'ChurchGate Mumbai', '[email protected]'),
   (3, 3, 'Jubilee Hills Hyderabad', '[email protected]'),
   (4, 5, 'MG Road Bangaluru', '[email protected]')
]

union_all ()

Operacja UNION ALL nie może usunąć duplikatów i nie może sortować danych w zestawie wyników. Na przykład w powyższym zapytaniu UNION jest zastępowane przez UNION ALL, aby zobaczyć efekt.

u = union_all(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.email_add.like('%@yahoo.com')))

Odpowiednie wyrażenie SQL jest następujące -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION ALL SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?

z wyjątkiem_()

SQL EXCEPTklauzula / operator służy do łączenia dwóch instrukcji SELECT i zwracania wierszy z pierwszej instrukcji SELECT, które nie są zwracane przez drugą instrukcję SELECT. Funkcja except_ () generuje wyrażenie SELECT z klauzulą ​​EXCEPT.

W poniższym przykładzie funkcja except_ () zwraca tylko te rekordy z tabeli adresów, które mają „gmail.com” w polu email_add, ale wyklucza te, które mają „Pune” jako część pola postal_add.

u = except_(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))

Rezultatem powyższego kodu jest następujące wyrażenie SQL -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? EXCEPT SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?

Zakładając, że tabela adresów zawiera dane użyte we wcześniejszych przykładach, wyświetli następujące dane wyjściowe -

[(2, 1, 'ChurchGate Mumbai', '[email protected]'),
   (3, 3, 'Jubilee Hills Hyderabad', '[email protected]')]

krzyżować()

Używając operatora INTERSECT, SQL wyświetla wspólne wiersze z obu instrukcji SELECT. Funkcja intersect () implementuje to zachowanie.

W poniższych przykładach dwie konstrukcje SELECT są parametrami funkcji intersect (). Jeden zwraca wiersze zawierające „gmail.com” jako część kolumny email_add, a inne zwraca wiersze zawierające „Pune” jako część kolumny postal_add. Wynikiem będą wspólne wiersze z obu zestawów wyników.

u = intersect(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))

W efekcie jest to równoważne z następującą instrukcją SQL -

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? INTERSECT SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?

Dwa powiązane parametry „% gmail.com” i „% Pune” generują pojedynczy wiersz z oryginalnych danych w tabeli adresów, jak pokazano poniżej -

[(1, 1, 'Shivajinagar Pune', '[email protected]')]