SQLAlchemy Core - Sử dụng các hoạt động tập hợp

Trong chương trước, chúng ta đã tìm hiểu về các hàm khác nhau như max (), min (), count (), v.v., ở đây, chúng ta sẽ tìm hiểu về các phép toán tập hợp và công dụng của chúng.

Các hoạt động tập hợp như UNION và INTERSECT được hỗ trợ bởi SQL tiêu chuẩn và hầu hết phương ngữ của nó. SQLAlchemy triển khai chúng với sự trợ giúp của các hàm sau:

liên hiệp()

Trong khi kết hợp các kết quả của hai hoặc nhiều câu lệnh SELECT, UNION sẽ loại bỏ các bản sao khỏi tập kết quả. Số lượng cột và kiểu dữ liệu phải giống nhau trong cả hai bảng.

Hàm union () trả về một đối tượng CompoundSelect từ nhiều bảng. Ví dụ sau thể hiện công dụng của nó:

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

Cấu trúc union dịch sang biểu thức SQL sau:

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 ?

Từ bảng địa chỉ của chúng tôi, các hàng sau đại diện cho hoạt động liên hợp:

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

Thao tác UNION ALL không thể loại bỏ các bản sao và không thể sắp xếp dữ liệu trong tập kết quả. Ví dụ, trong truy vấn trên, UNION được thay thế bằng UNION ALL để xem hiệu ứng.

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

Biểu thức SQL tương ứng như sau:

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 ?

ngoại trừ_()

SQL EXCEPTmệnh đề / toán tử được sử dụng để kết hợp hai câu lệnh SELECT và trả về các hàng từ câu lệnh SELECT đầu tiên mà không được trả về bởi câu lệnh SELECT thứ hai. Hàm exception_ () tạo ra biểu thức SELECT với mệnh đề EXCEPT.

Trong ví dụ sau, hàm exception_ () chỉ trả về những bản ghi từ bảng địa chỉ có 'gmail.com' trong trường email_add nhưng loại trừ những bản ghi có 'Pune' như một phần của trường post_add.

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

Kết quả của đoạn mã trên là biểu thức SQL sau:

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 ?

Giả sử rằng bảng địa chỉ chứa dữ liệu được sử dụng trong các ví dụ trước đó, nó sẽ hiển thị kết quả sau:

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

giao nhau()

Sử dụng toán tử INTERSECT, SQL hiển thị các hàng chung từ cả hai câu lệnh SELECT. Hàm interect () thực hiện hành vi này.

Trong các ví dụ sau, hai cấu trúc SELECT là các tham số của hàm giao nhau (). Một trả về các hàng chứa 'gmail.com' như một phần của cột email_add và các hàng khác trả về các hàng có 'Pune' là một phần của cột post_add. Kết quả sẽ là các hàng chung từ cả hai tập kết quả.

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

Trên thực tế, điều này tương đương với câu lệnh SQL sau:

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 ?

Hai tham số liên kết '% gmail.com' và '% Pune' tạo ra một hàng từ dữ liệu gốc trong bảng địa chỉ như được hiển thị bên dưới -

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