SQLAlchemy Core: uso de operaciones de conjuntos

En el último capítulo, hemos aprendido acerca de varias funciones como max (), min (), count (), etc., aquí aprenderemos sobre las operaciones de conjuntos y sus usos.

Las operaciones de conjuntos como UNION e INTERSECT son compatibles con SQL estándar y la mayor parte de su dialecto. SQLAlchemy los implementa con la ayuda de las siguientes funciones:

Unión()

Al combinar los resultados de dos o más sentencias SELECT, UNION elimina los duplicados del conjunto de resultados. El número de columnas y el tipo de datos deben ser iguales en ambas tablas.

La función union () devuelve un objeto CompoundSelect de varias tablas. El siguiente ejemplo demuestra su uso:

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 construcción de unión se traduce en la siguiente expresión 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 ?

De nuestra tabla de direcciones, las siguientes filas representan la operación de unión:

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

La operación UNION ALL no puede eliminar los duplicados y no puede ordenar los datos en el conjunto de resultados. Por ejemplo, en la consulta anterior, UNION se reemplaza por UNION ALL para ver el efecto.

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

La expresión SQL correspondiente es la siguiente:

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 ?

excepto_()

El SQL EXCEPTLa cláusula / operador se utiliza para combinar dos sentencias SELECT y devolver filas de la primera sentencia SELECT que no son devueltas por la segunda sentencia SELECT. La función except_ () genera una expresión SELECT con cláusula EXCEPT.

En el siguiente ejemplo, la función except_ () devuelve solo los registros de la tabla de direcciones que tienen "gmail.com" en el campo email_add, pero excluye los que tienen "Pune" como parte del campo postal_add.

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

El resultado del código anterior es la siguiente expresión 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 ?

Suponiendo que la tabla de direcciones contiene datos utilizados en ejemplos anteriores, mostrará la siguiente salida:

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

intersecarse()

Usando el operador INTERSECT, SQL muestra filas comunes de ambas sentencias SELECT. La función intersect () implementa este comportamiento.

En los siguientes ejemplos, dos construcciones SELECT son parámetros para la función intersect (). Uno devuelve filas que contienen "gmail.com" como parte de la columna email_add, y el otro devuelve filas que contienen "Pune" como parte de la columna postal_add. El resultado serán filas comunes de ambos conjuntos de resultados.

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

En efecto, esto es equivalente a la siguiente instrucción 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 ?

Los dos parámetros enlazados '% gmail.com' y '% Pune' generan una sola fila a partir de los datos originales en la tabla de direcciones como se muestra a continuación:

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