SQLAlchemy Core - Utilisation des opérations Set

Dans le dernier chapitre, nous avons découvert diverses fonctions telles que max (), min (), count (), etc., ici, nous allons en apprendre davantage sur les opérations de set et leurs utilisations.

Les opérations d'ensemble telles que UNION et INTERSECT sont prises en charge par SQL standard et la plupart de son dialecte. SQLAlchemy les implémente à l'aide des fonctions suivantes -

syndicat()

Lors de la combinaison des résultats de deux instructions SELECT ou plus, UNION élimine les doublons du jeu de résultats. Le nombre de colonnes et le type de données doivent être identiques dans les deux tables.

La fonction union () renvoie un objet CompoundSelect à partir de plusieurs tables. L'exemple suivant montre son utilisation -

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

La construction union se traduit par l'expression SQL suivante -

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 ?

À partir de notre table d'adresses, les lignes suivantes représentent l'opération d'union -

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

L'opération UNION ALL ne peut pas supprimer les doublons et ne peut pas trier les données dans le jeu de résultats. Par exemple, dans la requête ci-dessus, UNION est remplacé par UNION ALL pour voir l'effet.

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

L'expression SQL correspondante est la suivante -

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 ?

sauf_()

Le SQL EXCEPTclause / operator est utilisé pour combiner deux instructions SELECT et renvoyer des lignes de la première instruction SELECT qui ne sont pas renvoyées par la seconde instruction SELECT. La fonction except_ () génère une expression SELECT avec la clause EXCEPT.

Dans l'exemple suivant, la fonction except_ () renvoie uniquement les enregistrements de la table des adresses qui ont «gmail.com» dans le champ email_add mais exclut ceux qui ont «Pune» dans le champ postal_add.

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

Le résultat du code ci-dessus est l'expression SQL suivante -

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 ?

En supposant que la table des adresses contient des données utilisées dans les exemples précédents, elle affichera la sortie suivante -

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

couper()

À l'aide de l'opérateur INTERSECT, SQL affiche les lignes communes des deux instructions SELECT. La fonction intersect () implémente ce comportement.

Dans les exemples suivants, deux constructions SELECT sont des paramètres de la fonction intersect (). L'un renvoie des lignes contenant «gmail.com» dans le cadre de la colonne email_add, et d'autres renvoie des lignes contenant «Pune» dans le cadre de la colonne postal_add. Le résultat sera des lignes communes des deux ensembles de résultats.

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

En fait, cela équivaut à suivre l'instruction 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 ?

Les deux paramètres liés '% gmail.com' et '% Pune' génèrent une seule ligne à partir des données d'origine dans le tableau des adresses comme indiqué ci-dessous -

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