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]')]