SQLAlchemy Core - การใช้ Set Operations

ในบทที่แล้วเราได้เรียนรู้เกี่ยวกับฟังก์ชั่นต่างๆเช่น max (), min (), count () ฯลฯ ที่นี่เราจะเรียนรู้เกี่ยวกับการใช้งานชุดและการใช้งาน

การดำเนินการตั้งค่าเช่น UNION และ INTERSECT ได้รับการสนับสนุนโดย SQL มาตรฐานและภาษาถิ่นส่วนใหญ่ SQLAlchemy ดำเนินการด้วยความช่วยเหลือของฟังก์ชันต่อไปนี้ -

สหภาพแรงงาน ()

ในขณะที่รวมผลลัพธ์ของคำสั่ง SELECT สองคำขึ้นไป UNION จะกำจัดรายการที่ซ้ำกันออกจากชุดผลลัพธ์ จำนวนคอลัมน์และประเภทข้อมูลต้องเหมือนกันในทั้งสองตาราง

ฟังก์ชัน union () ส่งคืนวัตถุ CompoundSelect จากหลายตาราง ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งาน -

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

โครงสร้างสหภาพแปลเป็นนิพจน์ 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 ?

จากตารางที่อยู่ของเราแถวต่อไปนี้แสดงถึงการดำเนินการร่วมกัน -

[
   (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 ไม่สามารถลบรายการที่ซ้ำกันและไม่สามารถเรียงลำดับข้อมูลในชุดผลลัพธ์ได้ ตัวอย่างเช่นในข้อความค้นหาด้านบน UNION จะถูกแทนที่ด้วย UNION ALL เพื่อดูเอฟเฟกต์

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

นิพจน์ SQL ที่เกี่ยวข้องมีดังนี้ -

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 ?

ยกเว้น_()

SQL EXCEPTอนุประโยค / ตัวดำเนินการใช้เพื่อรวมสองคำสั่ง SELECT และส่งคืนแถวจากคำสั่ง SELECT แรกที่ไม่ถูกส่งกลับโดยคำสั่ง SELECT ที่สอง ฟังก์ชัน except_ () สร้างนิพจน์ SELECT ที่มีส่วนคำสั่ง EXCEPT

ในตัวอย่างต่อไปนี้ฟังก์ชัน except_ () จะส่งคืนเฉพาะระเบียนเหล่านั้นจากตารางที่อยู่ที่มี "gmail.com" ในช่อง email_add แต่ไม่รวมรายการที่มี "Pune" เป็นส่วนหนึ่งของช่อง Postal_add

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

ผลลัพธ์ของโค้ดด้านบนคือนิพจน์ 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 ?

สมมติว่าตารางที่อยู่มีข้อมูลที่ใช้ในตัวอย่างก่อนหน้านี้จะแสดงผลลัพธ์ต่อไปนี้ -

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

ตัด()

การใช้ตัวดำเนินการ INTERSECT SQL จะแสดงแถวทั่วไปจากทั้งคำสั่ง SELECT ฟังก์ชัน intersect () ใช้พฤติกรรมนี้

ในตัวอย่างต่อไปนี้โครงสร้าง SELECT สองรายการคือพารามิเตอร์เพื่อตัดกัน () ฟังก์ชัน หนึ่งส่งคืนแถวที่มี "gmail.com" เป็นส่วนหนึ่งของคอลัมน์ email_add และแถวอื่น ๆ จะแสดงผลที่มี "Pune" เป็นส่วนหนึ่งของคอลัมน์ Postal_add ผลลัพธ์จะเป็นแถวทั่วไปจากทั้งสองชุดผลลัพธ์

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

มีผลเทียบเท่ากับคำสั่ง 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 ?

พารามิเตอร์สองตัวที่ถูกผูกไว้ '% gmail.com' และ '% Pune' สร้างแถวเดียวจากข้อมูลต้นฉบับในตารางที่อยู่ดังที่แสดงด้านล่าง -

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