SQLAlchemy Core - Set İşlemlerini Kullanma

Son bölümde max (), min (), count () vb. Gibi çeşitli fonksiyonlar hakkında bilgi edindik, burada set işlemlerini ve kullanımlarını öğreneceğiz.

UNION ve INTERSECT gibi set işlemleri, standart SQL ve lehçesinin çoğu tarafından desteklenir. SQLAlchemy bunları aşağıdaki işlevlerin yardımıyla uygular -

Birlik()

İki veya daha fazla SELECT ifadesinin sonuçlarını birleştirirken, UNION, sonuç kümesindeki kopyaları ortadan kaldırır. Her iki tabloda da sütun sayısı ve veri türü aynı olmalıdır.

Union () işlevi, birden çok tablodan bir CompoundSelect nesnesi döndürür. Aşağıdaki örnek, kullanımını göstermektedir -

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()

Birleşim yapısı aşağıdaki SQL ifadesine çevrilir -

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 ?

Adres tablomuzdan, aşağıdaki satırlar birleşim işlemini temsil eder -

[
   (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 ()

UNION ALL işlemi yinelenenleri kaldıramaz ve sonuç kümesindeki verileri sıralayamaz. Örneğin, yukarıdaki sorguda UNION, etkisini görmek için UNION ALL ile değiştirilmiştir.

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

Karşılık gelen SQL ifadesi aşağıdaki gibidir -

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 ?

dışında_()

SQL EXCEPTyan tümce / işleç, iki SELECT deyimini birleştirmek ve ilk SELECT deyiminden ikinci SELECT deyimi tarafından döndürülmeyen satırları döndürmek için kullanılır. Exclu_ () işlevi, EXCEPT yan tümcesine sahip bir SELECT ifadesi oluşturur.

Aşağıdaki örnekte, exclu_ () işlevi, yalnızca e-posta_add alanında 'gmail.com' bulunan, ancak postal_add alanının bir parçası olarak 'Pune' bulunanları hariç tutan adres tablosundaki kayıtları döndürür.

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

Yukarıdaki kodun sonucu aşağıdaki SQL ifadesidir -

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 ?

Adres tablosunun önceki örneklerde kullanılan verileri içerdiğini varsayarsak, aşağıdaki çıktıyı gösterecektir -

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

kesişmek ()

INTERSECT operatörünü kullanarak SQL, her iki SELECT deyiminden ortak satırları görüntüler. İntersect () işlevi bu davranışı uygular.

Aşağıdaki örneklerde, iki SELECT yapısı, intersect () işlevinin parametreleridir. Biri, email_add sütununun bir parçası olarak 'gmail.com'u içeren satırları döndürür ve diğerleri, postal_add sütununun bir parçası olarak' Pune 'içeren satırları döndürür. Sonuç, her iki sonuç kümesinden ortak satırlar olacaktır.

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

Aslında bu, aşağıdaki SQL ifadesine eşdeğerdir -

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 ?

İki bağlı parametre '% gmail.com' ve '% Pune', aşağıda gösterildiği gibi adres tablosundaki orijinal verilerden tek bir satır oluşturur -

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